[thgg] Pytanie o konferencje

0

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.

0

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).

0

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).

0

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...

0

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?

0

W tym, że

Msg: CharArray;

nie ma określonej długości. Więc wszystkie "doklejone" pakiety zawieta też Msg. :d

0

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.

0

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

0

No więc jaka jest twoja rada żeby odebrac ten cholerny pakiet? ;/

0

Prosta rada - po odebraniu wiadomości po prostu przepisuj z wiadomości informacje o konferencji do odpowiedniego rekordu. :)

0

Nie wiem zbytnio jak tego dokonac. W wiadomości nie widze na końcu żadnych cyferek czy krzakow.
Mógłbyś nieco jaśniej?

0

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

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