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