libgadu
1.12.2
|
Struktury danych | |
struct | gg_session |
Sesja Gadu-Gadu. Więcej... | |
struct | gg_login_params |
Parametry połączenia z serwerem Gadu-Gadu. Więcej... | |
Wyliczenia | |
enum | gg_ssl_t { GG_SSL_DISABLED = 0, GG_SSL_ENABLED, GG_SSL_REQUIRED } |
Flaga połączenia szyfrowanego. Więcej... | |
enum | { GG_FEATURE_MSG77, GG_FEATURE_STATUS77, GG_FEATURE_DND_FFC, GG_FEATURE_IMAGE_DESCR } |
Flagi opcji protokołu. Więcej... | |
Funkcje | |
struct gg_session * | gg_login (const struct gg_login_params *p) |
Łączy się z serwerem Gadu-Gadu. Więcej... | |
int | gg_ping (struct gg_session *sess) |
Wysyła do serwera pakiet utrzymania połączenia. Więcej... | |
void | gg_logoff (struct gg_session *sess) |
Kończy połączenie z serwerem. Więcej... | |
void | gg_free_session (struct gg_session *sess) |
Zwalnia zasoby używane przez połączenie z serwerem. Więcej... | |
int | gg_multilogon_disconnect (struct gg_session *gs, gg_multilogon_id_t conn_id) |
Rozłącza inną sesję multilogowania. Więcej... | |
Każde połączenie z serwerem jest rozpoczynane funkcją gg_login()
zwracającą strukturę gg_session
, opisującą dane połączenie. Funkcja gg_login()
za parametr przyjmuje wskaźnik strukturę zawierającą listę parametrów połączenia. Przykładowy kod rozpoczynający łączenie wygląda następująco:
Lista wszystkich parametrów połączenia znajduje się w opisie struktury gg_login_params
. W zależności od tego, czy łączymy się synchronicznie czy asynchronicznie (jak w przykładzie), funkcja gg_login()
zwróci wskaźnik dopiero po udanym połączeniu lub zaraz po rozpoczęciu procedury łączenia. Dokładny opis dalszej obsługi połączenia znajduje się w sekcji poświęconej obsłudze zdarzeń.
Nowe statusy (nie przeszkadzać, poGGadaj ze mną), opisy graficzne i wiadomości kodowane UTF-8 będą dostępne dopiero po ustawieniu odpowiednich parametrów połączenia. Jest to niezbędne, ponieważ starsze klienty mogłyby nie działać prawidłowo, gdyby przy domyślnych parametrach połączenia zmieniło się zachowanie biblioteki.
Aby łączyć się z użyciem serwera pośredniczącego (ang. proxy), należy przed połączeniem ustawić zmienne globalne gg_proxy_enabled
, gg_proxy_host
, gg_proxy_port
i inne.
Do korzystania z połączeń bezpośrednich wersji 6.x, konieczne jest przed połączeniem ustawienie zmiennych globalnych gg_dcc_ip
i gg_dcc_port
.
Począwszy od Gadu-Gadu 10 możliwe są połączenia szyfrowane. Aby je włączyć, należy ustawić pole tls
struktury gg_login_params:
W przypadku braku wkompilowanej obsługi SSL parametr ten zostanie zignorowany. By upewnić się, że połączenie nigdy nie będzie przeprowadzone bez szyfrowania, należy przypisać wartość GG_SSL_REQUIRED
(patrz gg_ssl_t
).
Procedura łączenia się z serwerem składa się z kilku etapów:
appmsg.gadu-gadu.pl
Wszystkimi etapami zajmuje się funkcja gg_login()
w przypadku połączenia synchronicznego lub gg_login()
i gg_watch_fd()
dla połączeń asynchronicznych. Możliwe jest pominięcie pierwszych czterech kroków, związanych z połączeniem z serwerem rozdzielającym, przez ręczne podanie adresu i portu właściwego serwera w polach server_addr
i server_port
struktury gg_login_params
. Jest to przydatne w sytuacjach, gdy serwer rozdzielający jest przeciążony lub niedostępny, albo gdy zwraca nieprawidłowy adres właściwego serwera.
Rozwiązywanie nazwy w systemach zgodnych z normą POSIX jest operacją synchroniczną. Z tego powodu w trybie asynchronicznym konieczne jest utworzenie dodatkowego procesu lub wątku (w zależności od opcji kompilacji), który w tle dokona rozwiązania nazwy i zwróci wynik do procesu lub wątku nadrzędnego.
wait()
lub podobnej do prawidłowego zakończenia życia procesu potomnego. W przeciwnym wypadku, w zależności od zachowania systemu operacyjnego, mogą powstawać procesy zombie.Serwer oczekuje regularnego wysyłania pakietów utrzymania połączenia. W tym celu należy co minutę wywoływać funkcję gg_ping()
.
Aby się wylogować, należy użyć funkcji gg_logoff()
, a następnie zwolnić zasoby związane z sesją za pomocą funkcji gg_free_session()
. Aby ustawić status z opisem, należy wcześniej wywołać funkcję gg_change_status_descr()
.
Około wersji Gadu-Gadu 10 pojawiła się możliwość łączenia kilku sesji jednocześnie. Aby włączyć tę funkcję należy do gg_login_params.protocol_features
dodać GG_FEATURE_MULTILOGON
. Domyślnie ta opcja jest wyłączona, więc zwykle będzie to wyglądać następująco:
Po połączeniu z włączoną możliwością multilogowania, inne sesje nie zostaną rozłączone. W momencie połączenia dodatkowej sesji, aplikacja otrzyma zdarzenie GG_EVENT_MULTILOGON_INFO
. Wiadomości przychodzące sąprzekazywane do wszystkich sesji, a wychodzące do rozmówców z jednej sesji do pozostałych za pomocą zdarzenia GG_EVENT_MULTILOGON_MSG
. Aby zdalnie rozłączyć innąsesję, należy użyć funkcji gg_multilogon_disconnect()
.
enum gg_ssl_t |
Flaga połączenia szyfrowanego.
anonymous enum |
Flagi opcji protokołu.
struct gg_session* gg_login | ( | const struct gg_login_params * | p | ) |
Łączy się z serwerem Gadu-Gadu.
Przy połączeniu synchronicznym funkcja zakończy działanie po nawiązaniu połączenia lub gdy wystąpi błąd. Po udanym połączeniu należy wywoływać funkcję gg_watch_fd()
, która odbiera informacje od serwera i zwraca informacje o zdarzeniach.
Przy połączeniu asynchronicznym funkcja rozpocznie procedurę połączenia i zwróci zaalokowaną strukturę. Pole fd
struktury gg_session
zawiera deskryptor, który należy obserwować funkcją select
, poll
lub za pomocą mechanizmów użytej pętli zdarzeń (Glib, Qt itp.). Pole check
jest maską bitową mówiącą, czy biblioteka chce być informowana o możliwości odczytu danych (GG_CHECK_READ
) czy zapisu danych (GG_CHECK_WRITE
). Po zaobserwowaniu zmian na deskryptorze należy wywołać funkcję gg_watch_fd()
. Podczas korzystania z połączeń asynchronicznych, w trakcie połączenia może zostać stworzony dodatkowy proces rozwiązujący nazwę serwera – z tego powodu program musi poprawnie obsłużyć sygnał SIGCHLD.
gg_notify()
lub gg_notify_ex()
.p | Struktura opisująca parametry połączenia. Wymagane pola: uin, password, async. |
gg_session
lub NULL w przypadku błędu. int gg_ping | ( | struct gg_session * | sess | ) |
Wysyła do serwera pakiet utrzymania połączenia.
Klient powinien regularnie co minutę wysyłać pakiet utrzymania połączenia, inaczej serwer uzna, że klient stracił łączność z siecią i zerwie połączenie.
sess | Struktura sesji |
void gg_logoff | ( | struct gg_session * | sess | ) |
Kończy połączenie z serwerem.
Funkcja nie zwalnia zasobów, więc po jej wywołaniu należy użyć gg_free_session()
. Jeśli chce się ustawić opis niedostępności, należy wcześniej wywołać funkcję gg_change_status_descr()
lub gg_change_status_descr_time()
.
GG_STATUS_NOT_AVAIL_DESCR
za pomocą funkcji gg_change_status_descr()
i poczekać na zdarzenie GG_EVENT_DISCONNECT_ACK
.sess | Struktura sesji |
void gg_free_session | ( | struct gg_session * | sess | ) |
Zwalnia zasoby używane przez połączenie z serwerem.
Funkcję należy wywołać po zamknięciu połączenia z serwerem, by nie doprowadzić do wycieku zasobów systemowych.
sess | Struktura sesji |
int gg_multilogon_disconnect | ( | struct gg_session * | gs, |
gg_multilogon_id_t | conn_id | ||
) |
Rozłącza inną sesję multilogowania.
gs | Struktura sesji |
conn_id | Sesja do rozłączenia |