home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / rxremlog.pas < prev    next >
Pascal/Delphi Source File  |  1999-10-12  |  8KB  |  305 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1998 Master-Bank                }
  6. {                                                       }
  7. {*******************************************************}
  8.  
  9. unit RxRemLog;
  10.  
  11. interface
  12.  
  13. {$I RX.INC}
  14.  
  15. {$IFDEF RX_D3}
  16. {$IFDEF RX_MIDAS}
  17.  
  18. uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
  19.   Dialogs, RxLogin, DBClient;
  20.  
  21. { TRxRemoteLogin }
  22.  
  23. type
  24.   TRxRemoteLogin = class(TRxCustomLogin)
  25.   private
  26.     FRemoteServer: TCustomRemoteServer;
  27.     FPrepared: Boolean;
  28.     FUsername: string;
  29.     FInLogin: Boolean;
  30.     FOnCheckUser: TRxLoginEvent;
  31.     FSaveAfterConnect: TNotifyEvent;
  32.     procedure AbortConnection;
  33.     procedure OkButtonClick(Sender: TObject);
  34.     procedure PrepareRemoteServer;
  35.     procedure UnprepareRemoteServer;
  36.     procedure ServerAfterConnect(Sender: TObject);
  37.     procedure SetRemoteServer(Value: TCustomRemoteServer);
  38.     procedure WriteUserName(const UserName: string);
  39.     function ReadUserName(const UserName: string): string;
  40.   protected
  41.     function DoCheckUser(const UserName, Password: string): Boolean; dynamic;
  42.     function DoLogin(var UserName: string): Boolean; override;
  43.     procedure Loaded; override;
  44.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  45.   public
  46.     constructor Create(AOwner: TComponent); override;
  47.     destructor Destroy; override;
  48.   published
  49.     property RemoteServer: TCustomRemoteServer read FRemoteServer write SetRemoteServer;
  50.     property Active;
  51.     property AllowEmptyPassword;
  52.     property AttemptNumber;
  53.     property IniFileName;
  54.     property MaxPasswordLen;
  55.     property UpdateCaption;
  56.     property UseRegistry;
  57.     property OnCheckUser: TRxLoginEvent read FOnCheckUser write FOnCheckUser;
  58.     property AfterLogin;
  59.     property BeforeLogin;
  60.     property OnUnlock;
  61.     property OnUnlockApp;
  62.     property OnIconDblClick;
  63.   end;
  64.  
  65. {$ENDIF RX_MIDAS}
  66. {$ENDIF RX_D3}
  67.  
  68. implementation
  69.  
  70. {$IFDEF RX_D3}
  71. {$IFDEF RX_MIDAS}
  72.  
  73. uses IniFiles, Registry, AppUtils, VclUtils {$IFDEF RX_D4}, MConnect {$ENDIF};
  74.  
  75. const
  76.   keyLoginSection  = 'Remote Login';
  77.   keyLastLoginUserName = 'Last User';
  78.  
  79. type
  80.   TServer = class(TCustomRemoteServer);
  81.  
  82. { TRxRemoteLogin }
  83.  
  84. constructor TRxRemoteLogin.Create(AOwner: TComponent);
  85. begin
  86.   inherited Create(AOwner);
  87. end;
  88.  
  89. destructor TRxRemoteLogin.Destroy;
  90. begin
  91.   UnprepareRemoteServer;
  92.   inherited Destroy;
  93. end;
  94.  
  95. procedure TRxRemoteLogin.Notification(AComponent: TComponent; Operation: TOperation);
  96. begin
  97.   inherited Notification(AComponent, Operation);
  98.   if (Operation = opRemove) and (AComponent = RemoteServer) then
  99.     RemoteServer := nil;
  100. end;
  101.  
  102. procedure TRxRemoteLogin.Loaded;
  103. var
  104.   Loading: Boolean;
  105. begin
  106.   Loading := csLoading in ComponentState;
  107.   inherited Loaded;
  108.   if not (csDesigning in ComponentState) and Loading and
  109.     Assigned(FRemoteServer) then
  110.   begin
  111.     if not Active then PrepareRemoteServer
  112.     else if not Login then TerminateApplication;
  113.   end;
  114. end;
  115.  
  116. procedure TRxRemoteLogin.SetRemoteServer(Value: TCustomRemoteServer);
  117. begin
  118.   if FRemoteServer <> Value then begin
  119.     UnprepareRemoteServer;
  120.     FRemoteServer := Value;
  121.     if Value <> nil then begin
  122.       Value.FreeNotification(Self);
  123.       if not (csLoading in ComponentState) then PrepareRemoteServer;
  124.     end;
  125.   end;
  126. end;
  127.  
  128. procedure TRxRemoteLogin.PrepareRemoteServer;
  129. begin
  130.   if Assigned(FRemoteServer) and not FPrepared then
  131.     with TServer(RemoteServer) do begin
  132. {$IFDEF RX_D4}
  133.       if RemoteServer is TDispatchConnection then
  134.         TDispatchConnection(RemoteServer).LoginPrompt := False;
  135. {$ENDIF}
  136.       FSaveAfterConnect := AfterConnect;
  137.       AfterConnect := ServerAfterConnect;
  138.       FPrepared := True;
  139.     end;
  140. end;
  141.  
  142. procedure TRxRemoteLogin.UnprepareRemoteServer;
  143. begin
  144.   if Assigned(FRemoteServer) and FPrepared then
  145.     with TServer(RemoteServer) do begin
  146.       AfterConnect := FSaveAfterConnect;
  147.       FPrepared := False;
  148.     end;
  149. end;
  150.  
  151. procedure TRxRemoteLogin.OkButtonClick(Sender: TObject);
  152. var
  153.   SetCursor: Boolean;
  154. begin
  155.   with TRxLoginForm(Sender) do begin
  156.     SetCursor := GetCurrentThreadID = MainThreadID;
  157.     try
  158.       if SetCursor then Screen.Cursor := crHourGlass;
  159.       try
  160.         if DoCheckUser(UserNameEdit.Text, PasswordEdit.Text) then
  161.           ModalResult := mrOk
  162.         else ModalResult := mrNone;
  163.       finally
  164.         if SetCursor then Screen.Cursor := crDefault;
  165.       end;
  166.     except
  167.       Application.HandleException(Self);
  168.     end;
  169.   end;
  170. end;
  171.  
  172. procedure TRxRemoteLogin.ServerAfterConnect(Sender: TObject);
  173. {$IFDEF RX_D4}
  174. var
  175.   OnGetUser: TGetUsernameEvent;
  176. {$ENDIF}
  177. begin
  178.   if Sender = FRemoteServer then begin
  179.     if not FInLogin then DoBeforeLogin;
  180.     with CreateLoginForm(False) do
  181.     try
  182.       OnOkClick := Self.OkButtonClick;
  183.       FUsername := ReadUserName(FUsername);
  184. {$IFDEF RX_D4}
  185.       if FRemoteServer is TDispatchConnection then begin
  186.         OnGetUser := TDispatchConnection(FRemoteServer).OnGetUsername;
  187.         if Assigned(OnGetUser) then OnGetUser(FRemoteServer, FUsername);
  188.       end;
  189. {$ENDIF}
  190.       UserNameEdit.Text := FUsername;
  191.       if ShowModal = mrOk then begin
  192.         FUsername := UserNameEdit.Text;
  193.         WriteUserName(FUsername);
  194.         if not FInLogin then begin
  195.           SetLoggedUser(FUsername);
  196.           DoUpdateCaption;
  197.           DoAfterLogin;
  198.         end;
  199.       end
  200.       else begin
  201.         AbortConnection;
  202.         SysUtils.Abort;
  203.       end;
  204.     finally
  205.       Free;
  206.     end;
  207.   end;
  208. end;
  209.  
  210. function TRxRemoteLogin.DoCheckUser(const UserName, Password: string): Boolean;
  211. begin
  212.   Result := True;
  213.   if Assigned(FOnCheckUser) then
  214.     FOnCheckUser(Self, UserName, Password, Result);
  215. end;
  216.  
  217. procedure TRxRemoteLogin.WriteUserName(const UserName: string);
  218. var
  219.   Ini: TObject;
  220. begin
  221.   try
  222.     if UseRegistry then Ini := TRegIniFile.Create(IniFileName)
  223.     else Ini := TIniFile.Create(IniFileName);
  224.     try
  225.       IniWriteString(Ini, keyLoginSection, keyLastLoginUserName, UserName);
  226.     finally
  227.       Ini.Free;
  228.     end;
  229.   except
  230.   end;
  231. end;
  232.  
  233. function TRxRemoteLogin.ReadUserName(const UserName: string): string;
  234. var
  235.   Ini: TObject;
  236. begin
  237.   try
  238.     if UseRegistry then begin
  239.       Ini := TRegIniFile.Create(IniFileName);
  240. {$IFDEF RX_D5}
  241.       TRegIniFile(Ini).Access := KEY_READ;
  242. {$ENDIF}
  243.     end
  244.     else Ini := TIniFile.Create(IniFileName);
  245.     try
  246.       Result := IniReadString(Ini, keyLoginSection, keyLastLoginUserName,
  247.         UserName);
  248.     finally
  249.       Ini.Free;
  250.     end;
  251.   except
  252.     Result := UserName;
  253.   end;
  254. end;
  255.  
  256. procedure TRxRemoteLogin.AbortConnection;
  257. var
  258.   OnAfterDisconnect, OnBeforeDisconnect: TNotifyEvent;
  259. begin
  260.   if Assigned(FRemoteServer) and TServer(FRemoteServer).Connected then
  261.   try
  262.     OnAfterDisconnect := TServer(FRemoteServer).AfterDisconnect;
  263.     OnBeforeDisconnect := TServer(FRemoteServer).BeforeDisconnect;
  264.     try
  265.       TServer(FRemoteServer).AfterDisconnect := nil;
  266.       TServer(FRemoteServer).BeforeDisconnect := nil;
  267.       TServer(FRemoteServer).Connected := False;
  268.     finally
  269.       TServer(FRemoteServer).AfterDisconnect := OnAfterDisconnect;
  270.       TServer(FRemoteServer).BeforeDisconnect := OnBeforeDisconnect;
  271.     end;
  272.   except
  273.   end;
  274. end;
  275.  
  276. function TRxRemoteLogin.DoLogin(var UserName: string): Boolean;
  277. begin
  278.   Result := False;
  279.   if not Assigned(FRemoteServer) then Exit;
  280.   PrepareRemoteServer;
  281.   FUsername := UserName;
  282.   try
  283.     FInLogin := True;
  284.     try
  285.       TServer(FRemoteServer).Connected := True;
  286.       Result := TServer(FRemoteServer).Connected;
  287.       UserName := FUsername;
  288.       FUsername := '';
  289.     finally
  290.       FInLogin := False;
  291.     end;
  292.   except
  293.     Application.HandleException(Self);
  294.     Result := False;
  295.     FUsername := '';
  296.     AbortConnection;
  297.   end;
  298.   if Result and Assigned(FSaveAfterConnect) then
  299.     FSaveAfterConnect(FRemoteServer);
  300. end;
  301.  
  302. {$ENDIF RX_MIDAS}
  303. {$ENDIF RX_D3}
  304.  
  305. end.