1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/Frameworks/libpurple.framework/Versions/0.6.2/Headers/libgadu-ppc.h Fri Aug 21 13:25:11 2009 -0700
1.3 @@ -0,0 +1,1393 @@
1.4 +/* include/libgadu.h. Generated from libgadu.h.in by configure. */
1.5 +/* $Id: libgadu.h.in,v 1.5.2.1 2007-04-21 23:44:25 wojtekka Exp $ */
1.6 +
1.7 +/*
1.8 + * (C) Copyright 2001-2003 Wojtek Kaniewski <wojtekka@irc.pl>
1.9 + * Robert J. Woźny <speedy@ziew.org>
1.10 + * Arkadiusz Miśkiewicz <arekm@pld-linux.org>
1.11 + * Tomasz Chiliński <chilek@chilan.com>
1.12 + * Piotr Wysocki <wysek@linux.bydg.org>
1.13 + * Dawid Jarosz <dawjar@poczta.onet.pl>
1.14 + *
1.15 + * This program is free software; you can redistribute it and/or modify
1.16 + * it under the terms of the GNU Lesser General Public License Version
1.17 + * 2.1 as published by the Free Software Foundation.
1.18 + *
1.19 + * This program is distributed in the hope that it will be useful,
1.20 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.21 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.22 + * GNU Lesser General Public License for more details.
1.23 + *
1.24 + * You should have received a copy of the GNU Lesser General Public
1.25 + * License along with this program; if not, write to the Free Software
1.26 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
1.27 + * USA.
1.28 + */
1.29 +
1.30 +#ifndef __GG_LIBGADU_H
1.31 +#define __GG_LIBGADU_H
1.32 +
1.33 +#ifdef __cplusplus
1.34 +#ifdef _WIN32
1.35 +#pragma pack(push, 1)
1.36 +#endif
1.37 +extern "C" {
1.38 +#endif
1.39 +
1.40 +#include <sys/types.h>
1.41 +#include <stdio.h>
1.42 +#include <stdarg.h>
1.43 +
1.44 +/* Defined if libgadu was compiled for bigendian machine. */
1.45 +#define GG_CONFIG_BIGENDIAN
1.46 +
1.47 +/* Defined if this machine has gethostbyname_r(). */
1.48 +/* #undef GG_CONFIG_HAVE_GETHOSTBYNAME_R */
1.49 +
1.50 +/* Defined if libgadu was compiled and linked with pthread support. */
1.51 +/* #undef GG_CONFIG_HAVE_PTHREAD */
1.52 +
1.53 +/* Defined if this machine has C99-compiliant vsnprintf(). */
1.54 +#define GG_CONFIG_HAVE_C99_VSNPRINTF
1.55 +
1.56 +/* Defined if this machine has va_copy(). */
1.57 +#define GG_CONFIG_HAVE_VA_COPY
1.58 +
1.59 +/* Defined if this machine has __va_copy(). */
1.60 +#define GG_CONFIG_HAVE___VA_COPY
1.61 +
1.62 +/* Defined if this machine supports long long. */
1.63 +#define GG_CONFIG_HAVE_LONG_LONG
1.64 +
1.65 +/* Defined if libgadu was compiled and linked with TLS support. */
1.66 +#define GG_CONFIG_HAVE_OPENSSL
1.67 +
1.68 +/* Defined if uintX_t types are defined in <stdint.h>. */
1.69 +#define GG_CONFIG_HAVE_STDINT_H
1.70 +
1.71 +/* Defined if uintX_t types are defined in <inttypes.h>. */
1.72 +/* #undef GG_CONFIG_HAVE_INTTYPES_H */
1.73 +
1.74 +/* Defined if uintX_t types are defined in <sys/inttypes.h>. */
1.75 +/* #undef GG_CONFIG_HAVE_SYS_INTTYPES_H */
1.76 +
1.77 +/* Defined if uintX_t types are defined in <sys/int_types.h>. */
1.78 +/* #undef GG_CONFIG_HAVE_SYS_INT_TYPES_H */
1.79 +
1.80 +/* Defined if uintX_t types are defined in <sys/types.h>. */
1.81 +/* #undef GG_CONFIG_HAVE_SYS_TYPES_H */
1.82 +
1.83 +#ifdef GG_CONFIG_HAVE_OPENSSL
1.84 +#include <openssl/ssl.h>
1.85 +#endif
1.86 +
1.87 +#ifdef GG_CONFIG_HAVE_STDINT_H
1.88 +#include <stdint.h>
1.89 +#else
1.90 +# ifdef GG_CONFIG_HAVE_INTTYPES_H
1.91 +# include <inttypes.h>
1.92 +# else
1.93 +# ifdef GG_CONFIG_HAVE_SYS_INTTYPES_H
1.94 +# include <sys/inttypes.h>
1.95 +# else
1.96 +# ifdef GG_CONFIG_HAVE_SYS_INT_TYPES_H
1.97 +# include <sys/int_types.h>
1.98 +# else
1.99 +# ifdef GG_CONFIG_HAVE_SYS_TYPES_H
1.100 +# include <sys/types.h>
1.101 +# else
1.102 +
1.103 +#ifndef __AC_STDINT_H
1.104 +#define __AC_STDINT_H
1.105 +
1.106 +/* ISO C 9X: 7.18 Integer types <stdint.h> */
1.107 +
1.108 +typedef unsigned char uint8_t;
1.109 +typedef unsigned short uint16_t;
1.110 +typedef unsigned int uint32_t;
1.111 +
1.112 +#ifndef __CYGWIN__
1.113 +#define __int8_t_defined
1.114 +typedef signed char int8_t;
1.115 +typedef signed short int16_t;
1.116 +typedef signed int int32_t;
1.117 +#endif
1.118 +
1.119 +#endif /* __AC_STDINT_H */
1.120 +
1.121 +# endif
1.122 +# endif
1.123 +# endif
1.124 +# endif
1.125 +#endif
1.126 +
1.127 +/*
1.128 + * typedef uin_t
1.129 + *
1.130 + * typ reprezentujący numer osoby.
1.131 + */
1.132 +typedef uint32_t uin_t;
1.133 +
1.134 +/*
1.135 + * ogólna struktura opisująca różne sesje. przydatna w klientach.
1.136 + */
1.137 +#define gg_common_head(x) \
1.138 + int fd; /* podglądany deskryptor */ \
1.139 + int check; /* sprawdzamy zapis czy odczyt */ \
1.140 + int state; /* aktualny stan maszynki */ \
1.141 + int error; /* kod błędu dla GG_STATE_ERROR */ \
1.142 + int type; /* rodzaj sesji */ \
1.143 + int id; /* identyfikator */ \
1.144 + int timeout; /* sugerowany timeout w sekundach */ \
1.145 + int (*callback)(x*); /* callback przy zmianach */ \
1.146 + void (*destroy)(x*); /* funkcja niszczenia */
1.147 +
1.148 +struct gg_common {
1.149 + gg_common_head(struct gg_common)
1.150 +};
1.151 +
1.152 +struct gg_image_queue;
1.153 +
1.154 +/*
1.155 + * struct gg_session
1.156 + *
1.157 + * struktura opisująca daną sesję. tworzona przez gg_login(), zwalniana
1.158 + * przez gg_free_session().
1.159 + */
1.160 +struct gg_session {
1.161 + gg_common_head(struct gg_session)
1.162 +
1.163 + int async; /* czy połączenie jest asynchroniczne */
1.164 + int pid; /* pid procesu resolvera */
1.165 + int port; /* port, z którym się łączymy */
1.166 + int seq; /* numer sekwencyjny ostatniej wiadomości */
1.167 + int last_pong; /* czas otrzymania ostatniego ping/pong */
1.168 + int last_event; /* czas otrzymania ostatniego pakietu */
1.169 +
1.170 + struct gg_event *event; /* zdarzenie po ->callback() */
1.171 +
1.172 + uint32_t proxy_addr; /* adres proxy, keszowany */
1.173 + uint16_t proxy_port; /* port proxy */
1.174 +
1.175 + uint32_t hub_addr; /* adres huba po resolvnięciu */
1.176 + uint32_t server_addr; /* adres serwera, od huba */
1.177 +
1.178 + uint32_t client_addr; /* adres klienta */
1.179 + uint16_t client_port; /* port, na którym klient słucha */
1.180 +
1.181 + uint32_t external_addr; /* adres zewnetrzny klienta */
1.182 + uint16_t external_port; /* port zewnetrzny klienta */
1.183 +
1.184 + uin_t uin; /* numerek klienta */
1.185 + char *password; /* i jego hasło. zwalniane automagicznie */
1.186 +
1.187 + int initial_status; /* początkowy stan klienta */
1.188 + int status; /* aktualny stan klienta */
1.189 +
1.190 + char *recv_buf; /* bufor na otrzymywane pakiety */
1.191 + int recv_done; /* ile już wczytano do bufora */
1.192 + int recv_left; /* i ile jeszcze trzeba wczytać */
1.193 +
1.194 + int protocol_version; /* wersja używanego protokołu */
1.195 + char *client_version; /* wersja używanego klienta */
1.196 + int last_sysmsg; /* ostatnia wiadomość systemowa */
1.197 +
1.198 + char *initial_descr; /* początkowy opis stanu klienta */
1.199 +
1.200 + void *resolver; /* wskaźnik na informacje resolvera */
1.201 +
1.202 + char *header_buf; /* bufor na początek nagłówka */
1.203 + unsigned int header_done;/* ile już mamy */
1.204 +
1.205 +#ifdef GG_CONFIG_HAVE_OPENSSL
1.206 + SSL *ssl; /* sesja TLS */
1.207 + SSL_CTX *ssl_ctx; /* kontekst sesji? */
1.208 +#else
1.209 + void *ssl; /* zachowujemy ABI */
1.210 + void *ssl_ctx;
1.211 +#endif
1.212 +
1.213 + int image_size; /* maksymalny rozmiar obrazków w KiB */
1.214 +
1.215 + char *userlist_reply; /* fragment odpowiedzi listy kontaktów */
1.216 +
1.217 + int userlist_blocks; /* na ile kawałków podzielono listę kontaktów */
1.218 +
1.219 + struct gg_image_queue *images; /* aktualnie wczytywane obrazki */
1.220 +};
1.221 +
1.222 +/*
1.223 + * struct gg_http
1.224 + *
1.225 + * ogólna struktura opisująca stan wszystkich operacji HTTP. tworzona
1.226 + * przez gg_http_connect(), zwalniana przez gg_http_free().
1.227 + */
1.228 +struct gg_http {
1.229 + gg_common_head(struct gg_http)
1.230 +
1.231 + int async; /* czy połączenie asynchroniczne */
1.232 + int pid; /* pid procesu resolvera */
1.233 + int port; /* port, z którym się łączymy */
1.234 +
1.235 + char *query; /* bufor zapytania http */
1.236 + char *header; /* bufor nagłówka */
1.237 + int header_size; /* rozmiar wczytanego nagłówka */
1.238 + char *body; /* bufor otrzymanych informacji */
1.239 + unsigned int body_size; /* oczekiwana ilość informacji */
1.240 +
1.241 + void *data; /* dane danej operacji http */
1.242 +
1.243 + char *user_data; /* dane użytkownika, nie są zwalniane przez gg_http_free() */
1.244 +
1.245 + void *resolver; /* wskaźnik na informacje resolvera */
1.246 +
1.247 + unsigned int body_done; /* ile już treści odebrano? */
1.248 +};
1.249 +
1.250 +#ifdef __GNUC__
1.251 +#define GG_PACKED __attribute__ ((packed))
1.252 +#else
1.253 +#define GG_PACKED
1.254 +#endif
1.255 +
1.256 +#define GG_MAX_PATH 276
1.257 +
1.258 +/*
1.259 + * struct gg_file_info
1.260 + *
1.261 + * odpowiednik windowsowej struktury WIN32_FIND_DATA niezbędnej przy
1.262 + * wysyłaniu plików.
1.263 + */
1.264 +struct gg_file_info {
1.265 + uint32_t mode; /* dwFileAttributes */
1.266 + uint32_t ctime[2]; /* ftCreationTime */
1.267 + uint32_t atime[2]; /* ftLastAccessTime */
1.268 + uint32_t mtime[2]; /* ftLastWriteTime */
1.269 + uint32_t size_hi; /* nFileSizeHigh */
1.270 + uint32_t size; /* nFileSizeLow */
1.271 + uint32_t reserved0; /* dwReserved0 */
1.272 + uint32_t reserved1; /* dwReserved1 */
1.273 + unsigned char filename[GG_MAX_PATH - 14]; /* cFileName */
1.274 + unsigned char short_filename[14]; /* cAlternateFileName */
1.275 +} GG_PACKED;
1.276 +
1.277 +/*
1.278 + * struct gg_dcc
1.279 + *
1.280 + * struktura opisująca nasłuchujące gniazdo połączeń między klientami.
1.281 + * tworzona przez gg_dcc_socket_create(), zwalniana przez gg_dcc_free().
1.282 + */
1.283 +struct gg_dcc {
1.284 + gg_common_head(struct gg_dcc)
1.285 +
1.286 + struct gg_event *event; /* opis zdarzenia */
1.287 +
1.288 + int active; /* czy to my się łączymy? */
1.289 + int port; /* port, na którym siedzi */
1.290 + uin_t uin; /* uin klienta */
1.291 + uin_t peer_uin; /* uin drugiej strony */
1.292 + int file_fd; /* deskryptor pliku */
1.293 + unsigned int offset; /* offset w pliku */
1.294 + unsigned int chunk_size;/* rozmiar kawałka */
1.295 + unsigned int chunk_offset;/* offset w aktualnym kawałku */
1.296 + struct gg_file_info file_info;
1.297 + /* informacje o pliku */
1.298 + int established; /* połączenie ustanowione */
1.299 + char *voice_buf; /* bufor na pakiet połączenia głosowego */
1.300 + int incoming; /* połączenie przychodzące */
1.301 + char *chunk_buf; /* bufor na kawałek danych */
1.302 + uint32_t remote_addr; /* adres drugiej strony */
1.303 + uint16_t remote_port; /* port drugiej strony */
1.304 +};
1.305 +
1.306 +/*
1.307 + * enum gg_session_t
1.308 + *
1.309 + * rodzaje sesji.
1.310 + */
1.311 +enum gg_session_t {
1.312 + GG_SESSION_GG = 1, /* połączenie z serwerem gg */
1.313 + GG_SESSION_HTTP, /* ogólna sesja http */
1.314 + GG_SESSION_SEARCH, /* szukanie */
1.315 + GG_SESSION_REGISTER, /* rejestrowanie */
1.316 + GG_SESSION_REMIND, /* przypominanie hasła */
1.317 + GG_SESSION_PASSWD, /* zmiana hasła */
1.318 + GG_SESSION_CHANGE, /* zmiana informacji o sobie */
1.319 + GG_SESSION_DCC, /* ogólne połączenie DCC */
1.320 + GG_SESSION_DCC_SOCKET, /* nasłuchujący socket */
1.321 + GG_SESSION_DCC_SEND, /* wysyłanie pliku */
1.322 + GG_SESSION_DCC_GET, /* odbieranie pliku */
1.323 + GG_SESSION_DCC_VOICE, /* rozmowa głosowa */
1.324 + GG_SESSION_USERLIST_GET, /* pobieranie userlisty */
1.325 + GG_SESSION_USERLIST_PUT, /* wysyłanie userlisty */
1.326 + GG_SESSION_UNREGISTER, /* usuwanie konta */
1.327 + GG_SESSION_USERLIST_REMOVE, /* usuwanie userlisty */
1.328 + GG_SESSION_TOKEN, /* pobieranie tokenu */
1.329 +
1.330 + GG_SESSION_USER0 = 256, /* zdefiniowana dla użytkownika */
1.331 + GG_SESSION_USER1, /* j.w. */
1.332 + GG_SESSION_USER2, /* j.w. */
1.333 + GG_SESSION_USER3, /* j.w. */
1.334 + GG_SESSION_USER4, /* j.w. */
1.335 + GG_SESSION_USER5, /* j.w. */
1.336 + GG_SESSION_USER6, /* j.w. */
1.337 + GG_SESSION_USER7 /* j.w. */
1.338 +};
1.339 +
1.340 +/*
1.341 + * enum gg_state_t
1.342 + *
1.343 + * opisuje stan asynchronicznej maszyny.
1.344 + */
1.345 +enum gg_state_t {
1.346 + /* wspólne */
1.347 + GG_STATE_IDLE = 0, /* nie powinno wystąpić. */
1.348 + GG_STATE_RESOLVING, /* wywołał gethostbyname() */
1.349 + GG_STATE_CONNECTING, /* wywołał connect() */
1.350 + GG_STATE_READING_DATA, /* czeka na dane http */
1.351 + GG_STATE_ERROR, /* wystąpił błąd. kod w x->error */
1.352 +
1.353 + /* gg_session */
1.354 + GG_STATE_CONNECTING_HUB, /* wywołał connect() na huba */
1.355 + GG_STATE_CONNECTING_GG, /* wywołał connect() na serwer */
1.356 + GG_STATE_READING_KEY, /* czeka na klucz */
1.357 + GG_STATE_READING_REPLY, /* czeka na odpowiedź */
1.358 + GG_STATE_CONNECTED, /* połączył się */
1.359 +
1.360 + /* gg_http */
1.361 + GG_STATE_SENDING_QUERY, /* wysyła zapytanie http */
1.362 + GG_STATE_READING_HEADER, /* czeka na nagłówek http */
1.363 + GG_STATE_PARSING, /* przetwarza dane */
1.364 + GG_STATE_DONE, /* skończył */
1.365 +
1.366 + /* gg_dcc */
1.367 + GG_STATE_LISTENING, /* czeka na połączenia */
1.368 + GG_STATE_READING_UIN_1, /* czeka na uin peera */
1.369 + GG_STATE_READING_UIN_2, /* czeka na swój uin */
1.370 + GG_STATE_SENDING_ACK, /* wysyła potwierdzenie dcc */
1.371 + GG_STATE_READING_ACK, /* czeka na potwierdzenie dcc */
1.372 + GG_STATE_READING_REQUEST, /* czeka na komendę */
1.373 + GG_STATE_SENDING_REQUEST, /* wysyła komendę */
1.374 + GG_STATE_SENDING_FILE_INFO, /* wysyła informacje o pliku */
1.375 + GG_STATE_READING_PRE_FILE_INFO, /* czeka na pakiet przed file_info */
1.376 + GG_STATE_READING_FILE_INFO, /* czeka na informacje o pliku */
1.377 + GG_STATE_SENDING_FILE_ACK, /* wysyła potwierdzenie pliku */
1.378 + GG_STATE_READING_FILE_ACK, /* czeka na potwierdzenie pliku */
1.379 + GG_STATE_SENDING_FILE_HEADER, /* wysyła nagłówek pliku */
1.380 + GG_STATE_READING_FILE_HEADER, /* czeka na nagłówek */
1.381 + GG_STATE_GETTING_FILE, /* odbiera plik */
1.382 + GG_STATE_SENDING_FILE, /* wysyła plik */
1.383 + GG_STATE_READING_VOICE_ACK, /* czeka na potwierdzenie voip */
1.384 + GG_STATE_READING_VOICE_HEADER, /* czeka na rodzaj bloku voip */
1.385 + GG_STATE_READING_VOICE_SIZE, /* czeka na rozmiar bloku voip */
1.386 + GG_STATE_READING_VOICE_DATA, /* czeka na dane voip */
1.387 + GG_STATE_SENDING_VOICE_ACK, /* wysyła potwierdzenie voip */
1.388 + GG_STATE_SENDING_VOICE_REQUEST, /* wysyła żądanie voip */
1.389 + GG_STATE_READING_TYPE, /* czeka na typ połączenia */
1.390 +
1.391 + /* nowe. bez sensu jest to API. */
1.392 + GG_STATE_TLS_NEGOTIATION /* negocjuje połączenie TLS */
1.393 +};
1.394 +
1.395 +/*
1.396 + * enum gg_check_t
1.397 + *
1.398 + * informuje, co proces klienta powinien sprawdzić na deskryptorze danego
1.399 + * połączenia.
1.400 + */
1.401 +enum gg_check_t {
1.402 + GG_CHECK_NONE = 0, /* nic. nie powinno wystąpić */
1.403 + GG_CHECK_WRITE = 1, /* sprawdzamy możliwość zapisu */
1.404 + GG_CHECK_READ = 2 /* sprawdzamy możliwość odczytu */
1.405 +};
1.406 +
1.407 +/*
1.408 + * struct gg_login_params
1.409 + *
1.410 + * parametry gg_login(). przeniesiono do struktury, żeby uniknąć problemów
1.411 + * z ciągłymi zmianami API, gdy dodano coś nowego do protokołu.
1.412 + */
1.413 +struct gg_login_params {
1.414 + uin_t uin; /* numerek */
1.415 + char *password; /* hasło */
1.416 + int async; /* asynchroniczne sockety? */
1.417 + int status; /* początkowy status klienta */
1.418 + char *status_descr; /* opis statusu */
1.419 + uint32_t server_addr; /* adres serwera gg */
1.420 + uint16_t server_port; /* port serwera gg */
1.421 + uint32_t client_addr; /* adres dcc klienta */
1.422 + uint16_t client_port; /* port dcc klienta */
1.423 + int protocol_version; /* wersja protokołu */
1.424 + char *client_version; /* wersja klienta */
1.425 + int has_audio; /* czy ma dźwięk? */
1.426 + int last_sysmsg; /* ostatnia wiadomość systemowa */
1.427 + uint32_t external_addr; /* adres widziany na zewnatrz */
1.428 + uint16_t external_port; /* port widziany na zewnatrz */
1.429 + int tls; /* czy łączymy po TLS? */
1.430 + int image_size; /* maksymalny rozmiar obrazka w KiB */
1.431 + int era_omnix; /* czy udawać klienta era omnix? */
1.432 +
1.433 + char dummy[6 * sizeof(int)]; /* miejsce na kolejnych 6 zmiennych,
1.434 + * żeby z dodaniem parametru nie
1.435 + * zmieniał się rozmiar struktury */
1.436 +};
1.437 +
1.438 +struct gg_session *gg_login(const struct gg_login_params *p);
1.439 +void gg_free_session(struct gg_session *sess);
1.440 +void gg_logoff(struct gg_session *sess);
1.441 +int gg_change_status(struct gg_session *sess, int status);
1.442 +int gg_change_status_descr(struct gg_session *sess, int status, const char *descr);
1.443 +int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time);
1.444 +int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message);
1.445 +int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen);
1.446 +int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message);
1.447 +int 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);
1.448 +int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len);
1.449 +int gg_ping(struct gg_session *sess);
1.450 +int gg_userlist_request(struct gg_session *sess, char type, const char *request);
1.451 +int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32);
1.452 +int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size);
1.453 +
1.454 +uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len);
1.455 +
1.456 +struct gg_image_queue {
1.457 + uin_t sender; /* nadawca obrazka */
1.458 + uint32_t size; /* rozmiar */
1.459 + uint32_t crc32; /* suma kontrolna */
1.460 + char *filename; /* nazwa pliku */
1.461 + char *image; /* bufor z obrazem */
1.462 + uint32_t done; /* ile już wczytano */
1.463 +
1.464 + struct gg_image_queue *next; /* następny na liście */
1.465 +};
1.466 +
1.467 +/*
1.468 + * enum gg_event_t
1.469 + *
1.470 + * rodzaje zdarzeń.
1.471 + */
1.472 +enum gg_event_t {
1.473 + GG_EVENT_NONE = 0, /* nic się nie wydarzyło */
1.474 + GG_EVENT_MSG, /* otrzymano wiadomość */
1.475 + GG_EVENT_NOTIFY, /* ktoś się pojawił */
1.476 + GG_EVENT_NOTIFY_DESCR, /* ktoś się pojawił z opisem */
1.477 + GG_EVENT_STATUS, /* ktoś zmienił stan */
1.478 + GG_EVENT_ACK, /* potwierdzenie wysłania wiadomości */
1.479 + GG_EVENT_PONG, /* pakiet pong */
1.480 + GG_EVENT_CONN_FAILED, /* połączenie się nie udało */
1.481 + GG_EVENT_CONN_SUCCESS, /* połączenie się powiodło */
1.482 + GG_EVENT_DISCONNECT, /* serwer zrywa połączenie */
1.483 +
1.484 + GG_EVENT_DCC_NEW, /* nowe połączenie między klientami */
1.485 + GG_EVENT_DCC_ERROR, /* błąd połączenia między klientami */
1.486 + GG_EVENT_DCC_DONE, /* zakończono połączenie */
1.487 + GG_EVENT_DCC_CLIENT_ACCEPT, /* moment akceptacji klienta */
1.488 + GG_EVENT_DCC_CALLBACK, /* klient się połączył na żądanie */
1.489 + GG_EVENT_DCC_NEED_FILE_INFO, /* należy wypełnić file_info */
1.490 + GG_EVENT_DCC_NEED_FILE_ACK, /* czeka na potwierdzenie pliku */
1.491 + GG_EVENT_DCC_NEED_VOICE_ACK, /* czeka na potwierdzenie rozmowy */
1.492 + GG_EVENT_DCC_VOICE_DATA, /* ramka danych rozmowy głosowej */
1.493 +
1.494 + GG_EVENT_PUBDIR50_SEARCH_REPLY, /* odpowiedz wyszukiwania */
1.495 + GG_EVENT_PUBDIR50_READ, /* odczytano własne dane z katalogu */
1.496 + GG_EVENT_PUBDIR50_WRITE, /* wpisano własne dane do katalogu */
1.497 +
1.498 + GG_EVENT_STATUS60, /* ktoś zmienił stan w GG 6.0 */
1.499 + GG_EVENT_NOTIFY60, /* ktoś się pojawił w GG 6.0 */
1.500 + GG_EVENT_USERLIST, /* odpowiedź listy kontaktów w GG 6.0 */
1.501 + GG_EVENT_IMAGE_REQUEST, /* prośba o wysłanie obrazka GG 6.0 */
1.502 + GG_EVENT_IMAGE_REPLY, /* podesłany obrazek GG 6.0 */
1.503 + GG_EVENT_DCC_ACK /* potwierdzenie transmisji */
1.504 +};
1.505 +
1.506 +#define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY
1.507 +
1.508 +/*
1.509 + * enum gg_failure_t
1.510 + *
1.511 + * określa powód nieudanego połączenia.
1.512 + */
1.513 +enum gg_failure_t {
1.514 + GG_FAILURE_RESOLVING = 1, /* nie znaleziono serwera */
1.515 + GG_FAILURE_CONNECTING, /* nie można się połączyć */
1.516 + GG_FAILURE_INVALID, /* serwer zwrócił nieprawidłowe dane */
1.517 + GG_FAILURE_READING, /* zerwano połączenie podczas odczytu */
1.518 + GG_FAILURE_WRITING, /* zerwano połączenie podczas zapisu */
1.519 + GG_FAILURE_PASSWORD, /* nieprawidłowe hasło */
1.520 + GG_FAILURE_404, /* XXX nieużywane */
1.521 + GG_FAILURE_TLS, /* błąd negocjacji TLS */
1.522 + GG_FAILURE_NEED_EMAIL, /* serwer rozłączył nas z prośbą o zmianę emaila */
1.523 + GG_FAILURE_INTRUDER, /* za dużo prób połączenia się z nieprawidłowym hasłem */
1.524 + GG_FAILURE_UNAVAILABLE /* serwery są wyłączone */
1.525 +};
1.526 +
1.527 +/*
1.528 + * enum gg_error_t
1.529 + *
1.530 + * określa rodzaj błędu wywołanego przez daną operację. nie zawiera
1.531 + * przesadnie szczegółowych informacji o powodzie błędu, by nie komplikować
1.532 + * obsługi błędów. jeśli wymagana jest większa dokładność, należy sprawdzić
1.533 + * zawartość zmiennej errno.
1.534 + */
1.535 +enum gg_error_t {
1.536 + GG_ERROR_RESOLVING = 1, /* błąd znajdowania hosta */
1.537 + GG_ERROR_CONNECTING, /* błąd łaczenia się */
1.538 + GG_ERROR_READING, /* błąd odczytu */
1.539 + GG_ERROR_WRITING, /* błąd wysyłania */
1.540 +
1.541 + GG_ERROR_DCC_HANDSHAKE, /* błąd negocjacji */
1.542 + GG_ERROR_DCC_FILE, /* błąd odczytu/zapisu pliku */
1.543 + GG_ERROR_DCC_EOF, /* plik się skończył? */
1.544 + GG_ERROR_DCC_NET, /* błąd wysyłania/odbierania */
1.545 + GG_ERROR_DCC_REFUSED /* połączenie odrzucone przez usera */
1.546 +};
1.547 +
1.548 +/*
1.549 + * struktury dotyczące wyszukiwania w GG 5.0. NIE NALEŻY SIĘ DO NICH
1.550 + * ODWOŁYWAĆ BEZPOŚREDNIO! do dostępu do nich służą funkcje gg_pubdir50_*()
1.551 + */
1.552 +struct gg_pubdir50_entry {
1.553 + int num;
1.554 + char *field;
1.555 + char *value;
1.556 +};
1.557 +
1.558 +struct gg_pubdir50_s {
1.559 + int count;
1.560 + uin_t next;
1.561 + int type;
1.562 + uint32_t seq;
1.563 + struct gg_pubdir50_entry *entries;
1.564 + int entries_count;
1.565 +};
1.566 +
1.567 +/*
1.568 + * typedef gg_pubdir_50_t
1.569 + *
1.570 + * typ opisujący zapytanie lub wynik zapytania katalogu publicznego
1.571 + * z protokołu GG 5.0. nie należy się odwoływać bezpośrednio do jego
1.572 + * pól -- służą do tego funkcje gg_pubdir50_*()
1.573 + */
1.574 +typedef struct gg_pubdir50_s *gg_pubdir50_t;
1.575 +
1.576 +/*
1.577 + * struct gg_event
1.578 + *
1.579 + * struktura opisująca rodzaj zdarzenia. wychodzi z gg_watch_fd() lub
1.580 + * z gg_dcc_watch_fd()
1.581 + */
1.582 +struct gg_event {
1.583 + int type; /* rodzaj zdarzenia -- gg_event_t */
1.584 + union { /* @event */
1.585 + struct gg_notify_reply *notify; /* informacje o liście kontaktów -- GG_EVENT_NOTIFY */
1.586 +
1.587 + enum gg_failure_t failure; /* błąd połączenia -- GG_EVENT_FAILURE */
1.588 +
1.589 + struct gg_dcc *dcc_new; /* nowe połączenie bezpośrednie -- GG_EVENT_DCC_NEW */
1.590 +
1.591 + int dcc_error; /* błąd połączenia bezpośredniego -- GG_EVENT_DCC_ERROR */
1.592 +
1.593 + gg_pubdir50_t pubdir50; /* wynik operacji związanej z katalogiem publicznym -- GG_EVENT_PUBDIR50_* */
1.594 +
1.595 + struct { /* @msg odebrano wiadomość -- GG_EVENT_MSG */
1.596 + uin_t sender; /* numer nadawcy */
1.597 + int msgclass; /* klasa wiadomości */
1.598 + time_t time; /* czas nadania */
1.599 + unsigned char *message; /* treść wiadomości */
1.600 +
1.601 + int recipients_count; /* ilość odbiorców konferencji */
1.602 + uin_t *recipients; /* odbiorcy konferencji */
1.603 +
1.604 + int formats_length; /* długość informacji o formatowaniu tekstu */
1.605 + void *formats; /* informacje o formatowaniu tekstu */
1.606 + } msg;
1.607 +
1.608 + struct { /* @notify_descr informacje o liście kontaktów z opisami stanu -- GG_EVENT_NOTIFY_DESCR */
1.609 + struct gg_notify_reply *notify; /* informacje o liście kontaktów */
1.610 + char *descr; /* opis stanu */
1.611 + } notify_descr;
1.612 +
1.613 + struct { /* @status zmiana stanu -- GG_EVENT_STATUS */
1.614 + uin_t uin; /* numer */
1.615 + uint32_t status; /* nowy stan */
1.616 + char *descr; /* opis stanu */
1.617 + } status;
1.618 +
1.619 + struct { /* @status60 zmiana stanu -- GG_EVENT_STATUS60 */
1.620 + uin_t uin; /* numer */
1.621 + int status; /* nowy stan */
1.622 + uint32_t remote_ip; /* adres ip */
1.623 + uint16_t remote_port; /* port */
1.624 + int version; /* wersja klienta */
1.625 + int image_size; /* maksymalny rozmiar grafiki w KiB */
1.626 + char *descr; /* opis stanu */
1.627 + time_t time; /* czas powrotu */
1.628 + } status60;
1.629 +
1.630 + struct { /* @notify60 informacja o liście kontaktów -- GG_EVENT_NOTIFY60 */
1.631 + uin_t uin; /* numer */
1.632 + int status; /* stan */
1.633 + uint32_t remote_ip; /* adres ip */
1.634 + uint16_t remote_port; /* port */
1.635 + int version; /* wersja klienta */
1.636 + int image_size; /* maksymalny rozmiar grafiki w KiB */
1.637 + char *descr; /* opis stanu */
1.638 + time_t time; /* czas powrotu */
1.639 + } *notify60;
1.640 +
1.641 + struct { /* @ack potwierdzenie wiadomości -- GG_EVENT_ACK */
1.642 + uin_t recipient; /* numer odbiorcy */
1.643 + int status; /* stan doręczenia wiadomości */
1.644 + int seq; /* numer sekwencyjny wiadomości */
1.645 + } ack;
1.646 +
1.647 + struct { /* @dcc_voice_data otrzymano dane dźwiękowe -- GG_EVENT_DCC_VOICE_DATA */
1.648 + uint8_t *data; /* dane dźwiękowe */
1.649 + int length; /* ilość danych dźwiękowych */
1.650 + } dcc_voice_data;
1.651 +
1.652 + struct { /* @userlist odpowiedź listy kontaktów serwera */
1.653 + char type; /* rodzaj odpowiedzi */
1.654 + char *reply; /* treść odpowiedzi */
1.655 + } userlist;
1.656 +
1.657 + struct { /* @image_request prośba o obrazek */
1.658 + uin_t sender; /* nadawca prośby */
1.659 + uint32_t size; /* rozmiar obrazka */
1.660 + uint32_t crc32; /* suma kontrolna */
1.661 + } image_request;
1.662 +
1.663 + struct { /* @image_reply odpowiedź z obrazkiem */
1.664 + uin_t sender; /* nadawca odpowiedzi */
1.665 + uint32_t size; /* rozmiar obrazka */
1.666 + uint32_t crc32; /* suma kontrolna */
1.667 + char *filename; /* nazwa pliku */
1.668 + char *image; /* bufor z obrazkiem */
1.669 + } image_reply;
1.670 + } event;
1.671 +};
1.672 +
1.673 +struct gg_event *gg_watch_fd(struct gg_session *sess);
1.674 +void gg_event_free(struct gg_event *e);
1.675 +#define gg_free_event gg_event_free
1.676 +
1.677 +/*
1.678 + * funkcje obsługi listy kontaktów.
1.679 + */
1.680 +int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count);
1.681 +int gg_notify(struct gg_session *sess, uin_t *userlist, int count);
1.682 +int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type);
1.683 +int gg_add_notify(struct gg_session *sess, uin_t uin);
1.684 +int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type);
1.685 +int gg_remove_notify(struct gg_session *sess, uin_t uin);
1.686 +
1.687 +/*
1.688 + * funkcje obsługi http.
1.689 + */
1.690 +struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header);
1.691 +int gg_http_watch_fd(struct gg_http *h);
1.692 +void gg_http_stop(struct gg_http *h);
1.693 +void gg_http_free(struct gg_http *h);
1.694 +void gg_http_free_fields(struct gg_http *h);
1.695 +#define gg_free_http gg_http_free
1.696 +
1.697 +/*
1.698 + * struktury opisująca kryteria wyszukiwania dla gg_search(). nieaktualne,
1.699 + * zastąpione przez gg_pubdir50_t. pozostawiono je dla zachowania ABI.
1.700 + */
1.701 +struct gg_search_request {
1.702 + int active;
1.703 + unsigned int start;
1.704 + char *nickname;
1.705 + char *first_name;
1.706 + char *last_name;
1.707 + char *city;
1.708 + int gender;
1.709 + int min_birth;
1.710 + int max_birth;
1.711 + char *email;
1.712 + char *phone;
1.713 + uin_t uin;
1.714 +};
1.715 +
1.716 +struct gg_search {
1.717 + int count;
1.718 + struct gg_search_result *results;
1.719 +};
1.720 +
1.721 +struct gg_search_result {
1.722 + uin_t uin;
1.723 + char *first_name;
1.724 + char *last_name;
1.725 + char *nickname;
1.726 + int born;
1.727 + int gender;
1.728 + char *city;
1.729 + int active;
1.730 +};
1.731 +
1.732 +#define GG_GENDER_NONE 0
1.733 +#define GG_GENDER_FEMALE 1
1.734 +#define GG_GENDER_MALE 2
1.735 +
1.736 +/*
1.737 + * funkcje wyszukiwania.
1.738 + */
1.739 +struct gg_http *gg_search(const struct gg_search_request *r, int async);
1.740 +int gg_search_watch_fd(struct gg_http *f);
1.741 +void gg_free_search(struct gg_http *f);
1.742 +#define gg_search_free gg_free_search
1.743 +
1.744 +const 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);
1.745 +const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start);
1.746 +const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start);
1.747 +const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start);
1.748 +void gg_search_request_free(struct gg_search_request *r);
1.749 +
1.750 +/*
1.751 + * funkcje obsługi katalogu publicznego zgodne z GG 5.0. tym razem funkcje
1.752 + * zachowują pewien poziom abstrakcji, żeby uniknąć zmian ABI przy zmianach
1.753 + * w protokole.
1.754 + *
1.755 + * NIE NALEŻY SIĘ ODWOŁYWAĆ DO PÓL gg_pubdir50_t BEZPOŚREDNIO!
1.756 + */
1.757 +uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req);
1.758 +gg_pubdir50_t gg_pubdir50_new(int type);
1.759 +int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value);
1.760 +int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq);
1.761 +const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field);
1.762 +int gg_pubdir50_type(gg_pubdir50_t res);
1.763 +int gg_pubdir50_count(gg_pubdir50_t res);
1.764 +uin_t gg_pubdir50_next(gg_pubdir50_t res);
1.765 +uint32_t gg_pubdir50_seq(gg_pubdir50_t res);
1.766 +void gg_pubdir50_free(gg_pubdir50_t res);
1.767 +
1.768 +#define GG_PUBDIR50_UIN "FmNumber"
1.769 +#define GG_PUBDIR50_STATUS "FmStatus"
1.770 +#define GG_PUBDIR50_FIRSTNAME "firstname"
1.771 +#define GG_PUBDIR50_LASTNAME "lastname"
1.772 +#define GG_PUBDIR50_NICKNAME "nickname"
1.773 +#define GG_PUBDIR50_BIRTHYEAR "birthyear"
1.774 +#define GG_PUBDIR50_CITY "city"
1.775 +#define GG_PUBDIR50_GENDER "gender"
1.776 +#define GG_PUBDIR50_GENDER_FEMALE "1"
1.777 +#define GG_PUBDIR50_GENDER_MALE "2"
1.778 +#define GG_PUBDIR50_GENDER_SET_FEMALE "2"
1.779 +#define GG_PUBDIR50_GENDER_SET_MALE "1"
1.780 +#define GG_PUBDIR50_ACTIVE "ActiveOnly"
1.781 +#define GG_PUBDIR50_ACTIVE_TRUE "1"
1.782 +#define GG_PUBDIR50_START "fmstart"
1.783 +#define GG_PUBDIR50_FAMILYNAME "familyname"
1.784 +#define GG_PUBDIR50_FAMILYCITY "familycity"
1.785 +
1.786 +int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length);
1.787 +
1.788 +/*
1.789 + * struct gg_pubdir
1.790 + *
1.791 + * operacje na katalogu publicznym.
1.792 + */
1.793 +struct gg_pubdir {
1.794 + int success; /* czy się udało */
1.795 + uin_t uin; /* otrzymany numerek. 0 jeśli błąd */
1.796 +};
1.797 +
1.798 +/* ogólne funkcje, nie powinny być używane */
1.799 +int gg_pubdir_watch_fd(struct gg_http *f);
1.800 +void gg_pubdir_free(struct gg_http *f);
1.801 +#define gg_free_pubdir gg_pubdir_free
1.802 +
1.803 +struct gg_token {
1.804 + int width; /* szerokość obrazka */
1.805 + int height; /* wysokość obrazka */
1.806 + int length; /* ilość znaków w tokenie */
1.807 + char *tokenid; /* id tokenu */
1.808 +};
1.809 +
1.810 +/* funkcje dotyczące tokenów */
1.811 +struct gg_http *gg_token(int async);
1.812 +int gg_token_watch_fd(struct gg_http *h);
1.813 +void gg_token_free(struct gg_http *h);
1.814 +
1.815 +/* rejestracja nowego numerka */
1.816 +struct gg_http *gg_register(const char *email, const char *password, int async);
1.817 +struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async);
1.818 +struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async);
1.819 +#define gg_register_watch_fd gg_pubdir_watch_fd
1.820 +#define gg_register_free gg_pubdir_free
1.821 +#define gg_free_register gg_pubdir_free
1.822 +
1.823 +struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async);
1.824 +struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async);
1.825 +struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async);
1.826 +#define gg_unregister_watch_fd gg_pubdir_watch_fd
1.827 +#define gg_unregister_free gg_pubdir_free
1.828 +
1.829 +/* przypomnienie hasła e-mailem */
1.830 +struct gg_http *gg_remind_passwd(uin_t uin, int async);
1.831 +struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async);
1.832 +struct gg_http *gg_remind_passwd3(uin_t uin, const char *email, const char *tokenid, const char *tokenval, int async);
1.833 +#define gg_remind_passwd_watch_fd gg_pubdir_watch_fd
1.834 +#define gg_remind_passwd_free gg_pubdir_free
1.835 +#define gg_free_remind_passwd gg_pubdir_free
1.836 +
1.837 +/* zmiana hasła */
1.838 +struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async);
1.839 +struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async);
1.840 +struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async);
1.841 +struct 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);
1.842 +#define gg_change_passwd_free gg_pubdir_free
1.843 +#define gg_free_change_passwd gg_pubdir_free
1.844 +
1.845 +/*
1.846 + * struct gg_change_info_request
1.847 + *
1.848 + * opis żądania zmiany informacji w katalogu publicznym.
1.849 + */
1.850 +struct gg_change_info_request {
1.851 + char *first_name; /* imię */
1.852 + char *last_name; /* nazwisko */
1.853 + char *nickname; /* pseudonim */
1.854 + char *email; /* email */
1.855 + int born; /* rok urodzenia */
1.856 + int gender; /* płeć */
1.857 + char *city; /* miasto */
1.858 +};
1.859 +
1.860 +struct 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);
1.861 +void gg_change_info_request_free(struct gg_change_info_request *r);
1.862 +
1.863 +struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async);
1.864 +#define gg_change_pubdir_watch_fd gg_pubdir_watch_fd
1.865 +#define gg_change_pubdir_free gg_pubdir_free
1.866 +#define gg_free_change_pubdir gg_pubdir_free
1.867 +
1.868 +/*
1.869 + * funkcje dotyczące listy kontaktów na serwerze.
1.870 + */
1.871 +struct gg_http *gg_userlist_get(uin_t uin, const char *password, int async);
1.872 +int gg_userlist_get_watch_fd(struct gg_http *f);
1.873 +void gg_userlist_get_free(struct gg_http *f);
1.874 +
1.875 +struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async);
1.876 +int gg_userlist_put_watch_fd(struct gg_http *f);
1.877 +void gg_userlist_put_free(struct gg_http *f);
1.878 +
1.879 +struct gg_http *gg_userlist_remove(uin_t uin, const char *password, int async);
1.880 +int gg_userlist_remove_watch_fd(struct gg_http *f);
1.881 +void gg_userlist_remove_free(struct gg_http *f);
1.882 +
1.883 +
1.884 +
1.885 +/*
1.886 + * funkcje dotyczące komunikacji między klientami.
1.887 + */
1.888 +extern int gg_dcc_port; /* port, na którym nasłuchuje klient */
1.889 +extern unsigned long gg_dcc_ip; /* adres, na którym nasłuchuje klient */
1.890 +
1.891 +int gg_dcc_request(struct gg_session *sess, uin_t uin);
1.892 +
1.893 +struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
1.894 +struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
1.895 +struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
1.896 +void gg_dcc_set_type(struct gg_dcc *d, int type);
1.897 +int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename);
1.898 +int gg_dcc_fill_file_info2(struct gg_dcc *d, const char *filename, const char *local_filename);
1.899 +int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length);
1.900 +
1.901 +#define GG_DCC_VOICE_FRAME_LENGTH 195
1.902 +#define GG_DCC_VOICE_FRAME_LENGTH_505 326
1.903 +
1.904 +struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port);
1.905 +#define gg_dcc_socket_free gg_free_dcc
1.906 +#define gg_dcc_socket_watch_fd gg_dcc_watch_fd
1.907 +
1.908 +struct gg_event *gg_dcc_watch_fd(struct gg_dcc *d);
1.909 +
1.910 +void gg_dcc_free(struct gg_dcc *c);
1.911 +#define gg_free_dcc gg_dcc_free
1.912 +
1.913 +/*
1.914 + * jeśli chcemy sobie podebugować, wystarczy ustawić `gg_debug_level'.
1.915 + * niestety w miarę przybywania wpisów `gg_debug(...)' nie chciało mi
1.916 + * się ustawiać odpowiednich leveli, więc większość szła do _MISC.
1.917 + */
1.918 +extern int gg_debug_level; /* poziom debugowania. mapa bitowa stałych GG_DEBUG_* */
1.919 +
1.920 +/*
1.921 + * można podać wskaźnik do funkcji obsługującej wywołania gg_debug().
1.922 + * nieoficjalne, nieudokumentowane, może się zmienić. jeśli ktoś jest
1.923 + * zainteresowany, niech da znać na ekg-devel.
1.924 + */
1.925 +extern void (*gg_debug_handler)(int level, const char *format, va_list ap);
1.926 +extern void (*gg_debug_handler_session)(struct gg_session *sess, int level, const char *format, va_list ap);
1.927 +
1.928 +/*
1.929 + * można podać plik, do którego będą zapisywane teksty z gg_debug().
1.930 + */
1.931 +extern FILE *gg_debug_file;
1.932 +
1.933 +#define GG_DEBUG_NET 1
1.934 +#define GG_DEBUG_TRAFFIC 2
1.935 +#define GG_DEBUG_DUMP 4
1.936 +#define GG_DEBUG_FUNCTION 8
1.937 +#define GG_DEBUG_MISC 16
1.938 +
1.939 +#ifdef GG_DEBUG_DISABLE
1.940 +#define gg_debug(x, y...) do { } while(0)
1.941 +#define gg_debug_session(z, x, y...) do { } while(0)
1.942 +#else
1.943 +void gg_debug(int level, const char *format, ...);
1.944 +void gg_debug_session(struct gg_session *sess, int level, const char *format, ...);
1.945 +#endif
1.946 +
1.947 +const char *gg_libgadu_version(void);
1.948 +
1.949 +/*
1.950 + * konfiguracja http proxy.
1.951 + */
1.952 +extern int gg_proxy_enabled; /* włącza obsługę proxy */
1.953 +extern char *gg_proxy_host; /* określa adres serwera proxy */
1.954 +extern int gg_proxy_port; /* określa port serwera proxy */
1.955 +extern char *gg_proxy_username; /* określa nazwę użytkownika przy autoryzacji serwera proxy */
1.956 +extern char *gg_proxy_password; /* określa hasło użytkownika przy autoryzacji serwera proxy */
1.957 +extern int gg_proxy_http_only; /* włącza obsługę proxy wyłącznie dla usług HTTP */
1.958 +
1.959 +
1.960 +/*
1.961 + * adres, z którego ślemy pakiety (np łączymy się z serwerem)
1.962 + * używany przy gg_connect()
1.963 + */
1.964 +extern unsigned long gg_local_ip;
1.965 +/*
1.966 + * -------------------------------------------------------------------------
1.967 + * poniżej znajdują się wewnętrzne sprawy biblioteki. zwykły klient nie
1.968 + * powinien ich w ogóle ruszać, bo i nie ma po co. wszystko można załatwić
1.969 + * procedurami wyższego poziomu, których definicje znajdują się na początku
1.970 + * tego pliku.
1.971 + * -------------------------------------------------------------------------
1.972 + */
1.973 +
1.974 +#ifdef GG_CONFIG_HAVE_PTHREAD
1.975 +int gg_resolve_pthread(int *fd, void **resolver, const char *hostname);
1.976 +void gg_resolve_pthread_cleanup(void *resolver, int kill);
1.977 +#endif
1.978 +
1.979 +#ifdef _WIN32
1.980 +int gg_thread_socket(int thread_id, int socket);
1.981 +#endif
1.982 +
1.983 +int gg_resolve(int *fd, int *pid, const char *hostname);
1.984 +
1.985 +#ifdef __GNUC__
1.986 +char *gg_saprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
1.987 +#else
1.988 +char *gg_saprintf(const char *format, ...);
1.989 +#endif
1.990 +
1.991 +char *gg_vsaprintf(const char *format, va_list ap);
1.992 +
1.993 +#define gg_alloc_sprintf gg_saprintf
1.994 +
1.995 +char *gg_get_line(char **ptr);
1.996 +
1.997 +int gg_connect(void *addr, int port, int async);
1.998 +struct in_addr *gg_gethostbyname(const char *hostname);
1.999 +char *gg_read_line(int sock, char *buf, int length);
1.1000 +void gg_chomp(char *line);
1.1001 +char *gg_urlencode(const char *str);
1.1002 +int gg_http_hash(const char *format, ...);
1.1003 +int gg_read(struct gg_session *sess, char *buf, int length);
1.1004 +int gg_write(struct gg_session *sess, const char *buf, int length);
1.1005 +void *gg_recv_packet(struct gg_session *sess);
1.1006 +int gg_send_packet(struct gg_session *sess, int type, ...);
1.1007 +unsigned int gg_login_hash(const unsigned char *password, unsigned int seed);
1.1008 +uint32_t gg_fix32(uint32_t x);
1.1009 +uint16_t gg_fix16(uint16_t x);
1.1010 +#define fix16 gg_fix16
1.1011 +#define fix32 gg_fix32
1.1012 +char *gg_proxy_auth(void);
1.1013 +char *gg_base64_encode(const char *buf);
1.1014 +char *gg_base64_decode(const char *buf);
1.1015 +int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq);
1.1016 +
1.1017 +#define GG_APPMSG_HOST "appmsg.gadu-gadu.pl"
1.1018 +#define GG_APPMSG_PORT 80
1.1019 +#define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl"
1.1020 +#define GG_PUBDIR_PORT 80
1.1021 +#define GG_REGISTER_HOST "register.gadu-gadu.pl"
1.1022 +#define GG_REGISTER_PORT 80
1.1023 +#define GG_REMIND_HOST "retr.gadu-gadu.pl"
1.1024 +#define GG_REMIND_PORT 80
1.1025 +
1.1026 +#define GG_DEFAULT_PORT 8074
1.1027 +#define GG_HTTPS_PORT 443
1.1028 +#define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
1.1029 +
1.1030 +#define GG_DEFAULT_CLIENT_VERSION "6, 1, 0, 158"
1.1031 +#define GG_DEFAULT_PROTOCOL_VERSION 0x24
1.1032 +#define GG_DEFAULT_TIMEOUT 30
1.1033 +#define GG_HAS_AUDIO_MASK 0x40000000
1.1034 +#define GG_ERA_OMNIX_MASK 0x04000000
1.1035 +#define GG_LIBGADU_VERSION "CVS"
1.1036 +
1.1037 +#define GG_DEFAULT_DCC_PORT 1550
1.1038 +
1.1039 +struct gg_header {
1.1040 + uint32_t type; /* typ pakietu */
1.1041 + uint32_t length; /* długość reszty pakietu */
1.1042 +} GG_PACKED;
1.1043 +
1.1044 +#define GG_WELCOME 0x0001
1.1045 +#define GG_NEED_EMAIL 0x0014
1.1046 +
1.1047 +struct gg_welcome {
1.1048 + uint32_t key; /* klucz szyfrowania hasła */
1.1049 +} GG_PACKED;
1.1050 +
1.1051 +#define GG_LOGIN 0x000c
1.1052 +
1.1053 +struct gg_login {
1.1054 + uint32_t uin; /* mój numerek */
1.1055 + uint32_t hash; /* hash hasła */
1.1056 + uint32_t status; /* status na dzień dobry */
1.1057 + uint32_t version; /* moja wersja klienta */
1.1058 + uint32_t local_ip; /* mój adres ip */
1.1059 + uint16_t local_port; /* port, na którym słucham */
1.1060 +} GG_PACKED;
1.1061 +
1.1062 +#define GG_LOGIN_EXT 0x0013
1.1063 +
1.1064 +struct gg_login_ext {
1.1065 + uint32_t uin; /* mój numerek */
1.1066 + uint32_t hash; /* hash hasła */
1.1067 + uint32_t status; /* status na dzień dobry */
1.1068 + uint32_t version; /* moja wersja klienta */
1.1069 + uint32_t local_ip; /* mój adres ip */
1.1070 + uint16_t local_port; /* port, na którym słucham */
1.1071 + uint32_t external_ip; /* zewnętrzny adres ip */
1.1072 + uint16_t external_port; /* zewnętrzny port */
1.1073 +} GG_PACKED;
1.1074 +
1.1075 +#define GG_LOGIN60 0x0015
1.1076 +
1.1077 +struct gg_login60 {
1.1078 + uint32_t uin; /* mój numerek */
1.1079 + uint32_t hash; /* hash hasła */
1.1080 + uint32_t status; /* status na dzień dobry */
1.1081 + uint32_t version; /* moja wersja klienta */
1.1082 + uint8_t dunno1; /* 0x00 */
1.1083 + uint32_t local_ip; /* mój adres ip */
1.1084 + uint16_t local_port; /* port, na którym słucham */
1.1085 + uint32_t external_ip; /* zewnętrzny adres ip */
1.1086 + uint16_t external_port; /* zewnętrzny port */
1.1087 + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
1.1088 + uint8_t dunno2; /* 0xbe */
1.1089 +} GG_PACKED;
1.1090 +
1.1091 +#define GG_LOGIN_OK 0x0003
1.1092 +
1.1093 +#define GG_LOGIN_FAILED 0x0009
1.1094 +
1.1095 +#define GG_PUBDIR50_REQUEST 0x0014
1.1096 +
1.1097 +#define GG_PUBDIR50_WRITE 0x01
1.1098 +#define GG_PUBDIR50_READ 0x02
1.1099 +#define GG_PUBDIR50_SEARCH 0x03
1.1100 +#define GG_PUBDIR50_SEARCH_REQUEST GG_PUBDIR50_SEARCH
1.1101 +#define GG_PUBDIR50_SEARCH_REPLY 0x05
1.1102 +
1.1103 +struct gg_pubdir50_request {
1.1104 + uint8_t type; /* GG_PUBDIR50_* */
1.1105 + uint32_t seq; /* czas wysłania zapytania */
1.1106 +} GG_PACKED;
1.1107 +
1.1108 +#define GG_PUBDIR50_REPLY 0x000e
1.1109 +
1.1110 +struct gg_pubdir50_reply {
1.1111 + uint8_t type; /* GG_PUBDIR50_* */
1.1112 + uint32_t seq; /* czas wysłania zapytania */
1.1113 +} GG_PACKED;
1.1114 +
1.1115 +#define GG_NEW_STATUS 0x0002
1.1116 +
1.1117 +#define GG_STATUS_NOT_AVAIL 0x0001 /* niedostępny */
1.1118 +#define GG_STATUS_NOT_AVAIL_DESCR 0x0015 /* niedostępny z opisem (4.8) */
1.1119 +#define GG_STATUS_AVAIL 0x0002 /* dostępny */
1.1120 +#define GG_STATUS_AVAIL_DESCR 0x0004 /* dostępny z opisem (4.9) */
1.1121 +#define GG_STATUS_BUSY 0x0003 /* zajęty */
1.1122 +#define GG_STATUS_BUSY_DESCR 0x0005 /* zajęty z opisem (4.8) */
1.1123 +#define GG_STATUS_INVISIBLE 0x0014 /* niewidoczny (4.6) */
1.1124 +#define GG_STATUS_INVISIBLE_DESCR 0x0016 /* niewidoczny z opisem (4.9) */
1.1125 +#define GG_STATUS_BLOCKED 0x0006 /* zablokowany */
1.1126 +
1.1127 +#define GG_STATUS_FRIENDS_MASK 0x8000 /* tylko dla znajomych (4.6) */
1.1128 +
1.1129 +#define GG_STATUS_DESCR_MAXSIZE 70
1.1130 +
1.1131 +/*
1.1132 + * makra do łatwego i szybkiego sprawdzania stanu.
1.1133 + */
1.1134 +
1.1135 +/* GG_S_F() tryb tylko dla znajomych */
1.1136 +#define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0)
1.1137 +
1.1138 +/* GG_S() stan bez uwzględnienia trybu tylko dla znajomych */
1.1139 +#define GG_S(x) ((x) & ~GG_STATUS_FRIENDS_MASK)
1.1140 +
1.1141 +/* GG_S_A() dostępny */
1.1142 +#define GG_S_A(x) (GG_S(x) == GG_STATUS_AVAIL || GG_S(x) == GG_STATUS_AVAIL_DESCR)
1.1143 +
1.1144 +/* GG_S_NA() niedostępny */
1.1145 +#define GG_S_NA(x) (GG_S(x) == GG_STATUS_NOT_AVAIL || GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR)
1.1146 +
1.1147 +/* GG_S_B() zajęty */
1.1148 +#define GG_S_B(x) (GG_S(x) == GG_STATUS_BUSY || GG_S(x) == GG_STATUS_BUSY_DESCR)
1.1149 +
1.1150 +/* GG_S_I() niewidoczny */
1.1151 +#define GG_S_I(x) (GG_S(x) == GG_STATUS_INVISIBLE || GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
1.1152 +
1.1153 +/* GG_S_D() stan opisowy */
1.1154 +#define GG_S_D(x) (GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR || GG_S(x) == GG_STATUS_AVAIL_DESCR || GG_S(x) == GG_STATUS_BUSY_DESCR || GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
1.1155 +
1.1156 +/* GG_S_BL() blokowany lub blokujący */
1.1157 +#define GG_S_BL(x) (GG_S(x) == GG_STATUS_BLOCKED)
1.1158 +
1.1159 +struct gg_new_status {
1.1160 + uint32_t status; /* na jaki zmienić? */
1.1161 +} GG_PACKED;
1.1162 +
1.1163 +#define GG_NOTIFY_FIRST 0x000f
1.1164 +#define GG_NOTIFY_LAST 0x0010
1.1165 +
1.1166 +#define GG_NOTIFY 0x0010
1.1167 +
1.1168 +struct gg_notify {
1.1169 + uint32_t uin; /* numerek danej osoby */
1.1170 + uint8_t dunno1; /* rodzaj wpisu w liście */
1.1171 +} GG_PACKED;
1.1172 +
1.1173 +#define GG_USER_OFFLINE 0x01 /* będziemy niewidoczni dla użytkownika */
1.1174 +#define GG_USER_NORMAL 0x03 /* zwykły użytkownik */
1.1175 +#define GG_USER_BLOCKED 0x04 /* zablokowany użytkownik */
1.1176 +
1.1177 +#define GG_LIST_EMPTY 0x0012
1.1178 +
1.1179 +#define GG_NOTIFY_REPLY 0x000c /* tak, to samo co GG_LOGIN */
1.1180 +
1.1181 +struct gg_notify_reply {
1.1182 + uint32_t uin; /* numerek */
1.1183 + uint32_t status; /* status danej osoby */
1.1184 + uint32_t remote_ip; /* adres ip delikwenta */
1.1185 + uint16_t remote_port; /* port, na którym słucha klient */
1.1186 + uint32_t version; /* wersja klienta */
1.1187 + uint16_t dunno2; /* znowu port? */
1.1188 +} GG_PACKED;
1.1189 +
1.1190 +#define GG_NOTIFY_REPLY60 0x0011
1.1191 +
1.1192 +struct gg_notify_reply60 {
1.1193 + uint32_t uin; /* numerek plus flagi w MSB */
1.1194 + uint8_t status; /* status danej osoby */
1.1195 + uint32_t remote_ip; /* adres ip delikwenta */
1.1196 + uint16_t remote_port; /* port, na którym słucha klient */
1.1197 + uint8_t version; /* wersja klienta */
1.1198 + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
1.1199 + uint8_t dunno1; /* 0x00 */
1.1200 +} GG_PACKED;
1.1201 +
1.1202 +#define GG_STATUS60 0x000f
1.1203 +
1.1204 +struct gg_status60 {
1.1205 + uint32_t uin; /* numerek plus flagi w MSB */
1.1206 + uint8_t status; /* status danej osoby */
1.1207 + uint32_t remote_ip; /* adres ip delikwenta */
1.1208 + uint16_t remote_port; /* port, na którym słucha klient */
1.1209 + uint8_t version; /* wersja klienta */
1.1210 + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
1.1211 + uint8_t dunno1; /* 0x00 */
1.1212 +} GG_PACKED;
1.1213 +
1.1214 +#define GG_ADD_NOTIFY 0x000d
1.1215 +#define GG_REMOVE_NOTIFY 0x000e
1.1216 +
1.1217 +struct gg_add_remove {
1.1218 + uint32_t uin; /* numerek */
1.1219 + uint8_t dunno1; /* bitmapa */
1.1220 +} GG_PACKED;
1.1221 +
1.1222 +#define GG_STATUS 0x0002
1.1223 +
1.1224 +struct gg_status {
1.1225 + uint32_t uin; /* numerek */
1.1226 + uint32_t status; /* nowy stan */
1.1227 +} GG_PACKED;
1.1228 +
1.1229 +#define GG_SEND_MSG 0x000b
1.1230 +
1.1231 +#define GG_CLASS_QUEUED 0x0001
1.1232 +#define GG_CLASS_OFFLINE GG_CLASS_QUEUED
1.1233 +#define GG_CLASS_MSG 0x0004
1.1234 +#define GG_CLASS_CHAT 0x0008
1.1235 +#define GG_CLASS_CTCP 0x0010
1.1236 +#define GG_CLASS_ACK 0x0020
1.1237 +#define GG_CLASS_EXT GG_CLASS_ACK /* kompatybilność wstecz */
1.1238 +
1.1239 +#define GG_MSG_MAXSIZE 2000
1.1240 +
1.1241 +struct gg_send_msg {
1.1242 + uint32_t recipient;
1.1243 + uint32_t seq;
1.1244 + uint32_t msgclass;
1.1245 +} GG_PACKED;
1.1246 +
1.1247 +struct gg_msg_richtext {
1.1248 + uint8_t flag;
1.1249 + uint16_t length;
1.1250 +} GG_PACKED;
1.1251 +
1.1252 +struct gg_msg_richtext_format {
1.1253 + uint16_t position;
1.1254 + uint8_t font;
1.1255 +} GG_PACKED;
1.1256 +
1.1257 +struct gg_msg_richtext_image {
1.1258 + uint16_t unknown1;
1.1259 + uint32_t size;
1.1260 + uint32_t crc32;
1.1261 +} GG_PACKED;
1.1262 +
1.1263 +#define GG_FONT_BOLD 0x01
1.1264 +#define GG_FONT_ITALIC 0x02
1.1265 +#define GG_FONT_UNDERLINE 0x04
1.1266 +#define GG_FONT_COLOR 0x08
1.1267 +#define GG_FONT_IMAGE 0x80
1.1268 +
1.1269 +struct gg_msg_richtext_color {
1.1270 + uint8_t red;
1.1271 + uint8_t green;
1.1272 + uint8_t blue;
1.1273 +} GG_PACKED;
1.1274 +
1.1275 +struct gg_msg_recipients {
1.1276 + uint8_t flag;
1.1277 + uint32_t count;
1.1278 +} GG_PACKED;
1.1279 +
1.1280 +struct gg_msg_image_request {
1.1281 + uint8_t flag;
1.1282 + uint32_t size;
1.1283 + uint32_t crc32;
1.1284 +} GG_PACKED;
1.1285 +
1.1286 +struct gg_msg_image_reply {
1.1287 + uint8_t flag;
1.1288 + uint32_t size;
1.1289 + uint32_t crc32;
1.1290 + /* char filename[]; */
1.1291 + /* char image[]; */
1.1292 +} GG_PACKED;
1.1293 +
1.1294 +#define GG_SEND_MSG_ACK 0x0005
1.1295 +
1.1296 +#define GG_ACK_BLOCKED 0x0001
1.1297 +#define GG_ACK_DELIVERED 0x0002
1.1298 +#define GG_ACK_QUEUED 0x0003
1.1299 +#define GG_ACK_MBOXFULL 0x0004
1.1300 +#define GG_ACK_NOT_DELIVERED 0x0006
1.1301 +
1.1302 +struct gg_send_msg_ack {
1.1303 + uint32_t status;
1.1304 + uint32_t recipient;
1.1305 + uint32_t seq;
1.1306 +} GG_PACKED;
1.1307 +
1.1308 +#define GG_RECV_MSG 0x000a
1.1309 +
1.1310 +struct gg_recv_msg {
1.1311 + uint32_t sender;
1.1312 + uint32_t seq;
1.1313 + uint32_t time;
1.1314 + uint32_t msgclass;
1.1315 +} GG_PACKED;
1.1316 +
1.1317 +#define GG_PING 0x0008
1.1318 +
1.1319 +#define GG_PONG 0x0007
1.1320 +
1.1321 +#define GG_DISCONNECTING 0x000b
1.1322 +
1.1323 +#define GG_USERLIST_REQUEST 0x0016
1.1324 +
1.1325 +#define GG_USERLIST_PUT 0x00
1.1326 +#define GG_USERLIST_PUT_MORE 0x01
1.1327 +#define GG_USERLIST_GET 0x02
1.1328 +
1.1329 +struct gg_userlist_request {
1.1330 + uint8_t type;
1.1331 +} GG_PACKED;
1.1332 +
1.1333 +#define GG_USERLIST_REPLY 0x0010
1.1334 +
1.1335 +#define GG_USERLIST_PUT_REPLY 0x00
1.1336 +#define GG_USERLIST_PUT_MORE_REPLY 0x02
1.1337 +#define GG_USERLIST_GET_REPLY 0x06
1.1338 +#define GG_USERLIST_GET_MORE_REPLY 0x04
1.1339 +
1.1340 +struct gg_userlist_reply {
1.1341 + uint8_t type;
1.1342 +} GG_PACKED;
1.1343 +
1.1344 +/*
1.1345 + * pakiety, stałe, struktury dla DCC
1.1346 + */
1.1347 +
1.1348 +struct gg_dcc_tiny_packet {
1.1349 + uint8_t type; /* rodzaj pakietu */
1.1350 +} GG_PACKED;
1.1351 +
1.1352 +struct gg_dcc_small_packet {
1.1353 + uint32_t type; /* rodzaj pakietu */
1.1354 +} GG_PACKED;
1.1355 +
1.1356 +struct gg_dcc_big_packet {
1.1357 + uint32_t type; /* rodzaj pakietu */
1.1358 + uint32_t dunno1; /* niewiadoma */
1.1359 + uint32_t dunno2; /* niewiadoma */
1.1360 +} GG_PACKED;
1.1361 +
1.1362 +/*
1.1363 + * póki co, nie znamy dokładnie protokołu. nie wiemy, co czemu odpowiada.
1.1364 + * nazwy są niepoważne i tymczasowe.
1.1365 + */
1.1366 +#define GG_DCC_WANT_FILE 0x0003 /* peer chce plik */
1.1367 +#define GG_DCC_HAVE_FILE 0x0001 /* więc mu damy */
1.1368 +#define GG_DCC_HAVE_FILEINFO 0x0003 /* niech ma informacje o pliku */
1.1369 +#define GG_DCC_GIMME_FILE 0x0006 /* peer jest pewny */
1.1370 +#define GG_DCC_CATCH_FILE 0x0002 /* wysyłamy plik */
1.1371 +
1.1372 +#define GG_DCC_FILEATTR_READONLY 0x0020
1.1373 +
1.1374 +#define GG_DCC_TIMEOUT_SEND 1800 /* 30 minut */
1.1375 +#define GG_DCC_TIMEOUT_GET 1800 /* 30 minut */
1.1376 +#define GG_DCC_TIMEOUT_FILE_ACK 300 /* 5 minut */
1.1377 +#define GG_DCC_TIMEOUT_VOICE_ACK 300 /* 5 minut */
1.1378 +
1.1379 +#ifdef __cplusplus
1.1380 +}
1.1381 +#ifdef _WIN32
1.1382 +#pragma pack(pop)
1.1383 +#endif
1.1384 +#endif
1.1385 +
1.1386 +#endif /* __GG_LIBGADU_H */
1.1387 +
1.1388 +/*
1.1389 + * Local variables:
1.1390 + * c-indentation-style: k&r
1.1391 + * c-basic-offset: 8
1.1392 + * indent-tabs-mode: notnil
1.1393 + * End:
1.1394 + *
1.1395 + * vim: shiftwidth=8:
1.1396 + */