Czy ten komponent ma możliwośc zrobienia w jakiś sposób konferencji?
Tutaj mam napisane dosyc niejasno o jakiś połączeniach konferencyjnych:
http://dev.null.pl/ekg/docs/protocol.html#ch1.6
Wysyłanie do kilku osób to po prostu wywołanie SendMessage ze zmianą numeru odbiorcy.
Nie wiem tylko jak klient ma sprawdzic, że wiadomośc odebrana była przeznaczona do kilku osób.
Cytat z powyzszej strony:
Oryginalny klient wysyłając wiadomość do kilku użytkowników, wysyła po kilka takich samych pakietów z różnymi numerkami odbiorców. Nie ma osobnego pakietu do tego. Natomiast jeśli chodzi o połączenia konferencyjne do pakietu doklejana jest następująca struktura:
A niżej znajduje się struktura którą należy dokleić i jak jest zbudowana.
A przy odbiorze wystarczy że program sprawdzi do kogo "jeszcze" adresowana jest wiadomość (właśnie z tej doklejonej struktury).
W bieżącej wersji nie ma możliwości połączeń konferencyjnych - jednak jakbyś znalazł czas byłoby miło, gdybyś dodał to do komponentu HGG (według opisu z w/w strony).
Nie używam HGG. :P Od dłuższego czasu pracuję nad swoim komponentem do obsługi Gadu-Gadu... I moim zdaniem jest lepszy od HGG (no i potrafi wysyłać obrazki :D). Dzisiaj też dodałem obsługe konferencji, jednak niedopracowaną na razie...
Wydaje mi się jednak, że dopisanie odpowiednich komend do HGG (a później implementacja ich w programie) nie byłaby trudna...
pÓÓÓÓki co mam tylko THGG więc podjęłem próby obsługi konferencji. Tylko coś nie chce działac. Oto zmodyfikowany przeze mnie kod:
TIntArr = array of Int;
PInput_Message = ^TInput_Message;
TInput_Message = packed record
GGNumber: Int;
Sequential: Int;
Time: Int;
MsgClass: Int;
Msg: CharArray;
Flag: Char; // = 1
Count: Int; // ilość odbiorców
Recipients: TIntArr;
end;
...
TMessageEvent = procedure(Sender: TObject; GGNumber: Integer; MessageContent: string; MessageTime: TDateTime; MessageRecipents: TIntArr) of object;
...
procedure TTCPThread.EventHandler;
begin
case PacketType of
C_INPUT_DISCONNECTING:
Owner.FOnServerDisconnect(Self);
C_INPUT_LOGIN_OK:
Owner.FOnLogin(Self);
C_INPUT_LOGIN_FAILED:
Owner.FOnLoginFailed(Self);
C_INPUT_NOTIFY_REPLY, C_INPUT_STATUS60, C_INPUT_STATUS:
Owner.DelayTimeHandler(UserIndex);
C_INPUT_MESSAGE_INCOMING:
Owner.FOnMessage(Self, Input_Message.GGNumber, Copy(string(Input_Message.Msg), 1, PacketLength - 17), Input_Message.Time / 86400 + 25569, Input_Message.Recipients); // tu dałem tablice typu int
C_INPUT_PUBDIR_REPLY:
begin
case Input_PubDirReply.ReplyType of
C_PUBDIR_SEARCH_REPLY:
if Owner.PubDirNextGGNumber = '-1' then
Owner.FOnPubDirNoReply(Self)
else
Owner.FOnPubDirReply(Self, PubDirGGNumber, PubDirUserStatus, PubDirFirstName, PubDirNickName, PubDirCity, PubDirBirthYear);
else
Owner.FOnPubDirGetData(Self, PubDirFirstName, PubDirLastName, PubDirNickName, PubDirCity, PubDirFamilyName, PubDirFamilyCity, PubDirBirthYear, PubDirGender);
end;
end;
C_INPUT_USERLIST_REPLY:
Owner.FOnUsersGetFromServer(Self);
end;
end;
Jednak przy próbie odbioru tej listy nie otrzymuje jej:
procedure TForm1.HGG1Message(Sender: TObject; GGNumber: Integer;
MessageContent: String; MessageTime: TDateTime;
MessageRecipents: TIntArr);
var
i: Integer;
begin
ListBox1.Clear;
for i := 0 to High(MessageRecipents) do
ListBox1.Items.Add(IntToStr(MessageRecipents[i]));
Memo1.Text := MessageContent;
end;
Wie ktoś może w czym problem?
W tym, że
Msg: CharArray;
nie ma określonej długości. Więc wszystkie "doklejone" pakiety zawieta też Msg. :d
W opisie protokołu wyczytałem że wiadomośc może miec do 2000 znaków, więc...
TIntArr = array[0..255] of Int;
PInput_Message = ^TInput_Message;
TInput_Message = packed record
GGNumber: Int;
Sequential: Int;
Time: Int;
MsgClass: Int;
Msg: array[1..2000] of Char;//CharArray;
flag: Char; // = 1
count: Int; // ilość odbiorców
recipients: TIntArr; // tablica odbiorców */
end;
I nadal wszystkie elementy tablicy wynoszą 0 :(
P.S. W przypadku TIntArr = array of Int; zwraca szereg błędów Acces Violation więc dałem stały rozmiar.
Maksymalny rozmiar wiadomości to 2000. Ale wiadomośc może mieć mniej. :P Dlatego ten rekord zostanie uzupełniony tylko w przypadku wiadomości która ma 2000 znaków. :D
No więc jaka jest twoja rada żeby odebrac ten cholerny pakiet? ;/
Prosta rada - po odebraniu wiadomości po prostu przepisuj z wiadomości informacje o konferencji do odpowiedniego rekordu. :)
Nie wiem zbytnio jak tego dokonac. W wiadomości nie widze na końcu żadnych cyferek czy krzakow.
Mógłbyś nieco jaśniej?
Bo wiadomość którą wyświetla komponent kończy znak #0. Wszystkie informacje znajdują się za tym znakiem... W odebranym pakiecie. No i możesz z nimi robic co chcesz. :D
[EDIT]
Więcej powiedzieć raczej nie moge. :P Bo pracuje nad projektem obsługi GG. :P