Subversion Repositories delphiutils

Rev

Blame | Last modification | View Log | RSS feed

  1. unit test_utils;
  2.  
  3. interface
  4.  
  5. function IsConnected: boolean;
  6. function GetHostname: string;
  7. function GetComputerName: String;
  8. function GetUserName: String;
  9. function GetSystemWinDir: string;
  10. function GetSystemDrive: AnsiChar;
  11. function GetOSVersion: string;
  12. function GetRegisteredOrganisation: string;
  13. function GetRegisteredOwner: string;
  14. function LaufwerkBereit(root: string): boolean;
  15. function GetMyDocuments: string;
  16. function GetLocalAppData: string;
  17. function GetDomainName: string;
  18. function GetWindowsDirectory: string;
  19. // function GetWifiSSID: string;
  20. function GetTempDirectory: String;
  21.  
  22. implementation
  23.  
  24. uses
  25.   Windows, SysUtils, Registry, wininet, shlobj;
  26.  
  27. type
  28.   EAPICallError = Exception;
  29.  
  30. function IsConnected: boolean;
  31. {$IF defined(ANDROID)}
  32. begin
  33.   result := IsConnectedAndroid;
  34. end;
  35. {$ELSEIF defined(MACOS)}
  36. //var
  37.   //IPW: TIdHTTP;
  38. begin
  39.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  40.   result := false;  // TODO: im zweifelsfall lieber true?
  41.  
  42.   // head verzögert den Programmfluss um 1-2 Sekunden...
  43.   // Ip-Watch würde auch eine LAN-Adresse zeigen
  44.   //TIdHTTP.Head('http://registration.rinntech.com');
  45.   //response.code=200 -> true
  46. end;
  47. {$ELSEIF defined(MSWINDOWS)}
  48. var
  49.   origin: Cardinal;
  50. begin
  51.   result := InternetGetConnectedState(@origin, 0);
  52. end;
  53. {$ELSE}
  54. begin
  55.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  56.   result := false;
  57. end;
  58. {$IFEND}
  59.  
  60. var CacheHostname: string;
  61. {$IFDEF MSWindows}
  62. function GetHostname: string;
  63. var
  64.   reg: TRegistry;
  65. begin
  66.   if CacheHostname <> '' then
  67.   begin
  68.     result := CacheHostname;
  69.     Exit;
  70.   end;
  71.   result := '';
  72.   reg := TRegistry.Create;
  73.   try
  74.     reg.RootKey := HKEY_LOCAL_MACHINE;
  75.     if reg.OpenKeyReadOnly
  76.       ('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') then
  77.     begin
  78.       result := reg.ReadString('Hostname');
  79.       reg.CloseKey;
  80.     end;
  81.   finally
  82.     reg.Free;
  83.   end;
  84.   CacheHostname := result;
  85. end;
  86. {$ELSE}
  87. function GetHostname: string;
  88. {$IFDEF MACOS}
  89. var
  90.   buff: array [0 .. 255] of AnsiChar;
  91. {$ENDIF}
  92. begin
  93.   if CacheHostname <> '' then
  94.   begin
  95.     result := CacheHostname;
  96.     Exit;
  97.   end;
  98.   {$IFDEF MACOS}
  99.   Posix.Unistd.gethostname(buff,sizeof(buff));
  100.   SetString(result, buff, AnsiStrings.strlen(buff));
  101.   CacheHostname := result;
  102.   {$ELSE}
  103.     {$IFDEF ANDROID}
  104.     result := '';
  105.     {$ELSE}
  106.     {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  107.     {$ENDIF}
  108.   {$ENDIF}
  109. end;
  110. {$ENDIF}
  111.  
  112. {$IFDEF MSWindows}
  113. function GetComputerName: String;
  114. var
  115.   buffer: array [0 .. MAX_PATH] of Char;
  116.   Size: dWord;
  117. begin
  118.   Size := SizeOf(buffer);
  119.   Windows.GetComputerName(buffer, Size);
  120.   SetString(result, buffer, lstrlen(buffer));
  121. end;
  122. {$ELSE}
  123. function GetComputerName: String;
  124. {$IFDEF MACOS}
  125. var
  126.   Pool: NSAutoreleasePool;
  127.   h : NSHost;
  128. {$ENDIF}
  129. begin
  130.   {$IFDEF MACOS}
  131.   NSDefaultRunLoopMode;
  132.   Pool := TNSAutoreleasePool.Create;
  133.     try
  134.     h := TNSHost.Wrap(TNSHost.OCClass.currentHost);
  135.     result := Format('%s',[h.localizedName.UTF8String]);
  136.   finally
  137.     Pool.drain;
  138.   end;
  139.   {$ELSE}
  140.     {$IFDEF ANDROID}
  141.     //TODO: anderer/richtiger name ... AccountManager for email adress, Telephony mngr etc.
  142.     result := JStringToString(TJBuild.JavaClass.SERIAL);
  143.     {$ELSE}
  144.     {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  145.     result := '';
  146.     {$ENDIF}
  147.   {$ENDIF}
  148. end;
  149. {$ENDIF}
  150.  
  151. {$IFDEF MACOS}
  152. function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU +'NSUserName';
  153. function NSFullUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU + 'NSFullUserName';
  154. {$ENDIF}
  155.  
  156. {$IFDEF MSWindows}
  157. function GetUserName: String;
  158. var
  159.   buffer: array [0 .. MAX_PATH] of Char;
  160.   Size: dWord;
  161. begin
  162.   Size := SizeOf(buffer);
  163.  
  164.   if Windows.GetUserName(Buffer, Size) then
  165.   begin
  166.     // SetString(result, buffer, lstrlen(buffer));
  167.     Result := StrPas(Buffer);
  168.   end
  169.   else
  170.   begin
  171.     Result := '';
  172.   end;
  173. end;
  174. {$ELSE}
  175. function GetUserName: String;
  176. begin
  177.   {$IFDEF MACOS}
  178.   result := Format('%s',[TNSString.Wrap(NSUserName).UTF8String]);
  179.   {$ELSE}
  180.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  181.   result := '';
  182.   {$ENDIF}
  183. end;
  184. {$ENDIF}
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192. {$IFDEF MSWindows}
  193. function GetSystemWinDir: string;
  194. var
  195.   h: HModule;
  196.   {$IFDEF UNICODE}
  197.   f: function(lpBuffer: LPWSTR; uSize: UINT): UINT; stdcall;
  198.   {$ELSE}
  199.   f: function(lpBuffer: LPSTR; uSize: UINT): UINT; stdcall;
  200.   {$ENDIF}
  201.   res: string;
  202.   cnt: UINT;
  203. begin
  204.   h := LoadLibrary(kernel32);
  205.   if h = 0 then RaiseLastOSError;
  206.  
  207.   {$IFDEF UNICODE}
  208.   @f := GetProcAddress(h, 'GetSystemWindowsDirectoryW');
  209.   {$ELSE}
  210.   @f := GetProcAddress(h, 'GetSystemWindowsDirectoryA');
  211.   {$ENDIF}
  212.  
  213.   SetLength(res, MAX_PATH);
  214.   if @f = nil then  // Assigned?
  215.   begin
  216.     // We are probably on Win9x where GetSystemWindowsDirectory* does not exist.
  217.     cnt := Windows.GetWindowsDirectory(PChar(res), MAX_PATH);
  218.   end
  219.   else
  220.   begin
  221.     // We are on a modern system where GetSystemWindowsDirectory* does exist.
  222.     // http://objectmix.com/delphi/402836-getting-hard-drive-letter-windows-runs.html
  223.     // Im Gegensatz zu GetWindowsDirectory zeigt GetSystemWindowsDirectory bei
  224.     // Terminalservern das System-Windows-Verzeichnis und nicht das "private"
  225.     // Windows-Verzeichnis des Users.
  226.     cnt := f(PChar(res), MAX_PATH);
  227.   end;
  228.  
  229.   if cnt <= 0 then RaiseLastOSError;
  230.   result := res;
  231. end;
  232. {$ELSE}
  233. function GetSystemWinDir: string;
  234. begin
  235.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  236.   result := '';
  237. end;
  238. {$ENDIF}
  239.  
  240. function GetSystemDrive: AnsiChar;
  241. var
  242.   res: string;
  243. begin
  244.   res := ExtractFileDrive(GetSystemWinDir);
  245.   Assert(Length(res) >= 1);
  246.   result := AnsiChar(res[1]);
  247. end;
  248.  
  249. function GetOSVersion: string;
  250. {$IF Declared(TOSVersion)}
  251. begin
  252.   result := TOSVersion.ToString;
  253. {$ELSE}
  254. var
  255.   VersionInfo: TOSVersionInfo;
  256. begin
  257.   VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  258.   GetVersionEx(VersionInfo);
  259.   result := IntToStr(VersionInfo.dwPlatformId) + '-' +
  260.     IntToStr(VersionInfo.dwMajorVersion) + '.' +
  261.     IntToStr(VersionInfo.dwMinorVersion) + '-' +
  262.     IntToStr(VersionInfo.dwBuildNumber)
  263. {$IFEND}
  264. end;
  265.  
  266. {$IFDEF MSWindows}
  267. function GetRegisteredOrganisation: string;
  268. var
  269.   reg: TRegistry;
  270.   k: string;
  271.   VersionInfo: TOSVersionInfo;
  272. begin
  273.   result := '';
  274.   reg := TRegistry.Create;
  275.   try
  276.     reg.rootkey := HKEY_LOCAL_MACHINE;
  277.  
  278.     VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  279.     GetVersionEx(VersionInfo);
  280.  
  281.     if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
  282.     begin
  283.       k := '\Software\Microsoft\Windows NT\CurrentVersion';
  284.     end
  285.     else
  286.     begin
  287.       k := '\Software\Microsoft\Windows\CurrentVersion';
  288.     end;
  289.     if reg.OpenKeyReadOnly(k) then
  290.     begin
  291.       result := reg.ReadString('RegisteredOrganization');
  292.       reg.CloseKey;
  293.     end;
  294.   finally
  295.     reg.Free;
  296.   end;
  297. end;
  298. {$ELSE}
  299. function GetRegisteredOrganisation: string;
  300. begin
  301.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  302.   result := '';
  303. end;
  304. {$ENDIF}
  305.  
  306. {$IFDEF MSWindows}
  307. function GetRegisteredOwner: string;
  308. var
  309.   reg: TRegistry;
  310.   k: string;
  311.   VersionInfo: TOSVersionInfo;
  312. begin
  313.   result := '';
  314.   reg := TRegistry.Create;
  315.   try
  316.     reg.rootkey := HKEY_LOCAL_MACHINE;
  317.  
  318.     VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  319.     GetVersionEx(VersionInfo);
  320.  
  321.     if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
  322.     begin
  323.       k := '\Software\Microsoft\Windows NT\CurrentVersion';
  324.     end
  325.     else
  326.     begin
  327.       k := '\Software\Microsoft\Windows\CurrentVersion';
  328.     end;
  329.     if reg.OpenKeyReadOnly(k) then
  330.     begin
  331.       result := reg.ReadString('RegisteredOwner');
  332.       reg.CloseKey;
  333.     end;
  334.   finally
  335.     reg.Free;
  336.   end;
  337. end;
  338. {$ELSE}
  339. function GetRegisteredOwner: string;
  340. begin
  341.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  342.   result := '';
  343. end;
  344. {$ENDIF}
  345.  
  346. {$IFDEF MSWindows}
  347. function LaufwerkBereit(root: string): boolean;
  348. var
  349.   Oem: cardinal;
  350.   Dw1, Dw2: DWORD;
  351. begin
  352.   // http://www.delphi-treff.de/tipps/system/hardware/feststellen-ob-ein-laufwerk-bereit-ist/
  353.   Oem := SetErrorMode(SEM_FAILCRITICALERRORS);
  354.   result := GetVolumeInformation(PCHAR(Root), nil, 0, nil, Dw1, Dw2, nil, 0);
  355.   SetErrorMode(Oem) ;
  356. end;
  357. {$ELSE}
  358. function LaufwerkBereit(root: string): boolean;
  359. begin
  360.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  361.   result := false;
  362. end;
  363. {$ENDIF}
  364.  
  365. {$IFDEF MSWindows}
  366. function GetMyDocuments: string;
  367. var
  368.   r: Bool;
  369.   path: array[0..Max_Path] of Char;
  370. begin
  371.   // TODO: Stattdessen ShGetFolderPath verwenden?
  372.   r := ShGetSpecialFolderPath(0, path, CSIDL_Personal, False);
  373.   if not r then
  374.     raise EAPICallError.Create('Could not find MyDocuments folder location.');
  375.   Result := Path;
  376. end;
  377. {$ELSE}
  378. function GetMyDocuments: string;
  379. begin
  380.   result := TPath.GetDocumentsPath;
  381. end;
  382. {$ENDIF}
  383.  
  384. {$IF not Defined(CSIDL_LOCAL_APPDATA)}
  385. const
  386.   CSIDL_LOCAL_APPDATA = $001c;
  387. {$IFEND}
  388.  
  389. {$IFDEF MSWindows}
  390. function GetLocalAppData: string;
  391. var
  392.   r: Bool;
  393.   path: array[0..Max_Path] of Char;
  394. begin
  395.   // TODO: Stattdessen ShGetFolderPath verwenden?
  396.   r := ShGetSpecialFolderPath(0, path, CSIDL_LOCAL_APPDATA, False);
  397.   if not r then
  398.     raise EAPICallError.Create('Could not find LocalAppData folder location.');
  399.   Result := Path;
  400. end;
  401. {$ELSE}
  402. function GetLocalAppData: string;
  403. begin
  404.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  405.   result := '';
  406. end;
  407. {$ENDIF}
  408.  
  409. {$IFDEF MSWindows}
  410. var CacheDomainName: string;
  411. function GetDomainName: string;
  412. var
  413.   reg: TRegistry;
  414. begin
  415.   if CacheDomainName <> '' then
  416.   begin
  417.     result := CacheDomainName;
  418.     Exit;
  419.   end;
  420.   result := '';
  421.   reg := TRegistry.Create;
  422.   try
  423.     reg.RootKey := HKEY_LOCAL_MACHINE;
  424.     if reg.OpenKeyReadOnly
  425.       ('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') then
  426.     begin
  427.       result := reg.ReadString('Domain');
  428.       reg.CloseKey;
  429.     end;
  430.   finally
  431.     reg.Free;
  432.   end;
  433.   CacheDomainName := result;
  434. end;
  435. {$ELSE}
  436. function GetDomainName: string;
  437. begin
  438.   result := '';
  439.   {$IF DEFINDED(MACOS)}
  440.   //c++ builder kennt die methode:
  441.   //getdomainname(buffer,sizeof(buffer));
  442.   {$ELSEIF DEFINED(ANDROID)}
  443.   result := GetWifiSSID();
  444.   {$ELSE}
  445.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  446.   {$IFEND}
  447. end;
  448. {$ENDIF}
  449.  
  450. {$IFDEF MSWindows}
  451. function GetWindowsDirectory: string;
  452. var
  453.   WinDir: PChar;
  454. begin
  455.   WinDir := StrAlloc(MAX_PATH);
  456.   try
  457.     Windows.GetWindowsDirectory(WinDir, MAX_PATH);
  458.     result := string(WinDir);
  459.   finally
  460.     StrDispose(WinDir);
  461.   end;
  462. end;
  463. {$ELSE}
  464. function GetWindowsDirectory: string;
  465. begin
  466.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  467.   result := '';
  468. end;
  469. {$ENDIF}
  470.  
  471. {$IFDEF MSWindows}
  472. function GetTempDirectory: String;
  473. var
  474.   tempFolder: array [0 .. MAX_PATH] of Char;
  475. begin
  476.   GetTempPath(MAX_PATH, @tempFolder);
  477.   result := StrPas(tempFolder);
  478. end;
  479. {$ELSE}
  480. function GetTempDirectory: String;
  481. begin
  482.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  483.   result := '';
  484. end;
  485. {$ENDIF}
  486.  
  487. end.
  488.