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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
{$ifdef BIN_IMPORT_}
var
qhfver:byte;
szMsgHd:word;
UIDstr:UTF8String;
UIDLen,NickLen:word;
NickStr:UTF8String;
function DecodeQHFMsg(ver:byte; adr:integer; cSize:word):string;
function get1(c: char): byte;
begin
if ShortInt(c)>=0 then Result:=Byte(c)
else Result := Byte(c)+256;
end;
function get2(b:byte): char;
begin
if b<128 then result:=Char(b)
else result:=Char(b-256);
end;
var i:integer;
begin
SetLength(Result,cSize);
for i:=1 to cSize do
begin
Result[i]:=PChar(adr+i-1)^;
if ver<>$01 then
begin
inc(Result[i],i);
Result[i]:=get2(255-get1(Result[i]));
end
end;
end;
{$else}
begin
pt:=integer(pFileText);
if FileLen>=$2E then
if (PChar(pt)^='Q') and (PChar(pt+1)^='H') and (PChar(pt+2)^='F') then
begin
qhfver:=PByte(pt+3)^;
if qhfver>=$03 then szMsgHd:=$23
else szMsgHd:=$21;
fsz:=RLInteger(pt+$04);
UIDLen:=RLWord(pt+$2C);
SetLength(UIDstr,UIDLen);
if qhfver<=2 then lstrcpynA(PChar(UIDstr),PChar(pt+$2E),UIDLen)
else lstrcpynA(PChar(UIDstr),PChar(pt+$2E),UIDLen+1);
NickLen:=RLWord(pt+$2E+UIDLen);
SetLength(NickStr,NickLen);
if qhfver<=2 then lstrcpynA(PChar(NickStr),PChar(pt+$2E+UIDLen+2),UIDLen)
else lstrcpynA(PChar(NickStr),PChar(pt+$2E+UIDLen+2),UIDLen+1);
inc(pt,$2E+UIDLen+2+NickLen);
if fsz<>FileLen-($2E+UIDLen+2+NickLen) then fsz:= FileLen-($2E+UIDLen+2+NickLen);
if (DContact.hContact=0) or (DContact.hContact=INVALID_HANDLE_VALUE) then
begin
if IsMirandaUnicode then DContact.ContactUID:=UIDstr
else
begin
tempstr:=UTF8ToANSI(PChar(UIDstr),tempstr,cp);
DContact.ContactUID:=tempstr;
FreeMem(tempstr);
end;
if IsMirandaUnicode then DContact.ContactNick:=NickStr
else
begin
tempstr:=UTF8ToANSI(PChar(NickStr),tempstr,cp);
DContact.ContactNick:=tempstr;
FreeMem(tempstr);
end;
TryDetermContact(DContact);
end;
if (DContact.hContact=0) or (DContact.hContact=INVALID_HANDLE_VALUE) then
if (fContact.hContact<>0) and (fContact.hContact<>INVALID_HANDLE_VALUE) then
DContact:=fContact;
if (DContact.hContact<>0) and (DContact.hContact<>INVALID_HANDLE_VALUE) then
begin
proto:=GetContactProto(DContact.hContact);
DoMessage(ITXT_THREAD_DEST_CONTACT,DContact.hContact,0);
DoMessage(ITXT_THREAD_START,0,0);
DoMessage(ITXT_THREAD_MAXPROGRESS,0,fsz);
i:=0;
while i<fsz do
begin
with dbei do
begin
fillchar(dbei,sizeof(dbei),0);
cbSize:=sizeof(dbei);
szModule:=PChar(proto);
timestamp:=RLInteger(pt+i+$12);
timestamp:=timestamp-(PluginLink.CallService(MS_DB_TIME_TIMESTAMPTOLOCAL,timestamp,0)-timestamp);//ïðèâîäèì ê GMT
if PByte(pt+i+$1A)^=$00 then flags:=0
else flags:=DBEF_SENT;
flags:=flags or DBEF_READ or DBEF_UTF; //â ôàéëàõ ëåæàò â utf8 è èìïîðòèðóþòñÿ áåç èçìåíåíèé
eventType:= EVENTTYPE_MESSAGE;
cbBlob:=RLWord(pt+i+szMsgHd-2)+1; //ðàçìåð òåêñòà ñîîáùåíèÿ ñ #0
pBlob:=AllocMem(cbBlob);
end;
try
Move(DecodeQHFMsg(qhfver,pt+i+szMsgHd,dbei.cbBlob-1)[1],dbei.pBlob^,dbei.cbBlob-1);
if not IsDuplicateEvent(DContact.hContact,dbei) then
if pluginLink^.CallService(MS_DB_EVENT_ADD, wParam(DContact.hContact), lParam(@dbei))<>0 then Inc(AddedMessages)
else begin
s:= 'Error adding message to DB';
DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); break; end
else Inc(Duplicates);
finally
inc(i,szMsgHd+dbei.cbBlob-1);
FreeMem(dbei.pBlob);
end;
DoMessage(ITXT_THREAD_PROGRESS,i,0);
end;
end
else
begin
s:=TranslateWideString('Can''t determine destination contact');
DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0);
end;
end
else
begin
s:=WideFormat(TranslateWideString('Its not %s file'),['QHF']);
DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0);
end
else //file len
end;
{$endif}
|