libgadu
1.11.2
|
Nie wydarzyło się nic wartego uwagi. Więcej...
Struktury danych | |
union | gg_event_union |
Unia wszystkich zdarzeń zwracanych przez funkcje gg_watch_fd() , gg_dcc_watch_fd() i gg_dcc7_watch_fd() . Więcej... | |
struct | gg_event |
Opis zdarzenia. Więcej... | |
Funkcje | |
void | gg_event_free (struct gg_event *e) |
Zwalnia pamięć zajmowaną przez informację o zdarzeniu. Więcej... | |
struct gg_event * | gg_watch_fd (struct gg_session *sess) |
Funkcja wywoływana po zaobserwowaniu zmian na deskryptorze sesji. Więcej... | |
Nie wydarzyło się nic wartego uwagi.
Funkcje biblioteki zostały przygotowane w taki sposób, by móc z nich korzystać zarówno w trybie synchronicznym (działanie programu jest blokowane do zakończeniu operacji), jak i asynchroniczym (operacja jest rozpoczynana, a do czasu jej zakończenia program może robić inne rzeczy). Wyjątkiem są połączenia bezpośrednie, które pozwalają jedynie na połączenia asynchroniczne.
W trybie synchronicznym, po udanym zakończeniu funkcji gg_login()
, należy w pętli wywoływać funkcję gg_watch_fd()
, która po odebraniu informacji od serwera zwróci informację o zdarzeniu w strukturze gg_event
lub NULL
w przypadku błędu. Lista zdarzeń znajduje się poniżej.
Tryb asynchroniczny wymaga od programu obserwowania zmian na określonych deskryptorach za pomocą funkcji systemowych select()
czy poll()
, lub za pomocą mechanizmów pętli zdarzeń wbudowanych w wykorzystaną bibliotekę interfejsu użytkownika. Interesujące z punktu widzeniu połączenia asynchronicznego pola to fd
określające obserwowany deskryptor, pole check
będące maską bitową typu gg_check_t
, mówiącą czy obserwowana ma być możliwość odczytu i/lub zapisu oraz timeout
określające maksymalny czas wykonywania operacji. Gdy zaobserwuje się zmianę na deskryptorze należy wywołać funkcję gg_watch_fd()
i postępować podobnie jak w trybie synchronicznym.
timeout
, należy sprawdzić wartość flagi soft_timeout
. Jeśli jest równa 0
(tj. FALSE
), można przerwać połączenie i zwolnić zasoby, a jeśli jest różna (tj. TRUE
), należy wywołać gg_watch_fd()
ustawiając wcześniej timeout
na 0
, by dać szansę bibliotece zareagować na przekroczenie czasu operacji. Za pomocą mechanizmu soft_timeout
są realizowane próby połączenia z innymi portami, np. gdy domyślny port 8074 jest zablokowany oraz zwrotne połączenia bezpośrednie (7.x), gdy jedna ze stron połączenia znajduje się za routerem NAT lub firewallem.state
przyjmuje wartość GG_STATE_IDLE
. Przed dodaniem deskryptora fd
do listy obserwowanych, warto w ten sposób sprawdzić, czy dane połączenie nie jest już nieaktywne.SIGPIPE
, który domyślnie powoduje unicestwienie procesu. Dlatego, aby pozwolić bibliotece zareagować na zerwanie połączenia w sensowny sposób, należy ignorować sygnał w aplikacji.gg_ping()
.gg_ping()
.Typ zdarzenia | Pole gg_event | Typ pola | Opis |
---|---|---|---|
GG_EVENT_NONE | - | - |
Zdarzenia związane z połączeniem
GG_EVENT_CONN_SUCCESS
-
-
Połączono z serwerem.
Pierwszą rzeczą, jaką należy zrobić jest wysłanie listy kontaktów.
GG_EVENT_CONN_FAILED
event.failure
Nie udało się połączyć
GG_EVENT_PONG
-
-
Utrzymanie połączenia.
Obecnie serwer nie wysyła już do klienta ramek utrzymania połączenia, polega wyłącznie na wysyłaniu ramek przez klienta.
GG_EVENT_DISCONNECT
-
-
Serwer zrywa połączenie.
Zdarza się, gdy równolegle do serwera podłączy się druga sesja i trzeba zerwać połączenie z pierwszą.
GG_EVENT_DISCONNECT_ACK
-
-
Potwierdzenie zakończenia sesji.
Informuje o tym, że zmiana stanu na niedostępny z opisem dotarła do serwera i można zakończyć połączenie TCP.
Multilogowanie
GG_EVENT_MULTILOGON_INFO
event.multilogon_info
Informacja o innych sesjach multilogowania.
GG_EVENT_MULTILOGON_MSG
event.multilogon_msg
Wiadomość wysłana z innej sesji multilogowania.
Wiadomości
GG_EVENT_XML_EVENT
event.xml_event
Otrzymano komunikat systemowy (7.7)
GG_EVENT_MSG
event.msg
Otrzymano wiadomość.
Przekazuje również wiadomości systemowe od numeru 0.
GG_EVENT_ACK
event.ack
Potwierdzenie doręczenia wiadomości.
GG_EVENT_TYPING_NOTIFICATION
event.typing_notification
Powiadomienie o pisaniu.
GG_EVENT_IMAGE_REQUEST
event.image_request
Żądanie przesłania obrazka z wiadomości.
GG_EVENT_IMAGE_REPLY
event.image_reply
Przysłano obrazek z wiadomości.
Lista kontaktów
GG_EVENT_NOTIFY
event.notify
[]
Informacja o statusach osób z listy kontaktów (przed 6.0).
Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. Ostatni element tablicy zawiera uin równy 0, a pozostałe pola są niezainicjowane.
GG_EVENT_NOTIFY_DESCR
event.notify_descr
Informacja o statusie opisowym osoby z listy kontaktów (przed 6.0).
Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna.
GG_EVENT_STATUS
event.status
Zmiana statusu osoby z listy kontaktów (przed 6.0).
Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna.
GG_EVENT_NOTIFY60
event.notify60
[]
Informacja o statusach osób z listy kontaktów.
Ostatni element tablicy zawiera uin równy 0, a pozostałe pola są niezainicjowane.
GG_EVENT_STATUS60
event.status60
Zmiana statusu osoby z listy kontaktów.
GG_EVENT_USERLIST
event.userlist
Wynik importu lub eksportu listy kontaktów.
GG_EVENT_USERLIST100_VERSION
event.userlist100_version
Otrzymano numer wersji listy kontaktów na serwerze (10.0)
GG_EVENT_USERLIST100_REPLY
event.userlist100_reply
Wynik importu lub eksportu listy kontaktów (10.0)
Katalog publiczny
GG_EVENT_PUBDIR50_SEARCH_REPLY
event.pubdir50
Odpowiedź katalogu publicznego.
GG_EVENT_PUBDIR50_READ
event.pubdir50
Odczytano własne dane z katalogu publicznego.
GG_EVENT_PUBDIR50_WRITE
event.pubdir50
Zmieniono własne dane w katalogu publicznym.
Połączenia bezpośrednie
GG_EVENT_DCC7_NEW
event.dcc7_new
Nowe połączenie bezpośrednie (7.x)
GG_EVENT_DCC7_ACCEPT
event.dcc7_accept
Zaakceptowano połączenie bezpośrednie (7.x), nowy deskryptor.
GG_EVENT_DCC7_REJECT
event.dcc7_reject
Odrzucono połączenie bezpośrednie (7.x)
GG_EVENT_DCC7_PENDING
event.dcc7_pending
Trwa próba połączenia bezpośredniego (7.x), nowy deskryptor.
GG_EVENT_DCC7_CONNECTED
event.dcc7_connected
Zestawiono połączenie bezpośrednie (7.x), nowy deskryptor.
GG_EVENT_DCC7_DONE
event.dcc7_connected
Zakończono połączenie bezpośrednie (7.x)
GG_EVENT_DCC7_ERROR
event.dcc7_error
Błąd połączenia bezpośredniego (7.x)
enum gg_check_t |
enum gg_event_t |
Rodzaj zdarzenia.
void gg_event_free | ( | struct gg_event * | e) |
Zwalnia pamięć zajmowaną przez informację o zdarzeniu.
Funkcję należy wywoływać za każdym razem gdy funkcja biblioteki zwróci strukturę gg_event
.
e | Struktura zdarzenia |
struct gg_event* gg_watch_fd | ( | struct gg_session * | sess) |
Funkcja wywoływana po zaobserwowaniu zmian na deskryptorze sesji.
Funkcja zwraca strukturę zdarzenia gg_event
. Jeśli rodzaj zdarzenia to GG_EVENT_NONE
, nie wydarzyło się jeszcze nic wartego odnotowania. Strukturę zdarzenia należy zwolnić funkcja gg_event_free()
.
sess | Struktura sesji |
NULL
jeśli wystąpił błąd