1.1 --- a/Frameworks/libpurple.framework/Versions/0.6.0/Headers/libgadu-ppc.h Fri Aug 21 13:24:36 2009 -0700
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,1393 +0,0 @@
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 - */