Mam problem z TEasyGG. Gdy użytkownik, z którym się kontaktuję, rozpoczyna konferencję, do mnie dochodzi wiadomość, ale lista uczestników konferencji już nie (dostaję tylko UID autora).
Z tego, co do tej pory zrozumiałem, do struktury:
#define GG_RECV_MSG80 0x002e
struct gg_recv_msg80 {
int sender; /* numer nadawcy */
int seq; /* numer sekwencyjny */
int time; /* czas nadania */
int class; /* klasa wiadomości */
int offset_plain; /* położenie treści czystym tekstem */
int offset_attributes; /* położenie atrybutów */
char html_message[]; /* treść w formacie HTML (zakończona \0) */
char plain_message[]; /* treść czystym tekstem (zakończona \0) */
char attributes[]; /* atrybuty wiadomości */
};
powinny być doklejone dane o liście uczestników konferencji (łącznie z flagą konferencji):
struct gg_msg_recipients {
char flag; /* 0x01 - flaga konferencji */
int count; /* liczba odbiorców */
int recipients[]; /* lista odbiorców */
};
tymczasem w pakiecie, który dostaję jest zwracany blok atrybutów o długości 9 bajtów, których za nic nie mogę rozszyfrować, a dane o liście uczestników nie dochodzą.
konferencja rozpoczynana naprzemiennie z aqq i gg 10.
//próbowałem też zmienić trochę procedurę:
procedure TEasyGG.SocketGGRecvMsg(const Header: Tgg_recv_msg80);
var
s: String;
Count: LongWord;
Conference: array of LongWord;
i: Integer;
begin
if Assigned(FOnReceiveMsg) then begin
i := FUsers.IndexOfUID(Header.sender);
if i <> -1 then
if FUsers.Get(i).GetBlocked and (not FGetMsgFromBlocked) then
Exit; // nie otrzymujemy wiadomości od zablokowanego użytkownika
if Length(Header.attributes) > 0 then
begin
if (Length(Header.attributes) > 9) and (Header.attributes[9] = 1) then begin // jeżeli konferencja - ZMIENIONA LINIA
//if Header.attributes[0] = 1 then begin
Move(Header.attributes[10], Count, SizeOf(LongWord)); // pobranie ilości numerów - ZMIENIONA LINIA
//Move(Header.attributes[1], Count, SizeOf(LongWord)); // pobranie ilości numerów
SetLength(Conference, Count);
for i := 0 to Count - 1 do
Move(Header.attributes[i * SizeOf(LongWord) + 5], Conference[i], SizeOf(LongWord));
SetLength(s, Length(Header.attributes) - Length(Conference) * SizeOf(LongWord) - 5);
Move(Header.attributes[Length(Conference) * SizeOf(LongWord) + 5], s[1], Length(s));
end
else begin
SetLength(s, Length(Header.attributes));
Move(Header.attributes[0], s[1], Length(Header.attributes));
end;
end;
FOnReceiveMsg(Self, Header.sender, Header.html_message, Header.plain_message, s, UnixToDateTime(Header.time), Conference);
end;
end;
ale to też nic nie daje. po prostu do pakietu nie zostają doklejone żadne dane o konferencji.
no, chyba, że to ja coś pokaszaniłem...
sorry za to, że nie przetłumaczyłem części kodów źródłowych na delphi, ale nie chciało mi się grzebać w komponencie. pisałem z opisu protokołu. ale mam nadzieję, że ktoś zrozumiał te kody :D
//edit: z tego, co się zorientowałem, w konferencjach treść HTML nie jest przesyłana, bo pakiety, które dostawałem były pozbawione wiadomości w wersji HTML (offset Plain i offset HTML były równe sobie)