-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathHashInfo.pas
107 lines (89 loc) · 2.31 KB
/
HashInfo.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit HashInfo;
interface
uses system.sysutils, MRC_Helper, CMLTypes;
const
ERR_WRONG_FORMAT = 'Parameter should be in hash:size:name or hash:size format.';
ERR_WRONG_HASH_LENGTH = 'Hash length shoud be exactly 40 symbols.';
ERR_WRONG_SIZE_FORMAT = 'Size should be in numeric format.';
type
THashInfo = class
private
function GetCloudMailRuFileIdentity: TCloudMailRuFileIdentity;
public
hash: WideString;
size: int64;
name: WideString;
valid: boolean;
errorString: WideString;
property CloudFileIdentity: TCloudMailRuFileIdentity read GetCloudMailRuFileIdentity;
constructor Create(parameter: WideString; doClean: boolean = true);
destructor Destroy; override;
end;
implementation
{THashInfo}
(*Ïàðñåð ïàðàìåòðîâ êîìàíäû hash. Êîððåêòíûé ôîðìàò ïàðàìåòðà:
hash:size:name
hash:size
*)
constructor THashInfo.Create(parameter: WideString; doClean: boolean = true);
const
divisor = ':';
var
divisor_position: integer;
sizeString: WideString;
begin
if doClean then //êîìàíäà ìîæåò áûòü ïåðåäàíà ïîëíîñòüþ, íóæíî îïðåäåëèòü è âûïàðñèòü ïàðàìåòð
begin
if (1 = Pos(WideString('hash '), parameter)) then //ýòî êîìàíäà, ÷èñòèì
begin
parameter := copy(parameter, 6, length(parameter) - 5);
parameter := TrimEx(parameter, '"');
end;
end;
self.valid := false;
divisor_position := Pos(WideString(divisor), parameter);
if divisor_position = 0 then
begin
self.errorString := ERR_WRONG_FORMAT;
exit;
end;
self.hash := copy(parameter, 0, divisor_position - 1);
if length(hash) <> 40 then
begin
self.errorString := ERR_WRONG_HASH_LENGTH;
exit;
end;
parameter := copy(parameter, divisor_position + 1);
divisor_position := Pos(WideString(divisor), parameter);
if divisor_position = 0 then
sizeString := parameter
else
begin
sizeString := copy(parameter, 0, divisor_position - 1);
parameter := copy(parameter, divisor_position + 1);
end;
try
self.size := StrToInt64(sizeString);
Except
on E: EConvertError do
begin
self.errorString := ERR_WRONG_SIZE_FORMAT;
exit;
end;
end;
self.valid := true;
if divisor_position = 0 then
self.name := self.hash
else
self.name := parameter;
end;
destructor THashInfo.Destroy;
begin
inherited;
end;
function THashInfo.GetCloudMailRuFileIdentity: TCloudMailRuFileIdentity;
begin
result.hash := self.hash;
result.size := self.size;
end;
end.