source: tags/1.1.0/Packages/Common/UCommon.pas

Last change on this file was 116, checked in by chronos, 8 years ago
  • Modified: Updated Common package.
File size: 13.2 KB
Line 
1unit UCommon;
2
3{$mode delphi}
4
5interface
6
7uses
8 {$ifdef Windows}Windows,{$endif}
9 {$ifdef Linux}baseunix,{$endif}
10 Classes, SysUtils, StrUtils, Dialogs, Process, LCLIntf,
11 FileUtil; //, ShFolder, ShellAPI;
12
13type
14 TArrayOfByte = array of Byte;
15 TArrayOfString = array of string;
16 TExceptionEvent = procedure(Sender: TObject; E: Exception) of object;
17
18 TUserNameFormat = (
19 unfNameUnknown = 0, // Unknown name type.
20 unfNameFullyQualifiedDN = 1, // Fully qualified distinguished name
21 unfNameSamCompatible = 2, // Windows NT® 4.0 account name
22 unfNameDisplay = 3, // A "friendly" display name
23 unfNameUniqueId = 6, // GUID string that the IIDFromString function returns
24 unfNameCanonical = 7, // Complete canonical name
25 unfNameUserPrincipal = 8, // User principal name
26 unfNameCanonicalEx = 9,
27 unfNameServicePrincipal = 10, // Generalized service principal name
28 unfDNSDomainName = 11);
29
30var
31 ExceptionHandler: TExceptionEvent;
32 DLLHandle1: HModule;
33
34{$IFDEF Windows}
35 GetUserNameEx: procedure (NameFormat: DWORD;
36 lpNameBuffer: LPSTR; nSize: PULONG); stdcall;
37{$ENDIF}
38
39function IntToBin(Data: Int64; Count: Byte): string;
40function BinToInt(BinStr: string): Int64;
41function TryHexToInt(Data: string; var Value: Integer): Boolean;
42function TryBinToInt(Data: string; var Value: Integer): Boolean;
43function BinToHexString(Source: AnsiString): string;
44//function DelTree(DirName : string): Boolean;
45//function GetSpecialFolderPath(Folder: Integer): string;
46function BCDToInt(Value: Byte): Byte;
47function CompareByteArray(Data1, Data2: TArrayOfByte): Boolean;
48function GetUserName: string;
49function LoggedOnUserNameEx(Format: TUserNameFormat): string;
50function SplitString(var Text: string; Count: Word): string;
51function GetBitCount(Variable: QWord; MaxIndex: Integer): Integer;
52function GetBit(Variable: QWord; Index: Byte): Boolean;
53procedure SetBit(var Variable: Int64; Index: Byte; State: Boolean); overload;
54procedure SetBit(var Variable: QWord; Index: Byte; State: Boolean); overload;
55procedure SetBit(var Variable: Cardinal; Index: Byte; State: Boolean); overload;
56procedure SetBit(var Variable: Word; Index: Byte; State: Boolean); overload;
57function AddLeadingZeroes(const aNumber, Length : integer) : string;
58function LastPos(const SubStr: String; const S: String): Integer;
59function GenerateNewName(OldName: string): string;
60function GetFileFilterItemExt(Filter: string; Index: Integer): string;
61procedure FileDialogUpdateFilterFileType(FileDialog: TOpenDialog);
62procedure DeleteFiles(APath, AFileSpec: string);
63procedure OpenWebPage(URL: string);
64procedure OpenFileInShell(FileName: string);
65procedure ExecuteProgram(CommandLine: string);
66procedure FreeThenNil(var Obj);
67function RemoveQuotes(Text: string): string;
68function ComputerName: string;
69function OccurenceOfChar(What: Char; Where: string): Integer;
70function GetDirCount(Dir: string): Integer;
71function MergeArray(A, B: array of string): TArrayOfString;
72
73
74implementation
75
76function BinToInt(BinStr : string) : Int64;
77var
78 i : byte;
79 RetVar : Int64;
80begin
81 BinStr := UpperCase(BinStr);
82 if BinStr[length(BinStr)] = 'B' then Delete(BinStr,length(BinStr),1);
83 RetVar := 0;
84 for i := 1 to length(BinStr) do begin
85 if not (BinStr[i] in ['0','1']) then begin
86 RetVar := 0;
87 Break;
88 end;
89 RetVar := (RetVar shl 1) + (byte(BinStr[i]) and 1) ;
90 end;
91
92 Result := RetVar;
93end;
94
95function BinToHexString(Source: AnsiString): string;
96var
97 I: Integer;
98begin
99 for I := 1 to Length(Source) do begin
100 Result := Result + LowerCase(IntToHex(Ord(Source[I]), 2));
101 end;
102end;
103
104
105procedure DeleteFiles(APath, AFileSpec: string);
106var
107 SearchRec: TSearchRec;
108 Find: Integer;
109 Path: string;
110begin
111 Path := IncludeTrailingPathDelimiter(APath);
112
113 Find := FindFirst(UTF8Decode(Path + AFileSpec), faAnyFile xor faDirectory, SearchRec);
114 while Find = 0 do begin
115 DeleteFile(Path + UTF8Encode(SearchRec.Name));
116
117 Find := SysUtils.FindNext(SearchRec);
118 end;
119 FindClose(SearchRec);
120end;
121
122
123function GetFileFilterItemExt(Filter: string; Index: Integer): string;
124var
125 List: TStringList;
126begin
127 try
128 List := TStringList.Create;
129 List.Text := StringReplace(Filter, '|', #10, [rfReplaceAll]);
130 Result := List[Index * 2 + 1];
131 finally
132 List.Free;
133 end;
134end;
135
136procedure FileDialogUpdateFilterFileType(FileDialog: TOpenDialog);
137var
138 FileExt: string;
139begin
140 FileExt := GetFileFilterItemExt(FileDialog.Filter, FileDialog.FilterIndex - 1);
141 Delete(FileExt, 1, 1); // Remove symbol '*'
142 if FileExt <> '.*' then
143 FileDialog.FileName := ChangeFileExt(FileDialog.FileName, FileExt)
144end;
145
146function GenerateNewName(OldName: string): string;
147var
148 I: Integer;
149 Number: Integer;
150begin
151 Number := 1;
152 // Find number on end
153 if Length(OldName) > 0 then begin
154 I := Length(OldName);
155 while (I > 1) and ((OldName[I] >= '0') and (OldName[I] <= '9')) do Dec(I);
156 TryStrToInt(Copy(OldName, I + 1, Length(OldName) - I), Number);
157 Inc(Number)
158 end;
159 Result := Copy(OldName, 1, I) + IntToStr(Number);
160end;
161
162(*function DelTree(DirName : string): Boolean;
163var
164 SHFileOpStruct : TSHFileOpStruct;
165 DirBuf : array [0..255] of char;
166begin
167 DirName := UTF8Decode(DirName);
168 try
169 Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ;
170 FillChar(DirBuf, Sizeof(DirBuf), 0 ) ;
171 StrPCopy(DirBuf, DirName) ;
172 with SHFileOpStruct do begin
173 Wnd := 0;
174 pFrom := @DirBuf;
175 wFunc := FO_DELETE;
176 fFlags := FOF_ALLOWUNDO;
177 fFlags := fFlags or FOF_NOCONFIRMATION;
178 fFlags := fFlags or FOF_SILENT;
179 end;
180 Result := (SHFileOperation(SHFileOpStruct) = 0) ;
181 except
182 Result := False;
183 end;
184end;*)
185
186function LastPos(const SubStr: String; const S: String): Integer;
187begin
188 Result := Pos(ReverseString(SubStr), ReverseString(S));
189 if (Result <> 0) then
190 Result := ((Length(S) - Length(SubStr)) + 1) - Result + 1;
191end;
192
193function BCDToInt(Value: Byte): Byte;
194begin
195 Result := (Value shr 4) * 10 + (Value and 15);
196end;
197
198(*function GetSpecialFolderPath(Folder: Integer): string;
199const
200 SHGFP_TYPE_CURRENT = 0;
201var
202 Path: array[0..MAX_PATH] of Char;
203begin
204 Result := 'C:\Test';
205 if SUCCEEDED(SHGetFolderPath(0, Folder, 0, SHGFP_TYPE_CURRENT, @path[0])) then
206 Result := path
207 else
208 Result := '';
209end;*)
210
211function IntToBin(Data: Int64; Count: Byte): string;
212var
213 I: Integer;
214begin
215 Result := '';
216 for I := 0 to Count - 1 do
217 Result := IntToStr((Data shr I) and 1) + Result;
218end;
219
220function IntToHex(Data: Cardinal; Count: Byte): string;
221const
222 Chars: array[0..15] of Char = '0123456789ABCDEF';
223var
224 I: Integer;
225begin
226 Result := '';
227 for I := 0 to Count - 1 do
228 Result := Result + Chars[(Data shr (I * 4)) and 15];
229end;
230
231function TryHexToInt(Data: string; var Value: Integer): Boolean;
232var
233 I: Integer;
234begin
235 Data := UpperCase(Data);
236 Result := True;
237 Value := 0;
238 for I := 0 to Length(Data) - 1 do begin
239 if (Data[I + 1] >= '0') and (Data[I + 1] <= '9') then
240 Value := Value or (Ord(Data[I + 1]) - Ord('0')) shl ((Length(Data) - I - 1) * 4)
241 else if (Data[I + 1] >= 'A') and (Data[I + 1] <= 'F') then
242 Value := Value or (Ord(Data[I + 1]) - Ord('A') + 10) shl ((Length(Data) - I - 1) * 4)
243 else Result := False;
244 end;
245end;
246
247function TryBinToInt(Data: string; var Value: Integer): Boolean;
248var
249 I: Integer;
250begin
251 Result := True;
252 Value := 0;
253 for I := 0 to Length(Data) - 1 do begin
254 if (Data[I + 1] >= '0') and (Data[I + 1] <= '1') then
255 Value := Value or (Ord(Data[I + 1]) - Ord('0')) shl ((Length(Data) - I - 1))
256 else Result := False;
257 end;
258end;
259
260function CompareByteArray(Data1, Data2: TArrayOfByte): Boolean;
261var
262 I: Integer;
263begin
264 if Length(Data1) = Length(Data2) then begin
265 Result := True;
266 for I := 0 to Length(Data1) - 1 do begin
267 if Data1[I] <> Data2[I] then begin
268 Result := False;
269 Break;
270 end
271 end;
272 end else Result := False;
273end;
274
275function Explode(Separator: char; Data: string): TArrayOfString;
276begin
277 SetLength(Result, 0);
278 while Pos(Separator, Data) > 0 do begin
279 SetLength(Result, Length(Result) + 1);
280 Result[High(Result)] := Copy(Data, 1, Pos(Separator, Data) - 1);
281 Delete(Data, 1, Pos(Separator, Data));
282 end;
283 SetLength(Result, Length(Result) + 1);
284 Result[High(Result)] := Data;
285end;
286
287{$IFDEF Windows}
288function GetUserName: string;
289const
290 MAX_USERNAME_LENGTH = 256;
291var
292 L: LongWord;
293begin
294 L := MAX_USERNAME_LENGTH + 2;
295 SetLength(Result, L);
296 if Windows.GetUserName(PChar(Result), L) and (L > 0) then begin
297 SetLength(Result, StrLen(PChar(Result)));
298 Result := UTF8Encode(Result);
299 end else Result := '';
300end;
301
302function GetVersionInfo: TOSVersionInfo;
303begin
304 Result.dwOSVersionInfoSize := SizeOf(Result);
305 if GetVersionEx(Result) then begin
306 end;
307end;
308{$endif}
309
310function ComputerName: string;
311{$ifdef mswindows}
312const
313 INFO_BUFFER_SIZE = 32767;
314var
315 Buffer : array[0..INFO_BUFFER_SIZE] of WideChar;
316 Ret : DWORD;
317begin
318 Ret := INFO_BUFFER_SIZE;
319 If (GetComputerNameW(@Buffer[0],Ret)) then begin
320 Result := UTF8Encode(WideString(Buffer));
321 end
322 else begin
323 Result := 'ERROR_NO_COMPUTERNAME_RETURNED';
324 end;
325end;
326{$endif}
327{$ifdef unix}
328var
329 Name: UtsName;
330begin
331 fpuname(Name);
332 Result := Name.Nodename;
333end;
334{$endif}
335
336{$ifdef windows}
337function LoggedOnUserNameEx(Format: TUserNameFormat): string;
338const
339 MaxLength = 1000;
340var
341 UserName: array[0..MaxLength] of Char;
342 VersionInfo: TOSVersionInfo;
343 Size: DWORD;
344begin
345 VersionInfo := GetVersionInfo;
346 if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
347 Size := MaxLength;
348 GetUserNameEx(Integer(Format), @UserName, @Size);
349 //ShowMessage(SysErrorMessage(GetLastError));
350 if GetLastError = 0 then Result := UTF8Encode(UserName)
351 else Result := GetUserName;
352 end else Result := GetUserName;
353end;
354{$ELSE}
355function GetUserName: string;
356begin
357 Result := '';
358end;
359
360function LoggedOnUserNameEx(Format: TUserNameFormat): string;
361begin
362 Result := '';
363end;
364
365{$ENDIF}
366
367function SplitString(var Text: string; Count: Word): string;
368begin
369 Result := Copy(Text, 1, Count);
370 Delete(Text, 1, Count);
371end;
372
373function GetBitCount(Variable: QWord; MaxIndex: Integer): Integer;
374var
375 I: Integer;
376begin
377 Result := 0;
378 for I := 0 to MaxIndex - 1 do
379 if ((Variable shr I) and 1) = 1 then Inc(Result);
380end;
381
382function GetBit(Variable:QWord;Index:Byte):Boolean;
383begin
384 Result := ((Variable shr Index) and 1) = 1;
385end;
386
387procedure SetBit(var Variable: Int64; Index: Byte; State: Boolean);
388begin
389 Variable := (Variable and ((1 shl Index) xor High(QWord))) or (Int64(State) shl Index);
390end;
391
392procedure SetBit(var Variable:QWord;Index:Byte;State:Boolean); overload;
393begin
394 Variable := (Variable and ((1 shl Index) xor High(QWord))) or (QWord(State) shl Index);
395end;
396
397procedure SetBit(var Variable:Cardinal;Index:Byte;State:Boolean); overload;
398begin
399 Variable := (Variable and ((1 shl Index) xor High(Cardinal))) or (Cardinal(State) shl Index);
400end;
401
402procedure SetBit(var Variable:Word;Index:Byte;State:Boolean); overload;
403begin
404 Variable := (Variable and ((1 shl Index) xor High(Word))) or (Word(State) shl Index);
405end;
406
407function AddLeadingZeroes(const aNumber, Length : integer) : string;
408begin
409 Result := SysUtils.Format('%.*d', [Length, aNumber]) ;
410end;
411
412procedure LoadLibraries;
413begin
414 {$IFDEF Windows}
415 DLLHandle1 := LoadLibrary('secur32.dll');
416 if DLLHandle1 <> 0 then
417 begin
418 @GetUserNameEx := GetProcAddress(DLLHandle1, 'GetUserNameExA');
419 end;
420 {$ENDIF}
421end;
422
423procedure FreeLibraries;
424begin
425 {$IFDEF Windows}
426 if DLLHandle1 <> 0 then FreeLibrary(DLLHandle1);
427 {$ENDIF}
428end;
429
430procedure ExecuteProgram(CommandLine: string);
431var
432 Process: TProcess;
433begin
434 try
435 Process := TProcess.Create(nil);
436 Process.CommandLine := CommandLine;
437 Process.Options := [poNoConsole];
438 Process.Execute;
439 finally
440 Process.Free;
441 end;
442end;
443
444procedure FreeThenNil(var Obj);
445begin
446 TObject(Obj).Free;
447 TObject(Obj) := nil;
448end;
449
450procedure OpenWebPage(URL: string);
451begin
452 OpenURL(URL);
453end;
454
455procedure OpenFileInShell(FileName: string);
456begin
457 ExecuteProgram('cmd.exe /c start "' + FileName + '"');
458end;
459
460function RemoveQuotes(Text: string): string;
461begin
462 Result := Text;
463 if (Pos('"', Text) = 1) and (Text[Length(Text)] = '"') then
464 Result := Copy(Text, 2, Length(Text) - 2);
465end;
466
467function OccurenceOfChar(What: Char; Where: string): Integer;
468var
469 I: Integer;
470begin
471 Result := 0;
472 for I := 1 to Length(Where) do
473 if Where[I] = What then Inc(Result);
474end;
475
476function GetDirCount(Dir: string): Integer;
477begin
478 Result := OccurenceOfChar(DirectorySeparator, Dir);
479 if Copy(Dir, Length(Dir), 1) = DirectorySeparator then
480 Dec(Result);
481end;
482
483function MergeArray(A, B: array of string): TArrayOfString;
484var
485 I: Integer;
486begin
487 SetLength(Result, Length(A) + Length(B));
488 for I := 0 to Length(A) - 1 do
489 Result[I] := A[I];
490 for I := 0 to Length(B) - 1 do
491 Result[Length(A) + I] := B[I];
492end;
493
494
495
496initialization
497
498LoadLibraries;
499
500
501finalization
502
503FreeLibraries;
504
505end.
Note: See TracBrowser for help on using the repository browser.