home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 February / Chip_2003-02_cd1.bin / zkuste / delphi / kompon / d34567 / KADAO77.ZIP / KADaoInfo.pas < prev    next >
Pascal/Delphi Source File  |  2002-05-16  |  17KB  |  496 lines

  1. {$B-}
  2. unit KADaoInfo;
  3. //******************************************************************************
  4. //                         Delphi Dao Project
  5. //                 Copyright (c) 2000 by Kiril Antonov
  6. //******************************************************************************
  7. interface
  8.  
  9. uses
  10.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  11.  
  12. type
  13.   TInfoCheckEvent = Procedure of object;
  14.   TKADaoInfo = class(TComponent)
  15.   private
  16.     { Private declarations }
  17.     LU  : Array[0..255,0..63] of Char;
  18.   protected
  19.     { Protected declarations }
  20.     F_Active             : Boolean;
  21.     F_Database           : String;
  22.     F_DaoDll             : String;
  23.     F_DatabaseVersion    : Integer;
  24.     F_NumberOfUsers      : Integer;
  25.     F_LoggedUsers        : TStringList;
  26.     F_LoggedInfo         : TStringList;
  27.     F_LoggedNowUsers     : TStringList;
  28.     F_ErrorUsers         : TStringList;
  29.     F_LastError          : Integer;
  30.     F_LastErrorText      : String;
  31.  
  32.     F_AfterGetDatabaseVersion : TInfoCheckEvent;
  33.     F_AfterGetNumberOfUsers   : TInfoCheckEvent;
  34.     F_AfterGetLoggedUsers     : TInfoCheckEvent;
  35.     F_AfterGetLoggedUsersEx   : TInfoCheckEvent;
  36.     F_AfterGetLoggedNowUsers  : TInfoCheckEvent;
  37.     F_AfterGetErrorUsers      : TInfoCheckEvent;
  38.  
  39.     Procedure F_Set_Active(Value:Boolean);
  40.  
  41.     Function  F_GET_LoggedUsers : TStringList;
  42.     Procedure F_SET_LoggedUsers(Value:TStringList);
  43.  
  44.     Function  F_GET_LoggedUsersEx : TStringList;
  45.     Procedure F_SET_LoggedUsersEx(Value:TStringList);
  46.  
  47.     Function  F_GET_LoggedNowUsers : TStringList;
  48.     Procedure F_SET_LoggedNowUsers(Value:TStringList);
  49.  
  50.     Function  F_GET_ErrorUsers : TStringList;
  51.     Procedure F_SET_ErrorUsers(Value:TStringList);
  52.  
  53.     Function  F_GET_DatabaseVersion :Integer;
  54.     Procedure F_SET_DatabaseVersion (Value:Integer);
  55.  
  56.     Function  F_GET_NumberOfUsers :Integer;
  57.     Procedure F_SET_NumberOfUsers (Value:Integer);
  58.  
  59.     Procedure F_SET_LastError(Value:Integer);
  60.     Procedure F_SET_LastErrorText(Value:String);
  61.  
  62.   public
  63.     { Public declarations }
  64.     Constructor   Create(AOwner: TComponent); override;
  65.     Destructor    Destroy; override;
  66.  
  67.     Function KAGetDatabaseVersion(LibraryName,DatabasePath:String):Integer;
  68.     Function KAGetNumberOfUsers(LibraryName,DatabasePath:String):Integer;
  69.     Function KAGetLoggedUsers(LibraryName,DatabasePath:String):Integer;
  70.     Function KAGetLoggedNowUsers(LibraryName,DatabasePath:String):Integer;
  71.     Function KAGetErrorUsers(LibraryName,DatabasePath:String):Integer;
  72.     Function KAGetLoggedInfo(DatabasePath:String):Boolean;
  73.  
  74.   published
  75.     { Published declarations }
  76.     Property Database           : String        Read F_Database             Write F_Database;
  77.     Property DaoInfoDll         : String        Read F_DaoDll               Write F_DaoDll;
  78.     Property DatabaseVersion    : Integer       Read F_GET_DatabaseVersion  Write F_SET_DatabaseVersion;
  79.     Property NumberOfUsers      : Integer       Read F_GET_NumberOfUsers    Write F_SET_NumberOfUsers;
  80.     Property LoggedUsers        : TStringList   Read F_GET_LoggedUsers      Write F_SET_LoggedUsers;
  81.     Property LoggedUsersEx      : TStringList   Read F_GET_LoggedUsersEx    Write F_SET_LoggedUsersEx;
  82.     Property LoggedNowUsers     : TStringList   Read F_GET_LoggedNowUsers   Write F_SET_LoggedNowUsers;
  83.     Property ErrorUsers         : TStringList   Read F_GET_ErrorUsers       Write F_SET_ErrorUsers;
  84.     Property LastError          : Integer       Read F_LastError            Write F_SET_LastError;
  85.     Property LastErrorText      : String        Read F_LastErrorText        Write F_SET_LastErrorText;
  86.     Property AfterGetDatabaseVersion : TInfoCheckEvent Read F_AfterGetDatabaseVersion Write F_AfterGetDatabaseVersion;
  87.     Property AfterGetNumberOfUsers   : TInfoCheckEvent Read F_AfterGetNumberOfUsers   Write F_AfterGetNumberOfUsers;
  88.     Property AfterGetLoggedUsers     : TInfoCheckEvent Read F_AfterGetLoggedUsers     Write F_AfterGetLoggedUsers;
  89.     Property AfterGetLoggedUsersEx   : TInfoCheckEvent Read F_AfterGetLoggedUsersEx   Write F_AfterGetLoggedUsersEx;
  90.     Property AfterGetLoggedNowUsers  : TInfoCheckEvent Read F_AfterGetLoggedNowUsers  Write F_AfterGetLoggedNowUsers;
  91.     Property AfterGetErrorUsers      : TInfoCheckEvent Read F_AfterGetErrorUsers      Write F_AfterGetErrorUsers;
  92.  
  93.     Property Active                  : Boolean       Read F_Active                    Write F_Set_Active;
  94.   end;
  95.  
  96. procedure Register;
  97.  
  98. implementation
  99. Uses
  100.   ActiveX, DaoUtils;
  101.  
  102. Constructor TKADaoInfo.Create(AOwner: TComponent);
  103. var
  104.    Tmp : String;
  105. Begin
  106.   Inherited Create(AOwner);
  107.   F_Active             := False;
  108.   F_Database           := '';
  109.   F_DatabaseVersion    := 0;
  110.   F_NumberOfUsers      := 0;
  111.   F_LoggedUsers        := TStringList.Create;
  112.   F_LoggedInfo         := TStringList.Create;
  113.   F_LoggedNowUsers     := TStringList.Create;
  114.   F_ErrorUsers         := TStringList.Create;
  115.   F_LastError          := 0;
  116.   F_LastErrorText      := '';
  117.   GetDir(0,Tmp);
  118.   F_DaoDll             := 'msldbusr.dll';
  119. End;
  120.  
  121. Destructor TKADaoInfo.Destroy;
  122. Begin
  123.   F_LoggedUsers.Free;
  124.   F_LoggedInfo.Free;
  125.   F_LoggedNowUsers.Free;
  126.   F_ErrorUsers.Free;
  127.   Inherited Destroy;
  128. End;
  129.  
  130. Procedure TKADaoInfo.F_Set_Active(Value:Boolean);
  131. Begin
  132.  F_Active := Value;
  133.  if F_Active Then
  134.     Begin
  135.       KAGetDatabaseVersion(F_DaoDll,F_Database);
  136.       if Assigned(F_AfterGetDatabaseVersion) Then F_AfterGetDatabaseVersion;
  137.       KAGetNumberOfUsers(F_DaoDll,F_Database);
  138.       if Assigned(F_AfterGetNumberOfUsers) Then F_AfterGetNumberOfUsers;
  139.       KAGetLoggedUsers(F_DaoDll,F_Database);
  140.       if Assigned(F_AfterGetLoggedUsers) Then F_AfterGetLoggedUsers;
  141.       KAGetLoggedNowUsers(F_DaoDll,F_Database);
  142.       if Assigned(F_AfterGetLoggedNowUsers) Then F_AfterGetLoggedNowUsers;
  143.       KAGetErrorUsers(F_DaoDll,F_Database);
  144.       if Assigned(F_AfterGetErrorUsers) Then F_AfterGetErrorUsers;
  145.       KAGetLoggedInfo(F_Database);
  146.       if Assigned(F_AfterGetLoggedUsersEx) Then F_AfterGetLoggedUsersEx;
  147.     End;
  148. End;
  149.  
  150. Function TKADaoInfo.KAGetDatabaseVersion(LibraryName,DatabasePath:String):Integer;
  151. Var
  152.   LibHandle          : HMODULE;
  153.   GetDatabaseVersion : function (DBPath:PChar): Integer; stdcall;
  154.   GetLastError       : function (ErrorNo:Integer): PChar; stdcall;
  155. Begin
  156.   Result := 0;
  157.   LibHandle:=LoadLibrary(PChar(LibraryName));
  158.   IF LibHandle=0 Then
  159.      Begin
  160.        Result:=-1000;
  161.        F_LastError:=Result;
  162.        F_LastErrorText:='DLL Library not found!';
  163.        Exit;
  164.      End;
  165.   @GetDatabaseVersion:=GetProcAddress(LibHandle,'LDBUser_GetDatabaseVersion');
  166.   @GetLastError:=GetProcAddress(LibHandle,'LDBUser_GetError');
  167.   if @GetDatabaseVersion <> Nil Then
  168.      Begin
  169.        Result:=GetDatabaseVersion(PChar(DatabasePath));
  170.        if Result < 0 Then
  171.           Begin
  172.             F_LastError:=Result;
  173.             F_LastErrorText:=StrPas(GetLastError(F_LastError));
  174.           End;
  175.      End;
  176.   FreeLibrary(LibHandle);
  177. End;
  178.  
  179. Function TKADaoInfo.KAGetNumberOfUsers(LibraryName,DatabasePath:String):Integer;
  180. Var
  181.   LibHandle          : HMODULE;
  182.   GetNumberOfUsers   : function (UserBuffer:PChar;DBPath:PChar;Options:Integer): Integer; stdcall;
  183.   GetLastError       : function (ErrorNo:Integer): PChar; stdcall;
  184.   UserBuffer         : PChar;
  185. Begin
  186.   Result := 0;
  187.   LibHandle:=LoadLibrary(PChar(LibraryName));
  188.   IF LibHandle=0 Then
  189.      Begin
  190.        Result:=-1000;
  191.        F_LastError:=Result;
  192.        F_LastErrorText:='DLL Library not found!';
  193.        Exit;
  194.      End;
  195.   @GetNumberOfUsers:=GetProcAddress(LibHandle,'LDBUser_GetUsers');
  196.   @GetLastError:=GetProcAddress(LibHandle,'LDBUser_GetError');
  197.   if @GetNumberOfUsers <> Nil Then
  198.      Begin
  199.        UserBuffer:=Nil;
  200.        Result:=GetNumberOfUsers(UserBuffer,PChar(DatabasePath),8);
  201.        if Result < 0 Then
  202.           Begin
  203.             F_LastError:=Result;
  204.             F_LastErrorText:=StrPas(GetLastError(F_LastError));
  205.           End;
  206.      End;
  207.   FreeLibrary(LibHandle);
  208. End;
  209.  
  210. Function TKADaoInfo.KAGetLoggedUsers(LibraryName,DatabasePath:String):Integer;
  211. Var
  212.   LibHandle          : HMODULE;
  213.   GetLoggedUsers     : function (UserBuffer:PSafeArray;DBPath:PChar;Options:Integer): Integer; stdcall;
  214.   GetLastError       : function (ErrorNo:Integer): PChar; stdcall;
  215.   UserList           : PSafeArray;
  216.   sabUserList        : TSafeArrayBound;
  217.   X                  : Integer;
  218.   HR                 : HResult;
  219.   P                  : PChar;
  220. Begin
  221.   Result := 0;
  222.   F_LoggedUsers.Clear;
  223.   LibHandle:=LoadLibrary(PChar(LibraryName));
  224.   IF LibHandle=0 Then
  225.      Begin
  226.        Result:=-1000;
  227.        F_LastError:=Result;
  228.        F_LastErrorText:='DLL Library not found!';
  229.        Exit;
  230.      End;
  231.   @GetLoggedUsers:=GetProcAddress(LibHandle,'LDBUser_GetUsers');
  232.   @GetLastError:=GetProcAddress(LibHandle,'LDBUser_GetError');
  233.   if @GetLoggedUsers <> Nil Then
  234.      Begin
  235.        F_LastError:=0;
  236.        F_LastErrorText:='';
  237.        sabUserList.lLbound    := 1;
  238.        sabUserList.cElements    := 1;
  239.        UserList            := SafeArrayCreate(VT_BSTR, 1, sabUserList);
  240.        Result:=GetLoggedUsers(@UserList,PChar(DatabasePath),1);
  241.        if Result > 0 Then
  242.           Begin
  243.             For X:=1 To Result do
  244.                 Begin
  245.                   HR := SafeArrayGetElement(UserList, X, P);
  246.                   if HR=S_OK Then
  247.                      Begin
  248.                        F_LoggedUsers.Add(StrPas(P));
  249.                      End;
  250.                 End;
  251.           End
  252.        Else
  253.        if Result < 0 Then
  254.           Begin
  255.             F_LastError:=Result;
  256.             F_LastErrorText:=StrPas(GetLastError(F_LastError));
  257.           End;
  258.        SafeArrayDestroy(UserList);
  259.      End;
  260.   FreeLibrary(LibHandle);
  261. End;
  262.  
  263. Function TKADaoInfo.KAGetLoggedNowUsers(LibraryName,DatabasePath:String):Integer;
  264. Var
  265.   LibHandle          : HMODULE;
  266.   GetLoggedNowUsers  : function (UserBuffer:PSafeArray;DBPath:PChar;Options:Integer): Integer; stdcall;
  267.   GetLastError       : function (ErrorNo:Integer): PChar; stdcall;
  268.   UserList           : PSafeArray;
  269.   sabUserList        : TSafeArrayBound;
  270.   X                  : Integer;
  271.   HR                 : HResult;
  272.   P                  : PChar;
  273. Begin
  274.   Result := 0;
  275.   F_LoggedNowUsers.Clear;
  276.   LibHandle:=LoadLibrary(PChar(LibraryName));
  277.   IF LibHandle=0 Then
  278.      Begin
  279.        Result:=-1000;
  280.        F_LastError:=Result;
  281.        F_LastErrorText:='DLL Library not found!';
  282.        Exit;
  283.      End;
  284.   @GetLoggedNowUsers:=GetProcAddress(LibHandle,'LDBUser_GetUsers');
  285.   @GetLastError:=GetProcAddress(LibHandle,'LDBUser_GetError');
  286.   if @GetLoggedNowUsers <> Nil Then
  287.      Begin
  288.        F_LastError:=0;
  289.        F_LastErrorText:='';
  290.        sabUserList.lLbound    := 1;
  291.        sabUserList.cElements    := 1;
  292.        UserList            := SafeArrayCreate(VT_BSTR, 1, sabUserList);
  293.        Result:=GetLoggedNowUsers(@UserList,PChar(DatabasePath),2);
  294.        if Result > 0 Then
  295.           Begin
  296.             For X:=1 To Result do
  297.                 Begin
  298.                   HR := SafeArrayGetElement(UserList, X, P);
  299.                   if HR=S_OK Then
  300.                      Begin
  301.                        F_LoggedNowUsers.Add(StrPas(P));
  302.                      End;
  303.                 End;
  304.           End
  305.        Else
  306.        if Result < 0 Then
  307.           Begin
  308.             F_LastError:=Result;
  309.             F_LastErrorText:=StrPas(GetLastError(F_LastError));
  310.           End;
  311.        SafeArrayDestroy(UserList);
  312.      End;
  313.   FreeLibrary(LibHandle);
  314. End;
  315.  
  316. Function TKADaoInfo.KAGetErrorUsers(LibraryName,DatabasePath:String):Integer;
  317. Var
  318.   LibHandle          : HMODULE;
  319.   GetErrorUsers      : function (UserBuffer:PSafeArray;DBPath:PChar;Options:Integer): Integer; stdcall;
  320.   GetLastError       : function (ErrorNo:Integer): PChar; stdcall;
  321.   UserList           : PSafeArray;
  322.   sabUserList        : TSafeArrayBound;
  323.   X                  : Integer;
  324.   HR                 : HResult;
  325.   P                  : PChar;
  326. Begin
  327.   Result := 0;
  328.   F_ErrorUsers.Clear;
  329.   LibHandle:=LoadLibrary(PChar(LibraryName));
  330.   IF LibHandle=0 Then
  331.      Begin
  332.        Result:=-1000;
  333.        F_LastError:=Result;
  334.        F_LastErrorText:='DLL Library not found!';
  335.        Exit;
  336.      End;
  337.   @GetErrorUsers:=GetProcAddress(LibHandle,'LDBUser_GetUsers');
  338.   @GetLastError:=GetProcAddress(LibHandle,'LDBUser_GetError');
  339.   if @GetErrorUsers <> Nil Then
  340.      Begin
  341.        F_LastError:=0;
  342.        F_LastErrorText:='';
  343.        sabUserList.lLbound    := 1;
  344.        sabUserList.cElements    := 1;
  345.        UserList            := SafeArrayCreate(VT_BSTR, 1, sabUserList);
  346.        Result:=GetErrorUsers(@UserList,PChar(DatabasePath),4);
  347.        if Result > 0 Then
  348.           Begin
  349.             For X:=1 To Result do
  350.                 Begin
  351.                   HR := SafeArrayGetElement(UserList, X, P);
  352.                   if HR=S_OK Then
  353.                      Begin
  354.                        F_ErrorUsers.Add(StrPas(P));
  355.                      End;
  356.                 End;
  357.           End
  358.        Else
  359.        if Result < 0 Then
  360.           Begin
  361.             F_LastError:=Result;
  362.             F_LastErrorText:=StrPas(GetLastError(F_LastError));
  363.           End;
  364.        SafeArrayDestroy(UserList);
  365.      End;
  366.   FreeLibrary(LibHandle);
  367. End;
  368.  
  369. Function TKADaoInfo.KAGetLoggedInfo(DatabasePath:String):Boolean;
  370. Var
  371.   FP  : String;
  372.   FN  : String;
  373.   S   : String;
  374.   FNA : Array[0..1000] of Char;
  375.   P   : PChar;
  376.   F   : File;
  377.   NR  : Integer;
  378.   X   : Integer;
  379.   I   : Integer;
  380. Begin
  381.   Result := False;
  382.   F_LoggedInfo.Clear;
  383.   if NOT FileExists(DatabasePath) Then Exit;
  384.   FP := ExtractFilePath(DatabasePath);
  385.   FN := ExtractFileName(DatabasePath);
  386.   StrPCopy(FNA,FN);
  387.   P:=StrRScan(FNA,'.');
  388.   if P <> Nil Then P[0]:=#0;
  389.   StrCat(FNA,'.ldb');
  390.   FN  :=FP+StrPas(FNA);
  391.   if NOT FileExists(FN) Then Exit;
  392.   AssignFile(F,FN);
  393.   FileMode := 0;
  394.   Reset(F,1);
  395.   BlockRead(F,LU,SizeOf(LU),NR);
  396.   Close(F);
  397.   if NR=0 Then Exit;
  398.   For X :=0 To (NR DIV 64)-1 do
  399.       Begin
  400.         SetString(S,LU[X],64);
  401.         FP:=Copy(S,1,32);
  402.         Delete(S,1,32);
  403.         I:=Pos(#0,S);
  404.         if I > 0 Then S := Copy(S,1,I-1);
  405.         I:=Pos(#0,FP);
  406.         if I > 0 Then FP := Copy(FP,1,I-1);
  407.         F_LoggedInfo.Add(FP+'/'+S);
  408.       End;
  409.   Result := True;
  410. End;
  411.  
  412. Function TKADaoInfo.F_GET_LoggedUsers : TStringList;
  413. Begin
  414.   if F_Active Then KAGETLoggedUsers(F_DaoDll,F_Database);
  415.   Result := F_LoggedUsers;
  416. End;
  417.  
  418. Procedure TKADaoInfo.F_SET_LoggedUsers(Value:TStringList);
  419. Begin
  420.  //****************************************************************** Read Onlly
  421. End;
  422.  
  423. Function  TKADaoInfo.F_GET_LoggedNowUsers : TStringList;
  424. Begin
  425.   if F_Active Then KAGETLoggedNowUsers(F_DaoDll,F_Database);
  426.   Result := F_LoggedNowUsers;
  427. End;
  428.  
  429. Procedure TKADaoInfo.F_SET_LoggedNowUsers(Value:TStringList);
  430. Begin
  431.  //****************************************************************** Read Onlly
  432. End;
  433.  
  434. Function  TKADaoInfo.F_GET_ErrorUsers : TStringList;
  435. Begin
  436.   if F_Active Then KAGETErrorUsers(F_DaoDll,F_Database);
  437.   Result := F_ErrorUsers;
  438. End;
  439.  
  440. Procedure TKADaoInfo.F_SET_ErrorUsers(Value:TStringList);
  441. Begin
  442.  //****************************************************************** Read Onlly
  443. End;
  444.  
  445. Function  TKADaoInfo.F_GET_DatabaseVersion :Integer;
  446. Begin
  447.  Result:=0;
  448.  if F_Active Then Result:=KAGETDatabaseVersion(F_DaoDll,F_Database);
  449.  if Result < 0 Then Result:=0;
  450. End;
  451.  
  452. Procedure TKADaoInfo.F_SET_DatabaseVersion (Value:Integer);
  453. Begin
  454.  //****************************************************************** Read Onlly
  455. End;
  456.  
  457. Function TKADaoInfo.F_GET_NumberOfUsers :Integer;
  458. Begin
  459.   Result:=0;
  460.   if F_Active Then Result:=KAGETNumberOfUsers(F_DaoDll,F_Database);
  461.   if Result < 0 Then Result:=0;
  462. End;
  463.  
  464. Procedure  TKADaoInfo.F_SET_NumberOfUsers (Value:Integer);
  465. Begin
  466.  //****************************************************************** Read Onlly
  467. End;
  468.  
  469. Procedure  TKADaoInfo.F_SET_LastError(Value:Integer);
  470. Begin
  471.  //****************************************************************** Read Onlly
  472. End;
  473.  
  474. Procedure  TKADaoInfo.F_SET_LastErrorText(Value:String);
  475. Begin
  476.  //****************************************************************** Read Onlly
  477. End;
  478.  
  479. Function TKADaoInfo.F_GET_LoggedUsersEx:TStringList;
  480. Begin
  481.  Result := F_LoggedInfo;
  482.  if F_Active Then KAGetLoggedInfo(F_Database);
  483. End;
  484.  
  485. Procedure TKADaoInfo.F_SET_LoggedUsersEx(Value:TStringList);
  486. Begin
  487.  //****************************************************************** Read Onlly
  488. End;
  489.  
  490. procedure Register;
  491. begin
  492.   RegisterComponents('KA Dao', [TKADaoInfo]);
  493. end;
  494.  
  495. end.
  496.