unit srvLogin_Impl; {----------------------------------------------------------------------------} { This unit was automatically generated by the RemObjects SDK after reading } { the RODL file associated with this project . } { } { This is where you are supposed to code the implementation of your objects. } {----------------------------------------------------------------------------} interface uses {vcl:} Classes, SysUtils, {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions, {Required:} uRORemoteDataModule, {Ancestor Implementation:} DataAbstractService_Impl, {Used RODLs:} DataAbstract4_Intf, {Generated:} FactuGES_Intf, uDAClasses, uDAInterfaces, uDAEngine, uDADataTable, uDABINAdapter, uROClient, uDADataStreamer, uDABin2DataStreamer; const PERFIL_ADMINISTRADORES = 'Administradores'; type { TsrvLogin } TsrvLogin = class(TDataAbstractService, IsrvLogin) Bin2DataStreamer: TDABin2DataStreamer; schLogin: TDASchema; procedure DataAbstractServiceBeforeAcquireConnection(aSender: TObject; var aConnectionName: string); procedure DataAbstractServiceCreate(Sender: TObject); private protected function Login2(const User: String; const Password: String; out LoginInfo: TRdxLoginInfo): Boolean; function Login(const User: String; const Password: String): Boolean; procedure Logout; function Ping: Boolean; end; implementation {$R *.dfm} uses {Generated:} FactuGES_Invk, uDataModuleServer, Dialogs, IB, Variants, uSesionesUtils; procedure Create_srvLogin(out anInstance : IUnknown); begin anInstance := TsrvLogin.Create(NIL); end; { srvLogin } { TsrvLogin } procedure TsrvLogin.DataAbstractServiceBeforeAcquireConnection(aSender: TObject; var aConnectionName: string); begin ConnectionName := dmServer.ConnectionName; end; procedure TsrvLogin.DataAbstractServiceCreate(Sender: TObject); begin SessionManager := dmServer.SessionManager; end; function TsrvLogin.Login(const User, Password: String): Boolean; var dsUser, dsPerfiles, dsEmpresas : IDADataset; LoginInfo : TRdxLoginInfo; begin LoginInfo := NIL; Result := False; dsUser := schLogin.NewDataset(Connection, 'UsuarioPermitido', ['Usuario', 'Pass'], [User, Password]); if (dsUser.RecordCount = 1) then begin try LoginInfo := TRdxLoginInfo.Create(); with LoginInfo do begin UserID := dsUser.FieldValues[0]; Usuario := User; SessionID := GUIDToString(Session.SessionID); Perfiles := StringArray.Create(); Empresas := TRdxEmpresasArray.Create; end; // Asigna los perfiles del usuario LoginInfo.Perfiles.Clear; dsPerfiles := schLogin.NewDataset(Connection, 'PerfilesUsuario', ['ID_USUARIO'], [LoginInfo.UserID]); while not dsPerfiles.EOF do begin LoginInfo.Perfiles.Add(VarToStr(dsPerfiles.FieldValues[0])); dsPerfiles.Next; end; // Asigna las empresas del usuario LoginInfo.Empresas.Clear; dsEmpresas := schLogin.NewDataset(Connection, 'EmpresasUsuario', ['ID_USUARIO'], [LoginInfo.UserID]); while not dsEmpresas.EOF do begin LoginInfo.Empresas.Add(dsEmpresas.FieldValues[0]); dsEmpresas.Next; end; SesionesHelper.SaveSessionObject(Session, SESION_LOGININFO, LoginInfo); Result := True; except on e : exception do begin ShowMessage(e.Message); raise end; end; end else begin // Invalid login. The temporary session is not to be kept. DestroySession; end; end; function TsrvLogin.Login2(const User, Password: String; out LoginInfo: TRdxLoginInfo): Boolean; var dsUser, dsPerfiles, dsEmpresas : IDADataset; InternalLoginInfo : TRdxLoginInfo; begin LoginInfo := NIL; Result := False; dsUser := schLogin.NewDataset(Connection, 'UsuarioPermitido', ['Usuario', 'Pass'], [User, Password]); if (dsUser.RecordCount = 1) then begin try LoginInfo := TRdxLoginInfo.Create(); with LoginInfo do begin UserID := dsUser.FieldValues[0]; Usuario := User; SessionID := GUIDToString(Session.SessionID); Perfiles := StringArray.Create(); Empresas := TRdxEmpresasArray.Create; end; // Asigna los perfiles del usuario LoginInfo.Perfiles.Clear; dsPerfiles := schLogin.NewDataset(Connection, 'PerfilesUsuario', ['ID_USUARIO'], [LoginInfo.UserID]); while not dsPerfiles.EOF do begin LoginInfo.Perfiles.Add(VarToStr(dsPerfiles.FieldValues[0])); dsPerfiles.Next; end; // Asigna las empresas del usuario LoginInfo.Empresas.Clear; dsEmpresas := schLogin.NewDataset(Connection, 'EmpresasUsuario', ['ID_USUARIO'], [LoginInfo.UserID]); while not dsEmpresas.EOF do begin LoginInfo.Empresas.Add(dsEmpresas.FieldValues[0]); dsEmpresas.Next; end; // Guardamos una copia de LoginInfo en el servidor para usarlo // en otros servicios InternalLoginInfo := TRdxLoginInfo.Create; InternalLoginInfo.Assign(LoginInfo); SesionesHelper.SaveSessionObject(Session, SESION_LOGININFO, InternalLoginInfo); Result := True; except on e : exception do begin FreeAndNIL(LoginInfo); ShowMessage(e.Message); raise end; end; end else begin // Invalid login. The temporary session is not to be kept. DestroySession; end; end; procedure TsrvLogin.Logout; begin DestroySession; end; function TsrvLogin.Ping: Boolean; begin Result := True; end; initialization TROClassFactory.Create('srvLogin', Create_srvLogin, TsrvLogin_Invoker); finalization end.