Frameworks/libpurple.framework/Versions/0.6.2/Headers/libgadu-i386.h
author Zachary West <zacw@adium.im>
Fri Aug 21 13:25:11 2009 -0700 (2009-08-21)
changeset 2592 e8d15275025e
parent 1739 Frameworks/libpurple.framework/Versions/0.6.0/Headers/libgadu-i386.h@8b0daad9656c
permissions -rw-r--r--
im.pidgin.adium.1-4 at 267c6165e02e34318a1823960bd04c0639952f73
     1 /* include/libgadu.h.  Generated from libgadu.h.in by configure.  */
     2 /* $Id: libgadu.h.in,v 1.5.2.1 2007-04-21 23:44:25 wojtekka Exp $ */
     3 
     4 /*
     5  *  (C) Copyright 2001-2003 Wojtek Kaniewski <wojtekka@irc.pl>
     6  *                          Robert J. Wo�ny <speedy@ziew.org>
     7  *                          Arkadiusz Mi�kiewicz <arekm@pld-linux.org>
     8  *                          Tomasz Chili� <chilek@chilan.com>
     9  *                          Piotr Wysocki <wysek@linux.bydg.org>
    10  *                          Dawid Jarosz <dawjar@poczta.onet.pl>
    11  *
    12  *  This program is free software; you can redistribute it and/or modify
    13  *  it under the terms of the GNU Lesser General Public License Version
    14  *  2.1 as published by the Free Software Foundation.
    15  *
    16  *  This program is distributed in the hope that it will be useful,
    17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    19  *  GNU Lesser General Public License for more details.
    20  *
    21  *  You should have received a copy of the GNU Lesser General Public
    22  *  License along with this program; if not, write to the Free Software
    23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
    24  *  USA.
    25  */
    26 
    27 #ifndef __GG_LIBGADU_H
    28 #define __GG_LIBGADU_H
    29 
    30 #ifdef __cplusplus
    31 #ifdef _WIN32
    32 #pragma pack(push, 1)
    33 #endif
    34 extern "C" {
    35 #endif
    36 
    37 #include <sys/types.h>
    38 #include <stdio.h>
    39 #include <stdarg.h>
    40 
    41 /* Defined if libgadu was compiled for bigendian machine. */
    42 /* #undef GG_CONFIG_BIGENDIAN */
    43 
    44 /* Defined if this machine has gethostbyname_r(). */
    45 /* #undef GG_CONFIG_HAVE_GETHOSTBYNAME_R */
    46 
    47 /* Defined if libgadu was compiled and linked with pthread support. */
    48 /* #undef GG_CONFIG_HAVE_PTHREAD */
    49 
    50 /* Defined if this machine has C99-compiliant vsnprintf(). */
    51 #define GG_CONFIG_HAVE_C99_VSNPRINTF 
    52 
    53 /* Defined if this machine has va_copy(). */
    54 #define GG_CONFIG_HAVE_VA_COPY 
    55 
    56 /* Defined if this machine has __va_copy(). */
    57 #define GG_CONFIG_HAVE___VA_COPY 
    58 
    59 /* Defined if this machine supports long long. */
    60 #define GG_CONFIG_HAVE_LONG_LONG 
    61 
    62 /* Defined if libgadu was compiled and linked with TLS support. */
    63 #define GG_CONFIG_HAVE_OPENSSL 
    64 
    65 /* Defined if uintX_t types are defined in <stdint.h>. */
    66 #define GG_CONFIG_HAVE_STDINT_H 
    67 
    68 /* Defined if uintX_t types are defined in <inttypes.h>. */
    69 /* #undef GG_CONFIG_HAVE_INTTYPES_H */
    70 
    71 /* Defined if uintX_t types are defined in <sys/inttypes.h>. */
    72 /* #undef GG_CONFIG_HAVE_SYS_INTTYPES_H */
    73 
    74 /* Defined if uintX_t types are defined in <sys/int_types.h>. */
    75 /* #undef GG_CONFIG_HAVE_SYS_INT_TYPES_H */
    76 
    77 /* Defined if uintX_t types are defined in <sys/types.h>. */
    78 /* #undef GG_CONFIG_HAVE_SYS_TYPES_H */
    79 
    80 #ifdef GG_CONFIG_HAVE_OPENSSL
    81 #include <openssl/ssl.h>
    82 #endif
    83 
    84 #ifdef GG_CONFIG_HAVE_STDINT_H
    85 #include <stdint.h>
    86 #else
    87 #  ifdef GG_CONFIG_HAVE_INTTYPES_H
    88 #  include <inttypes.h>
    89 #  else
    90 #    ifdef GG_CONFIG_HAVE_SYS_INTTYPES_H
    91 #    include <sys/inttypes.h>
    92 #    else
    93 #      ifdef GG_CONFIG_HAVE_SYS_INT_TYPES_H
    94 #      include <sys/int_types.h>
    95 #      else
    96 #        ifdef GG_CONFIG_HAVE_SYS_TYPES_H
    97 #        include <sys/types.h>
    98 #        else
    99 
   100 #ifndef __AC_STDINT_H
   101 #define __AC_STDINT_H
   102 
   103 /* ISO C 9X: 7.18 Integer types <stdint.h> */
   104 
   105 typedef unsigned char   uint8_t;
   106 typedef unsigned short uint16_t;
   107 typedef unsigned int   uint32_t;
   108 
   109 #ifndef __CYGWIN__
   110 #define __int8_t_defined
   111 typedef   signed char    int8_t;
   112 typedef   signed short  int16_t;
   113 typedef   signed int    int32_t;
   114 #endif
   115 
   116 #endif /* __AC_STDINT_H */
   117 
   118 #        endif
   119 #      endif
   120 #    endif
   121 #  endif
   122 #endif
   123 
   124 /*
   125  * typedef uin_t
   126  *
   127  * typ reprezentuj�cy numer osoby.
   128  */
   129 typedef uint32_t uin_t;
   130 
   131 /*
   132  * og� struktura opisuj�ca r� sesje. przydatna w klientach.
   133  */
   134 #define gg_common_head(x) \
   135 	int fd;			/* podgl�dany deskryptor */ \
   136 	int check;		/* sprawdzamy zapis czy odczyt */ \
   137 	int state;		/* aktualny stan maszynki */ \
   138 	int error;		/* kod b�� dla GG_STATE_ERROR */ \
   139 	int type;		/* rodzaj sesji */ \
   140 	int id;			/* identyfikator */ \
   141 	int timeout;		/* sugerowany timeout w sekundach */ \
   142 	int (*callback)(x*); 	/* callback przy zmianach */ \
   143 	void (*destroy)(x*); 	/* funkcja niszczenia */
   144 
   145 struct gg_common {
   146 	gg_common_head(struct gg_common)
   147 };
   148 
   149 struct gg_image_queue;
   150 
   151 /*
   152  * struct gg_session
   153  *
   154  * struktura opisuj�ca dan� sesj�tworzona przez gg_login(), zwalniana
   155  * przez gg_free_session().
   156  */
   157 struct gg_session {
   158 	gg_common_head(struct gg_session)
   159 
   160 	int async;      	/* czy po��czenie jest asynchroniczne */
   161 	int pid;        	/* pid procesu resolvera */
   162 	int port;       	/* port, z kt� si��czymy */
   163 	int seq;        	/* numer sekwencyjny ostatniej wiadomo�ci */
   164 	int last_pong;  	/* czas otrzymania ostatniego ping/pong */
   165 	int last_event;		/* czas otrzymania ostatniego pakietu */
   166 
   167 	struct gg_event *event;	/* zdarzenie po ->callback() */
   168 
   169 	uint32_t proxy_addr;	/* adres proxy, keszowany */
   170 	uint16_t proxy_port;	/* port proxy */
   171 
   172 	uint32_t hub_addr;	/* adres huba po resolvni�u */
   173 	uint32_t server_addr;	/* adres serwera, od huba */
   174 
   175 	uint32_t client_addr;	/* adres klienta */
   176 	uint16_t client_port;	/* port, na kt� klient s�ucha */
   177 
   178 	uint32_t external_addr;	/* adres zewnetrzny klienta */
   179 	uint16_t external_port;	/* port zewnetrzny klienta */
   180 
   181 	uin_t uin;		/* numerek klienta */
   182 	char *password;		/* i jego has�o. zwalniane automagicznie */
   183 
   184 	int initial_status;	/* pocz�tkowy stan klienta */
   185 	int status;		/* aktualny stan klienta */
   186 
   187 	char *recv_buf;		/* bufor na otrzymywane pakiety */
   188 	int recv_done;		/* ile ju� wczytano do bufora */
   189 	int recv_left;		/* i ile jeszcze trzeba wczyta�/
   190 
   191 	int protocol_version;	/* wersja u�ywanego protoko�u */
   192 	char *client_version;	/* wersja u�ywanego klienta */
   193 	int last_sysmsg;	/* ostatnia wiadomo��ystemowa */
   194 
   195 	char *initial_descr;	/* pocz�tkowy opis stanu klienta */
   196 
   197 	void *resolver;		/* wska�nik na informacje resolvera */
   198 
   199 	char *header_buf;	/* bufor na pocz�tek nag�� */
   200 	unsigned int header_done;/* ile ju� mamy */
   201 
   202 #ifdef GG_CONFIG_HAVE_OPENSSL
   203 	SSL *ssl;		/* sesja TLS */
   204 	SSL_CTX *ssl_ctx;	/* kontekst sesji? */
   205 #else
   206 	void *ssl;		/* zachowujemy ABI */
   207 	void *ssl_ctx;
   208 #endif
   209 
   210 	int image_size;		/* maksymalny rozmiar obrazk� KiB */
   211 
   212 	char *userlist_reply;	/* fragment odpowiedzi listy kontakt�/
   213 
   214 	int userlist_blocks;	/* na ile kawa�k�odzielono list�ontakt�/
   215 
   216 	struct gg_image_queue *images;	/* aktualnie wczytywane obrazki */
   217 };
   218 
   219 /*
   220  * struct gg_http
   221  *
   222  * og� struktura opisuj�ca stan wszystkich operacji HTTP. tworzona
   223  * przez gg_http_connect(), zwalniana przez gg_http_free().
   224  */
   225 struct gg_http {
   226 	gg_common_head(struct gg_http)
   227 
   228 	int async;              /* czy po��czenie asynchroniczne */
   229 	int pid;                /* pid procesu resolvera */
   230 	int port;               /* port, z kt� si��czymy */
   231 
   232 	char *query;            /* bufor zapytania http */
   233 	char *header;           /* bufor nag�� */
   234 	int header_size;        /* rozmiar wczytanego nag�� */
   235 	char *body;             /* bufor otrzymanych informacji */
   236 	unsigned int body_size; /* oczekiwana ilo��nformacji */
   237 
   238 	void *data;             /* dane danej operacji http */
   239 
   240 	char *user_data;	/* dane u�ytkownika, nie s� zwalniane przez gg_http_free() */
   241 
   242 	void *resolver;		/* wska�nik na informacje resolvera */
   243 
   244 	unsigned int body_done;	/* ile ju� tre�ci odebrano? */
   245 };
   246 
   247 #ifdef __GNUC__
   248 #define GG_PACKED __attribute__ ((packed))
   249 #else
   250 #define GG_PACKED
   251 #endif
   252 
   253 #define GG_MAX_PATH 276
   254 
   255 /*
   256  * struct gg_file_info
   257  *
   258  * odpowiednik windowsowej struktury WIN32_FIND_DATA niezb�ej przy
   259  * wysy�aniu plik� */
   260 struct gg_file_info {
   261 	uint32_t mode;			/* dwFileAttributes */
   262 	uint32_t ctime[2];		/* ftCreationTime */
   263 	uint32_t atime[2];		/* ftLastAccessTime */
   264 	uint32_t mtime[2];		/* ftLastWriteTime */
   265 	uint32_t size_hi;		/* nFileSizeHigh */
   266 	uint32_t size;			/* nFileSizeLow */
   267 	uint32_t reserved0;		/* dwReserved0 */
   268 	uint32_t reserved1;		/* dwReserved1 */
   269 	unsigned char filename[GG_MAX_PATH - 14];	/* cFileName */
   270 	unsigned char short_filename[14];		/* cAlternateFileName */
   271 } GG_PACKED;
   272 
   273 /*
   274  * struct gg_dcc
   275  *
   276  * struktura opisuj�ca nas�uchuj�ce gniazdo po��cze��y klientami.
   277  * tworzona przez gg_dcc_socket_create(), zwalniana przez gg_dcc_free().
   278  */
   279 struct gg_dcc {
   280 	gg_common_head(struct gg_dcc)
   281 
   282 	struct gg_event *event;	/* opis zdarzenia */
   283 
   284 	int active;		/* czy to my si��czymy? */
   285 	int port;		/* port, na kt� siedzi */
   286 	uin_t uin;		/* uin klienta */
   287 	uin_t peer_uin;		/* uin drugiej strony */
   288 	int file_fd;		/* deskryptor pliku */
   289 	unsigned int offset;	/* offset w pliku */
   290 	unsigned int chunk_size;/* rozmiar kawa�ka */
   291 	unsigned int chunk_offset;/* offset w aktualnym kawa�ku */
   292 	struct gg_file_info file_info;
   293 				/* informacje o pliku */
   294 	int established;	/* po��czenie ustanowione */
   295 	char *voice_buf;	/* bufor na pakiet po��czenia g�osowego */
   296 	int incoming;		/* po��czenie przychodz�ce */
   297 	char *chunk_buf;	/* bufor na kawa�ek danych */
   298 	uint32_t remote_addr;	/* adres drugiej strony */
   299 	uint16_t remote_port;	/* port drugiej strony */
   300 };
   301 
   302 /*
   303  * enum gg_session_t
   304  *
   305  * rodzaje sesji.
   306  */
   307 enum gg_session_t {
   308 	GG_SESSION_GG = 1,	/* po��czenie z serwerem gg */
   309 	GG_SESSION_HTTP,	/* og� sesja http */
   310 	GG_SESSION_SEARCH,	/* szukanie */
   311 	GG_SESSION_REGISTER,	/* rejestrowanie */
   312 	GG_SESSION_REMIND,	/* przypominanie has�a */
   313 	GG_SESSION_PASSWD,	/* zmiana has�a */
   314 	GG_SESSION_CHANGE,	/* zmiana informacji o sobie */
   315 	GG_SESSION_DCC,		/* og� po��czenie DCC */
   316 	GG_SESSION_DCC_SOCKET,	/* nas�uchuj�cy socket */
   317 	GG_SESSION_DCC_SEND,	/* wysy�anie pliku */
   318 	GG_SESSION_DCC_GET,	/* odbieranie pliku */
   319 	GG_SESSION_DCC_VOICE,	/* rozmowa g�osowa */
   320 	GG_SESSION_USERLIST_GET,	/* pobieranie userlisty */
   321 	GG_SESSION_USERLIST_PUT,	/* wysy�anie userlisty */
   322 	GG_SESSION_UNREGISTER,	/* usuwanie konta */
   323 	GG_SESSION_USERLIST_REMOVE,	/* usuwanie userlisty */
   324 	GG_SESSION_TOKEN,	/* pobieranie tokenu */
   325 
   326 	GG_SESSION_USER0 = 256,	/* zdefiniowana dla u�ytkownika */
   327 	GG_SESSION_USER1,	/* j.w. */
   328 	GG_SESSION_USER2,	/* j.w. */
   329 	GG_SESSION_USER3,	/* j.w. */
   330 	GG_SESSION_USER4,	/* j.w. */
   331 	GG_SESSION_USER5,	/* j.w. */
   332 	GG_SESSION_USER6,	/* j.w. */
   333 	GG_SESSION_USER7	/* j.w. */
   334 };
   335 
   336 /*
   337  * enum gg_state_t
   338  *
   339  * opisuje stan asynchronicznej maszyny.
   340  */
   341 enum gg_state_t {
   342 		/* wsp� */
   343 	GG_STATE_IDLE = 0,		/* nie powinno wyst�pi�*/
   344 	GG_STATE_RESOLVING,             /* wywo�a� gethostbyname() */
   345 	GG_STATE_CONNECTING,            /* wywo�a� connect() */
   346 	GG_STATE_READING_DATA,		/* czeka na dane http */
   347 	GG_STATE_ERROR,			/* wyst�pi� b��d. kod w x->error */
   348 
   349 		/* gg_session */
   350 	GG_STATE_CONNECTING_HUB,	/* wywo�a� connect() na huba */
   351 	GG_STATE_CONNECTING_GG,         /* wywo�a� connect() na serwer */
   352 	GG_STATE_READING_KEY,           /* czeka na klucz */
   353 	GG_STATE_READING_REPLY,         /* czeka na odpowied� */
   354 	GG_STATE_CONNECTED,             /* po��czy� si�/
   355 
   356 		/* gg_http */
   357 	GG_STATE_SENDING_QUERY,		/* wysy�a zapytanie http */
   358 	GG_STATE_READING_HEADER,	/* czeka na nag�� http */
   359 	GG_STATE_PARSING,               /* przetwarza dane */
   360 	GG_STATE_DONE,                  /* sko�� */
   361 
   362 		/* gg_dcc */
   363 	GG_STATE_LISTENING,		/* czeka na po��czenia */
   364 	GG_STATE_READING_UIN_1,		/* czeka na uin peera */
   365 	GG_STATE_READING_UIN_2,		/* czeka na sw�in */
   366 	GG_STATE_SENDING_ACK,		/* wysy�a potwierdzenie dcc */
   367 	GG_STATE_READING_ACK,		/* czeka na potwierdzenie dcc */
   368 	GG_STATE_READING_REQUEST,	/* czeka na komend�/
   369 	GG_STATE_SENDING_REQUEST,	/* wysy�a komend�/
   370 	GG_STATE_SENDING_FILE_INFO,	/* wysy�a informacje o pliku */
   371 	GG_STATE_READING_PRE_FILE_INFO,	/* czeka na pakiet przed file_info */
   372 	GG_STATE_READING_FILE_INFO,	/* czeka na informacje o pliku */
   373 	GG_STATE_SENDING_FILE_ACK,	/* wysy�a potwierdzenie pliku */
   374 	GG_STATE_READING_FILE_ACK,	/* czeka na potwierdzenie pliku */
   375 	GG_STATE_SENDING_FILE_HEADER,	/* wysy�a nag�� pliku */
   376 	GG_STATE_READING_FILE_HEADER,	/* czeka na nag�� */
   377 	GG_STATE_GETTING_FILE,		/* odbiera plik */
   378 	GG_STATE_SENDING_FILE,		/* wysy�a plik */
   379 	GG_STATE_READING_VOICE_ACK,	/* czeka na potwierdzenie voip */
   380 	GG_STATE_READING_VOICE_HEADER,	/* czeka na rodzaj bloku voip */
   381 	GG_STATE_READING_VOICE_SIZE,	/* czeka na rozmiar bloku voip */
   382 	GG_STATE_READING_VOICE_DATA,	/* czeka na dane voip */
   383 	GG_STATE_SENDING_VOICE_ACK,	/* wysy�a potwierdzenie voip */
   384 	GG_STATE_SENDING_VOICE_REQUEST,	/* wysy�a ��danie voip */
   385 	GG_STATE_READING_TYPE,		/* czeka na typ po��czenia */
   386 
   387 	/* nowe. bez sensu jest to API. */
   388 	GG_STATE_TLS_NEGOTIATION	/* negocjuje po��czenie TLS */
   389 };
   390 
   391 /*
   392  * enum gg_check_t
   393  *
   394  * informuje, co proces klienta powinien sprawdzi�a deskryptorze danego
   395  * po��czenia.
   396  */
   397 enum gg_check_t {
   398 	GG_CHECK_NONE = 0,		/* nic. nie powinno wyst�pi�/
   399 	GG_CHECK_WRITE = 1,		/* sprawdzamy mo�liwo��apisu */
   400 	GG_CHECK_READ = 2		/* sprawdzamy mo�liwo��dczytu */
   401 };
   402 
   403 /*
   404  * struct gg_login_params
   405  *
   406  * parametry gg_login(). przeniesiono do struktury, �eby unikn��roblem�* z ci�g�ymi zmianami API, gdy dodano co� nowego do protoko�u.
   407  */
   408 struct gg_login_params {
   409 	uin_t uin;			/* numerek */
   410 	char *password;			/* has�o */
   411 	int async;			/* asynchroniczne sockety? */
   412 	int status;			/* pocz�tkowy status klienta */
   413 	char *status_descr;		/* opis statusu */
   414 	uint32_t server_addr;		/* adres serwera gg */
   415 	uint16_t server_port;		/* port serwera gg */
   416 	uint32_t client_addr;		/* adres dcc klienta */
   417 	uint16_t client_port;		/* port dcc klienta */
   418 	int protocol_version;		/* wersja protoko�u */
   419 	char *client_version;		/* wersja klienta */
   420 	int has_audio;			/* czy ma d�wi� */
   421 	int last_sysmsg;		/* ostatnia wiadomo��ystemowa */
   422 	uint32_t external_addr;		/* adres widziany na zewnatrz */
   423 	uint16_t external_port;		/* port widziany na zewnatrz */
   424 	int tls;			/* czy ��czymy po TLS? */
   425 	int image_size;			/* maksymalny rozmiar obrazka w KiB */
   426 	int era_omnix;			/* czy udawa�lienta era omnix? */
   427 
   428 	char dummy[6 * sizeof(int)];	/* miejsce na kolejnych 6 zmiennych,
   429 					 * �eby z dodaniem parametru nie
   430 					 * zmienia� si�ozmiar struktury */
   431 };
   432 
   433 struct gg_session *gg_login(const struct gg_login_params *p);
   434 void gg_free_session(struct gg_session *sess);
   435 void gg_logoff(struct gg_session *sess);
   436 int gg_change_status(struct gg_session *sess, int status);
   437 int gg_change_status_descr(struct gg_session *sess, int status, const char *descr);
   438 int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time);
   439 int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message);
   440 int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen);
   441 int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message);
   442 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);
   443 int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len);
   444 int gg_ping(struct gg_session *sess);
   445 int gg_userlist_request(struct gg_session *sess, char type, const char *request);
   446 int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32);
   447 int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size);
   448 
   449 uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len);
   450 
   451 struct gg_image_queue {
   452 	uin_t sender;			/* nadawca obrazka */
   453 	uint32_t size;			/* rozmiar */
   454 	uint32_t crc32;			/* suma kontrolna */
   455 	char *filename;			/* nazwa pliku */
   456 	char *image;			/* bufor z obrazem */
   457 	uint32_t done;			/* ile ju� wczytano */
   458 
   459 	struct gg_image_queue *next;	/* nast�y na li�cie */
   460 };
   461 
   462 /*
   463  * enum gg_event_t
   464  *
   465  * rodzaje zdarze�*/
   466 enum gg_event_t {
   467 	GG_EVENT_NONE = 0,		/* nic si�ie wydarzy�o */
   468 	GG_EVENT_MSG,			/* otrzymano wiadomo��/
   469 	GG_EVENT_NOTIFY,		/* kto� si�ojawi� */
   470 	GG_EVENT_NOTIFY_DESCR,		/* kto� si�ojawi� z opisem */
   471 	GG_EVENT_STATUS,		/* kto� zmieni� stan */
   472 	GG_EVENT_ACK,			/* potwierdzenie wys�ania wiadomo�ci */
   473 	GG_EVENT_PONG,			/* pakiet pong */
   474 	GG_EVENT_CONN_FAILED,		/* po��czenie si�ie uda�o */
   475 	GG_EVENT_CONN_SUCCESS,		/* po��czenie si�owiod�o */
   476 	GG_EVENT_DISCONNECT,		/* serwer zrywa po��czenie */
   477 
   478 	GG_EVENT_DCC_NEW,		/* nowe po��czenie mi�y klientami */
   479 	GG_EVENT_DCC_ERROR,		/* b��d po��czenia mi�y klientami */
   480 	GG_EVENT_DCC_DONE,		/* zako�no po��czenie */
   481 	GG_EVENT_DCC_CLIENT_ACCEPT,	/* moment akceptacji klienta */
   482 	GG_EVENT_DCC_CALLBACK,		/* klient si�o��czy� na ��danie */
   483 	GG_EVENT_DCC_NEED_FILE_INFO,	/* nale�y wype�ni�ile_info */
   484 	GG_EVENT_DCC_NEED_FILE_ACK,	/* czeka na potwierdzenie pliku */
   485 	GG_EVENT_DCC_NEED_VOICE_ACK,	/* czeka na potwierdzenie rozmowy */
   486 	GG_EVENT_DCC_VOICE_DATA, 	/* ramka danych rozmowy g�osowej */
   487 
   488 	GG_EVENT_PUBDIR50_SEARCH_REPLY,	/* odpowiedz wyszukiwania */
   489 	GG_EVENT_PUBDIR50_READ,		/* odczytano w�asne dane z katalogu */
   490 	GG_EVENT_PUBDIR50_WRITE,	/* wpisano w�asne dane do katalogu */
   491 
   492 	GG_EVENT_STATUS60,		/* kto� zmieni� stan w GG 6.0 */
   493 	GG_EVENT_NOTIFY60,		/* kto� si�ojawi� w GG 6.0 */
   494 	GG_EVENT_USERLIST,		/* odpowied� listy kontakt� GG 6.0 */
   495 	GG_EVENT_IMAGE_REQUEST,		/* pro�ba o wys�anie obrazka GG 6.0 */
   496 	GG_EVENT_IMAGE_REPLY,		/* podes�any obrazek GG 6.0 */
   497 	GG_EVENT_DCC_ACK		/* potwierdzenie transmisji */
   498 };
   499 
   500 #define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY
   501 
   502 /*
   503  * enum gg_failure_t
   504  *
   505  * okre�la pow�ieudanego po��czenia.
   506  */
   507 enum gg_failure_t {
   508 	GG_FAILURE_RESOLVING = 1,	/* nie znaleziono serwera */
   509 	GG_FAILURE_CONNECTING,		/* nie mo�na si�o��czy�/
   510 	GG_FAILURE_INVALID,		/* serwer zwr� nieprawid�owe dane */
   511 	GG_FAILURE_READING,		/* zerwano po��czenie podczas odczytu */
   512 	GG_FAILURE_WRITING,		/* zerwano po��czenie podczas zapisu */
   513 	GG_FAILURE_PASSWORD,		/* nieprawid�owe has�o */
   514 	GG_FAILURE_404, 		/* XXX nieu�ywane */
   515 	GG_FAILURE_TLS,			/* b��d negocjacji TLS */
   516 	GG_FAILURE_NEED_EMAIL, 		/* serwer roz��czy� nas z pro�b� o zmian�maila */
   517 	GG_FAILURE_INTRUDER,		/* za du�o pr�o��czenia si� nieprawid�owym has�em */
   518 	GG_FAILURE_UNAVAILABLE		/* serwery s� wy��czone */
   519 };
   520 
   521 /*
   522  * enum gg_error_t
   523  *
   524  * okre�la rodzaj b�� wywo�anego przez dan� operacj�nie zawiera
   525  * przesadnie szczeg�ych informacji o powodzie b��, by nie komplikowa�* obs�ugi b��w. je�li wymagana jest wi�za dok�adno��nale�y sprawdzi�* zawarto��miennej errno.
   526  */
   527 enum gg_error_t {
   528 	GG_ERROR_RESOLVING = 1,		/* b��d znajdowania hosta */
   529 	GG_ERROR_CONNECTING,		/* b��d �aczenia si�/
   530 	GG_ERROR_READING,		/* b��d odczytu */
   531 	GG_ERROR_WRITING,		/* b��d wysy�ania */
   532 
   533 	GG_ERROR_DCC_HANDSHAKE,		/* b��d negocjacji */
   534 	GG_ERROR_DCC_FILE,		/* b��d odczytu/zapisu pliku */
   535 	GG_ERROR_DCC_EOF,		/* plik si�ko��? */
   536 	GG_ERROR_DCC_NET,		/* b��d wysy�ania/odbierania */
   537 	GG_ERROR_DCC_REFUSED 		/* po��czenie odrzucone przez usera */
   538 };
   539 
   540 /*
   541  * struktury dotycz�ce wyszukiwania w GG 5.0. NIE NALE�Y SI�DO NICH
   542  * ODWO�YWA�BEZPO�REDNIO! do dost� do nich s�u�� funkcje gg_pubdir50_*()
   543  */
   544 struct gg_pubdir50_entry {
   545 	int num;
   546 	char *field;
   547 	char *value;
   548 };
   549 
   550 struct gg_pubdir50_s {
   551 	int count;
   552 	uin_t next;
   553 	int type;
   554 	uint32_t seq;
   555 	struct gg_pubdir50_entry *entries;
   556 	int entries_count;
   557 };
   558 
   559 /*
   560  * typedef gg_pubdir_50_t
   561  *
   562  * typ opisuj�cy zapytanie lub wynik zapytania katalogu publicznego
   563  * z protoko�u GG 5.0. nie nale�y si�dwo�ywa�ezpo�rednio do jego
   564  * p�- s�u�� do tego funkcje gg_pubdir50_*()
   565  */
   566 typedef struct gg_pubdir50_s *gg_pubdir50_t;
   567 
   568 /*
   569  * struct gg_event
   570  *
   571  * struktura opisuj�ca rodzaj zdarzenia. wychodzi z gg_watch_fd() lub
   572  * z gg_dcc_watch_fd()
   573  */
   574 struct gg_event {
   575 	int type;	/* rodzaj zdarzenia -- gg_event_t */
   576 	union {		/* @event */
   577 		struct gg_notify_reply *notify;	/* informacje o li�cie kontakt�- GG_EVENT_NOTIFY */
   578 
   579 		enum gg_failure_t failure;	/* b��d po��czenia -- GG_EVENT_FAILURE */
   580 
   581 		struct gg_dcc *dcc_new;		/* nowe po��czenie bezpo�rednie -- GG_EVENT_DCC_NEW */
   582 
   583 		int dcc_error;			/* b��d po��czenia bezpo�redniego -- GG_EVENT_DCC_ERROR */
   584 
   585 		gg_pubdir50_t pubdir50;		/* wynik operacji zwi�zanej z katalogiem publicznym -- GG_EVENT_PUBDIR50_* */
   586 
   587 		struct {			/* @msg odebrano wiadomo��- GG_EVENT_MSG */
   588 			uin_t sender;		/* numer nadawcy */
   589 			int msgclass;		/* klasa wiadomo�ci */
   590 			time_t time;		/* czas nadania */
   591 			unsigned char *message;	/* tre��iadomo�ci */
   592 
   593 			int recipients_count;	/* ilo��dbiorc�onferencji */
   594 			uin_t *recipients;	/* odbiorcy konferencji */
   595 
   596 			int formats_length;	/* d�ugo��nformacji o formatowaniu tekstu */
   597 			void *formats;		/* informacje o formatowaniu tekstu */
   598 		} msg;
   599 
   600 		struct {			/* @notify_descr informacje o li�cie kontakt� opisami stanu -- GG_EVENT_NOTIFY_DESCR */
   601 			struct gg_notify_reply *notify;	/* informacje o li�cie kontakt�/
   602 			char *descr;		/* opis stanu */
   603 		} notify_descr;
   604 
   605 		struct {			/* @status zmiana stanu -- GG_EVENT_STATUS */
   606 			uin_t uin;		/* numer */
   607 			uint32_t status;	/* nowy stan */
   608 			char *descr;		/* opis stanu */
   609 		} status;
   610 
   611 		struct {			/* @status60 zmiana stanu -- GG_EVENT_STATUS60 */
   612 			uin_t uin;		/* numer */
   613 			int status;	/* nowy stan */
   614 			uint32_t remote_ip;	/* adres ip */
   615 			uint16_t remote_port;	/* port */
   616 			int version;	/* wersja klienta */
   617 			int image_size;	/* maksymalny rozmiar grafiki w KiB */
   618 			char *descr;		/* opis stanu */
   619 			time_t time;		/* czas powrotu */
   620 		} status60;
   621 
   622 		struct {			/* @notify60 informacja o li�cie kontakt�- GG_EVENT_NOTIFY60 */
   623 			uin_t uin;		/* numer */
   624 			int status;	/* stan */
   625 			uint32_t remote_ip;	/* adres ip */
   626 			uint16_t remote_port;	/* port */
   627 			int version;	/* wersja klienta */
   628 			int image_size;	/* maksymalny rozmiar grafiki w KiB */
   629 			char *descr;		/* opis stanu */
   630 			time_t time;		/* czas powrotu */
   631 		} *notify60;
   632 
   633 		struct {			/* @ack potwierdzenie wiadomo�ci -- GG_EVENT_ACK */
   634 			uin_t recipient;	/* numer odbiorcy */
   635 			int status;		/* stan dor�enia wiadomo�ci */
   636 			int seq;		/* numer sekwencyjny wiadomo�ci */
   637 		} ack;
   638 
   639 		struct {			/* @dcc_voice_data otrzymano dane d�wi�we -- GG_EVENT_DCC_VOICE_DATA */
   640 			uint8_t *data;		/* dane d�wi�we */
   641 			int length;		/* ilo��anych d�wi�wych */
   642 		} dcc_voice_data;
   643 
   644 		struct {			/* @userlist odpowied� listy kontakt�erwera */
   645 			char type;		/* rodzaj odpowiedzi */
   646 			char *reply;		/* tre��dpowiedzi */
   647 		} userlist;
   648 
   649 		struct {			/* @image_request pro�ba o obrazek */
   650 			uin_t sender;		/* nadawca pro�by */
   651 			uint32_t size;		/* rozmiar obrazka */
   652 			uint32_t crc32;		/* suma kontrolna */
   653 		} image_request;
   654 
   655 		struct {			/* @image_reply odpowied� z obrazkiem */
   656 			uin_t sender;		/* nadawca odpowiedzi */
   657 			uint32_t size;		/* rozmiar obrazka */
   658 			uint32_t crc32;		/* suma kontrolna */
   659 			char *filename;		/* nazwa pliku */
   660 			char *image;		/* bufor z obrazkiem */
   661 		} image_reply;
   662 	} event;
   663 };
   664 
   665 struct gg_event *gg_watch_fd(struct gg_session *sess);
   666 void gg_event_free(struct gg_event *e);
   667 #define gg_free_event gg_event_free
   668 
   669 /*
   670  * funkcje obs�ugi listy kontakt� */
   671 int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count);
   672 int gg_notify(struct gg_session *sess, uin_t *userlist, int count);
   673 int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type);
   674 int gg_add_notify(struct gg_session *sess, uin_t uin);
   675 int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type);
   676 int gg_remove_notify(struct gg_session *sess, uin_t uin);
   677 
   678 /*
   679  * funkcje obs�ugi http.
   680  */
   681 struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header);
   682 int gg_http_watch_fd(struct gg_http *h);
   683 void gg_http_stop(struct gg_http *h);
   684 void gg_http_free(struct gg_http *h);
   685 void gg_http_free_fields(struct gg_http *h);
   686 #define gg_free_http gg_http_free
   687 
   688 /*
   689  * struktury opisuj�ca kryteria wyszukiwania dla gg_search(). nieaktualne,
   690  * zast�pione przez gg_pubdir50_t. pozostawiono je dla zachowania ABI.
   691  */
   692 struct gg_search_request {
   693 	int active;
   694 	unsigned int start;
   695 	char *nickname;
   696 	char *first_name;
   697 	char *last_name;
   698 	char *city;
   699 	int gender;
   700 	int min_birth;
   701 	int max_birth;
   702 	char *email;
   703 	char *phone;
   704 	uin_t uin;
   705 };
   706 
   707 struct gg_search {
   708 	int count;
   709 	struct gg_search_result *results;
   710 };
   711 
   712 struct gg_search_result {
   713 	uin_t uin;
   714 	char *first_name;
   715 	char *last_name;
   716 	char *nickname;
   717 	int born;
   718 	int gender;
   719 	char *city;
   720 	int active;
   721 };
   722 
   723 #define GG_GENDER_NONE 0
   724 #define GG_GENDER_FEMALE 1
   725 #define GG_GENDER_MALE 2
   726 
   727 /*
   728  * funkcje wyszukiwania.
   729  */
   730 struct gg_http *gg_search(const struct gg_search_request *r, int async);
   731 int gg_search_watch_fd(struct gg_http *f);
   732 void gg_free_search(struct gg_http *f);
   733 #define gg_search_free gg_free_search
   734 
   735 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);
   736 const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start);
   737 const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start);
   738 const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start);
   739 void gg_search_request_free(struct gg_search_request *r);
   740 
   741 /*
   742  * funkcje obs�ugi katalogu publicznego zgodne z GG 5.0. tym razem funkcje
   743  * zachowuj� pewien poziom abstrakcji, �eby unikn��mian ABI przy zmianach
   744  * w protokole.
   745  *
   746  * NIE NALE�Y SI�ODWO�YWA�DO P� gg_pubdir50_t BEZPO�REDNIO!
   747  */
   748 uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req);
   749 gg_pubdir50_t gg_pubdir50_new(int type);
   750 int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value);
   751 int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq);
   752 const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field);
   753 int gg_pubdir50_type(gg_pubdir50_t res);
   754 int gg_pubdir50_count(gg_pubdir50_t res);
   755 uin_t gg_pubdir50_next(gg_pubdir50_t res);
   756 uint32_t gg_pubdir50_seq(gg_pubdir50_t res);
   757 void gg_pubdir50_free(gg_pubdir50_t res);
   758 
   759 #define GG_PUBDIR50_UIN "FmNumber"
   760 #define GG_PUBDIR50_STATUS "FmStatus"
   761 #define GG_PUBDIR50_FIRSTNAME "firstname"
   762 #define GG_PUBDIR50_LASTNAME "lastname"
   763 #define GG_PUBDIR50_NICKNAME "nickname"
   764 #define GG_PUBDIR50_BIRTHYEAR "birthyear"
   765 #define GG_PUBDIR50_CITY "city"
   766 #define GG_PUBDIR50_GENDER "gender"
   767 #define GG_PUBDIR50_GENDER_FEMALE "1"
   768 #define GG_PUBDIR50_GENDER_MALE "2"
   769 #define GG_PUBDIR50_GENDER_SET_FEMALE "2"
   770 #define GG_PUBDIR50_GENDER_SET_MALE "1"
   771 #define GG_PUBDIR50_ACTIVE "ActiveOnly"
   772 #define GG_PUBDIR50_ACTIVE_TRUE "1"
   773 #define GG_PUBDIR50_START "fmstart"
   774 #define GG_PUBDIR50_FAMILYNAME "familyname"
   775 #define GG_PUBDIR50_FAMILYCITY "familycity"
   776 
   777 int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length);
   778 
   779 /*
   780  * struct gg_pubdir
   781  *
   782  * operacje na katalogu publicznym.
   783  */
   784 struct gg_pubdir {
   785 	int success;		/* czy si�da�o */
   786 	uin_t uin;		/* otrzymany numerek. 0 je�li b��d */
   787 };
   788 
   789 /* og� funkcje, nie powinny by��ywane */
   790 int gg_pubdir_watch_fd(struct gg_http *f);
   791 void gg_pubdir_free(struct gg_http *f);
   792 #define gg_free_pubdir gg_pubdir_free
   793 
   794 struct gg_token {
   795 	int width;		/* szeroko��brazka */
   796 	int height;		/* wysoko��brazka */
   797 	int length;		/* ilo��nak� tokenie */
   798 	char *tokenid;		/* id tokenu */
   799 };
   800 
   801 /* funkcje dotycz�ce token�/
   802 struct gg_http *gg_token(int async);
   803 int gg_token_watch_fd(struct gg_http *h);
   804 void gg_token_free(struct gg_http *h);
   805 
   806 /* rejestracja nowego numerka */
   807 struct gg_http *gg_register(const char *email, const char *password, int async);
   808 struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async);
   809 struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async);
   810 #define gg_register_watch_fd gg_pubdir_watch_fd
   811 #define gg_register_free gg_pubdir_free
   812 #define gg_free_register gg_pubdir_free
   813 
   814 struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async);
   815 struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async);
   816 struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async);
   817 #define gg_unregister_watch_fd gg_pubdir_watch_fd
   818 #define gg_unregister_free gg_pubdir_free
   819 
   820 /* przypomnienie has�a e-mailem */
   821 struct gg_http *gg_remind_passwd(uin_t uin, int async);
   822 struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async);
   823 struct gg_http *gg_remind_passwd3(uin_t uin, const char *email, const char *tokenid, const char *tokenval, int async);
   824 #define gg_remind_passwd_watch_fd gg_pubdir_watch_fd
   825 #define gg_remind_passwd_free gg_pubdir_free
   826 #define gg_free_remind_passwd gg_pubdir_free
   827 
   828 /* zmiana has�a */
   829 struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async);
   830 struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async);
   831 struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async);
   832 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);
   833 #define gg_change_passwd_free gg_pubdir_free
   834 #define gg_free_change_passwd gg_pubdir_free
   835 
   836 /*
   837  * struct gg_change_info_request
   838  *
   839  * opis ��dania zmiany informacji w katalogu publicznym.
   840  */
   841 struct gg_change_info_request {
   842 	char *first_name;	/* imi�/
   843 	char *last_name;	/* nazwisko */
   844 	char *nickname;		/* pseudonim */
   845 	char *email;		/* email */
   846 	int born;		/* rok urodzenia */
   847 	int gender;		/* p�e�/
   848 	char *city;		/* miasto */
   849 };
   850 
   851 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);
   852 void gg_change_info_request_free(struct gg_change_info_request *r);
   853 
   854 struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async);
   855 #define gg_change_pubdir_watch_fd gg_pubdir_watch_fd
   856 #define gg_change_pubdir_free gg_pubdir_free
   857 #define gg_free_change_pubdir gg_pubdir_free
   858 
   859 /*
   860  * funkcje dotycz�ce listy kontakt�a serwerze.
   861  */
   862 struct gg_http *gg_userlist_get(uin_t uin, const char *password, int async);
   863 int gg_userlist_get_watch_fd(struct gg_http *f);
   864 void gg_userlist_get_free(struct gg_http *f);
   865 
   866 struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async);
   867 int gg_userlist_put_watch_fd(struct gg_http *f);
   868 void gg_userlist_put_free(struct gg_http *f);
   869 
   870 struct gg_http *gg_userlist_remove(uin_t uin, const char *password, int async);
   871 int gg_userlist_remove_watch_fd(struct gg_http *f);
   872 void gg_userlist_remove_free(struct gg_http *f);
   873 
   874 
   875 
   876 /*
   877  * funkcje dotycz�ce komunikacji mi�y klientami.
   878  */
   879 extern int gg_dcc_port;			/* port, na kt� nas�uchuje klient */
   880 extern unsigned long gg_dcc_ip;		/* adres, na kt� nas�uchuje klient */
   881 
   882 int gg_dcc_request(struct gg_session *sess, uin_t uin);
   883 
   884 struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
   885 struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
   886 struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
   887 void gg_dcc_set_type(struct gg_dcc *d, int type);
   888 int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename);
   889 int gg_dcc_fill_file_info2(struct gg_dcc *d, const char *filename, const char *local_filename);
   890 int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length);
   891 
   892 #define GG_DCC_VOICE_FRAME_LENGTH 195
   893 #define GG_DCC_VOICE_FRAME_LENGTH_505 326
   894 
   895 struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port);
   896 #define gg_dcc_socket_free gg_free_dcc
   897 #define gg_dcc_socket_watch_fd gg_dcc_watch_fd
   898 
   899 struct gg_event *gg_dcc_watch_fd(struct gg_dcc *d);
   900 
   901 void gg_dcc_free(struct gg_dcc *c);
   902 #define gg_free_dcc gg_dcc_free
   903 
   904 /*
   905  * je�li chcemy sobie podebugowa�wystarczy ustawi�gg_debug_level'.
   906  * niestety w miar�rzybywania wpis�gg_debug(...)' nie chcia�o mi
   907  * si�stawia�dpowiednich leveli, wi�wi�zo��z�a do _MISC.
   908  */
   909 extern int gg_debug_level;	/* poziom debugowania. mapa bitowa sta�ych GG_DEBUG_* */
   910 
   911 /*
   912  * mo�na poda�ska�nik do funkcji obs�uguj�cej wywo�ania gg_debug().
   913  * nieoficjalne, nieudokumentowane, mo�e si�mieni�je�li kto� jest
   914  * zainteresowany, niech da zna�a ekg-devel.
   915  */
   916 extern void (*gg_debug_handler)(int level, const char *format, va_list ap);
   917 extern void (*gg_debug_handler_session)(struct gg_session *sess, int level, const char *format, va_list ap);
   918 
   919 /*
   920  * mo�na poda�lik, do kt�o b� zapisywane teksty z gg_debug().
   921  */
   922 extern FILE *gg_debug_file;
   923 
   924 #define GG_DEBUG_NET 1
   925 #define GG_DEBUG_TRAFFIC 2
   926 #define GG_DEBUG_DUMP 4
   927 #define GG_DEBUG_FUNCTION 8
   928 #define GG_DEBUG_MISC 16
   929 
   930 #ifdef GG_DEBUG_DISABLE
   931 #define gg_debug(x, y...) do { } while(0)
   932 #define gg_debug_session(z, x, y...) do { } while(0)
   933 #else
   934 void gg_debug(int level, const char *format, ...);
   935 void gg_debug_session(struct gg_session *sess, int level, const char *format, ...);
   936 #endif
   937 
   938 const char *gg_libgadu_version(void);
   939 
   940 /*
   941  * konfiguracja http proxy.
   942  */
   943 extern int gg_proxy_enabled;		/* w��cza obs�ug�roxy */
   944 extern char *gg_proxy_host;		/* okre�la adres serwera proxy */
   945 extern int gg_proxy_port;		/* okre�la port serwera proxy */
   946 extern char *gg_proxy_username;		/* okre�la nazw��ytkownika przy autoryzacji serwera proxy */
   947 extern char *gg_proxy_password;		/* okre�la has�o u�ytkownika przy autoryzacji serwera proxy */
   948 extern int gg_proxy_http_only;		/* w��cza obs�ug�roxy wy��cznie dla us�ug HTTP */
   949 
   950 
   951 /*
   952  * adres, z kt�o �lemy pakiety (np ��czymy si� serwerem)
   953  * u�ywany przy gg_connect()
   954  */
   955 extern unsigned long gg_local_ip;
   956 /*
   957  * -------------------------------------------------------------------------
   958  * poni�ej znajduj� si�ewn�zne sprawy biblioteki. zwyk�y klient nie
   959  * powinien ich w og�rusza�bo i nie ma po co. wszystko mo�na za�atwi�* procedurami wy�szego poziomu, kt�h definicje znajduj� si�a pocz�tku
   960  * tego pliku.
   961  * -------------------------------------------------------------------------
   962  */
   963 
   964 #ifdef GG_CONFIG_HAVE_PTHREAD
   965 int gg_resolve_pthread(int *fd, void **resolver, const char *hostname);
   966 void gg_resolve_pthread_cleanup(void *resolver, int kill);
   967 #endif
   968 
   969 #ifdef _WIN32
   970 int gg_thread_socket(int thread_id, int socket);
   971 #endif
   972 
   973 int gg_resolve(int *fd, int *pid, const char *hostname);
   974 
   975 #ifdef __GNUC__
   976 char *gg_saprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
   977 #else
   978 char *gg_saprintf(const char *format, ...);
   979 #endif
   980 
   981 char *gg_vsaprintf(const char *format, va_list ap);
   982 
   983 #define gg_alloc_sprintf gg_saprintf
   984 
   985 char *gg_get_line(char **ptr);
   986 
   987 int gg_connect(void *addr, int port, int async);
   988 struct in_addr *gg_gethostbyname(const char *hostname);
   989 char *gg_read_line(int sock, char *buf, int length);
   990 void gg_chomp(char *line);
   991 char *gg_urlencode(const char *str);
   992 int gg_http_hash(const char *format, ...);
   993 int gg_read(struct gg_session *sess, char *buf, int length);
   994 int gg_write(struct gg_session *sess, const char *buf, int length);
   995 void *gg_recv_packet(struct gg_session *sess);
   996 int gg_send_packet(struct gg_session *sess, int type, ...);
   997 unsigned int gg_login_hash(const unsigned char *password, unsigned int seed);
   998 uint32_t gg_fix32(uint32_t x);
   999 uint16_t gg_fix16(uint16_t x);
  1000 #define fix16 gg_fix16
  1001 #define fix32 gg_fix32
  1002 char *gg_proxy_auth(void);
  1003 char *gg_base64_encode(const char *buf);
  1004 char *gg_base64_decode(const char *buf);
  1005 int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq);
  1006 
  1007 #define GG_APPMSG_HOST "appmsg.gadu-gadu.pl"
  1008 #define GG_APPMSG_PORT 80
  1009 #define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl"
  1010 #define GG_PUBDIR_PORT 80
  1011 #define GG_REGISTER_HOST "register.gadu-gadu.pl"
  1012 #define GG_REGISTER_PORT 80
  1013 #define GG_REMIND_HOST "retr.gadu-gadu.pl"
  1014 #define GG_REMIND_PORT 80
  1015 
  1016 #define GG_DEFAULT_PORT 8074
  1017 #define GG_HTTPS_PORT 443
  1018 #define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
  1019 
  1020 #define GG_DEFAULT_CLIENT_VERSION "6, 1, 0, 158"
  1021 #define GG_DEFAULT_PROTOCOL_VERSION 0x24
  1022 #define GG_DEFAULT_TIMEOUT 30
  1023 #define GG_HAS_AUDIO_MASK 0x40000000
  1024 #define GG_ERA_OMNIX_MASK 0x04000000
  1025 #define GG_LIBGADU_VERSION "CVS"
  1026 
  1027 #define GG_DEFAULT_DCC_PORT 1550
  1028 
  1029 struct gg_header {
  1030 	uint32_t type;			/* typ pakietu */
  1031 	uint32_t length;		/* d�ugo��eszty pakietu */
  1032 } GG_PACKED;
  1033 
  1034 #define GG_WELCOME 0x0001
  1035 #define GG_NEED_EMAIL 0x0014
  1036 
  1037 struct gg_welcome {
  1038 	uint32_t key;			/* klucz szyfrowania has�a */
  1039 } GG_PACKED;
  1040 
  1041 #define GG_LOGIN 0x000c
  1042 
  1043 struct gg_login {
  1044 	uint32_t uin;			/* m�umerek */
  1045 	uint32_t hash;			/* hash has�a */
  1046 	uint32_t status;		/* status na dzie�bry */
  1047 	uint32_t version;		/* moja wersja klienta */
  1048 	uint32_t local_ip;		/* m�dres ip */
  1049 	uint16_t local_port;		/* port, na kt� s�ucham */
  1050 } GG_PACKED;
  1051 
  1052 #define GG_LOGIN_EXT 0x0013
  1053 
  1054 struct gg_login_ext {
  1055 	uint32_t uin;			/* m�umerek */
  1056 	uint32_t hash;			/* hash has�a */
  1057 	uint32_t status;		/* status na dzie�bry */
  1058 	uint32_t version;		/* moja wersja klienta */
  1059 	uint32_t local_ip;		/* m�dres ip */
  1060 	uint16_t local_port;		/* port, na kt� s�ucham */
  1061 	uint32_t external_ip;		/* zewn�zny adres ip */
  1062 	uint16_t external_port;		/* zewn�zny port */
  1063 } GG_PACKED;
  1064 
  1065 #define GG_LOGIN60 0x0015
  1066 
  1067 struct gg_login60 {
  1068 	uint32_t uin;			/* m�umerek */
  1069 	uint32_t hash;			/* hash has�a */
  1070 	uint32_t status;		/* status na dzie�bry */
  1071 	uint32_t version;		/* moja wersja klienta */
  1072 	uint8_t dunno1;			/* 0x00 */
  1073 	uint32_t local_ip;		/* m�dres ip */
  1074 	uint16_t local_port;		/* port, na kt� s�ucham */
  1075 	uint32_t external_ip;		/* zewn�zny adres ip */
  1076 	uint16_t external_port;		/* zewn�zny port */
  1077 	uint8_t image_size;		/* maksymalny rozmiar grafiki w KiB */
  1078 	uint8_t dunno2;			/* 0xbe */
  1079 } GG_PACKED;
  1080 
  1081 #define GG_LOGIN_OK 0x0003
  1082 
  1083 #define GG_LOGIN_FAILED 0x0009
  1084 
  1085 #define GG_PUBDIR50_REQUEST 0x0014
  1086 
  1087 #define GG_PUBDIR50_WRITE 0x01
  1088 #define GG_PUBDIR50_READ 0x02
  1089 #define GG_PUBDIR50_SEARCH 0x03
  1090 #define GG_PUBDIR50_SEARCH_REQUEST GG_PUBDIR50_SEARCH
  1091 #define GG_PUBDIR50_SEARCH_REPLY 0x05
  1092 
  1093 struct gg_pubdir50_request {
  1094 	uint8_t type;			/* GG_PUBDIR50_* */
  1095 	uint32_t seq;			/* czas wys�ania zapytania */
  1096 } GG_PACKED;
  1097 
  1098 #define GG_PUBDIR50_REPLY 0x000e
  1099 
  1100 struct gg_pubdir50_reply {
  1101 	uint8_t type;			/* GG_PUBDIR50_* */
  1102 	uint32_t seq;			/* czas wys�ania zapytania */
  1103 } GG_PACKED;
  1104 
  1105 #define GG_NEW_STATUS 0x0002
  1106 
  1107 #define GG_STATUS_NOT_AVAIL 0x0001		/* niedost�y */
  1108 #define GG_STATUS_NOT_AVAIL_DESCR 0x0015	/* niedost�y z opisem (4.8) */
  1109 #define GG_STATUS_AVAIL 0x0002			/* dost�y */
  1110 #define GG_STATUS_AVAIL_DESCR 0x0004		/* dost�y z opisem (4.9) */
  1111 #define GG_STATUS_BUSY 0x0003			/* zaj� */
  1112 #define GG_STATUS_BUSY_DESCR 0x0005		/* zaj� z opisem (4.8) */
  1113 #define GG_STATUS_INVISIBLE 0x0014		/* niewidoczny (4.6) */
  1114 #define GG_STATUS_INVISIBLE_DESCR 0x0016	/* niewidoczny z opisem (4.9) */
  1115 #define GG_STATUS_BLOCKED 0x0006		/* zablokowany */
  1116 
  1117 #define GG_STATUS_FRIENDS_MASK 0x8000		/* tylko dla znajomych (4.6) */
  1118 
  1119 #define GG_STATUS_DESCR_MAXSIZE 70
  1120 
  1121 /*
  1122  * makra do �atwego i szybkiego sprawdzania stanu.
  1123  */
  1124 
  1125 /* GG_S_F() tryb tylko dla znajomych */
  1126 #define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0)
  1127 
  1128 /* GG_S() stan bez uwzgl�ienia trybu tylko dla znajomych */
  1129 #define GG_S(x) ((x) & ~GG_STATUS_FRIENDS_MASK)
  1130 
  1131 /* GG_S_A() dost�y */
  1132 #define GG_S_A(x) (GG_S(x) == GG_STATUS_AVAIL || GG_S(x) == GG_STATUS_AVAIL_DESCR)
  1133 
  1134 /* GG_S_NA() niedost�y */
  1135 #define GG_S_NA(x) (GG_S(x) == GG_STATUS_NOT_AVAIL || GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR)
  1136 
  1137 /* GG_S_B() zaj� */
  1138 #define GG_S_B(x) (GG_S(x) == GG_STATUS_BUSY || GG_S(x) == GG_STATUS_BUSY_DESCR)
  1139 
  1140 /* GG_S_I() niewidoczny */
  1141 #define GG_S_I(x) (GG_S(x) == GG_STATUS_INVISIBLE || GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
  1142 
  1143 /* GG_S_D() stan opisowy */
  1144 #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)
  1145 
  1146 /* GG_S_BL() blokowany lub blokuj�cy */
  1147 #define GG_S_BL(x) (GG_S(x) == GG_STATUS_BLOCKED)
  1148 
  1149 struct gg_new_status {
  1150 	uint32_t status;			/* na jaki zmieni�*/
  1151 } GG_PACKED;
  1152 
  1153 #define GG_NOTIFY_FIRST 0x000f
  1154 #define GG_NOTIFY_LAST 0x0010
  1155 
  1156 #define GG_NOTIFY 0x0010
  1157 
  1158 struct gg_notify {
  1159 	uint32_t uin;				/* numerek danej osoby */
  1160 	uint8_t dunno1;				/* rodzaj wpisu w li�cie */
  1161 } GG_PACKED;
  1162 
  1163 #define GG_USER_OFFLINE 0x01	/* b�iemy niewidoczni dla u�ytkownika */
  1164 #define GG_USER_NORMAL 0x03	/* zwyk�y u�ytkownik */
  1165 #define GG_USER_BLOCKED 0x04	/* zablokowany u�ytkownik */
  1166 
  1167 #define GG_LIST_EMPTY 0x0012
  1168 
  1169 #define GG_NOTIFY_REPLY 0x000c	/* tak, to samo co GG_LOGIN */
  1170 
  1171 struct gg_notify_reply {
  1172 	uint32_t uin;			/* numerek */
  1173 	uint32_t status;		/* status danej osoby */
  1174 	uint32_t remote_ip;		/* adres ip delikwenta */
  1175 	uint16_t remote_port;		/* port, na kt� s�ucha klient */
  1176 	uint32_t version;		/* wersja klienta */
  1177 	uint16_t dunno2;		/* znowu port? */
  1178 } GG_PACKED;
  1179 
  1180 #define GG_NOTIFY_REPLY60 0x0011
  1181 
  1182 struct gg_notify_reply60 {
  1183 	uint32_t uin;			/* numerek plus flagi w MSB */
  1184 	uint8_t status;			/* status danej osoby */
  1185 	uint32_t remote_ip;		/* adres ip delikwenta */
  1186 	uint16_t remote_port;		/* port, na kt� s�ucha klient */
  1187 	uint8_t version;		/* wersja klienta */
  1188 	uint8_t image_size;		/* maksymalny rozmiar grafiki w KiB */
  1189 	uint8_t dunno1;			/* 0x00 */
  1190 } GG_PACKED;
  1191 
  1192 #define GG_STATUS60 0x000f
  1193 
  1194 struct gg_status60 {
  1195 	uint32_t uin;			/* numerek plus flagi w MSB */
  1196 	uint8_t status;			/* status danej osoby */
  1197 	uint32_t remote_ip;		/* adres ip delikwenta */
  1198 	uint16_t remote_port;		/* port, na kt� s�ucha klient */
  1199 	uint8_t version;		/* wersja klienta */
  1200 	uint8_t image_size;		/* maksymalny rozmiar grafiki w KiB */
  1201 	uint8_t dunno1;			/* 0x00 */
  1202 } GG_PACKED;
  1203 
  1204 #define GG_ADD_NOTIFY 0x000d
  1205 #define GG_REMOVE_NOTIFY 0x000e
  1206 
  1207 struct gg_add_remove {
  1208 	uint32_t uin;			/* numerek */
  1209 	uint8_t dunno1;			/* bitmapa */
  1210 } GG_PACKED;
  1211 
  1212 #define GG_STATUS 0x0002
  1213 
  1214 struct gg_status {
  1215 	uint32_t uin;			/* numerek */
  1216 	uint32_t status;		/* nowy stan */
  1217 } GG_PACKED;
  1218 
  1219 #define GG_SEND_MSG 0x000b
  1220 
  1221 #define GG_CLASS_QUEUED 0x0001
  1222 #define GG_CLASS_OFFLINE GG_CLASS_QUEUED
  1223 #define GG_CLASS_MSG 0x0004
  1224 #define GG_CLASS_CHAT 0x0008
  1225 #define GG_CLASS_CTCP 0x0010
  1226 #define GG_CLASS_ACK 0x0020
  1227 #define GG_CLASS_EXT GG_CLASS_ACK	/* kompatybilno��stecz */
  1228 
  1229 #define GG_MSG_MAXSIZE 2000
  1230 
  1231 struct gg_send_msg {
  1232 	uint32_t recipient;
  1233 	uint32_t seq;
  1234 	uint32_t msgclass;
  1235 } GG_PACKED;
  1236 
  1237 struct gg_msg_richtext {
  1238 	uint8_t flag;
  1239 	uint16_t length;
  1240 } GG_PACKED;
  1241 
  1242 struct gg_msg_richtext_format {
  1243 	uint16_t position;
  1244 	uint8_t font;
  1245 } GG_PACKED;
  1246 
  1247 struct gg_msg_richtext_image {
  1248 	uint16_t unknown1;
  1249 	uint32_t size;
  1250 	uint32_t crc32;
  1251 } GG_PACKED;
  1252 
  1253 #define GG_FONT_BOLD 0x01
  1254 #define GG_FONT_ITALIC 0x02
  1255 #define GG_FONT_UNDERLINE 0x04
  1256 #define GG_FONT_COLOR 0x08
  1257 #define GG_FONT_IMAGE 0x80
  1258 
  1259 struct gg_msg_richtext_color {
  1260 	uint8_t red;
  1261 	uint8_t green;
  1262 	uint8_t blue;
  1263 } GG_PACKED;
  1264 
  1265 struct gg_msg_recipients {
  1266 	uint8_t flag;
  1267 	uint32_t count;
  1268 } GG_PACKED;
  1269 
  1270 struct gg_msg_image_request {
  1271 	uint8_t flag;
  1272 	uint32_t size;
  1273 	uint32_t crc32;
  1274 } GG_PACKED;
  1275 
  1276 struct gg_msg_image_reply {
  1277 	uint8_t flag;
  1278 	uint32_t size;
  1279 	uint32_t crc32;
  1280 	/* char filename[]; */
  1281 	/* char image[]; */
  1282 } GG_PACKED;
  1283 
  1284 #define GG_SEND_MSG_ACK 0x0005
  1285 
  1286 #define GG_ACK_BLOCKED 0x0001
  1287 #define GG_ACK_DELIVERED 0x0002
  1288 #define GG_ACK_QUEUED 0x0003
  1289 #define GG_ACK_MBOXFULL 0x0004
  1290 #define GG_ACK_NOT_DELIVERED 0x0006
  1291 
  1292 struct gg_send_msg_ack {
  1293 	uint32_t status;
  1294 	uint32_t recipient;
  1295 	uint32_t seq;
  1296 } GG_PACKED;
  1297 
  1298 #define GG_RECV_MSG 0x000a
  1299 
  1300 struct gg_recv_msg {
  1301 	uint32_t sender;
  1302 	uint32_t seq;
  1303 	uint32_t time;
  1304 	uint32_t msgclass;
  1305 } GG_PACKED;
  1306 
  1307 #define GG_PING 0x0008
  1308 
  1309 #define GG_PONG 0x0007
  1310 
  1311 #define GG_DISCONNECTING 0x000b
  1312 
  1313 #define GG_USERLIST_REQUEST 0x0016
  1314 
  1315 #define GG_USERLIST_PUT 0x00
  1316 #define GG_USERLIST_PUT_MORE 0x01
  1317 #define GG_USERLIST_GET 0x02
  1318 
  1319 struct gg_userlist_request {
  1320 	uint8_t type;
  1321 } GG_PACKED;
  1322 
  1323 #define GG_USERLIST_REPLY 0x0010
  1324 
  1325 #define GG_USERLIST_PUT_REPLY 0x00
  1326 #define GG_USERLIST_PUT_MORE_REPLY 0x02
  1327 #define GG_USERLIST_GET_REPLY 0x06
  1328 #define GG_USERLIST_GET_MORE_REPLY 0x04
  1329 
  1330 struct gg_userlist_reply {
  1331 	uint8_t type;
  1332 } GG_PACKED;
  1333 
  1334 /*
  1335  * pakiety, sta�e, struktury dla DCC
  1336  */
  1337 
  1338 struct gg_dcc_tiny_packet {
  1339 	uint8_t type;		/* rodzaj pakietu */
  1340 } GG_PACKED;
  1341 
  1342 struct gg_dcc_small_packet {
  1343 	uint32_t type;		/* rodzaj pakietu */
  1344 } GG_PACKED;
  1345 
  1346 struct gg_dcc_big_packet {
  1347 	uint32_t type;		/* rodzaj pakietu */
  1348 	uint32_t dunno1;		/* niewiadoma */
  1349 	uint32_t dunno2;		/* niewiadoma */
  1350 } GG_PACKED;
  1351 
  1352 /*
  1353  * p�co, nie znamy dok�adnie protoko�u. nie wiemy, co czemu odpowiada.
  1354  * nazwy s� niepowa�ne i tymczasowe.
  1355  */
  1356 #define GG_DCC_WANT_FILE 0x0003		/* peer chce plik */
  1357 #define GG_DCC_HAVE_FILE 0x0001		/* wi�mu damy */
  1358 #define GG_DCC_HAVE_FILEINFO 0x0003	/* niech ma informacje o pliku */
  1359 #define GG_DCC_GIMME_FILE 0x0006	/* peer jest pewny */
  1360 #define GG_DCC_CATCH_FILE 0x0002	/* wysy�amy plik */
  1361 
  1362 #define GG_DCC_FILEATTR_READONLY 0x0020
  1363 
  1364 #define GG_DCC_TIMEOUT_SEND 1800	/* 30 minut */
  1365 #define GG_DCC_TIMEOUT_GET 1800		/* 30 minut */
  1366 #define GG_DCC_TIMEOUT_FILE_ACK 300	/* 5 minut */
  1367 #define GG_DCC_TIMEOUT_VOICE_ACK 300	/* 5 minut */
  1368 
  1369 #ifdef __cplusplus
  1370 }
  1371 #ifdef _WIN32
  1372 #pragma pack(pop)
  1373 #endif
  1374 #endif
  1375 
  1376 #endif /* __GG_LIBGADU_H */
  1377 
  1378 /*
  1379  * Local variables:
  1380  * c-indentation-style: k&r
  1381  * c-basic-offset: 8
  1382  * indent-tabs-mode: notnil
  1383  * End:
  1384  *
  1385  * vim: shiftwidth=8:
  1386  */
  1387