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