1/* include/libgadu.h. Generated from libgadu.h.in by configure. */
2/* $Id$ */
3
4/*
5 * (C) Copyright 2001-2009 Wojtek Kaniewski <wojtekka@irc.pl>
6 * Robert J. Woźny <speedy@ziew.org>
7 * Arkadiusz Miśkiewicz <arekm@pld-linux.org>
8 * Tomasz Chiliński <chilek@chilan.com>
9 * Piotr Wysocki <wysek@linux.bydg.org>
10 * Dawid Jarosz <dawjar@poczta.onet.pl>
11 * Jakub Zawadzki <darkjames@darkjames.ath.cx>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU Lesser General Public License Version
15 * 2.1 as published by the Free Software Foundation.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Lesser General Public License for more details.
21 *
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
25 * USA.
26 */
27
28/**
29 * \file libgadu.h
30 *
31 * \brief Główny plik nagłówkowy biblioteki
32 */
33
34#ifndef LIBGADU_LIBGADU_H
35#define LIBGADU_LIBGADU_H
36
37#ifdef _WIN32
38#pragma pack(push, 1)
39#endif
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45#include <sys/types.h>
46#include <stdio.h>
47#include <stdarg.h>
48
49/** \cond ignore */
50
51/* Defined if libgadu was compiled for bigendian machine. */
52/* #undef GG_CONFIG_BIGENDIAN */
53
54/* Defined if this machine has gethostbyname_r(). */
55#define GG_CONFIG_HAVE_GETHOSTBYNAME_R /**/
56
57/* Defined if libgadu was compiled and linked with fork support. */
58#define GG_CONFIG_HAVE_FORK /**/
59
60/* Defined if libgadu was compiled and linked with pthread support. */
61#define GG_CONFIG_HAVE_PTHREAD /**/
62
63/* Defined if pthread resolver is the default one. */
64/* #undef GG_CONFIG_PTHREAD_DEFAULT */
65
66/* Defined if this machine has C99-compiliant vsnprintf(). */
67#define GG_CONFIG_HAVE_C99_VSNPRINTF /**/
68
69/* Defined if this machine has va_copy(). */
70#define GG_CONFIG_HAVE_VA_COPY /**/
71
72/* Defined if this machine has __va_copy(). */
73#define GG_CONFIG_HAVE___VA_COPY /**/
74
75/* Defined if this machine supports long long. */
76#define GG_CONFIG_HAVE_LONG_LONG /**/
77
78/* Defined if libgadu was compiled and linked with GnuTLS support. */
79#define GG_CONFIG_HAVE_GNUTLS /**/
80
81/* Defined if libgadu was compiled and linked with OpenSSL support. */
82/* #undef GG_CONFIG_HAVE_OPENSSL */
83
84/* Defined if libgadu was compiled and linked with zlib support. */
85#define GG_CONFIG_HAVE_ZLIB /**/
86
87/* Defined if uintX_t types are defined in <stdint.h>. */
88/* #undef GG_CONFIG_HAVE_STDINT_H */
89
90/* Defined if uintX_t types are defined in <inttypes.h>. */
91#define GG_CONFIG_HAVE_INTTYPES_H /**/
92
93/* Defined if uintX_t types are defined in <sys/inttypes.h>. */
94/* #undef GG_CONFIG_HAVE_SYS_INTTYPES_H */
95
96/* Defined if uintX_t types are defined in <sys/int_types.h>. */
97/* #undef GG_CONFIG_HAVE_SYS_INT_TYPES_H */
98
99/* Defined if uintX_t types are defined in <sys/types.h>. */
100/* #undef GG_CONFIG_HAVE_SYS_TYPES_H */
101
102/* Defined if this machine has uint64_t. */
103#define GG_CONFIG_HAVE_UINT64_T /**/
104
105/* Defined if libgadu is GPL compliant (was not linked with OpenSSL or any
106 other non-GPL compliant library support). */
107#define GG_CONFIG_IS_GPL_COMPLIANT /**/
108
109#ifdef GG_CONFIG_HAVE_OPENSSL
110#include <openssl/ssl.h>
111#endif
112
113#ifdef GG_CONFIG_HAVE_STDINT_H
114#include <stdint.h>
115#else
116# ifdef GG_CONFIG_HAVE_INTTYPES_H
117# include <inttypes.h>
118# else
119# ifdef GG_CONFIG_HAVE_SYS_INTTYPES_H
120# include <sys/inttypes.h>
121# else
122# ifdef GG_CONFIG_HAVE_SYS_INT_TYPES_H
123# include <sys/int_types.h>
124# else
125# ifdef GG_CONFIG_HAVE_SYS_TYPES_H
126# include <sys/types.h>
127# else
128
129/* ISO C 9X: 7.18 Integer types <stdint.h> */
130
131typedef unsigned char uint8_t;
132typedef unsigned short uint16_t;
133typedef unsigned int uint32_t;
134
135# endif
136# endif
137# endif
138# endif
139#endif
140
141#ifndef GG_CONFIG_HAVE_UINT64_T
142typedef unsigned long long uint64_t;
143#endif
144
145#ifdef _MSC_VER
146#include <BaseTsd.h>
147typedef SSIZE_T ssize_t;
148#endif
149
150#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4))
151# define GG_GNUC_PRINTF(format_idx, arg_idx) \
152 __attribute__((format (printf, (format_idx), (arg_idx))))
153#else
154# define GG_GNUC_PRINTF(format_idx, arg_idx)
155#endif
156
157/** \endcond */
158
159/**
160 * Numer Gadu-Gadu.
161 */
162typedef uint32_t uin_t;
163
164/**
165 * Identyfikator połączenia bezpośredniego Gadu-Gadu 7.x.
166 */
167typedef struct {
168 uint8_t id[8];
169} gg_dcc7_id_t;
170
171/**
172 * Identyfikator sesji multilogowania.
173 */
174typedef struct {
175 uint8_t id[8];
176} gg_multilogon_id_t;
177
178/**
179 * Makro deklarujące pola wspólne dla struktur sesji.
180 */
181#define gg_common_head(x) \
182 int fd; /**< Obserwowany deskryptor */ \
183 int check; /**< Informacja o żądaniu odczytu/zapisu (patrz \ref gg_check_t) */ \
184 int state; /**< Aktualny stan połączenia (patrz \ref gg_state_t) */ \
185 int error; /**< Kod błędu dla \c GG_STATE_ERROR (patrz \ref gg_error_t) */ \
186 int type; /**< Rodzaj sesji (patrz \ref gg_session_t) */ \
187 int id; /**< Identyfikator sesji */ \
188 int timeout; /**< Czas pozostały do zakończenia stanu */ \
189 int (*callback)(x*); /**< Funkcja zwrotna */ \
190 void (*destroy)(x*); /**< Funkcja zwalniania zasobów */
191
192/**
193 * Struktura wspólna dla wszystkich sesji i połączeń. Pozwala na proste
194 * rzutowanie niezależne od rodzaju połączenia.
195 */
196struct gg_common {
197 gg_common_head(struct gg_common)
198};
199
200struct gg_image_queue;
201
202struct gg_dcc7;
203
204struct gg_dcc7_relay;
205
206struct gg_session_private;
207
208/**
209 * Sposób rozwiązywania nazw serwerów.
210 */
211typedef enum {
212 GG_RESOLVER_DEFAULT = 0, /**< Domyślny sposób rozwiązywania nazw (jeden z poniższych) */
213 GG_RESOLVER_FORK, /**< Rozwiązywanie nazw bazujące na procesach */
214 GG_RESOLVER_PTHREAD, /**< Rozwiązywanie nazw bazujące na wątkach */
215 GG_RESOLVER_CUSTOM, /**< Funkcje rozwiązywania nazw dostarczone przed aplikację */
216 GG_RESOLVER_WIN32, /**< Rozwiązywanie nazw bazujące na wątkach Win32 */
217 GG_RESOLVER_INVALID = -1 /**< Nieprawidłowy sposób rozwiązywania nazw (wynik \c gg_session_get_resolver) */
218} gg_resolver_t;
219
220/**
221 * Rodzaj kodowania znaków.
222 */
223typedef enum {
224 GG_ENCODING_CP1250 = 0, /**< Kodowanie CP1250 */
225 GG_ENCODING_UTF8, /**< Kodowanie UTF-8 */
226 GG_ENCODING_INVALID = -1 /**< Nieprawidłowe kodowanie */
227} gg_encoding_t;
228
229/**
230 * Stopień kompatybilności ze starymi wersjami API.
231 */
232typedef enum {
233 GG_COMPAT_LEGACY = 0, /**< Całkowita kompatybilność (nie wyłącza żadnych funkcji) */
234 GG_COMPAT_1_12_0 = 1 /**< Wyłącza: dostarczanie eventów GG_EVENT_ACK, stary format konferencji */
235} gg_compat_t;
236
237/**
238 * Flaga połączenia szyfrowanego.
239 *
240 * \ingroup login
241 */
242typedef enum {
243 GG_SSL_DISABLED = 0, /**< Połączenie SSL wyłączone */
244 GG_SSL_ENABLED, /**< Połączenie SSL włączone gdy dostępne. Błędny certyfikat serwera nie powoduje odrzucenia połączenia. */
245 GG_SSL_REQUIRED /**< Połączenie SSL wymagane. Błędny certyfikat serwera powoduje odrzucenie połączenia. */
246} gg_ssl_t;
247
248/**
249 * Sesja Gadu-Gadu.
250 *
251 * Tworzona przez funkcję \c gg_login(), zwalniana przez \c gg_free_session().
252 *
253 * \ingroup login
254 */
255struct gg_session {
256 gg_common_head(struct gg_session)
257
258 int async; /**< Flaga połączenia asynchronicznego */
259 int pid; /**< Numer procesu rozwiązującego nazwę serwera */
260 int port; /**< Port serwera */
261 int seq; /**< Numer sekwencyjny ostatniej wiadomości */
262 int last_pong; /**< Czas otrzymania ostatniej ramki utrzymaniowej */
263 int last_event; /**< Czas otrzymania ostatniego pakietu */
264
265 struct gg_event *event; /**< Zdarzenie po wywołaniu \c callback */
266
267 uint32_t proxy_addr; /**< Adres serwera pośredniczącego */
268 uint16_t proxy_port; /**< Port serwera pośredniczącego */
269
270 uint32_t hub_addr; /**< Adres huba po rozwiązaniu nazwy */
271 uint32_t server_addr; /**< Adres serwera otrzymany od huba */
272
273 uint32_t client_addr; /**< Adres gniazda dla połączeń bezpośrednich */
274 uint16_t client_port; /**< Port gniazda dla połączeń bezpośrednich */
275
276 uint32_t external_addr; /**< Publiczny adres dla połączeń bezpośrednich */
277 uint16_t external_port; /**< Publiczny port dla połączeń bezpośrednich */
278
279 uin_t uin; /**< Własny numer Gadu-Gadu */
280 char *password; /**< Hasło (zwalniane po użyciu) */
281
282 int initial_status; /**< Początkowy status */
283 int status; /**< Aktualny status */
284
285 char *recv_buf; /**< Bufor na odbierane pakiety. Wskaźnik zawsze maksymalnie wyrównany, tak jak w wyniku działania \c malloc(). */
286 int recv_done; /**< Liczba wczytanych bajtów pakietu */
287 int recv_left; /**< Liczba pozostałych do wczytania bajtów pakietu */
288
289 int protocol_version; /**< Wersja protokołu (bez flag) */
290 char *client_version; /**< Wersja klienta */
291 int last_sysmsg; /**< Numer ostatniej wiadomości systemowej */
292
293 char *initial_descr; /**< Początkowy opis statusu */
294
295 void *resolver; /**< Dane prywatne procesu lub wątku rozwiązującego nazwę serwera */
296
297#ifndef DOXYGEN
298 char *header_buf; /**< Bufor na początek nagłówka pakietu (nieaktualne) */
299 unsigned int header_done; /**< Liczba wczytanych bajtów nagłówka pakietu (nieaktualne) */
300#endif
301
302#ifdef GG_CONFIG_HAVE_OPENSSL
303 SSL *ssl; /**< Struktura TLS */
304 SSL_CTX *ssl_ctx; /**< Kontekst sesji TLS */
305#else
306 void *ssl; /**< Struktura TLS */
307 void *ssl_ctx; /**< Kontekst sesji TLS */
308#endif
309
310 int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
311
312 char *userlist_reply; /**< Bufor z odbieraną listą kontaktów */
313
314 int userlist_blocks; /**< Liczba części listy kontaktów */
315
316 struct gg_image_queue *images; /**< Lista wczytywanych obrazków */
317
318 int hash_type; /**< Rodzaj funkcji skrótu hasła (\c GG_LOGIN_HASH_GG32 lub \c GG_LOGIN_HASH_SHA1) */
319
320 char *send_buf; /**< Bufor z danymi do wysłania */
321 int send_left; /**< Liczba bajtów do wysłania */
322
323 struct gg_dcc7 *dcc7_list; /**< Lista połączeń bezpośrednich skojarzonych z sesją */
324
325 int soft_timeout; /**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_watch_fd() */
326
327 int protocol_flags; /**< Flagi protokołu */
328
329 gg_encoding_t encoding; /**< Rodzaj kodowania znaków */
330
331 gg_resolver_t resolver_type; /**< Sposób rozwiązywania nazw serwerów */
332 int (*resolver_start)(int *fd, void **private_data, const char *hostname); /**< Funkcja rozpoczynająca rozwiązywanie nazwy */
333 void (*resolver_cleanup)(void **private_data, int force); /**< Funkcja zwalniająca zasoby po rozwiązaniu nazwy */
334
335 int protocol_features; /**< Opcje protokołu */
336 int status_flags; /**< Flagi statusu */
337 int recv_msg_count; /**< Liczba odebranych wiadomości */
338
339 const char *resolver_host; /**< Nazwa do rozwiązania */
340 struct in_addr *resolver_result; /**< Wynik rozwiązywania nazwy */
341 unsigned int resolver_index; /**< Indeks aktualnie obsługiwanego wyniku rozwiązywania nazwy */
342 unsigned int resolver_count; /**< Liczba wyników rozwiązywania nazwy */
343
344 uint16_t connect_port[2]; /**< Lista portów do połączenia */
345 unsigned int connect_index; /**< Indeks aktualnie obsługiwanego portu */
346
347 char *connect_host; /**< Adres serwera Gadu-Gadu, z którym się łączymy */
348 gg_ssl_t ssl_flag; /**< Flaga połączenia szyfrowanego */
349
350 struct gg_session_private *private_data; /**< Prywatne dane sesji, nie udostępnione w API */
351};
352
353/**
354 * Połączenie HTTP.
355 *
356 * Tworzone przez \c gg_http_connect(), zwalniane przez \c gg_http_free().
357 *
358 * \ingroup http
359 */
360struct gg_http {
361 gg_common_head(struct gg_http)
362
363 int async; /**< Flaga połączenia asynchronicznego */
364 int pid; /**< Identyfikator procesu rozwiązującego nazwę serwera */
365 int port; /**< Port */
366
367 char *query; /**< Zapytanie HTTP */
368 char *header; /**< Odebrany nagłówek */
369 int header_size; /**< Rozmiar wczytanego nagłówka */
370 char *body; /**< Odebrana strona */
371 unsigned int body_size; /**< Rozmiar strony */
372
373 void *data; /**< Dane prywatne usługi HTTP */
374
375 char *user_data; /**< Dane prywatne użytkownika (nie są zwalniane) */
376
377 void *resolver; /**< Dane prywatne procesu lub wątku rozwiązującego nazwę */
378
379 unsigned int body_done; /**< Liczba odebranych bajtów strony */
380
381 gg_resolver_t resolver_type; /**< Sposób rozwiązywania nazw serwerów */
382 int (*resolver_start)(int *fd, void **private_data, const char *hostname); /**< Funkcja rozpoczynająca rozwiązywanie nazwy */
383 void (*resolver_cleanup)(void **private_data, int force); /**< Funkcja zwalniająca zasoby po rozwiązaniu nazwy */
384};
385
386/** \cond ignore */
387
388#ifdef __GNUC__
389#define GG_PACKED __attribute__ ((packed))
390#ifndef GG_IGNORE_DEPRECATED
391#define GG_DEPRECATED __attribute__ ((deprecated))
392#else
393#define GG_DEPRECATED
394#endif
395#else
396#define GG_PACKED
397#define GG_DEPRECATED
398#endif
399
400/** \endcond */
401
402#define GG_MAX_PATH 276 /**< Maksymalny rozmiar nazwy pliku w strukturze \c gg_file_info */
403
404/**
405 * Odpowiednik struktury WIN32_FIND_DATA z API WIN32.
406 *
407 * Wykorzystywana przy połączeniach bezpośrednich do wersji Gadu-Gadu 6.x.
408 */
409struct gg_file_info {
410 uint32_t mode; /**< dwFileAttributes */
411 uint32_t ctime[2]; /**< ftCreationTime */
412 uint32_t atime[2]; /**< ftLastAccessTime */
413 uint32_t mtime[2]; /**< ftLastWriteTime */
414 uint32_t size_hi; /**< nFileSizeHigh */
415 uint32_t size; /**< nFileSizeLow */
416 uint32_t reserved0; /**< dwReserved0 */
417 uint32_t reserved1; /**< dwReserved1 */
418 unsigned char filename[GG_MAX_PATH - 14]; /**< cFileName */
419 unsigned char short_filename[14]; /**< cAlternateFileName */
420} /** \cond ignore */ GG_PACKED /** \endcond */;
421
422/**
423 * Połączenie bezpośrednie do wersji Gadu-Gadu 6.x.
424 *
425 * Tworzone przez \c gg_dcc_socket_create(), \c gg_dcc_get_file(),
426 * \c gg_dcc_send_file() lub \c gg_dcc_voice_chat(), zwalniane przez
427 * \c gg_dcc_free().
428 *
429 * \ingroup dcc6
430 */
431struct gg_dcc {
432 gg_common_head(struct gg_dcc)
433
434 struct gg_event *event; /**< Zdarzenie po wywołaniu \c callback */
435
436 int active; /**< Flaga połączenia aktywnego (nieużywana) */
437 int port; /**< Port gniazda nasłuchującego */
438 uin_t uin; /**< Własny numer Gadu-Gadu */
439 uin_t peer_uin; /**< Numer Gadu-Gadu drugiej strony połączenia */
440 int file_fd; /**< deskryptor pliku */
441 unsigned int offset; /**< Położenie w pliku */
442 unsigned int chunk_size;
443 /**< Rozmiar kawałka pliku */
444 unsigned int chunk_offset;
445 /**< Położenie w aktualnym kawałku pliku */
446 struct gg_file_info file_info;
447 /**< Informacje o pliku */
448 int established; /**< Flaga ustanowienia połączenia */
449 char *voice_buf; /**< Bufor na pakiet połączenia głosowego */
450 int incoming; /**< Flaga połączenia przychodzącego */
451 char *chunk_buf; /**< Bufor na fragment danych */
452 uint32_t remote_addr; /**< Adres drugiej strony */
453 uint16_t remote_port; /**< Port drugiej strony */
454};
455
456#define GG_DCC7_HASH_LEN 20 /**< Maksymalny rozmiar skrótu pliku w połączeniach bezpośrenich */
457#define GG_DCC7_FILENAME_LEN 255 /**< Maksymalny rozmiar nazwy pliku w połączeniach bezpośrednich */
458#define GG_DCC7_INFO_LEN 32 /**< Maksymalny rozmiar informacji o połączeniach bezpośrednich */
459#define GG_DCC7_INFO_HASH_LEN 32 /**< Maksymalny rozmiar skrótu ip informacji o połączeniach bezpośrednich */
460
461/**
462 * Połączenie bezpośrednie od wersji Gadu-Gadu 7.x.
463 *
464 * \ingroup dcc7
465 */
466struct gg_dcc7 {
467 gg_common_head(struct gg_dcc7)
468
469 gg_dcc7_id_t cid; /**< Identyfikator połączenia */
470
471 struct gg_event *event; /**< Struktura zdarzenia */
472
473 uin_t uin; /**< Własny numer Gadu-Gadu */
474 uin_t peer_uin; /**< Numer Gadu-Gadu drugiej strony połączenia */
475
476 int file_fd; /**< Deskryptor przesyłanego pliku */
477 unsigned int offset; /**< Aktualne położenie w przesyłanym pliku */
478 unsigned int size; /**< Rozmiar przesyłanego pliku */
479 unsigned char filename[GG_DCC7_FILENAME_LEN + 1];
480 /**< Nazwa przesyłanego pliku */
481 unsigned char hash[GG_DCC7_HASH_LEN];
482 /**< Skrót SHA1 przesyłanego pliku */
483
484 int dcc_type; /**< Rodzaj połączenia bezpośredniego */
485 int established; /**< Flaga ustanowienia połączenia */
486 int incoming; /**< Flaga połączenia przychodzącego */
487 int reverse; /**< Flaga połączenia zwrotnego */
488
489 uint32_t local_addr; /**< Adres lokalny */
490 uint16_t local_port; /**< Port lokalny */
491
492 uint32_t remote_addr; /**< Adres drugiej strony */
493 uint16_t remote_port; /**< Port drugiej strony */
494
495 struct gg_session *sess;
496 /**< Sesja do której przypisano połączenie */
497 struct gg_dcc7 *next; /**< Następne połączenie w liście */
498
499 int soft_timeout; /**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_dcc7_watch_fd() */
500 int seek; /**< Flaga mówiąca, że można zmieniać położenie w wysyłanym pliku */
501
502 void *resolver; /**< Dane prywatne procesu lub wątku rozwiązującego nazwę serwera */
503
504 int relay; /**< Flaga mówiąca, że laczymy sie przez serwer */
505 int relay_index; /**< Numer serwera pośredniczącego, do którego się łączymy */
506 int relay_count; /**< Rozmiar listy serwerów pośredniczących */
507 struct gg_dcc7_relay *relay_list; /**< Lista serwerów pośredniczących */
508};
509
510/**
511 * Rodzaj sesji.
512 */
513enum gg_session_t {
514 GG_SESSION_GG = 1, /**< Połączenie z serwerem Gadu-Gadu */
515 GG_SESSION_HTTP, /**< Połączenie HTTP */
516 GG_SESSION_SEARCH, /**< Wyszukiwanie w katalogu publicznym (nieaktualne) */
517 GG_SESSION_REGISTER, /**< Rejestracja nowego konta */
518 GG_SESSION_REMIND, /**< Przypominanie hasła */
519 GG_SESSION_PASSWD, /**< Zmiana hasła */
520 GG_SESSION_CHANGE, /**< Zmiana informacji w katalogu publicznym (nieaktualne) */
521 GG_SESSION_DCC, /**< Połączenie bezpośrednie (do wersji 6.x) */
522 GG_SESSION_DCC_SOCKET, /**< Gniazdo nasłuchujące (do wersji 6.x) */
523 GG_SESSION_DCC_SEND, /**< Wysyłanie pliku (do wersji 6.x) */
524 GG_SESSION_DCC_GET, /**< Odbieranie pliku (do wersji 6.x) */
525 GG_SESSION_DCC_VOICE, /**< Rozmowa głosowa (do wersji 6.x) */
526 GG_SESSION_USERLIST_GET, /**< Import listy kontaktów z serwera (nieaktualne) */
527 GG_SESSION_USERLIST_PUT, /**< Eksport listy kontaktów do serwera (nieaktualne) */
528 GG_SESSION_UNREGISTER, /**< Usuwanie konta */
529 GG_SESSION_USERLIST_REMOVE, /**< Usuwanie listy kontaktów z serwera (nieaktualne) */
530 GG_SESSION_TOKEN, /**< Pobieranie tokenu */
531 GG_SESSION_DCC7_SOCKET, /**< Gniazdo nasłuchujące (od wersji 7.x) */
532 GG_SESSION_DCC7_SEND, /**< Wysyłanie pliku (od wersji 7.x) */
533 GG_SESSION_DCC7_GET, /**< Odbieranie pliku (od wersji 7.x) */
534 GG_SESSION_DCC7_VOICE, /**< Rozmowa głosowa (od wersji 7.x) */
535
536 GG_SESSION_USER0 = 256, /**< Rodzaj zadeklarowany dla użytkownika */
537 GG_SESSION_USER1, /**< Rodzaj zadeklarowany dla użytkownika */
538 GG_SESSION_USER2, /**< Rodzaj zadeklarowany dla użytkownika */
539 GG_SESSION_USER3, /**< Rodzaj zadeklarowany dla użytkownika */
540 GG_SESSION_USER4, /**< Rodzaj zadeklarowany dla użytkownika */
541 GG_SESSION_USER5, /**< Rodzaj zadeklarowany dla użytkownika */
542 GG_SESSION_USER6, /**< Rodzaj zadeklarowany dla użytkownika */
543 GG_SESSION_USER7 /**< Rodzaj zadeklarowany dla użytkownika */
544};
545
546/**
547 * Aktualny stan sesji.
548 */
549enum gg_state_t {
550 /* wspólne */
551 GG_STATE_IDLE = 0, /**< Nie dzieje się nic */
552 GG_STATE_RESOLVING, /**< Oczekiwanie na rozwiązanie nazwy serwera */
553 GG_STATE_CONNECTING, /**< Oczekiwanie na połączenie */
554 GG_STATE_READING_DATA, /**< Oczekiwanie na dane */
555 GG_STATE_ERROR, /**< Kod błędu w polu \c error */
556
557 /* gg_session */
558 GG_STATE_CONNECTING_HUB, /**< Oczekiwanie na połączenie z hubem */
559 GG_STATE_CONNECTING_GG, /**< Oczekiwanie na połączenie z serwerem */
560 GG_STATE_READING_KEY, /**< Oczekiwanie na klucz */
561 GG_STATE_READING_REPLY, /**< Oczekiwanie na odpowiedź serwera */
562 GG_STATE_CONNECTED, /**< Połączono z serwerem */
563
564 /* gg_http */
565 GG_STATE_SENDING_QUERY, /**< Wysłano zapytanie HTTP */
566 GG_STATE_READING_HEADER, /**< Oczekiwanie na nagłówek HTTP */
567 GG_STATE_PARSING, /**< Przetwarzanie danych */
568 GG_STATE_DONE, /**< Połączenie zakończone */
569
570 /* gg_dcc */
571 GG_STATE_LISTENING, /* czeka na połączenia */
572 GG_STATE_READING_UIN_1, /* czeka na uin peera */
573 GG_STATE_READING_UIN_2, /* czeka na swój uin */
574 GG_STATE_SENDING_ACK, /* wysyła potwierdzenie dcc */
575 GG_STATE_READING_ACK, /* czeka na potwierdzenie dcc */
576 GG_STATE_READING_REQUEST, /* czeka na komendę */
577 GG_STATE_SENDING_REQUEST, /* wysyła komendę */
578 GG_STATE_SENDING_FILE_INFO, /* wysyła informacje o pliku */
579 GG_STATE_READING_PRE_FILE_INFO, /* czeka na pakiet przed file_info */
580 GG_STATE_READING_FILE_INFO, /* czeka na informacje o pliku */
581 GG_STATE_SENDING_FILE_ACK, /* wysyła potwierdzenie pliku */
582 GG_STATE_READING_FILE_ACK, /* czeka na potwierdzenie pliku */
583 GG_STATE_SENDING_FILE_HEADER, /* wysyła nagłówek pliku */
584 GG_STATE_READING_FILE_HEADER, /* czeka na nagłówek */
585 GG_STATE_GETTING_FILE, /* odbiera plik */
586 GG_STATE_SENDING_FILE, /* wysyła plik */
587 GG_STATE_READING_VOICE_ACK, /* czeka na potwierdzenie voip */
588 GG_STATE_READING_VOICE_HEADER, /* czeka na rodzaj bloku voip */
589 GG_STATE_READING_VOICE_SIZE, /* czeka na rozmiar bloku voip */
590 GG_STATE_READING_VOICE_DATA, /* czeka na dane voip */
591 GG_STATE_SENDING_VOICE_ACK, /* wysyła potwierdzenie voip */
592 GG_STATE_SENDING_VOICE_REQUEST, /* wysyła żądanie voip */
593 GG_STATE_READING_TYPE, /* czeka na typ połączenia */
594
595 /* nowe. bez sensu jest to API. */
596 GG_STATE_TLS_NEGOTIATION, /**< Negocjacja połączenia szyfrowanego */
597
598 GG_STATE_REQUESTING_ID, /**< Oczekiwanie na nadanie identyfikatora połączenia bezpośredniego */
599 GG_STATE_WAITING_FOR_ACCEPT, /**< Oczekiwanie na potwierdzenie lub odrzucenie połączenia bezpośredniego */
600 GG_STATE_WAITING_FOR_INFO, /**< Oczekiwanie na informacje o połączeniu bezpośrednim */
601
602 GG_STATE_READING_ID, /**< Odebranie identyfikatora połączenia bezpośredniego */
603 GG_STATE_SENDING_ID, /**< Wysłano identyfikator połączenia bezpośredniego */
604 GG_STATE_RESOLVING_GG, /**< Oczekiwanie na rozwiązanie nazwy serwera Gadu-Gadu */
605
606 GG_STATE_RESOLVING_RELAY, /**< Oczekiwanie na rozwiązanie nazwy serwera pośredniczącego */
607 GG_STATE_CONNECTING_RELAY, /**< Oczekiwanie na połączenie z serwerem pośredniczącym */
608 GG_STATE_READING_RELAY, /**< Odbieranie danych */
609
610 GG_STATE_DISCONNECTING, /**< Oczekiwanie na potwierdzenie rozłączenia */
611
612 GG_STATE_CONNECT_HUB, /**< Nawiązanie połączenia z hubem */
613 GG_STATE_CONNECT_PROXY_HUB,
614 GG_STATE_CONNECT_GG, /**< Nawiązanie połączenia z serwerem */
615 GG_STATE_CONNECT_PROXY_GG,
616 GG_STATE_CONNECTING_PROXY_HUB,
617 GG_STATE_CONNECTING_PROXY_GG,
618 GG_STATE_RESOLVE_HUB_SYNC,
619 GG_STATE_RESOLVE_HUB_ASYNC,
620 GG_STATE_RESOLVE_PROXY_HUB_SYNC,
621 GG_STATE_RESOLVE_PROXY_HUB_ASYNC,
622 GG_STATE_RESOLVE_PROXY_GG_SYNC,
623 GG_STATE_RESOLVE_PROXY_GG_ASYNC,
624 GG_STATE_RESOLVE_GG_SYNC,
625 GG_STATE_RESOLVE_GG_ASYNC,
626 GG_STATE_RESOLVING_HUB,
627 GG_STATE_RESOLVING_PROXY_HUB,
628 GG_STATE_RESOLVING_PROXY_GG,
629 GG_STATE_SEND_HUB,
630 GG_STATE_SEND_PROXY_HUB,
631 GG_STATE_SEND_PROXY_GG,
632 GG_STATE_SENDING_HUB,
633 GG_STATE_SENDING_PROXY_HUB,
634 GG_STATE_SENDING_PROXY_GG,
635 GG_STATE_READING_HUB,
636 GG_STATE_READING_PROXY_HUB,
637 GG_STATE_READING_PROXY_GG,
638};
639
640/**
641 * Informacja o tym, czy biblioteka chce zapisywać i/lub czytać
642 * z deskryptora. Maska bitowa.
643 *
644 * \ingroup events
645 */
646enum gg_check_t {
647 GG_CHECK_NONE = 0, /**< Nie sprawdzaj niczego */
648 GG_CHECK_WRITE = 1, /**< Sprawdź możliwość zapisu */
649 GG_CHECK_READ = 2 /**< Sprawdź możliwość odczytu */
650};
651
652/**
653 * Metody nawiązywania połączeń TCP/TLS.
654 *
655 * \ingroup socketmanager
656 */
657typedef enum {
658 GG_SOCKET_MANAGER_TYPE_INTERNAL = 0, /**< Wewnętrzna obsługa gniazd (domyślne). */
659 GG_SOCKET_MANAGER_TYPE_TCP, /**< Dostarczona przez aplikację - tylko obsługa TCP. */
660 GG_SOCKET_MANAGER_TYPE_TLS /**< Dostarczona przez aplikację - obsługa zarówno TCP, jak i TLS. */
661} gg_socket_manager_type_t;
662
663/**
664 * Funkcja dostarczona przez aplikację, tworząca nowe gniazdo TCP/TLS.
665 *
666 * Po nawiązaniu połączenia aplikacja musi wywołać gg_socket_manager_connected.
667 * Jeżeli połączenie jest asynchroniczne, wywołanie musi nastąpić po wyjściu z
668 * kontekstu tej funkcji. Dla połączeń synchronicznych z kolei, musi nastąpić
669 * jeszcze przed wyjściem z kontekstu.
670 *
671 * \param cb_data Dane prywatne aplikacji
672 * \param host Nazwa hosta
673 * \param port Numer portu
674 * \param is_tls Flaga określająca, czy ma zostać nawiązane połączenie TLS
675 * \param is_async Flaga określająca połączenie asynchroniczne (patrz szczegóły powyżej)
676 * \param priv Dane prywatne biblioteki libgadu (do przekazania do gg_socket_manager_connected)
677 *
678 * \return Uchwyt gniazda
679 *
680 * \ingroup socketmanager
681 */
682typedef void* (*gg_socket_manager_connect_cb_t)(void *cb_data, const char *host, int port, int is_tls, int is_async, void *priv);
683
684/**
685 * Niszczy gniazdo i zwalnia wszystkie powiązane z nim zasoby.
686 *
687 * \param cb_data Dane prywatne aplikacji
688 * \param handle Uchwyt gniazda
689 *
690 * \ingroup socketmanager
691 */
692typedef void (*gg_socket_manager_close_cb_t)(void *cb_data, void *handle);
693
694/**
695 * Odbiera z gniazda dane binarne.
696 *
697 * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
698 *
699 * \param cb_data Dane prywatne aplikacji
700 * \param handle Uchwyt gniazda
701 * \param buffer Bufor do zapisu danych
702 * \param bufsize Rozmiar bufora
703 *
704 * \return Ilość zapisanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
705 *
706 * \ingroup socketmanager
707 */
708typedef ssize_t (*gg_socket_manager_read_cb_t)(void *cb_data, void *handle, unsigned char *buffer, size_t bufsize);
709
710/**
711 * Wysyła przez gniazdo dane binarne.
712 *
713 * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
714 *
715 * \param cb_data Dane prywatne aplikacji
716 * \param handle Uchwyt gniazda
717 * \param data Dane do wysłania
718 * \param length Rozmiar danych
719 *
720 * \return Ilość wysłanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
721 *
722 * \ingroup socketmanager
723 */
724typedef ssize_t (*gg_socket_manager_write_cb_t)(void *cb_data, void *handle, const unsigned char *data, size_t length);
725
726/**
727 * Struktura opisująca funkcje zarządzające gniazdami, jeżeli aplikacja sama je
728 * obsługuje.
729 *
730 * \ingroup socketmanager
731 */
732typedef struct {
733 void *cb_data; /**< Dane prywatne aplikacji */
734 gg_socket_manager_connect_cb_t connect_cb; /**< Funkcja tworząca nowe gniazdo */
735 gg_socket_manager_close_cb_t close_cb; /**< Funkcja niszcząca gniazdo */
736 gg_socket_manager_read_cb_t read_cb; /**< Funkcja odczytująca dane z gniazda */
737 gg_socket_manager_write_cb_t write_cb; /**< Funkcja wysyłająca dane przez gniazdo */
738#ifndef DOXYGEN
739 void *reserved1;
740 void *reserved2;
741 void *reserved3;
742 void *reserved4;
743#endif
744} gg_socket_manager_t;
745
746int gg_socket_manager_connected(void *handle, void *priv, int fd);
747
748/**
749 * Parametry połączenia z serwerem Gadu-Gadu. Parametry zostały przeniesione
750 * do struktury, by uniknąć zmian API po rozszerzeniu protokołu i dodaniu
751 * kolejnych opcji połączenia. Część parametrów, które nie są już aktualne
752 * lub nie mają znaczenia, została usunięta z dokumentacji.
753 *
754 * \ingroup login
755 */
756struct gg_login_params {
757 uin_t uin; /**< Numer Gadu-Gadu */
758 char *password; /**< Hasło */
759 int async; /**< Flaga asynchronicznego połączenia (domyślnie nie) */
760 int status; /**< Początkowy status użytkownika (domyślnie \c GG_STATUS_AVAIL) */
761 char *status_descr; /**< Początkowy opis użytkownika (domyślnie brak) */
762 uint32_t server_addr; /**< Adres serwera Gadu-Gadu (domyślnie pobierany automatycznie) */
763 uint16_t server_port; /**< Port serwera Gadu-Gadu (domyślnie pobierany automatycznie) */
764 uint32_t client_addr; /**< Adres połączeń bezpośrednich (domyślnie dobierany automatycznie) */
765 uint16_t client_port; /**< Port połączeń bezpośrednich (domyślnie dobierany automatycznie) */
766 int protocol_version; /**< Wersja protokołu wysyłana do serwera (domyślnie najnowsza obsługiwana) */
767 char *client_version; /**< Wersja klienta wysyłana do serwera (domyślnie najnowsza znana) */
768 int has_audio; /**< Flaga obsługi połączeń głosowych */
769 int last_sysmsg; /**< Numer ostatnio odebranej wiadomości systemowej */
770 uint32_t external_addr; /**< Adres publiczny dla połączeń bezpośrednich (domyślnie dobierany automatycznie) */
771 uint16_t external_port; /**< Port publiczny dla połączeń bezpośrednich (domyślnie dobierany automatycznie) */
772 int tls; /**< Flaga połączenia szyfrowanego (patrz \ref gg_ssl_t) */
773 int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w kilobajtach */
774#ifndef DOXYGEN
775 int era_omnix; /**< Flaga udawania klienta Era Omnix (nieaktualna) */
776#endif
777 int hash_type; /**< Rodzaj skrótu hasła (\c GG_LOGIN_HASH_GG32 lub \c GG_LOGIN_HASH_SHA1, domyślnie SHA1) */
778 gg_encoding_t encoding; /**< Rodzaj kodowania używanego w sesji (domyślnie CP1250) */
779 gg_resolver_t resolver; /**< Sposób rozwiązywania nazw (patrz \ref build-resolver) */
780 int protocol_features; /**< Opcje protokołu (flagi GG_FEATURE_*). */
781 int status_flags; /**< Flagi statusu (flagi GG_STATUS_FLAG_*, patrz \ref status). */
782
783 unsigned int struct_size; /**< Rozmiar struktury. To pole powinno być inicjowane wartością sizeof(struct gg_login_params) - w przeciwnym przypadku pola za nim nie będą obsługiwane. Pozwala na rozszerzanie struktury bez łamania ABI. */
784
785 gg_compat_t compatibility; /**< Stopień kompatybilności ze starym API. */
786
787 char *connect_host; /**< Nazwa hosta (oraz opcjonalnie port, podany po dwukropku) serwera Gadu-Gadu (domyślnie pobierany automatycznie) (patrz pole struct_size). */
788
789 gg_socket_manager_type_t socket_manager_type; /**< Wybrana metoda nawiązywania połączeń TCP/TLS (domyślnie wewnętrzna) */
790 gg_socket_manager_t socket_manager; /**< Jeżeli wybrano metodę zewnętrzną - konfiguracja jej */
791
792 char **host_white_list; /**< Lista zakończona wskaźnikiem NULL, domen akceptowanych w odpowiedziach od huba (domyślnie wszystkie do tej pory znane). Używane tylko przy GG_SSL_REQUIRED. Pusta lista wyłącza sprawdzanie. */
793};
794
795#ifdef GG_CONFIG_IS_GPL_COMPLIANT
796int gg_is_gpl_compliant(void);
797#endif
798struct gg_session *gg_login(const struct gg_login_params *p);
799void gg_free_session(struct gg_session *sess);
800void gg_logoff(struct gg_session *sess);
801int gg_change_status(struct gg_session *sess, int status);
802int gg_change_status_descr(struct gg_session *sess, int status, const char *descr);
803int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time);
804int gg_change_status_flags(struct gg_session *sess, int flags);
805int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message);
806int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen);
807int gg_send_message_html(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *html_message);
808int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message);
809int gg_send_message_confer_richtext(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message, const unsigned char *format, int formatlen);
810int gg_send_message_confer_html(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *html_message);
811int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len);
812int gg_ping(struct gg_session *sess);
813int gg_userlist_request(struct gg_session *sess, char type, const char *request);
814int gg_userlist100_request(struct gg_session *sess, char type, unsigned int version, char format_type, const char *request);
815int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32);
816int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size);
817int gg_typing_notification(struct gg_session *sess, uin_t recipient, int length);
818
819uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len);
820
821int gg_session_set_resolver(struct gg_session *gs, gg_resolver_t type);
822gg_resolver_t gg_session_get_resolver(struct gg_session *gs);
823int gg_session_set_custom_resolver(struct gg_session *gs, int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
824
825int gg_http_set_resolver(struct gg_http *gh, gg_resolver_t type);
826gg_resolver_t gg_http_get_resolver(struct gg_http *gh);
827int gg_http_set_custom_resolver(struct gg_http *gh, int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
828
829int gg_global_set_resolver(gg_resolver_t type);
830gg_resolver_t gg_global_get_resolver(void);
831int gg_global_set_custom_resolver(int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
832
833int gg_multilogon_disconnect(struct gg_session *gs, gg_multilogon_id_t conn_id);
834
835int gg_chat_create(struct gg_session *gs);
836int gg_chat_invite(struct gg_session *gs, uint64_t id, uin_t *participants, unsigned int participants_count);
837int gg_chat_leave(struct gg_session *gs, uint64_t id);
838int gg_chat_send_message(struct gg_session *gs, uint64_t id, const char *message, int is_html);
839
840/**
841 * Rodzaj zdarzenia.
842 *
843 * \ingroup events
844 */
845enum gg_event_t {
846 GG_EVENT_NONE = 0, /**< Nie wydarzyło się nic wartego uwagi */
847 GG_EVENT_MSG, /**< \brief Otrzymano wiadomość. Przekazuje również wiadomości systemowe od numeru 0. */
848 GG_EVENT_NOTIFY, /**< \brief 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. */
849 GG_EVENT_NOTIFY_DESCR, /**< \brief 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. */
850 GG_EVENT_STATUS, /**< \brief 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. */
851 GG_EVENT_ACK, /**< Potwierdzenie doręczenia wiadomości */
852 GG_EVENT_PONG, /**< \brief Utrzymanie połączenia. Obecnie serwer nie wysyła już do klienta ramek utrzymania połączenia, polega wyłącznie na wysyłaniu ramek przez klienta. */
853 GG_EVENT_CONN_FAILED, /**< \brief Nie udało się połączyć */
854 GG_EVENT_CONN_SUCCESS, /**< \brief Połączono z serwerem. Pierwszą rzeczą, jaką należy zrobić jest wysłanie listy kontaktów. */
855 GG_EVENT_DISCONNECT, /**< \brief Serwer zrywa połączenie. Zdarza się, gdy równolegle do serwera podłączy się druga sesja i trzeba zerwać połączenie z pierwszą. */
856
857 GG_EVENT_DCC_NEW, /**< Nowe połączenie bezpośrednie (6.x) */
858 GG_EVENT_DCC_ERROR, /**< Błąd połączenia bezpośredniego (6.x) */
859 GG_EVENT_DCC_DONE, /**< Zakończono połączenie bezpośrednie (6.x) */
860 GG_EVENT_DCC_CLIENT_ACCEPT, /**< Moment akceptacji klienta w połączeniu bezpośrednim (6.x) */
861 GG_EVENT_DCC_CALLBACK, /**< Zwrotne połączenie bezpośrednie (6.x) */
862 GG_EVENT_DCC_NEED_FILE_INFO, /**< Należy wypełnić \c file_info dla połączenia bezpośredniego (6.x) */
863 GG_EVENT_DCC_NEED_FILE_ACK, /**< Czeka na potwierdzenie pliku w połączeniu bezpośrednim (6.x) */
864 GG_EVENT_DCC_NEED_VOICE_ACK, /**< Czeka na potwierdzenie rozmowy w połączeniu bezpośrednim (6.x) */
865 GG_EVENT_DCC_VOICE_DATA, /**< Dane bezpośredniego połączenia głosowego (6.x) */
866
867 GG_EVENT_PUBDIR50_SEARCH_REPLY, /**< Odpowiedź katalogu publicznego */
868 GG_EVENT_PUBDIR50_READ, /**< Odczytano własne dane z katalogu publicznego */
869 GG_EVENT_PUBDIR50_WRITE, /**< Zmieniono własne dane w katalogu publicznym */
870
871 GG_EVENT_STATUS60, /**< Zmiana statusu osoby z listy kontaktów */
872 GG_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. */
873 GG_EVENT_USERLIST, /**< Wynik importu lub eksportu listy kontaktów */
874 GG_EVENT_IMAGE_REQUEST, /**< Żądanie przesłania obrazka z wiadomości */
875 GG_EVENT_IMAGE_REPLY, /**< Przysłano obrazek z wiadomości */
876 GG_EVENT_DCC_ACK, /**< Potwierdzenie transmisji w połączeniu bezpośrednim (6.x) */
877
878 GG_EVENT_DCC7_NEW, /**< Nowe połączenie bezpośrednie (7.x) */
879 GG_EVENT_DCC7_ACCEPT, /**< Zaakceptowano połączenie bezpośrednie (7.x), nowy deskryptor */
880 GG_EVENT_DCC7_REJECT, /**< Odrzucono połączenie bezpośrednie (7.x) */
881 GG_EVENT_DCC7_CONNECTED, /**< Zestawiono połączenie bezpośrednie (7.x), nowy deskryptor */
882 GG_EVENT_DCC7_ERROR, /**< Błąd połączenia bezpośredniego (7.x) */
883 GG_EVENT_DCC7_DONE, /**< Zakończono połączenie bezpośrednie (7.x) */
884 GG_EVENT_DCC7_PENDING, /**< Trwa próba połączenia bezpośredniego (7.x), nowy deskryptor */
885
886 GG_EVENT_XML_EVENT, /**< Otrzymano komunikat systemowy (7.7) */
887 GG_EVENT_DISCONNECT_ACK, /**< \brief 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. */
888 GG_EVENT_TYPING_NOTIFICATION, /**< Powiadomienie o pisaniu */
889 GG_EVENT_USER_DATA, /**< Informacja o kontaktach */
890 GG_EVENT_MULTILOGON_MSG, /**< Wiadomość wysłana z innej sesji multilogowania */
891 GG_EVENT_MULTILOGON_INFO, /**< Informacja o innych sesjach multilogowania */
892
893 GG_EVENT_USERLIST100_VERSION, /**< Otrzymano numer wersji listy kontaktów na serwerze (10.0) */
894 GG_EVENT_USERLIST100_REPLY, /**< Wynik importu lub eksportu listy kontaktów (10.0) */
895
896 GG_EVENT_IMTOKEN, /**< Otrzymano ciąg IMTOKEN (11.0) */
897 GG_EVENT_PONG110, /**< \brief Utrzymanie połączenia (11.0). Może służyć do synchronizacji czasu z serwerem. */
898 GG_EVENT_JSON_EVENT, /**< Otrzymano komunikat systemowy (11.0) */
899 GG_EVENT_ACK110, /**< Potwierdzenie wysłania wiadomości (11.0) */
900
901 GG_EVENT_CHAT_INFO, /**< Otrzymano informację o konferencji (11.0). */
902 GG_EVENT_CHAT_INFO_GOT_ALL, /**< \brief Informacje o wszystkich konferencjach zostały już wysłane (11.0). Otrzymywany po ostatnim pakiecie \c GG_EVENT_CHAT_INFO */
903 GG_EVENT_CHAT_INFO_UPDATE, /**< \brief Aktualizacja informacji o konferencji (11.0). Dodanie, usunięcie jednego z uczestników. */
904 GG_EVENT_CHAT_CREATED, /**< Potwierdzenie utworzenia konferencji (11.0) */
905 GG_EVENT_CHAT_INVITE_ACK, /**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) */
906};
907
908#define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY
909
910/**
911 * Powód nieudanego połączenia.
912 */
913enum gg_failure_t {
914 GG_FAILURE_RESOLVING = 1, /**< Nie znaleziono serwera */
915 GG_FAILURE_CONNECTING, /**< Błąd połączenia */
916 GG_FAILURE_INVALID, /**< Serwer zwrócił nieprawidłowe dane */
917 GG_FAILURE_READING, /**< Zerwano połączenie podczas odczytu */
918 GG_FAILURE_WRITING, /**< Zerwano połączenie podczas zapisu */
919 GG_FAILURE_PASSWORD, /**< Nieprawidłowe hasło */
920 GG_FAILURE_404, /**< Nieużywane */
921 GG_FAILURE_TLS, /**< Błąd negocjacji szyfrowanego połączenia */
922 GG_FAILURE_NEED_EMAIL, /**< Serwer rozłączył nas z prośbą o zmianę adresu e-mail */
923 GG_FAILURE_INTRUDER, /**< Zbyt wiele prób połączenia z nieprawidłowym hasłem */
924 GG_FAILURE_UNAVAILABLE, /**< Serwery są wyłączone */
925 GG_FAILURE_PROXY, /**< Błąd serwera pośredniczącego */
926 GG_FAILURE_HUB, /**< Błąd połączenia z hubem */
927 GG_FAILURE_INTERNAL, /**< Błąd wewnętrzny */
928};
929
930/**
931 * Kod błędu danej operacji.
932 *
933 * Nie zawiera przesadnie szczegółowych informacji o powodach błędów, by nie
934 * komplikować ich obsługi. Jeśli wymagana jest większa dokładność, należy
935 * sprawdzić zawartość zmiennej systemowej \c errno.
936 */
937enum gg_error_t {
938 GG_ERROR_RESOLVING = 1, /**< Nie znaleziono hosta */
939 GG_ERROR_CONNECTING, /**< Błąd połączenia */
940 GG_ERROR_READING, /**< Błąd odczytu/odbierania */
941 GG_ERROR_WRITING, /**< Błąd zapisu/wysyłania */
942
943 GG_ERROR_DCC_HANDSHAKE, /**< Błąd negocjacji */
944 GG_ERROR_DCC_FILE, /**< Błąd odczytu/zapisu pliku */
945 GG_ERROR_DCC_EOF, /**< Przedwczesny koniec pliku */
946 GG_ERROR_DCC_NET, /**< Błąd wysyłania/odbierania */
947 GG_ERROR_DCC_REFUSED, /**< Połączenie odrzucone */
948
949 GG_ERROR_DCC7_HANDSHAKE, /**< Błąd negocjacji */
950 GG_ERROR_DCC7_FILE, /**< Błąd odczytu/zapisu pliku */
951 GG_ERROR_DCC7_EOF, /**< Przedwczesny koniec pliku */
952 GG_ERROR_DCC7_NET, /**< Błąd wysyłania/odbierania */
953 GG_ERROR_DCC7_REFUSED, /**< Połączenie odrzucone */
954 GG_ERROR_DCC7_RELAY, /**< Problem z serwerem pośredniczącym */
955};
956
957/**
958 * Pole zapytania lub odpowiedzi katalogu publicznego.
959 */
960struct gg_pubdir50_entry {
961 int num; /**< Numer wyniku */
962 char *field; /**< Nazwa pola */
963 char *value; /**< Wartość pola */
964} /* GG_DEPRECATED */;
965
966/**
967 * Zapytanie lub odpowiedź katalogu publicznego.
968 *
969 * Patrz \c gg_pubdir50_t.
970 */
971struct gg_pubdir50_s {
972 int count; /**< Liczba wyników odpowiedzi */
973 uin_t next; /**< Numer początkowy następnego zapytania */
974 int type; /**< Rodzaj zapytania */
975 uint32_t seq; /**< Numer sekwencyjny */
976 struct gg_pubdir50_entry *entries; /**< Pola zapytania lub odpowiedzi */
977 int entries_count; /**< Liczba pól */
978} /* GG_DEPRECATED */;
979
980/**
981 * Zapytanie lub odpowiedź katalogu publicznego.
982 *
983 * Do pól nie należy się odwoływać bezpośrednio -- wszystkie niezbędne
984 * informacje są dostępne za pomocą funkcji \c gg_pubdir50_*
985 */
986typedef struct gg_pubdir50_s *gg_pubdir50_t;
987
988/**
989 * Opis zdarzeń \c GG_EVENT_MSG i \c GG_EVENT_MULTILOGON_MSG.
990 */
991struct gg_event_msg {
992 uin_t sender; /**< Numer nadawcy/odbiorcy */
993 int msgclass; /**< Klasa wiadomości */
994#ifndef _WIN32
995 time_t time; /**< Czas nadania */
996#else
997 uint32_t time; /**< Czas nadania */
998#endif
999 unsigned char *message; /**< Treść wiadomości */
1000
1001 int recipients_count; /**< Liczba odbiorców konferencji */
1002 uin_t *recipients; /**< Odbiorcy konferencji */
1003
1004 int formats_length; /**< Długość informacji o formatowaniu tekstu */
1005 void *formats; /**< Informacje o formatowaniu tekstu */
1006 uint32_t seq; /**< Numer sekwencyjny wiadomości */
1007
1008 char *xhtml_message; /**< Treść wiadomości w formacie XHTML */
1009
1010 uint64_t chat_id; /**< Identyfikator konferencji lub 0, jeżeli jest to zwykła wiadomość (11.0) */
1011 uint64_t flags; /**< Flagi wiadomości (11.0) */
1012};
1013
1014/**
1015 * Opis zdarzenia \c GG_EVENT_NOTIFY_DESCR.
1016 */
1017struct gg_event_notify_descr {
1018 struct gg_notify_reply *notify; /**< Informacje o liście kontaktów */
1019 char *descr; /**< Opis status */
1020};
1021
1022/**
1023 * Opis zdarzenia \c GG_EVENT_STATUS.
1024 */
1025struct gg_event_status {
1026 uin_t uin; /**< Numer Gadu-Gadu */
1027 uint32_t status; /**< Nowy status */
1028 char *descr; /**< Opis */
1029};
1030
1031/**
1032 * Opis zdarzenia \c GG_EVENT_STATUS60.
1033 */
1034struct gg_event_status60 {
1035 uin_t uin; /**< Numer Gadu-Gadu */
1036 int status; /**< Nowy status */
1037 uint32_t remote_ip; /**< Adres IP dla połączeń bezpośrednich */
1038 uint16_t remote_port; /**< Port dla połączeń bezpośrednich */
1039 int version; /**< Wersja protokołu */
1040 int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
1041 char *descr; /**< Opis statusu */
1042#ifndef _WIN32
1043 time_t time; /**< Czas powrotu */
1044#else
1045 uint32_t time; /**< Czas powrotu */
1046#endif
1047};
1048
1049/**
1050 * Opis zdarzenia \c GG_EVENT_NOTIFY_REPLY60.
1051 */
1052struct gg_event_notify60 {
1053 uin_t uin; /**< Numer Gadu-Gadu. W ostatnim elemencie jest równy 0, a pozostałe pola są niezainicjowane. */
1054 int status; /**< Nowy status */
1055 uint32_t remote_ip; /**< Adres IP dla połączeń bezpośrednich */
1056 uint16_t remote_port; /**< Port dla połączeń bezpośrednich */
1057 int version; /**< Wersja protokołu */
1058 int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
1059 char *descr; /**< Opis statusu */
1060#ifndef _WIN32
1061 time_t time; /**< Czas powrotu */
1062#else
1063 uint32_t time; /**< Czas powrotu */
1064#endif
1065};
1066
1067/**
1068 * Opis zdarzenia \c GG_EVENT_ACK.
1069 */
1070struct gg_event_ack {
1071 uin_t recipient; /**< Numer odbiorcy */
1072 int status; /**< Status doręczenia */
1073 int seq; /**< Numer sekwencyjny wiadomości */
1074};
1075
1076/**
1077 * Opis zdarzenia \c GG_EVENT_ACK110.
1078 */
1079struct gg_event_ack110 {
1080 uint8_t msg_type; /**< Rodzaj wiadomości (0x01 - zwykła, 0x02 - konferencja) */
1081 uint32_t seq; /**< Numer sekwencyjny */
1082 uint32_t time; /**< Czas zdarzenia */
1083};
1084
1085/**
1086 * Opis zdarzenia \c GG_EVENT_USERLIST.
1087 */
1088struct gg_event_userlist {
1089 char type; /**< Rodzaj odpowiedzi */
1090 char *reply; /**< Treść odpowiedzi */
1091};
1092
1093/**
1094 * Opis zdarzenia \c GG_EVENT_DCC_VOICE_DATA.
1095 */
1096struct gg_event_dcc_voice_data {
1097 uint8_t *data; /**< Dane dźwiękowe */
1098 int length; /**< Rozmiar danych dźwiękowych */
1099};
1100
1101/**
1102 * Opis zdarzenia \c GG_EVENT_IMAGE_REQUEST.
1103 */
1104struct gg_event_image_request {
1105 uin_t sender; /**< Nadawca żądania */
1106 uint32_t size; /**< Rozmiar obrazka */
1107 uint32_t crc32; /**< Suma kontrolna CRC32 */
1108};
1109
1110/**
1111 * Opis zdarzenia \c GG_EVENT_IMAGE_REPLY.
1112 */
1113struct gg_event_image_reply {
1114 uin_t sender; /**< Nadawca obrazka */
1115 uint32_t size; /**< Rozmiar obrazka */
1116 uint32_t crc32; /**< Suma kontrolna CRC32 */
1117 char *filename; /**< Nazwa pliku */
1118 char *image; /**< Bufor z obrazkiem */
1119};
1120
1121/**
1122 * Opis zdarzenia \c GG_EVENT_XML_EVENT.
1123 */
1124struct gg_event_xml_event {
1125 char *data; /**< Bufor z komunikatem */
1126};
1127
1128/**
1129 * Opis zdarzenia \c GG_EVENT_JSON_EVENT.
1130 */
1131struct gg_event_json_event {
1132 char *data; /**< Bufor z komunikatem */
1133 char *type; /**< Bufor z typem komunikatu */
1134};
1135
1136/**
1137 * Opis zdarzenia \c GG_EVENT_DCC7_CONNECTED.
1138 */
1139struct gg_event_dcc7_connected {
1140 struct gg_dcc7 *dcc7; /**< Struktura połączenia */
1141};
1142
1143/**
1144 * Opis zdarzenia \c GG_EVENT_DCC7_PENDING.
1145 */
1146struct gg_event_dcc7_pending {
1147 struct gg_dcc7 *dcc7; /**< Struktura połączenia */
1148};
1149
1150/**
1151 * Opis zdarzenia \c GG_EVENT_DCC7_REJECT.
1152 */
1153struct gg_event_dcc7_reject {
1154 struct gg_dcc7 *dcc7; /**< Struktura połączenia */
1155 int reason; /**< powód odrzucenia */
1156};
1157
1158/**
1159 * Opis zdarzenia \c GG_EVENT_DCC7_ACCEPT.
1160 */
1161struct gg_event_dcc7_accept {
1162 struct gg_dcc7 *dcc7; /**< Struktura połączenia */
1163 int type; /**< Sposób połączenia (P2P, przez serwer) */
1164 uint32_t remote_ip; /**< Adres zdalnego klienta */
1165 uint16_t remote_port; /**< Port zdalnego klienta */
1166};
1167
1168/**
1169 * Opis zdarzenia \c GG_EVENT_DCC7_DONE.
1170 */
1171struct gg_event_dcc7_done {
1172 struct gg_dcc7 *dcc7; /**< Struktura połączenia */
1173};
1174
1175/**
1176 * Opis zdarzenia \c GG_EVENT_TYPING_NOTIFICATION.
1177 */
1178struct gg_event_typing_notification {
1179 uin_t uin; /**< Numer rozmówcy */
1180 int length; /**< Długość tekstu */
1181};
1182
1183/**
1184 * Atrybut użytkownika.
1185 */
1186struct gg_event_user_data_attr {
1187 int type; /**< Typ atrybutu */
1188 char *key; /**< Klucz */
1189 char *value; /**< Wartość */
1190};
1191
1192/**
1193 * Struktura opisująca kontakt w zdarzeniu GG_EVENT_USER_DATA.
1194 */
1195struct gg_event_user_data_user {
1196 uin_t uin; /**< Numer kontaktu */
1197 size_t attr_count; /**< Liczba atrybutów */
1198 struct gg_event_user_data_attr *attrs; /**< Lista atrybutów */
1199};
1200
1201/**
1202 * Opis zdarzenia \c GG_EVENT_USER_DATA.
1203 */
1204struct gg_event_user_data {
1205 int type; /**< Rodzaj informacji o kontaktach */
1206 size_t user_count; /**< Liczba kontaktów */
1207 struct gg_event_user_data_user *users; /**< Lista kontaktów */
1208};
1209
1210/**
1211 * Struktura opisująca sesję multilogowania.
1212 */
1213struct gg_multilogon_session {
1214 gg_multilogon_id_t id; /**< Identyfikator sesji */
1215 char *name; /**< Nazwa sesji (podana w \c gg_login_params.client_version) */
1216 uint32_t remote_addr; /**< Adres sesji */
1217 int status_flags; /**< Flagi statusu sesji */
1218 int protocol_features; /**< Opcje protokolu sesji */
1219#ifndef _WIN32
1220 time_t logon_time; /**< Czas zalogowania */
1221#else
1222 uint32_t logon_time; /**< Czas zalogowania */
1223#endif
1224};
1225
1226/**
1227 * Opis zdarzenia \c GG_EVENT_MULTILOGON_INFO.
1228 */
1229struct gg_event_multilogon_info {
1230 int count; /**< Liczba sesji */
1231 struct gg_multilogon_session *sessions; /** Lista sesji */
1232};
1233
1234/**
1235 * Opis zdarzenia \c GG_EVENT_USERLIST100_VERSION.
1236 */
1237struct gg_event_userlist100_version {
1238 uint32_t version; /**< Numer wersji listy kontaktów na serwerze */
1239};
1240
1241/**
1242 * Opis zdarzenia \c GG_EVENT_USERLIST100_REPLY.
1243 */
1244struct gg_event_userlist100_reply {
1245 char type; /**< Rodzaj odpowiedzi */
1246 uint32_t version; /**< Aktualna wersja listy kontaktów na serwerze */
1247 char format_type; /**< Typ formatu listy kontaktów (żądany w \c gg_userlist100_request.format_type) */
1248 char *reply; /**< Treść listy kontaktów w przesyłanej wersji i formacie */
1249};
1250
1251/**
1252 * Opis zdarzenia \c GG_EVENT_IMTOKEN.
1253 */
1254struct gg_event_imtoken {
1255 char *imtoken; /**< Wartość IMTOKEN */
1256};
1257
1258/**
1259 * Opis zdarzenia \c GG_EVENT_PONG110.
1260 */
1261struct gg_event_pong110 {
1262#ifndef _WIN32
1263 time_t time; /**< Aktualny czas na serwerze */
1264#else
1265 uint32_t time; /**< Aktualny czas na serwerze */
1266#endif
1267};
1268
1269/**
1270 * Opis zdarzenia \c GG_EVENT_CHAT_INFO.
1271 */
1272struct gg_event_chat_info {
1273 uint64_t id; /**< Identyfikator konferencji */
1274 uint32_t version; /**< Wersja informacji o konferencji */
1275 uint32_t participants_count; /**< Ilość uczestników */
1276 uin_t *participants; /**< Lista uczestników */
1277};
1278
1279/**
1280 * Opis zdarzenia \c GG_EVENT_CHAT_INFO_UPDATE.
1281 */
1282struct gg_event_chat_info_update {
1283 uint64_t id; /**< Identyfikator konferencji */
1284 uint32_t type; /**< Typ aktualizacji (\c GG_CHAT_INFO_UPDATE_*) */
1285 uin_t participant; /**< Uczestnik, którego dotyczy aktualizacja */
1286 uin_t inviter; /**< Uczestnik inicjujący aktualizację (zapraszający) */
1287 uint32_t version; /**< Wersja informacji o konferencji */
1288 uint32_t time; /**< Czas zdarzenia */
1289};
1290
1291/**
1292 * Opis zdarzenia \c GG_EVENT_CHAT_CREATED.
1293 */
1294struct gg_event_chat_created {
1295 uint64_t id; /**< Identyfikator konferencji */
1296 uint32_t seq; /**< Numer sekwencyjny */
1297};
1298
1299/**
1300 * Opis zdarzenia \c GG_EVENT_CHAT_INVITE_ACK.
1301 */
1302struct gg_event_chat_invite_ack {
1303 uint64_t id; /**< Identyfikator konferencji */
1304 uint32_t seq; /**< Numer sekwencyjny */
1305};
1306
1307/**
1308 * Unia wszystkich zdarzeń zwracanych przez funkcje \c gg_watch_fd(),
1309 * \c gg_dcc_watch_fd() i \c gg_dcc7_watch_fd().
1310 *
1311 * \ingroup events
1312 */
1313union gg_event_union {
1314 enum gg_failure_t failure; /**< Błąd połączenia (\c GG_EVENT_CONN_FAILED) */
1315 struct gg_notify_reply *notify; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY) */
1316 struct gg_event_notify_descr notify_descr; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY_DESCR) */
1317 struct gg_event_status status; /**< Zmiana statusu kontaktów (\c GG_EVENT_STATUS) */
1318 struct gg_event_status60 status60; /**< Zmiana statusu kontaktów (\c GG_EVENT_STATUS60) */
1319 struct gg_event_notify60 *notify60; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY60) */
1320 struct gg_event_msg msg; /**< Otrzymano wiadomość (\c GG_EVENT_MSG) */
1321 struct gg_event_ack ack; /**< Potwierdzenie wiadomości (\c GG_EVENT_ACK) */
1322 struct gg_event_ack110 ack110; /**< Potwierdzenie wysłania wiadomości (11.0) (\c GG_EVENT_ACK110) */
1323 struct gg_event_image_request image_request; /**< Żądanie wysłania obrazka (\c GG_EVENT_IMAGE_REQUEST) */
1324 struct gg_event_image_reply image_reply; /**< Odpowiedź z obrazkiem (\c GG_EVENT_IMAGE_REPLY) */
1325 struct gg_event_userlist userlist; /**< Odpowiedź listy kontaktów (\c GG_EVENT_USERLIST) */
1326 gg_pubdir50_t pubdir50; /**< Odpowiedź katalogu publicznego (\c GG_EVENT_PUBDIR50_*) */
1327 struct gg_event_xml_event xml_event; /**< Zdarzenie systemowe (\c GG_EVENT_XML_EVENT) */
1328 struct gg_event_json_event json_event; /**< Zdarzenie systemowe (\c GG_EVENT_JSON_EVENT) */
1329 struct gg_dcc *dcc_new; /**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC_NEW) */
1330 enum gg_error_t dcc_error; /**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC_ERROR) */
1331 struct gg_event_dcc_voice_data dcc_voice_data; /**< Dane połączenia głosowego (\c GG_EVENT_DCC_VOICE_DATA) */
1332 struct gg_dcc7 *dcc7_new; /**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC7_NEW) */
1333 enum gg_error_t dcc7_error; /**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC7_ERROR) */
1334 struct gg_event_dcc7_connected dcc7_connected; /**< Informacja o zestawieniu połączenia bezpośredniego (\c GG_EVENT_DCC7_CONNECTED) */
1335 struct gg_event_dcc7_pending dcc7_pending; /**< Trwa próba połączenia bezpośredniego (\c GG_EVENT_DCC7_PENDING) */
1336 struct gg_event_dcc7_reject dcc7_reject; /**< Odrzucono połączenia bezpośredniego (\c GG_EVENT_DCC7_REJECT) */
1337 struct gg_event_dcc7_accept dcc7_accept; /**< Zaakceptowano połączenie bezpośrednie (\c GG_EVENT_DCC7_ACCEPT) */
1338 struct gg_event_dcc7_done dcc7_done; /**< Zakończono połączenie bezpośrednie (\c GG_EVENT_DCC7_DONE) */
1339 struct gg_event_typing_notification typing_notification; /**< Powiadomienie o pisaniu */
1340 struct gg_event_user_data user_data; /**< Informacje o kontaktach */
1341 struct gg_event_msg multilogon_msg; /**< Inna sesja wysłała wiadomość (\c GG_EVENT_MULTILOGON_MSG) */
1342 struct gg_event_multilogon_info multilogon_info; /**< Informacja o innych sesjach multilogowania (\c GG_EVENT_MULTILOGON_INFO) */
1343 struct gg_event_userlist100_version userlist100_version; /**< Informacja o numerze wersji listy kontaktów na serwerze (\c GG_EVENT_USERLIST100_VERSION) */
1344 struct gg_event_userlist100_reply userlist100_reply; /**< Odpowiedź listy kontaktów (10.0) (\c GG_EVENT_USERLIST100_REPLY) */
1345 struct gg_event_imtoken imtoken; /**< Ciąg IMTOKEN (11.0) (\c GG_EVENT_IMTOKEN) */
1346 struct gg_event_pong110 pong110; /**< Utrzymanie połączenia (11.0) (\c GG_EVENT_PONG110) */
1347 struct gg_event_chat_info chat_info; /**< Informacje o konferencji (11.0) (\c GG_EVENT_CHAT_INFO) */
1348 struct gg_event_chat_info_update chat_info_update; /**< Aktualizacja informacji o konferencji (11.0) (\c GG_EVENT_CHAT_INFO_UPDATE) */
1349 struct gg_event_chat_created chat_created; /**< Potwierdzenie utworzenia konferencji (11.0) (\c GG_EVENT_CHAT_CREATED) */
1350 struct gg_event_chat_invite_ack chat_invite_ack; /**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) (\c GG_EVENT_CHAT_INVITE_ACK) */
1351};
1352
1353/**
1354 * Opis zdarzenia.
1355 *
1356 * Zwracany przez funkcje \c gg_watch_fd(), \c gg_dcc_watch_fd()
1357 * i \c gg_dcc7_watch_fd(). Po przeanalizowaniu należy zwolnić
1358 * za pomocą \c gg_event_free().
1359 *
1360 * \ingroup events
1361 */
1362struct gg_event {
1363 int type; /**< Rodzaj zdarzenia */
1364 union gg_event_union event; /**< Informacja o zdarzeniu */
1365};
1366
1367struct gg_event *gg_watch_fd(struct gg_session *sess);
1368void gg_event_free(struct gg_event *e);
1369
1370int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count);
1371int gg_notify(struct gg_session *sess, uin_t *userlist, int count);
1372int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type);
1373int gg_add_notify(struct gg_session *sess, uin_t uin);
1374int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type);
1375int gg_remove_notify(struct gg_session *sess, uin_t uin);
1376
1377struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header);
1378int gg_http_watch_fd(struct gg_http *h);
1379void gg_http_stop(struct gg_http *h);
1380void gg_http_free(struct gg_http *h);
1381
1382uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req);
1383gg_pubdir50_t gg_pubdir50_new(int type);
1384int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value);
1385int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq);
1386const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field);
1387int gg_pubdir50_type(gg_pubdir50_t res);
1388int gg_pubdir50_count(gg_pubdir50_t res);
1389uin_t gg_pubdir50_next(gg_pubdir50_t res);
1390uint32_t gg_pubdir50_seq(gg_pubdir50_t res);
1391void gg_pubdir50_free(gg_pubdir50_t res);
1392
1393#ifndef DOXYGEN
1394
1395#define GG_PUBDIR50_UIN "FmNumber"
1396#define GG_PUBDIR50_STATUS "FmStatus"
1397#define GG_PUBDIR50_FIRSTNAME "firstname"
1398#define GG_PUBDIR50_LASTNAME "lastname"
1399#define GG_PUBDIR50_NICKNAME "nickname"
1400#define GG_PUBDIR50_BIRTHYEAR "birthyear"
1401#define GG_PUBDIR50_CITY "city"
1402#define GG_PUBDIR50_GENDER "gender"
1403#define GG_PUBDIR50_GENDER_FEMALE "1"
1404#define GG_PUBDIR50_GENDER_MALE "2"
1405#define GG_PUBDIR50_GENDER_SET_FEMALE "2"
1406#define GG_PUBDIR50_GENDER_SET_MALE "1"
1407#define GG_PUBDIR50_ACTIVE "ActiveOnly"
1408#define GG_PUBDIR50_ACTIVE_TRUE "1"
1409#define GG_PUBDIR50_START "fmstart"
1410#define GG_PUBDIR50_FAMILYNAME "familyname"
1411#define GG_PUBDIR50_FAMILYCITY "familycity"
1412
1413#else
1414
1415/**
1416 * \ingroup pubdir50
1417 *
1418 * Rodzaj pola zapytania.
1419 */
1420enum {
1421 GG_PUBDIR50_UIN, /**< Numer Gadu-Gadu */
1422 GG_PUBDIR50_STATUS, /**< Status (tylko wynik wyszukiwania) */
1423 GG_PUBDIR50_FIRSTNAME, /**< Imię */
1424 GG_PUBDIR50_LASTNAME, /**< Nazwisko */
1425 GG_PUBDIR50_NICKNAME, /**< Pseudonim */
1426 GG_PUBDIR50_BIRTHYEAR, /**< Rok urodzenia lub przedział lat oddzielony spacją */
1427 GG_PUBDIR50_CITY, /**< Miejscowość */
1428 GG_PUBDIR50_GENDER, /**< Płeć */
1429 GG_PUBDIR50_ACTIVE, /**< Osoba dostępna (tylko wyszukiwanie) */
1430 GG_PUBDIR50_START, /**< Numer początkowy wyszukiwania (tylko wyszukiwanie) */
1431 GG_PUBDIR50_FAMILYNAME, /**< Nazwisko rodowe (tylko wysyłanie informacji o sobie) */
1432 GG_PUBDIR50_FAMILYCITY, /**< Miejscowość pochodzenia (tylko wysyłanie informacji o sobie) */
1433};
1434
1435/**
1436 * \ingroup pubdir50
1437 *
1438 * Wartość pola GG_PUBDIR50_GENDER przy wyszukiwaniu. Brak pola oznacza dowolną płeć.
1439 */
1440enum {
1441 GG_PUBDIR50_GENDER_FEMALE, /**< Kobieta */
1442 GG_PUBDIR50_GENDER_MALE, /**< Mężczyzna */
1443};
1444
1445/**
1446 * \ingroup pubdir50
1447 *
1448 * Wartość pola GG_PUBDIR50_GENDER przy wysyłaniu informacji o sobie.
1449 */
1450enum {
1451 GG_PUBDIR50_GENDER_SET_FEMALE, /**< Kobieta */
1452 GG_PUBDIR50_GENDER_SET_MALE, /**< Mężczyzna */
1453};
1454
1455/**
1456 * \ingroup pubdir50
1457 *
1458 * Wartość pola GG_PUBDIR50_ACTIVE.
1459 */
1460enum {
1461 GG_PUBDIR50_ACTIVE_TRUE, /**< Wyszukaj tylko osoby dostępne */
1462};
1463
1464#endif /* DOXYGEN */
1465
1466/**
1467 * Powód błędu operacji na katalogu publicznym.
1468 *
1469 * \ingroup http
1470 */
1471typedef enum {
1472 GG_PUBDIR_ERROR_NONE = 0, /**< Brak błędu */
1473 GG_PUBDIR_ERROR_OTHER, /**< Nieznany błąd */
1474 GG_PUBDIR_ERROR_TOKEN, /**< Błędny token */
1475 GG_PUBDIR_ERROR_OLD_PASSWORD, /**< Niepoprawne stare hasło */
1476 GG_PUBDIR_ERROR_NEW_PASSWORD, /**< Niepoprawne nowe hasło */
1477} gg_pubdir_error_t;
1478
1479/**
1480 * Wynik operacji na katalogu publicznym.
1481 *
1482 * \ingroup http
1483 */
1484struct gg_pubdir {
1485 int success; /**< Flaga powodzenia operacji */
1486 uin_t uin; /**< Otrzymany numer lub 0 w przypadku błędu */
1487 gg_pubdir_error_t error; /**< Powód błędu */
1488};
1489
1490int gg_pubdir_watch_fd(struct gg_http *f);
1491void gg_pubdir_free(struct gg_http *f);
1492
1493/**
1494 * Token autoryzacji niektórych operacji HTTP.
1495 *
1496 * \ingroup token
1497 */
1498struct gg_token {
1499 int width; /**< Szerokość obrazka */
1500 int height; /**< Wysokość obrazka */
1501 int length; /**< Liczba znaków w tokenie */
1502 char *tokenid; /**< Identyfikator tokenu */
1503};
1504
1505struct gg_http *gg_token(int async);
1506int gg_token_watch_fd(struct gg_http *h);
1507void gg_token_free(struct gg_http *h);
1508
1509struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async);
1510#ifndef DOXYGEN
1511#define gg_register_watch_fd gg_pubdir_watch_fd
1512#define gg_register_free gg_pubdir_free
1513#endif
1514
1515struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async);
1516#ifndef DOXYGEN
1517#define gg_unregister_watch_fd gg_pubdir_watch_fd
1518#define gg_unregister_free gg_pubdir_free
1519#endif
1520
1521struct gg_http *gg_remind_passwd3(uin_t uin, const char *email, const char *tokenid, const char *tokenval, int async);
1522#ifndef DOXYGEN
1523#define gg_remind_passwd_watch_fd gg_pubdir_watch_fd
1524#define gg_remind_passwd_free gg_pubdir_free
1525#endif
1526
1527struct gg_http *gg_change_passwd4(uin_t uin, const char *email, const char *passwd, const char *newpasswd, const char *tokenid, const char *tokenval, int async);
1528#ifndef DOXYGEN
1529#define gg_change_passwd_watch_fd gg_pubdir_watch_fd
1530#define gg_change_passwd_free gg_pubdir_free
1531#endif
1532
1533extern int gg_dcc_port;
1534extern unsigned long gg_dcc_ip;
1535
1536int gg_dcc_request(struct gg_session *sess, uin_t uin);
1537
1538struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
1539struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
1540struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
1541void gg_dcc_set_type(struct gg_dcc *d, int type);
1542int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename);
1543int gg_dcc_fill_file_info2(struct gg_dcc *d, const char *filename, const char *local_filename);
1544int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length);
1545
1546#define GG_DCC_VOICE_FRAME_LENGTH 195 /**< Rozmiar pakietu głosowego przed wersją Gadu-Gadu 5.0.5 */
1547#define GG_DCC_VOICE_FRAME_LENGTH_505 326 /**< Rozmiar pakietu głosowego od wersji Gadu-Gadu 5.0.5 */
1548
1549struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port);
1550#ifndef DOXYGEN
1551#define gg_dcc_socket_free gg_dcc_free
1552#define gg_dcc_socket_watch_fd gg_dcc_watch_fd
1553#endif
1554
1555struct gg_event *gg_dcc_watch_fd(struct gg_dcc *d);
1556
1557void gg_dcc_free(struct gg_dcc *c);
1558
1559struct gg_event *gg_dcc7_watch_fd(struct gg_dcc7 *d);
1560struct gg_dcc7 *gg_dcc7_send_file(struct gg_session *sess, uin_t rcpt, const char *filename, const char *filename1250, const char *hash);
1561struct gg_dcc7 *gg_dcc7_send_file_fd(struct gg_session *sess, uin_t rcpt, int fd, size_t size, const char *filename1250, const char *hash);
1562int gg_dcc7_accept(struct gg_dcc7 *dcc, unsigned int offset);
1563int gg_dcc7_reject(struct gg_dcc7 *dcc, int reason);
1564void gg_dcc7_free(struct gg_dcc7 *d);
1565
1566extern int gg_debug_level;
1567
1568extern void (*gg_debug_handler)(int level, const char *format, va_list ap);
1569extern void (*gg_debug_handler_session)(struct gg_session *sess, int level, const char *format, va_list ap);
1570
1571extern FILE *gg_debug_file;
1572
1573/**
1574 * \ingroup debug
1575 * @{
1576 */
1577#define GG_DEBUG_NET 1 /**< Rejestracja zdarzeń związanych z siecią */
1578#define GG_DEBUG_TRAFFIC 2 /**< Rejestracja ruchu sieciowego */
1579#define GG_DEBUG_DUMP 4 /**< Rejestracja zawartości pakietów */
1580#define GG_DEBUG_FUNCTION 8 /**< Rejestracja wywołań funkcji */
1581#define GG_DEBUG_MISC 16 /**< Rejestracja różnych informacji */
1582#define GG_DEBUG_VERBOSE 32 /**< Rejestracja informacji szczegółowych */
1583#define GG_DEBUG_WARNING 64 /**< Rejestracja ostrzeżeń */
1584#define GG_DEBUG_ERROR 128 /**< Rejestracja błędów krytycznych */
1585/** @} */
1586
1587const char *gg_debug_state(enum gg_state_t state);
1588const char *gg_debug_event(enum gg_event_t event);
1589
1590#ifdef GG_DEBUG_DISABLE
1591#define gg_debug(...) do { } while (0)
1592#define gg_debug_session(...) do { } while (0)
1593#else
1594void gg_debug(int level, const char *format, ...) GG_GNUC_PRINTF(2, 3);
1595void gg_debug_session(struct gg_session *sess, int level, const char *format, ...) GG_GNUC_PRINTF(3, 4);
1596#endif
1597
1598const char *gg_libgadu_version(void);
1599
1600/**
1601 * Lista funkcji biblioteki, które zależą od zewnętrznych bibliotek.
1602 *
1603 * \ingroup version
1604 */
1605typedef enum {
1606 GG_LIBGADU_FEATURE_SSL, /**< Biblioteka obsługuje połączenia szyfrowane */
1607 GG_LIBGADU_FEATURE_PTHREAD, /**< Biblioteka obsługuje rozwiązywanie nazw za pomocą wątków */
1608 GG_LIBGADU_FEATURE_USERLIST100, /**< Biblioteka obsługuje listę kontaktów zgodną z Gadu-Gadu 10 */
1609} gg_libgadu_feature_t;
1610
1611int gg_libgadu_check_feature(gg_libgadu_feature_t feature);
1612
1613extern int gg_proxy_enabled;
1614extern char *gg_proxy_host;
1615extern int gg_proxy_port;
1616extern char *gg_proxy_username;
1617extern char *gg_proxy_password;
1618extern int gg_proxy_http_only;
1619
1620extern unsigned long gg_local_ip;
1621
1622#define GG_LOGIN_HASH_GG32 0x01 /**< Algorytm Gadu-Gadu */
1623#define GG_LOGIN_HASH_SHA1 0x02 /**< Algorytm SHA1 */
1624
1625#ifndef DOXYGEN
1626
1627#define GG_PUBDIR50_WRITE 0x01
1628#define GG_PUBDIR50_READ 0x02
1629#define GG_PUBDIR50_SEARCH 0x03
1630#define GG_PUBDIR50_SEARCH_REQUEST GG_PUBDIR50_SEARCH
1631#define GG_PUBDIR50_SEARCH_REPLY 0x05
1632
1633#else
1634
1635/**
1636 * \ingroup pubdir50
1637 *
1638 * Rodzaj zapytania lub odpowiedzi katalogu publicznego.
1639 */
1640enum {
1641 GG_PUBDIR50_WRITE, /**< Wysłanie do serwera informacji o sobie */
1642 GG_PUBDIR50_READ, /**< Pobranie z serwera informacji o sobie */
1643 GG_PUBDIR50_SEARCH, /**< Wyszukiwanie w katalogu publicznym */
1644 GG_PUBDIR50_SEARCH_REPLY, /**< Wynik wyszukiwania w katalogu publicznym */
1645};
1646
1647#endif /* DOXYGEN */
1648
1649/** \cond obsolete */
1650
1651#define gg_free_event gg_event_free
1652#define gg_free_http gg_http_free
1653#define gg_free_pubdir gg_pubdir_free
1654#define gg_free_register gg_pubdir_free
1655#define gg_free_remind_passwd gg_pubdir_free
1656#define gg_free_dcc gg_dcc_free
1657#define gg_free_change_passwd gg_pubdir_free
1658
1659struct gg_search_request {
1660 int active;
1661 unsigned int start;
1662 char *nickname;
1663 char *first_name;
1664 char *last_name;
1665 char *city;
1666 int gender;
1667 int min_birth;
1668 int max_birth;
1669 char *email;
1670 char *phone;
1671 uin_t uin;
1672} /* GG_DEPRECATED */;
1673
1674struct gg_search {
1675 int count;
1676 struct gg_search_result *results;
1677} GG_DEPRECATED;
1678
1679struct gg_search_result {
1680 uin_t uin;
1681 char *first_name;
1682 char *last_name;
1683 char *nickname;
1684 int born;
1685 int gender;
1686 char *city;
1687 int active;
1688} GG_DEPRECATED;
1689
1690#define GG_GENDER_NONE 0
1691#define GG_GENDER_FEMALE 1
1692#define GG_GENDER_MALE 2
1693
1694struct gg_http *gg_search(const struct gg_search_request *r, int async) GG_DEPRECATED;
1695int gg_search_watch_fd(struct gg_http *f) GG_DEPRECATED;
1696void gg_free_search(struct gg_http *f) GG_DEPRECATED;
1697#define gg_search_free gg_free_search
1698
1699const struct gg_search_request *gg_search_request_mode_0(char *nickname, char *first_name, char *last_name, char *city, int gender, int min_birth, int max_birth, int active, int start) GG_DEPRECATED;
1700const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start) GG_DEPRECATED;
1701const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start) GG_DEPRECATED;
1702const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start) GG_DEPRECATED;
1703void gg_search_request_free(struct gg_search_request *r) GG_DEPRECATED;
1704
1705struct gg_http *gg_register(const char *email, const char *password, int async) GG_DEPRECATED;
1706struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async) GG_DEPRECATED;
1707
1708struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async) GG_DEPRECATED;
1709struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async) GG_DEPRECATED;
1710
1711struct gg_http *gg_remind_passwd(uin_t uin, int async) GG_DEPRECATED;
1712struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async) GG_DEPRECATED;
1713
1714struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async) GG_DEPRECATED;
1715struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async) GG_DEPRECATED;
1716struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async) GG_DEPRECATED;
1717
1718struct gg_change_info_request {
1719 char *first_name;
1720 char *last_name;
1721 char *nickname;
1722 char *email;
1723 int born;
1724 int gender;
1725 char *city;
1726} /* GG_DEPRECATED */;
1727
1728struct gg_change_info_request *gg_change_info_request_new(const char *first_name, const char *last_name, const char *nickname, const char *email, int born, int gender, const char *city) GG_DEPRECATED;
1729void gg_change_info_request_free(struct gg_change_info_request *r) GG_DEPRECATED;
1730
1731struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async) GG_DEPRECATED;
1732#define gg_change_pubdir_watch_fd gg_pubdir_watch_fd
1733#define gg_change_pubdir_free gg_pubdir_free
1734#define gg_free_change_pubdir gg_pubdir_free
1735
1736struct gg_http *gg_userlist_get(uin_t uin, const char *password, int async) GG_DEPRECATED;
1737int gg_userlist_get_watch_fd(struct gg_http *f) GG_DEPRECATED;
1738void gg_userlist_get_free(struct gg_http *f) GG_DEPRECATED;
1739
1740struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async) GG_DEPRECATED;
1741int gg_userlist_put_watch_fd(struct gg_http *f) GG_DEPRECATED;
1742void gg_userlist_put_free(struct gg_http *f) GG_DEPRECATED;
1743
1744struct gg_http *gg_userlist_remove(uin_t uin, const char *password, int async) GG_DEPRECATED;
1745int gg_userlist_remove_watch_fd(struct gg_http *f) GG_DEPRECATED;
1746void gg_userlist_remove_free(struct gg_http *f) GG_DEPRECATED;
1747
1748int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length) GG_DEPRECATED;
1749
1750/** \endcond */
1751
1752int gg_file_hash_sha1(int fd, uint8_t *result) GG_DEPRECATED;
1753
1754char *gg_saprintf(const char *format, ...) GG_GNUC_PRINTF(1, 2) GG_DEPRECATED;
1755char *gg_vsaprintf(const char *format, va_list ap) GG_DEPRECATED;
1756
1757#define gg_alloc_sprintf gg_saprintf
1758
1759char *gg_get_line(char **ptr) GG_DEPRECATED;
1760
1761int gg_connect(void *addr, int port, int async) GG_DEPRECATED;
1762struct in_addr *gg_gethostbyname(const char *hostname) GG_DEPRECATED;
1763char *gg_read_line(int sock, char *buf, int length) GG_DEPRECATED;
1764void gg_chomp(char *line) GG_DEPRECATED;
1765char *gg_urlencode(const char *str) GG_DEPRECATED;
1766int gg_http_hash(const char *format, ...) GG_DEPRECATED;
1767void gg_http_free_fields(struct gg_http *h) GG_DEPRECATED;
1768int gg_read(struct gg_session *sess, char *buf, int length) GG_DEPRECATED;
1769int gg_write(struct gg_session *sess, const char *buf, int length) GG_DEPRECATED;
1770void *gg_recv_packet(struct gg_session *sess) GG_DEPRECATED;
1771int gg_send_packet(struct gg_session *sess, int type, ...) GG_DEPRECATED;
1772unsigned int gg_login_hash(const unsigned char *password, unsigned int seed) GG_DEPRECATED;
1773void gg_login_hash_sha1(const char *password, uint32_t seed, uint8_t *result) GG_DEPRECATED;
1774uint32_t gg_fix32(uint32_t x);
1775uint16_t gg_fix16(uint16_t x);
1776#define fix16 gg_fix16
1777#define fix32 gg_fix32
1778char *gg_proxy_auth(void) GG_DEPRECATED;
1779char *gg_base64_encode(const char *buf) GG_DEPRECATED;
1780char *gg_base64_decode(const char *buf) GG_DEPRECATED;
1781int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq) GG_DEPRECATED;
1782
1783/**
1784 * Kolejka odbieranych obrazków.
1785 */
1786struct gg_image_queue {
1787 uin_t sender; /**< Nadawca obrazka */
1788 uint32_t size; /**< Rozmiar obrazka */
1789 uint32_t crc32; /**< Suma kontrolna CRC32 */
1790 char *filename; /**< Nazwa pliku */
1791 char *image; /**< Bufor z odebranymi danymi */
1792 uint32_t done; /**< Rozmiar odebranych danych */
1793
1794 struct gg_image_queue *next; /**< Kolejny element listy */
1795
1796 uint32_t packet_type; /**< \brief Rodzaj odbieranych pakietów. W niektórych przypadkach (przy multilogowaniu) serwer wysyła nam dwie kopie obrazka jako dwa różne typy pakietów */
1797} GG_DEPRECATED;
1798
1799int gg_dcc7_handle_id(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
1800int gg_dcc7_handle_new(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
1801int gg_dcc7_handle_info(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
1802int gg_dcc7_handle_accept(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
1803int gg_dcc7_handle_reject(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
1804
1805#define GG_APPMSG_HOST "appmsg.gadu-gadu.pl"
1806#define GG_APPMSG_PORT 80
1807#define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl"
1808#define GG_PUBDIR_PORT 80
1809#define GG_REGISTER_HOST "register.gadu-gadu.pl"
1810#define GG_REGISTER_PORT 80
1811#define GG_REMIND_HOST "retr.gadu-gadu.pl"
1812#define GG_REMIND_PORT 80
1813#define GG_RELAY_HOST "relay.gadu-gadu.pl"
1814#define GG_RELAY_PORT 80
1815
1816#define GG_DEFAULT_PORT 8074
1817#define GG_HTTPS_PORT 443
1818#define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
1819
1820#define GG_PROTOCOL_VERSION_100 0x2e
1821#define GG_PROTOCOL_VERSION_110 0x40
1822
1823/* GG_DEPRECATED */
1824#define GG_DEFAULT_CLIENT_VERSION "-"
1825
1826#define GG_DEFAULT_PROTOCOL_VERSION GG_PROTOCOL_VERSION_110
1827#define GG_DEFAULT_TIMEOUT 30
1828#define GG_HAS_AUDIO_MASK 0x40000000
1829#define GG_HAS_AUDIO7_MASK 0x20000000
1830#define GG_ERA_OMNIX_MASK 0x04000000
1831#define GG_LIBGADU_VERSION "1.12.0"
1832
1833#ifndef DOXYGEN
1834
1835#define GG_FEATURE_MSG77 0x0001
1836#define GG_FEATURE_STATUS77 0x0002
1837#define GG_FEATURE_UNKNOWN_4 0x0004
1838#define GG_FEATURE_UNKNOWN_8 0x0008
1839#define GG_FEATURE_DND_FFC 0x0010
1840#define GG_FEATURE_IMAGE_DESCR 0x0020
1841#define GG_FEATURE_UNKNOWN_40 0x0040
1842#define GG_FEATURE_UNKNOWN_80 0x0080
1843#define GG_FEATURE_UNKNOWN_100 0x0100
1844#define GG_FEATURE_USER_DATA 0x0200
1845#define GG_FEATURE_MSG_ACK 0x0400
1846#define GG_FEATURE_UNKNOWN_800 0x0800
1847#define GG_FEATURE_UNKNOWN_1000 0x1000
1848#define GG_FEATURE_TYPING_NOTIFICATION 0x2000
1849#define GG_FEATURE_MULTILOGON 0x4000
1850
1851/* Poniższe makra zostały zachowane dla zgodności API */
1852#define GG_FEATURE_MSG80 0
1853#define GG_FEATURE_STATUS80 0
1854#define GG_FEATURE_STATUS80BETA 0
1855
1856#define GG_FEATURE_ALL (GG_FEATURE_MSG80 | GG_FEATURE_STATUS80 | GG_FEATURE_DND_FFC | GG_FEATURE_IMAGE_DESCR | GG_FEATURE_UNKNOWN_100 | GG_FEATURE_USER_DATA | GG_FEATURE_MSG_ACK | GG_FEATURE_TYPING_NOTIFICATION)
1857
1858#else
1859
1860/**
1861 * \ingroup login
1862 *
1863 * Flagi opcji protokołu.
1864 */
1865enum {
1866 GG_FEATURE_MSG77, /**< Klient życzy sobie otrzymywać wiadomości zgodnie z protokołem 7.7 */
1867 GG_FEATURE_STATUS77, /**< Klient życzy sobie otrzymywać zmiany stanu zgodnie z protokołem 7.7 */
1868 GG_FEATURE_DND_FFC, /**< Klient obsługuje statusy "nie przeszkadzać" i "poGGadaj ze mną" */
1869 GG_FEATURE_IMAGE_DESCR, /**< Klient obsługuje opisy graficzne oraz flagę \c GG_STATUS80_DESCR_MASK */
1870};
1871
1872
1873#endif
1874
1875#define GG_DEFAULT_DCC_PORT 1550
1876
1877struct gg_header {
1878 uint32_t type; /* typ pakietu */
1879 uint32_t length; /* długość reszty pakietu */
1880} GG_PACKED;
1881
1882#define GG_WELCOME 0x0001
1883#define GG_NEED_EMAIL 0x0014
1884
1885struct gg_welcome {
1886 uint32_t key; /* klucz szyfrowania hasła */
1887} GG_PACKED;
1888
1889#define GG_LOGIN 0x000c
1890
1891struct gg_login {
1892 uint32_t uin; /* mój numerek */
1893 uint32_t hash; /* hash hasła */
1894 uint32_t status; /* status na dzień dobry */
1895 uint32_t version; /* moja wersja klienta */
1896 uint32_t local_ip; /* mój adres ip */
1897 uint16_t local_port; /* port, na którym słucham */
1898} GG_PACKED;
1899
1900#define GG_LOGIN_EXT 0x0013
1901
1902struct gg_login_ext {
1903 uint32_t uin; /* mój numerek */
1904 uint32_t hash; /* hash hasła */
1905 uint32_t status; /* status na dzień dobry */
1906 uint32_t version; /* moja wersja klienta */
1907 uint32_t local_ip; /* mój adres ip */
1908 uint16_t local_port; /* port, na którym słucham */
1909 uint32_t external_ip; /* zewnętrzny adres ip */
1910 uint16_t external_port; /* zewnętrzny port */
1911} GG_PACKED;
1912
1913#define GG_LOGIN60 0x0015
1914
1915struct gg_login60 {
1916 uint32_t uin; /* mój numerek */
1917 uint32_t hash; /* hash hasła */
1918 uint32_t status; /* status na dzień dobry */
1919 uint32_t version; /* moja wersja klienta */
1920 uint8_t dunno1; /* 0x00 */
1921 uint32_t local_ip; /* mój adres ip */
1922 uint16_t local_port; /* port, na którym słucham */
1923 uint32_t external_ip; /* zewnętrzny adres ip */
1924 uint16_t external_port; /* zewnętrzny port */
1925 uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
1926 uint8_t dunno2; /* 0xbe */
1927} GG_PACKED;
1928
1929#define GG_LOGIN70 0x0019
1930
1931struct gg_login70 {
1932 uint32_t uin; /* mój numerek */
1933 uint8_t hash_type; /* rodzaj hashowania hasła */
1934 uint8_t hash[64]; /* hash hasła dopełniony zerami */
1935 uint32_t status; /* status na dzień dobry */
1936 uint32_t version; /* moja wersja klienta */
1937 uint8_t dunno1; /* 0x00 */
1938 uint32_t local_ip; /* mój adres ip */
1939 uint16_t local_port; /* port, na którym słucham */
1940 uint32_t external_ip; /* zewnętrzny adres ip (???) */
1941 uint16_t external_port; /* zewnętrzny port (???) */
1942 uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
1943 uint8_t dunno2; /* 0xbe */
1944} GG_PACKED;
1945
1946#define GG_LOGIN_OK 0x0003
1947
1948#define GG_LOGIN_FAILED 0x0009
1949
1950#define GG_PUBDIR50_REQUEST 0x0014
1951
1952struct gg_pubdir50_request {
1953 uint8_t type; /* GG_PUBDIR50_* */
1954 uint32_t seq; /* czas wysłania zapytania */
1955} GG_PACKED;
1956
1957#define GG_PUBDIR50_REPLY 0x000e
1958
1959struct gg_pubdir50_reply {
1960 uint8_t type; /* GG_PUBDIR50_* */
1961 uint32_t seq; /* czas wysłania zapytania */
1962} GG_PACKED;
1963
1964#define GG_NEW_STATUS 0x0002
1965
1966#ifndef DOXYGEN
1967
1968#define GG_STATUS_NOT_AVAIL 0x0001
1969#define GG_STATUS_NOT_AVAIL_DESCR 0x0015
1970#define GG_STATUS_FFC 0x0017
1971#define GG_STATUS_FFC_DESCR 0x0018
1972#define GG_STATUS_AVAIL 0x0002
1973#define GG_STATUS_AVAIL_DESCR 0x0004
1974#define GG_STATUS_BUSY 0x0003
1975#define GG_STATUS_BUSY_DESCR 0x0005
1976#define GG_STATUS_DND 0x0021
1977#define GG_STATUS_DND_DESCR 0x0022
1978#define GG_STATUS_INVISIBLE 0x0014
1979#define GG_STATUS_INVISIBLE_DESCR 0x0016
1980#define GG_STATUS_BLOCKED 0x0006
1981
1982#define GG_STATUS_GGPLUS 0x0020
1983#define GG_STATUS_NOT_SET 0x0023
1984#define GG_STATUS_UNKNOWN 0x0025
1985
1986#define GG_STATUS_IMAGE_MASK 0x0100
1987#define GG_STATUS_DESCR_MASK 0x4000
1988#define GG_STATUS_FRIENDS_MASK 0x8000
1989
1990#define GG_STATUS_FLAG_UNKNOWN 0x00000001
1991#define GG_STATUS_FLAG_VIDEO 0x00000002
1992#define GG_STATUS_FLAG_INHERIT 0x00000020
1993#define GG_STATUS_FLAG_MOBILE 0x00100000
1994#define GG_STATUS_FLAG_SPAM 0x00800000
1995
1996#else
1997
1998/**
1999 * Rodzaje statusów użytkownika.
2000 *
2001 * \ingroup status
2002 */
2003enum {
2004 GG_STATUS_NOT_AVAIL, /**< Niedostępny */
2005 GG_STATUS_NOT_AVAIL_DESCR, /**< Niedostępny z opisem */
2006 GG_STATUS_FFC, /**< PoGGadaj ze mną */
2007 GG_STATUS_FFC_DESCR, /**< PoGGadaj ze mną z opisem */
2008 GG_STATUS_AVAIL, /**< Dostępny */
2009 GG_STATUS_AVAIL_DESCR, /**< Dostępny z opisem */
2010 GG_STATUS_BUSY, /**< Zajęty */
2011 GG_STATUS_BUSY_DESCR, /**< Zajęty z opisem */
2012 GG_STATUS_DND, /**< Nie przeszkadzać */
2013 GG_STATUS_DND_DESCR, /**< Nie przeszakdzać z opisem */
2014 GG_STATUS_INVISIBLE, /**< Niewidoczny (tylko własny status) */
2015 GG_STATUS_INVISIBLE_DESCR, /**< Niewidoczny z opisem (tylko własny status) */
2016 GG_STATUS_BLOCKED, /**< Zablokowany (tylko status innych) */
2017 GG_STATUS_GGPLUS, /**< Status "Korzystam z GG Plus" */
2018 GG_STATUS_NOT_SET, /**< Status nie ustawiony (przy logowaniu się do sieci) */
2019 GG_STATUS_IMAGE_MASK, /**< Flaga bitowa oznaczająca opis graficzny (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
2020 GG_STATUS_DESCR_MASK, /**< Flaga bitowa oznaczająca status z opisem (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
2021 GG_STATUS_FRIENDS_MASK, /**< Flaga bitowa dostępności tylko dla znajomych */
2022};
2023
2024/**
2025 * Rodzaje statusów użytkownika. Mapa bitowa.
2026 *
2027 * \ingroup status
2028 */
2029enum {
2030 GG_STATUS_FLAG_UNKNOWN, /**< Przeznaczenie nieznane, ale występuje zawsze */
2031 GG_STATUS_FLAG_VIDEO, /**< Klient obsługuje wideorozmowy */
2032 GG_STATUS_FLAG_INHERIT, /**< Synchronizacja statusu do innych klientów (przy logowaniu się do sieci) */
2033 GG_STATUS_FLAG_MOBILE, /**< Klient mobilny (ikona telefonu komórkowego) */
2034 GG_STATUS_FLAG_SPAM, /**< Klient chce otrzymywać linki od nieznajomych */
2035};
2036
2037#endif /* DOXYGEN */
2038
2039/**
2040 * \ingroup status
2041 *
2042 * Flaga bitowa dostepnosci informujaca ze mozemy voipowac
2043 */
2044
2045#define GG_STATUS_VOICE_MASK 0x20000 /**< czy ma wlaczone audio (7.7) */
2046
2047/**
2048 * \ingroup status
2049 *
2050 * Maksymalna długośc opisu.
2051 */
2052#define GG_STATUS_DESCR_MAXSIZE 255
2053#define GG_STATUS_DESCR_MAXSIZE_PRE_8_0 70
2054
2055#define GG_STATUS_MASK 0xff
2056
2057/* GG_S_F() tryb tylko dla znajomych */
2058#define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0)
2059
2060/* GG_S() stan bez uwzględnienia dodatkowych flag */
2061#define GG_S(x) ((x) & GG_STATUS_MASK)
2062
2063
2064/* GG_S_FF() chętny do rozmowy */
2065#define GG_S_FF(x) (GG_S(x) == GG_STATUS_FFC || GG_S(x) == GG_STATUS_FFC_DESCR)
2066
2067/* GG_S_AV() dostępny */
2068#define GG_S_AV(x) (GG_S(x) == GG_STATUS_AVAIL || GG_S(x) == GG_STATUS_AVAIL_DESCR)
2069
2070/* GG_S_AW() zaraz wracam */
2071#define GG_S_AW(x) (GG_S(x) == GG_STATUS_BUSY || GG_S(x) == GG_STATUS_BUSY_DESCR)
2072
2073/* GG_S_DD() nie przeszkadzać */
2074#define GG_S_DD(x) (GG_S(x) == GG_STATUS_DND || GG_S(x) == GG_STATUS_DND_DESCR)
2075
2076/* GG_S_NA() niedostępny */
2077#define GG_S_NA(x) (GG_S(x) == GG_STATUS_NOT_AVAIL || GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR)
2078
2079/* GG_S_I() niewidoczny */
2080#define GG_S_I(x) (GG_S(x) == GG_STATUS_INVISIBLE || GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
2081
2082
2083/* GG_S_A() dostępny lub chętny do rozmowy */
2084#define GG_S_A(x) (GG_S_FF(x) || GG_S_AV(x))
2085
2086/* GG_S_B() zajęty lub nie przeszkadzać */
2087#define GG_S_B(x) (GG_S_AW(x) || GG_S_DD(x))
2088
2089
2090/* GG_S_D() stan opisowy */
2091#define GG_S_D(x) (GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR || \
2092 GG_S(x) == GG_STATUS_FFC_DESCR || \
2093 GG_S(x) == GG_STATUS_AVAIL_DESCR || \
2094 GG_S(x) == GG_STATUS_BUSY_DESCR || \
2095 GG_S(x) == GG_STATUS_DND_DESCR || \
2096 GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
2097
2098/* GG_S_BL() blokowany lub blokujący */
2099#define GG_S_BL(x) (GG_S(x) == GG_STATUS_BLOCKED)
2100
2101/**
2102 * Zmiana statusu (pakiet \c GG_NEW_STATUS i \c GG_NEW_STATUS80BETA)
2103 */
2104struct gg_new_status {
2105 uint32_t status; /**< Nowy status */
2106} GG_PACKED;
2107
2108#define GG_NOTIFY_FIRST 0x000f
2109#define GG_NOTIFY_LAST 0x0010
2110
2111#define GG_NOTIFY 0x0010
2112
2113struct gg_notify {
2114 uint32_t uin; /* numerek danej osoby */
2115 uint8_t dunno1; /* rodzaj wpisu w liście */
2116} GG_PACKED;
2117
2118#ifndef DOXYGEN
2119
2120#define GG_USER_OFFLINE 0x01
2121#define GG_USER_NORMAL 0x03
2122#define GG_USER_BLOCKED 0x04
2123
2124#else
2125
2126/**
2127 * \ingroup contacts
2128 *
2129 * Rodzaj kontaktu.
2130 */
2131enum {
2132 GG_USER_NORMAL, /**< Zwykły kontakt */
2133 GG_USER_BLOCKED, /**< Zablokowany */
2134 GG_USER_OFFLINE, /**< Niewidoczny dla kontaktu */
2135};
2136
2137#endif /* DOXYGEN */
2138
2139#define GG_LIST_EMPTY 0x0012
2140
2141#define GG_NOTIFY_REPLY 0x000c /* tak, to samo co GG_LOGIN */
2142
2143struct gg_notify_reply {
2144 uint32_t uin; /* numerek */
2145 uint32_t status; /* status danej osoby */
2146 uint32_t remote_ip; /* adres ip delikwenta */
2147 uint16_t remote_port; /* port, na którym słucha klient */
2148 uint32_t version; /* wersja klienta */
2149 uint16_t dunno2; /* znowu port? */
2150} GG_PACKED;
2151
2152#define GG_NOTIFY_REPLY60 0x0011
2153
2154struct gg_notify_reply60 {
2155 uint32_t uin; /* numerek plus flagi w MSB */
2156 uint8_t status; /* status danej osoby */
2157 uint32_t remote_ip; /* adres ip delikwenta */
2158 uint16_t remote_port; /* port, na którym słucha klient */
2159 uint8_t version; /* wersja klienta */
2160 uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
2161 uint8_t dunno1; /* 0x00 */
2162} GG_PACKED;
2163
2164#define GG_STATUS60 0x000f
2165
2166struct gg_status60 {
2167 uint32_t uin; /* numerek plus flagi w MSB */
2168 uint8_t status; /* status danej osoby */
2169 uint32_t remote_ip; /* adres ip delikwenta */
2170 uint16_t remote_port; /* port, na którym słucha klient */
2171 uint8_t version; /* wersja klienta */
2172 uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
2173 uint8_t dunno1; /* 0x00 */
2174} GG_PACKED;
2175
2176#define GG_NOTIFY_REPLY77 0x0018
2177
2178struct gg_notify_reply77 {
2179 uint32_t uin; /* numerek plus flagi w MSB */
2180 uint8_t status; /* status danej osoby */
2181 uint32_t remote_ip; /* adres ip delikwenta */
2182 uint16_t remote_port; /* port, na którym słucha klient */
2183 uint8_t version; /* wersja klienta */
2184 uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
2185 uint8_t dunno1; /* 0x00 */
2186 uint32_t dunno2; /* ? */
2187} GG_PACKED;
2188
2189#define GG_STATUS77 0x0017
2190
2191struct gg_status77 {
2192 uint32_t uin; /* numerek plus flagi w MSB */
2193 uint8_t status; /* status danej osoby */
2194 uint32_t remote_ip; /* adres ip delikwenta */
2195 uint16_t remote_port; /* port, na którym słucha klient */
2196 uint8_t version; /* wersja klienta */
2197 uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
2198 uint8_t dunno1; /* 0x00 */
2199 uint32_t dunno2; /* ? */
2200} GG_PACKED;
2201
2202#define GG_ADD_NOTIFY 0x000d
2203#define GG_REMOVE_NOTIFY 0x000e
2204
2205struct gg_add_remove {
2206 uint32_t uin; /* numerek */
2207 uint8_t dunno1; /* bitmapa */
2208} GG_PACKED;
2209
2210#define GG_STATUS 0x0002
2211
2212struct gg_status {
2213 uint32_t uin; /* numerek */
2214 uint32_t status; /* nowy stan */
2215} GG_PACKED;
2216
2217#define GG_SEND_MSG 0x000b
2218
2219#ifndef DOXYGEN
2220
2221#define GG_CLASS_QUEUED 0x0001
2222#define GG_CLASS_OFFLINE GG_CLASS_QUEUED
2223#define GG_CLASS_MSG 0x0004
2224#define GG_CLASS_CHAT 0x0008
2225#define GG_CLASS_CTCP 0x0010
2226#define GG_CLASS_ACK 0x0020
2227#define GG_CLASS_EXT GG_CLASS_ACK /**< Dla kompatybilności wstecz */
2228
2229#else
2230
2231/**
2232 * Klasy wiadomości. Wartości są maskami bitowymi, które w większości
2233 * przypadków można łączyć (połączenie \c GG_CLASS_MSG i \c GG_CLASS_CHAT
2234 * nie ma sensu).
2235 *
2236 * \ingroup messages
2237 */
2238enum {
2239 GG_CLASS_MSG, /**< Wiadomość ma pojawić się w osobnym oknie */
2240 GG_CLASS_CHAT, /**< Wiadomość ma pojawić się w oknie rozmowy */
2241 GG_CLASS_CTCP, /**< Wiadomość przeznaczona dla klienta Gadu-Gadu */
2242 GG_CLASS_ACK, /**< Klient nie życzy sobie potwierdzenia */
2243 GG_CLASS_QUEUED, /**< Wiadomość zakolejkowana na serwerze (tylko przy odbieraniu) */
2244};
2245
2246#endif /* DOXYGEN */
2247
2248/**
2249 * Maksymalna długość wiadomości.
2250 *
2251 * \ingroup messages
2252 */
2253#define GG_MSG_MAXSIZE 1989
2254
2255struct gg_send_msg {
2256 uint32_t recipient;
2257 uint32_t seq;
2258 uint32_t msgclass;
2259} GG_PACKED;
2260
2261struct gg_msg_richtext {
2262 uint8_t flag;
2263 uint16_t length;
2264} GG_PACKED;
2265
2266/**
2267 * Struktura opisująca formatowanie tekstu. W zależności od wartości pola
2268 * \c font, zaraz za tą strukturą może wystąpić \c gg_msg_richtext_color
2269 * lub \c gg_msg_richtext_image.
2270 *
2271 * \ingroup messages
2272 */
2273struct gg_msg_richtext_format {
2274 uint16_t position; /**< Początkowy znak formatowania (liczony od 0) */
2275 uint8_t font; /**< Atrybuty formatowania */
2276} GG_PACKED;
2277
2278#ifndef DOXYGEN
2279
2280#define GG_FONT_BOLD 0x01
2281#define GG_FONT_ITALIC 0x02
2282#define GG_FONT_UNDERLINE 0x04
2283#define GG_FONT_COLOR 0x08
2284#define GG_FONT_IMAGE 0x80
2285
2286#else
2287
2288/**
2289 * Atrybuty formatowania wiadomości.
2290 *
2291 * \ingroup messages
2292 */
2293enum {
2294 GG_FONT_BOLD,
2295 GG_FONT_ITALIC,
2296 GG_FONT_UNDERLINE,
2297 GG_FONT_COLOR,
2298 GG_FONT_IMAGE
2299};
2300
2301#endif /* DOXYGEN */
2302
2303/**
2304 * Struktura opisującą kolor tekstu dla atrybutu \c GG_FONT_COLOR.
2305 *
2306 * \ingroup messages
2307 */
2308struct gg_msg_richtext_color {
2309 uint8_t red; /**< Składowa czerwona koloru */
2310 uint8_t green; /**< Składowa zielona koloru */
2311 uint8_t blue; /**< Składowa niebieska koloru */
2312} GG_PACKED;
2313
2314/**
2315 * Strukturya opisująca obrazek wstawiony do wiadomości dla atrubutu
2316 * \c GG_FONT_IMAGE.
2317 *
2318 * \ingroup messages
2319 */
2320struct gg_msg_richtext_image {
2321 uint16_t unknown1; /**< Nieznane pole o wartości 0x0109 */
2322 uint32_t size; /**< Rozmiar obrazka */
2323 uint32_t crc32; /**< Suma kontrolna CRC32 obrazka */
2324} GG_PACKED;
2325
2326struct gg_msg_recipients {
2327 uint8_t flag;
2328 uint32_t count;
2329} GG_PACKED;
2330
2331struct gg_msg_image_request {
2332 uint8_t flag;
2333 uint32_t size;
2334 uint32_t crc32;
2335} GG_PACKED;
2336
2337struct gg_msg_image_reply {
2338 uint8_t flag;
2339 uint32_t size;
2340 uint32_t crc32;
2341 /* char filename[]; */
2342 /* char image[]; */
2343} GG_PACKED;
2344
2345#define GG_SEND_MSG_ACK 0x0005
2346
2347#ifndef DOXYGEN
2348
2349#define GG_ACK_BLOCKED 0x0001
2350#define GG_ACK_DELIVERED 0x0002
2351#define GG_ACK_QUEUED 0x0003
2352#define GG_ACK_MBOXFULL 0x0004
2353#define GG_ACK_NOT_DELIVERED 0x0006
2354
2355#else
2356
2357/**
2358 * Status doręczenia wiadomości.
2359 *
2360 * \ingroup messages
2361 */
2362enum
2363{
2364 GG_ACK_DELIVERED, /**< Wiadomość dostarczono. */
2365 GG_ACK_QUEUED, /**< Wiadomość zakolejkowano z powodu niedostępności odbiorcy. */
2366 GG_ACK_BLOCKED, /**< Wiadomość zablokowana przez serwer (spam, świąteczne ograniczenia itd.) */
2367 GG_ACK_MBOXFULL, /**< Wiadomości nie dostarczono z powodu zapełnionej kolejki wiadomości odbiorcy. */
2368 GG_ACK_NOT_DELIVERED /**< Wiadomości nie dostarczono (tylko dla \c GG_CLASS_CTCP). */
2369};
2370
2371#endif /* DOXYGEN */
2372
2373struct gg_send_msg_ack {
2374 uint32_t status;
2375 uint32_t recipient;
2376 uint32_t seq;
2377} GG_PACKED;
2378
2379#define GG_RECV_MSG 0x000a
2380
2381struct gg_recv_msg {
2382 uint32_t sender;
2383 uint32_t seq;
2384 uint32_t time;
2385 uint32_t msgclass;
2386} GG_PACKED;
2387
2388#define GG_PING 0x0008
2389
2390#define GG_PONG 0x0007
2391
2392#define GG_DISCONNECTING 0x000b
2393
2394#define GG_USERLIST_REQUEST 0x0016
2395
2396#define GG_XML_EVENT 0x0027
2397
2398#ifndef DOXYGEN
2399
2400#define GG_USERLIST_PUT 0x00
2401#define GG_USERLIST_PUT_MORE 0x01
2402#define GG_USERLIST_GET 0x02
2403
2404#else
2405
2406/**
2407 * \ingroup importexport
2408 *
2409 * Rodzaj zapytania.
2410 */
2411enum {
2412 GG_USERLIST_PUT, /**< Eksport listy kontaktów. */
2413 GG_USERLIST_GET, /**< Import listy kontaktów. */
2414};
2415
2416#endif /* DOXYGEN */
2417
2418struct gg_userlist_request {
2419 uint8_t type;
2420} GG_PACKED;
2421
2422#define GG_USERLIST_REPLY 0x0010
2423
2424#ifndef DOXYGEN
2425
2426#define GG_USERLIST_PUT_REPLY 0x00
2427#define GG_USERLIST_PUT_MORE_REPLY 0x02
2428#define GG_USERLIST_GET_REPLY 0x06
2429#define GG_USERLIST_GET_MORE_REPLY 0x04
2430
2431#else
2432
2433/**
2434 * \ingroup importexport
2435 *
2436 * Rodzaj odpowiedzi.
2437 */
2438enum {
2439 GG_USERLIST_PUT_REPLY, /**< Wyeksportowano listy kontaktów. */
2440 GG_USERLIST_GET_REPLY, /**< Zaimportowano listę kontaktów. */
2441};
2442
2443#endif /* DOXYGEN */
2444
2445struct gg_userlist_reply {
2446 uint8_t type;
2447} GG_PACKED;
2448
2449#ifndef DOXYGEN
2450
2451#define GG_USERLIST100_PUT 0x00
2452#define GG_USERLIST100_GET 0x02
2453
2454#else
2455
2456/**
2457 * \ingroup importexport
2458 *
2459 * Rodzaj zapytania (10.0).
2460 */
2461enum {
2462 GG_USERLIST100_PUT, /**< Eksport listy kontaktów. */
2463 GG_USERLIST100_GET, /**< Import listy kontaktów. */
2464};
2465
2466#endif /* DOXYGEN */
2467
2468#ifndef DOXYGEN
2469
2470#define GG_USERLIST100_FORMAT_TYPE_NONE 0x00
2471#define GG_USERLIST100_FORMAT_TYPE_GG70 0x01
2472#define GG_USERLIST100_FORMAT_TYPE_GG100 0x02
2473
2474#else
2475
2476/**
2477 * \ingroup importexport
2478 *
2479 * Typ formatu listy kontaktów (10.0).
2480 */
2481enum {
2482 GG_USERLIST100_FORMAT_TYPE_NONE, /**< Brak treści listy kontaktów. */
2483 GG_USERLIST100_FORMAT_TYPE_GG70, /**< Format listy kontaktów zgodny z Gadu-Gadu 7.0. */
2484 GG_USERLIST100_FORMAT_TYPE_GG100, /**< Format listy kontaktów zgodny z Gadu-Gadu 10.0. */
2485};
2486
2487#endif /* DOXYGEN */
2488
2489#ifndef DOXYGEN
2490
2491#define GG_USERLIST100_REPLY_LIST 0x00
2492#define GG_USERLIST100_REPLY_UPTODATE 0x01
2493#define GG_USERLIST100_REPLY_ACK 0x10
2494#define GG_USERLIST100_REPLY_REJECT 0x12
2495
2496#else
2497
2498/**
2499 * \ingroup importexport
2500 *
2501 * Typ odpowiedzi listy kontaktów (10.0).
2502 */
2503enum {
2504 GG_USERLIST100_REPLY_LIST, /**< W odpowiedzi znajduje się aktualna lista kontaktów na serwerze. */
2505 GG_USERLIST100_REPLY_UPTODATE, /**< Komunikat o tym, że lista kontaktów jest już zsynchronizowana. */
2506 GG_USERLIST100_REPLY_ACK, /**< Potwierdzenie odebrania nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer nowej wersji listy kontaktów. */
2507 GG_USERLIST100_REPLY_REJECT, /**< Odmowa przyjęcia nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer wersji listy kontaktów aktualnie przechowywanej przez serwer. */
2508};
2509
2510#endif /* DOXYGEN */
2511
2512struct gg_dcc_tiny_packet {
2513 uint8_t type; /* rodzaj pakietu */
2514} GG_PACKED;
2515
2516struct gg_dcc_small_packet {
2517 uint32_t type; /* rodzaj pakietu */
2518} GG_PACKED;
2519
2520struct gg_dcc_big_packet {
2521 uint32_t type; /* rodzaj pakietu */
2522 uint32_t dunno1; /* niewiadoma */
2523 uint32_t dunno2; /* niewiadoma */
2524} GG_PACKED;
2525
2526/*
2527 * póki co, nie znamy dokładnie protokołu. nie wiemy, co czemu odpowiada.
2528 * nazwy są niepoważne i tymczasowe.
2529 */
2530#define GG_DCC_WANT_FILE 0x0003 /* peer chce plik */
2531#define GG_DCC_HAVE_FILE 0x0001 /* więc mu damy */
2532#define GG_DCC_HAVE_FILEINFO 0x0003 /* niech ma informacje o pliku */
2533#define GG_DCC_GIMME_FILE 0x0006 /* peer jest pewny */
2534#define GG_DCC_CATCH_FILE 0x0002 /* wysyłamy plik */
2535
2536#define GG_DCC_FILEATTR_READONLY 0x0020
2537
2538#define GG_DCC_TIMEOUT_SEND 1800 /* 30 minut */
2539#define GG_DCC_TIMEOUT_GET 1800 /* 30 minut */
2540#define GG_DCC_TIMEOUT_FILE_ACK 300 /* 5 minut */
2541#define GG_DCC_TIMEOUT_VOICE_ACK 300 /* 5 minut */
2542
2543#define GG_DCC7_INFO 0x1f
2544
2545struct gg_dcc7_info {
2546 uint32_t uin; /* numer nadawcy */
2547 uint32_t type; /* sposób połączenia */
2548 gg_dcc7_id_t id; /* identyfikator połączenia */
2549 char info[GG_DCC7_INFO_LEN]; /* informacje o połączeniu "ip port" */
2550 char hash[GG_DCC7_INFO_HASH_LEN];/* skrót "ip" */
2551} GG_PACKED;
2552
2553#define GG_DCC7_NEW 0x20
2554
2555struct gg_dcc7_new {
2556 gg_dcc7_id_t id; /* identyfikator połączenia */
2557 uint32_t uin_from; /* numer nadawcy */
2558 uint32_t uin_to; /* numer odbiorcy */
2559 uint32_t type; /* rodzaj transmisji */
2560 unsigned char filename[GG_DCC7_FILENAME_LEN]; /* nazwa pliku */
2561 uint32_t size; /* rozmiar pliku */
2562 uint32_t size_hi; /* rozmiar pliku (starsze bajty) */
2563 unsigned char hash[GG_DCC7_HASH_LEN]; /* hash SHA1 */
2564} GG_PACKED;
2565
2566#define GG_DCC7_ACCEPT 0x21
2567
2568struct gg_dcc7_accept {
2569 uint32_t uin; /* numer przyjmującego połączenie */
2570 gg_dcc7_id_t id; /* identyfikator połączenia */
2571 uint32_t offset; /* offset przy wznawianiu transmisji */
2572 uint32_t dunno1; /* 0x00000000 */
2573} GG_PACKED;
2574
2575/* XXX API */
2576#define GG_DCC7_TYPE_P2P 0x00000001 /**< Połączenie bezpośrednie */
2577#define GG_DCC7_TYPE_SERVER 0x00000002 /**< Połączenie przez serwer */
2578
2579#define GG_DCC7_REJECT 0x22
2580
2581struct gg_dcc7_reject {
2582 uint32_t uin; /**< Numer odrzucającego połączenie */
2583 gg_dcc7_id_t id; /**< Identyfikator połączenia */
2584 uint32_t reason; /**< Powód rozłączenia */
2585} GG_PACKED;
2586
2587/* XXX API */
2588#define GG_DCC7_REJECT_BUSY 0x00000001 /**< Połączenie bezpośrednie już trwa, nie umiem obsłużyć więcej */
2589#define GG_DCC7_REJECT_USER 0x00000002 /**< Użytkownik odrzucił połączenie */
2590#define GG_DCC7_REJECT_VERSION 0x00000006 /**< Druga strona ma wersję klienta nieobsługującą połączeń bezpośrednich tego typu */
2591
2592#define GG_DCC7_ID_REQUEST 0x23
2593
2594struct gg_dcc7_id_request {
2595 uint32_t type; /**< Rodzaj tranmisji */
2596} GG_PACKED;
2597
2598/* XXX API */
2599#define GG_DCC7_TYPE_VOICE 0x00000001 /**< Transmisja głosu */
2600#define GG_DCC7_TYPE_FILE 0x00000004 /**< transmisja pliku */
2601
2602#define GG_DCC7_ID_REPLY 0x23
2603
2604struct gg_dcc7_id_reply {
2605 uint32_t type; /** Rodzaj transmisji */
2606 gg_dcc7_id_t id; /** Przyznany identyfikator */
2607} GG_PACKED;
2608
2609#define GG_DCC7_DUNNO1 0x24
2610
2611#define GG_DCC7_TIMEOUT_CONNECT 10 /* 10 sekund */
2612#define GG_DCC7_TIMEOUT_SEND 1800 /* 30 minut */
2613#define GG_DCC7_TIMEOUT_GET 1800 /* 30 minut */
2614#define GG_DCC7_TIMEOUT_FILE_ACK 300 /* 5 minut */
2615#define GG_DCC7_TIMEOUT_VOICE_ACK 300 /* 5 minut */
2616
2617#define GG_CHAT_INFO_UPDATE_ENTERED 0x01
2618#define GG_CHAT_INFO_UPDATE_EXITED 0x03
2619
2620#ifdef __cplusplus
2621}
2622#endif
2623
2624#ifdef _WIN32
2625#pragma pack(pop)
2626#endif
2627
2628#endif /* LIBGADU_LIBGADU_H */
2629
2630/*
2631 * Local variables:
2632 * c-indentation-style: k&r
2633 * c-basic-offset: 8
2634 * indent-tabs-mode: notnil
2635 * End:
2636 *
2637 * vim: shiftwidth=8:
2638 */
2639