{$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}