wysyłanie grafiki przez gg przy użyciu thgg

0

Jak wysłać jakąś grafieprzy użyciu thgg. Zrobiłem sobie fajny programik wykorzystując thgg ale chciałbym jeszcze móc wysyłać obrazki? Jak to zrobić?

0

W komponencie jeszcze nie ma tej funkcji - poczytaj opis protokołu i może coś wymyślisz.. ja na razie nie zabierałem się za to.

Image: TMemoryStream;


//...

{ TODO : Dopisać i naprawić funkcję wysyłania obrazków }
procedure THGG.SendImage(Recipient: Integer; FileName: string);
var
  Output_Message: TOutput_Message;
  Offset_MSGRichText: TOffset_MSGRichText;
  Offset_MSGRichTextFormat: TOffset_MSGRichTextFormat;
begin
  if (Recipient <= 0) or (not FileExists(FileName)) then
    Exit;

  Image.LoadFromFile(FileName);

  Output_Message.Header.PacketType := C_OUTPUT_MESSAGE;
  Output_Message.Header.PacketLength := 12 + Length('Image' + #0) + SizeOf(Offset_MSGRichText) + 13;
  Output_Message.GGNumber := Recipient;
  Output_Message.Sequential := 0;
  Output_Message.MsgClass := C_MSG_CLASS_CHAT;
  Move(('Image' + #0)[1], Output_Message.Msg[1], Length('Image' + #0));

  Offset_MSGRichText.Flag := #2;
  Offset_MSGRichText.PacketLength := 13;
  
  Offset_MSGRichTextFormat.Position := 2;
  Offset_MSGRichTextFormat.Font := C_FORMAT_IMAGE;

  Offset_MSGRichTextFormat.Image.Unknown := $109;
  Offset_MSGRichTextFormat.Image.Size := Image.Size;
  Offset_MSGRichTextFormat.Image.CRC32 := GetCRC32(Image);

  if Logged then
  begin
    WriteBuffer(Output_Message, 20 + Length('Image' + #0));
    WriteBuffer(Offset_MSGRichText, SizeOf(Offset_MSGRichText));
    WriteBuffer(Offset_MSGRichTextFormat, 36);
  end;
end;

Jeszcze taka funkcja:

function GetCRC32(MemoryStream: TMemoryStream): Cardinal;
var
  i, j: Word;
  r: Cardinal;
  CRC32Array: PCRC32;
  Buffer: Byte;
begin
  New(CRC32Array);
  for i := 0 to 255 do
  begin
    r := i;
    for j := 8 downto 1 do
      if (r and 1) > 0 then
        r := (r shr 1) xor $EDB88320
      else
        r := r shr 1;
    CRC32Array[i] := r;
  end;
  Result := $FFFFFFFF;
  MemoryStream.Seek(0, soFromBeginning);
  while MemoryStream.Size <> MemoryStream.Position do
  begin
    MemoryStream.Read(Buffer, 1);
    Result := CRC32Array[Byte(Result xor Cardinal(Buffer))] xor ((Result shr 8) and $00FFFFFF);
  end;
 Result := Result xor $FFFFFFFF;
 Dispose(CRC32Array);
end;

Stałe masz w komponencie .. - może uda Ci się dopisać brakujące funkcje i obsługę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1