libpurple/protocols/gg/lib/libgadu.h

changeset 35557
e83a87761544
parent 33285
32cbdbf016bd
child 35620
fb20cfee648a
--- a/libpurple/protocols/gg/lib/libgadu.h	Thu Feb 13 04:27:27 2014 +0100
+++ b/libpurple/protocols/gg/lib/libgadu.h	Thu Feb 13 18:29:10 2014 +0100
@@ -1,4 +1,4 @@
-/* $Id: libgadu.h.in 1105 2011-05-25 21:34:50Z wojtekka $ */
+/* $Id$ */
 
 /*
  *  (C) Copyright 2001-2009 Wojtek Kaniewski <wojtekka@irc.pl>
@@ -30,10 +30,10 @@
  * \brief Główny plik nagłówkowy biblioteki
  */
 
-#ifndef __GG_LIBGADU_H
-#define __GG_LIBGADU_H
-
-#if defined(__cplusplus) || defined(_WIN32)
+#ifndef LIBGADU_LIBGADU_H
+#define LIBGADU_LIBGADU_H
+
+#ifdef _WIN32
 #pragma pack(push, 1)
 #endif
 
@@ -53,9 +53,6 @@
 /* Defined if this machine has gethostbyname_r(). */
 #undef GG_CONFIG_HAVE_GETHOSTBYNAME_R
 
-/* Defined if this machine has _exit(). */
-#undef GG_CONFIG_HAVE__EXIT
-
 /* Defined if libgadu was compiled and linked with fork support. */
 #undef GG_CONFIG_HAVE_FORK
 
@@ -63,7 +60,7 @@
 #undef GG_CONFIG_HAVE_PTHREAD
 
 /* Defined if pthread resolver is the default one. */
-#undef GG_CONFIG_PTHREAD_DEFAULT 
+#undef GG_CONFIG_PTHREAD_DEFAULT
 
 /* Defined if this machine has C99-compiliant vsnprintf(). */
 #undef GG_CONFIG_HAVE_C99_VSNPRINTF
@@ -101,6 +98,13 @@
 /* Defined if uintX_t types are defined in <sys/types.h>. */
 #undef GG_CONFIG_HAVE_SYS_TYPES_H
 
+/* Defined if this machine has uint64_t. */
+#undef GG_CONFIG_HAVE_UINT64_T
+
+/* Defined if libgadu is GPL compliant (was not linked with OpenSSL or any
+   other non-GPL compliant library support). */
+#undef GG_CONFIG_IS_GPL_COMPLIANT
+
 #include "config.h"
 
 #ifdef GG_CONFIG_HAVE_OPENSSL
@@ -135,6 +139,15 @@
 #  endif
 #endif
 
+#ifndef GG_CONFIG_HAVE_UINT64_T
+typedef unsigned long long uint64_t;
+#endif
+
+#ifdef _MSC_VER
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif
+
 /** \endcond */
 
 /**
@@ -184,6 +197,8 @@
 
 struct gg_dcc7_relay;
 
+struct gg_session_private;
+
 /**
  * Sposób rozwiązywania nazw serwerów.
  */
@@ -192,6 +207,7 @@
 	GG_RESOLVER_FORK,		/**< Rozwiązywanie nazw bazujące na procesach */
 	GG_RESOLVER_PTHREAD,		/**< Rozwiązywanie nazw bazujące na wątkach */
 	GG_RESOLVER_CUSTOM,		/**< Funkcje rozwiązywania nazw dostarczone przed aplikację */
+	GG_RESOLVER_WIN32,		/**< Rozwiązywanie nazw bazujące na wątkach Win32 */
 	GG_RESOLVER_INVALID = -1	/**< Nieprawidłowy sposób rozwiązywania nazw (wynik \c gg_session_get_resolver) */
 } gg_resolver_t;
 
@@ -205,6 +221,25 @@
 } gg_encoding_t;
 
 /**
+ * Stopień kompatybilności ze starymi wersjami API.
+ */
+typedef enum {
+	GG_COMPAT_LEGACY = 0,	/**< Całkowita kompatybilność (nie wyłącza żadnych funkcji) */
+	GG_COMPAT_1_12_0 = 1	/**< Wyłącza: dostarczanie eventów GG_EVENT_ACK, stary format konferencji */
+} gg_compat_t;
+
+/**
+ * Flaga połączenia szyfrowanego.
+ *
+ * \ingroup login
+ */
+typedef enum {
+	GG_SSL_DISABLED = 0,	/**< Połączenie SSL wyłączone */
+	GG_SSL_ENABLED,		/**< Połączenie SSL włączone gdy dostępne. Błędny certyfikat serwera nie powoduje odrzucenia połączenia. */
+	GG_SSL_REQUIRED		/**< Połączenie SSL wymagane. Błędny certyfikat serwera powoduje odrzucenie połączenia. */
+} gg_ssl_t;
+
+/**
  * Sesja Gadu-Gadu.
  *
  * Tworzona przez funkcję \c gg_login(), zwalniana przez \c gg_free_session().
@@ -292,6 +327,19 @@
 	int protocol_features;	/**< Opcje protokołu */
 	int status_flags;	/**< Flagi statusu */
 	int recv_msg_count;	/**< Liczba odebranych wiadomości */
+
+	const char *resolver_host;		/**< Nazwa do rozwiązania */
+	struct in_addr *resolver_result;	/**< Wynik rozwiązywania nazwy */
+	unsigned int resolver_index;		/**< Indeks aktualnie obsługiwanego wyniku rozwiązywania nazwy */
+	unsigned int resolver_count;		/**< Liczba wyników rozwiązywania nazwy */
+
+	uint16_t connect_port[2];		/**< Lista portów do połączenia */
+	unsigned int connect_index;		/**< Indeks aktualnie obsługiwanego portu */
+
+	char *connect_host;			/**< Adres serwera Gadu-Gadu, z którym się łączymy */
+	gg_ssl_t ssl_flag;			/**< Flaga połączenia szyfrowanego */
+
+	struct gg_session_private *private_data;	/**< Prywatne dane sesji, nie udostępnione w API */
 };
 
 /**
@@ -552,6 +600,33 @@
 	GG_STATE_READING_RELAY,		/**< Odbieranie danych */
 
 	GG_STATE_DISCONNECTING,		/**< Oczekiwanie na potwierdzenie rozłączenia */
+
+	GG_STATE_CONNECT_HUB,		/**< Nawiązanie połączenia z hubem */
+	GG_STATE_CONNECT_PROXY_HUB,
+	GG_STATE_CONNECT_GG,		/**< Nawiązanie połączenia z serwerem */
+	GG_STATE_CONNECT_PROXY_GG,
+	GG_STATE_CONNECTING_PROXY_HUB,
+	GG_STATE_CONNECTING_PROXY_GG,
+	GG_STATE_RESOLVE_HUB_SYNC,
+	GG_STATE_RESOLVE_HUB_ASYNC,
+	GG_STATE_RESOLVE_PROXY_HUB_SYNC,
+	GG_STATE_RESOLVE_PROXY_HUB_ASYNC,
+	GG_STATE_RESOLVE_PROXY_GG_SYNC,
+	GG_STATE_RESOLVE_PROXY_GG_ASYNC,
+	GG_STATE_RESOLVE_GG_SYNC,
+	GG_STATE_RESOLVE_GG_ASYNC,
+	GG_STATE_RESOLVING_HUB,
+	GG_STATE_RESOLVING_PROXY_HUB,
+	GG_STATE_RESOLVING_PROXY_GG,
+	GG_STATE_SEND_HUB,
+	GG_STATE_SEND_PROXY_HUB,
+	GG_STATE_SEND_PROXY_GG,
+	GG_STATE_SENDING_HUB,
+	GG_STATE_SENDING_PROXY_HUB,
+	GG_STATE_SENDING_PROXY_GG,
+	GG_STATE_READING_HUB,
+	GG_STATE_READING_PROXY_HUB,
+	GG_STATE_READING_PROXY_GG,
 };
 
 /**
@@ -567,15 +642,100 @@
 };
 
 /**
- * Flaga połączenia szyfrowanego.
+ * Metody nawiązywania połączeń TCP/TLS.
  *
- * \ingroup login
+ * \ingroup socketmanager
  */
 typedef enum {
-	GG_SSL_DISABLED = 0,	/**< Połączenie SSL wyłączone */
-	GG_SSL_ENABLED,		/**< Połączenie SSL włączone gdy dostępne */
-	GG_SSL_REQUIRED		/**< Połączenie SSL wymagane */
-} gg_ssl_t;
+	GG_SOCKET_MANAGER_TYPE_INTERNAL = 0, /**< Wewnętrzna obsługa gniazd (domyślne). */
+	GG_SOCKET_MANAGER_TYPE_TCP, /**< Dostarczona przez aplikację - tylko obsługa TCP. */
+	GG_SOCKET_MANAGER_TYPE_TLS /**< Dostarczona przez aplikację - obsługa zarówno TCP, jak i TLS. */
+} gg_socket_manager_type_t;
+
+/**
+ * Funkcja dostarczona przez aplikację, tworząca nowe gniazdo TCP/TLS.
+ *
+ * Po nawiązaniu połączenia aplikacja musi wywołać gg_socket_manager_connected.
+ * Jeżeli połączenie jest asynchroniczne, wywołanie musi nastąpić po wyjściu z
+ * kontekstu tej funkcji. Dla połączeń synchronicznych z kolei, musi nastąpić
+ * jeszcze przed wyjściem z kontekstu.
+ *
+ * \param cb_data Dane prywatne aplikacji
+ * \param host Nazwa hosta
+ * \param port Numer portu
+ * \param is_tls Flaga określająca, czy ma zostać nawiązane połączenie TLS
+ * \param is_async Flaga określająca połączenie asynchroniczne (patrz szczegóły powyżej)
+ * \param priv Dane prywatne biblioteki libgadu (do przekazania do gg_socket_manager_connected)
+ *
+ * \return Uchwyt gniazda
+ *
+ * \ingroup socketmanager
+ */
+typedef void* (*gg_socket_manager_connect_cb_t)(void *cb_data, const char *host, int port, int is_tls, int is_async, void *priv);
+
+/**
+ * Niszczy gniazdo i zwalnia wszystkie powiązane z nim zasoby.
+ *
+ * \param cb_data Dane prywatne aplikacji
+ * \param handle Uchwyt gniazda
+ *
+ * \ingroup socketmanager
+ */
+typedef void (*gg_socket_manager_close_cb_t)(void *cb_data, void *handle);
+
+/**
+ * Odbiera z gniazda dane binarne.
+ *
+ * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
+ *
+ * \param cb_data Dane prywatne aplikacji
+ * \param handle Uchwyt gniazda
+ * \param buffer Bufor do zapisu danych
+ * \param bufsize Rozmiar bufora
+ *
+ * \return Ilość zapisanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
+ *
+ * \ingroup socketmanager
+ */
+typedef ssize_t (*gg_socket_manager_read_cb_t)(void *cb_data, void *handle, unsigned char *buffer, size_t bufsize);
+
+/**
+ * Wysyła przez gniazdo dane binarne.
+ *
+ * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
+ *
+ * \param cb_data Dane prywatne aplikacji
+ * \param handle Uchwyt gniazda
+ * \param data Dane do wysłania
+ * \param length Rozmiar danych
+ *
+ * \return Ilość wysłanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
+ *
+ * \ingroup socketmanager
+ */
+typedef ssize_t (*gg_socket_manager_write_cb_t)(void *cb_data, void *handle, const unsigned char *data, size_t length);
+
+/**
+ * Struktura opisująca funkcje zarządzające gniazdami, jeżeli aplikacja sama je
+ * obsługuje.
+ *
+ * \ingroup socketmanager
+ */
+typedef struct {
+	void *cb_data; /**< Dane prywatne aplikacji */
+	gg_socket_manager_connect_cb_t connect_cb; /**< Funkcja tworząca nowe gniazdo */
+	gg_socket_manager_close_cb_t close_cb; /**< Funkcja niszcząca gniazdo */
+	gg_socket_manager_read_cb_t read_cb; /**< Funkcja odczytująca dane z gniazda */
+	gg_socket_manager_write_cb_t write_cb; /**< Funkcja wysyłająca dane przez gniazdo */
+#ifndef DOXYGEN
+	void *reserved1;
+	void *reserved2;
+	void *reserved3;
+	void *reserved4;
+#endif
+} gg_socket_manager_t;
+
+int gg_socket_manager_connected(void *handle, void *priv, int fd);
 
 /**
  * Parametry połączenia z serwerem Gadu-Gadu. Parametry zostały przeniesione
@@ -612,14 +772,21 @@
 	int protocol_features;		/**< Opcje protokołu (flagi GG_FEATURE_*). */
 	int status_flags;		/**< Flagi statusu (flagi GG_STATUS_FLAG_*, patrz \ref status). */
 
-#ifndef DOXYGEN
-	char dummy[1 * sizeof(int)];	/**< \internal Miejsce na kilka kolejnych
-					  parametrów, żeby wraz z dodawaniem kolejnych
-					  parametrów nie zmieniał się rozmiar struktury */
+	unsigned int struct_size;	/**< Rozmiar struktury. To pole powinno być inicjowane wartością sizeof(struct gg_login_params) - w przeciwnym przypadku pola za nim nie będą obsługiwane. Pozwala na rozszerzanie struktury bez łamania ABI. */
+
+	gg_compat_t compatibility;	/**< Stopień kompatybilności ze starym API. */
+
+	char *connect_host;		/**< Nazwa hosta (oraz opcjonalnie port, podany po dwukropku) serwera Gadu-Gadu (domyślnie pobierany automatycznie) (patrz pole struct_size). */
+
+	gg_socket_manager_type_t socket_manager_type; /**< Wybrana metoda nawiązywania połączeń TCP/TLS (domyślnie wewnętrzna) */
+	gg_socket_manager_t socket_manager; /**< Jeżeli wybrano metodę zewnętrzną - konfiguracja jej */
+
+	char **host_white_list;		/**< Lista zakończona wskaźnikiem NULL, domen akceptowanych w odpowiedziach od huba (domyślnie wszystkie do tej pory znane). Używane tylko przy GG_SSL_REQUIRED. Pusta lista wyłącza sprawdzanie. */
+};
+
+#ifdef GG_CONFIG_IS_GPL_COMPLIANT
+int gg_is_gpl_compliant(void);
 #endif
-
-};
-
 struct gg_session *gg_login(const struct gg_login_params *p);
 void gg_free_session(struct gg_session *sess);
 void gg_logoff(struct gg_session *sess);
@@ -629,8 +796,10 @@
 int gg_change_status_flags(struct gg_session *sess, int flags);
 int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message);
 int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen);
+int gg_send_message_html(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *html_message);
 int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message);
 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);
+int gg_send_message_confer_html(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *html_message);
 int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len);
 int gg_ping(struct gg_session *sess);
 int gg_userlist_request(struct gg_session *sess, char type, const char *request);
@@ -655,6 +824,11 @@
 
 int gg_multilogon_disconnect(struct gg_session *gs, gg_multilogon_id_t conn_id);
 
+int gg_chat_create(struct gg_session *gs);
+int gg_chat_invite(struct gg_session *gs, uint64_t id, uin_t *participants, unsigned int participants_count);
+int gg_chat_leave(struct gg_session *gs, uint64_t id);
+int gg_chat_send_message(struct gg_session *gs, uint64_t id, const char *message, int is_html);
+
 /**
  * Rodzaj zdarzenia.
  *
@@ -710,6 +884,17 @@
 
 	GG_EVENT_USERLIST100_VERSION,	/**< Otrzymano numer wersji listy kontaktów na serwerze (10.0) */
 	GG_EVENT_USERLIST100_REPLY,	/**< Wynik importu lub eksportu listy kontaktów (10.0) */
+
+	GG_EVENT_IMTOKEN,		/**< Otrzymano ciąg IMTOKEN (11.0) */
+	GG_EVENT_PONG110,		/**< \brief Utrzymanie połączenia (11.0). Może służyć do synchronizacji czasu z serwerem. */
+	GG_EVENT_JSON_EVENT,		/**< Otrzymano komunikat systemowy (11.0) */
+	GG_EVENT_ACK110,		/**< Potwierdzenie wysłania wiadomości (11.0) */
+
+	GG_EVENT_CHAT_INFO,		/**< Otrzymano informację o konferencji (11.0). */
+	GG_EVENT_CHAT_INFO_GOT_ALL,	/**< \brief Informacje o wszystkich konferencjach zostały już wysłane (11.0). Otrzymywany po ostatnim pakiecie \c GG_EVENT_CHAT_INFO */
+	GG_EVENT_CHAT_INFO_UPDATE,	/**< \brief Aktualizacja informacji o konferencji (11.0). Dodanie, usunięcie jednego z uczestników. */
+	GG_EVENT_CHAT_CREATED,		/**< Potwierdzenie utworzenia konferencji (11.0) */
+	GG_EVENT_CHAT_INVITE_ACK,	/**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) */
 };
 
 #define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY
@@ -731,6 +916,7 @@
 	GG_FAILURE_UNAVAILABLE,		/**< Serwery są wyłączone */
 	GG_FAILURE_PROXY,		/**< Błąd serwera pośredniczącego */
 	GG_FAILURE_HUB,			/**< Błąd połączenia z hubem */
+	GG_FAILURE_INTERNAL,		/**< Błąd wewnętrzny */
 };
 
 /**
@@ -797,7 +983,11 @@
 struct gg_event_msg {
 	uin_t sender;		/**< Numer nadawcy/odbiorcy */
 	int msgclass;		/**< Klasa wiadomości */
+#ifndef _WIN32
 	time_t time;		/**< Czas nadania */
+#else
+	uint32_t time;		/**< Czas nadania */
+#endif
 	unsigned char *message;	/**< Treść wiadomości */
 
 	int recipients_count;	/**< Liczba odbiorców konferencji */
@@ -807,7 +997,10 @@
 	void *formats;		/**< Informacje o formatowaniu tekstu */
 	uint32_t seq;		/**< Numer sekwencyjny wiadomości */
 
-	char *xhtml_message;	/**< Treść wiadomości w formacie XHTML (może być równe \c NULL, jeśli wiadomość nie zawiera treści XHTML) */
+	char *xhtml_message;	/**< Treść wiadomości w formacie XHTML */
+
+	uint64_t chat_id;	/**< Identyfikator konferencji lub 0, jeżeli jest to zwykła wiadomość (11.0) */
+	uint64_t flags;		/**< Flagi wiadomości (11.0) */
 };
 
 /**
@@ -838,7 +1031,11 @@
 	int version;		/**< Wersja protokołu */
 	int image_size;		/**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
 	char *descr;		/**< Opis statusu */
+#ifndef _WIN32
 	time_t time;		/**< Czas powrotu */
+#else
+	uint32_t time;		/**< Czas powrotu */
+#endif
 };
 
 /**
@@ -852,7 +1049,11 @@
 	int version;		/**< Wersja protokołu */
 	int image_size;		/**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
 	char *descr;		/**< Opis statusu */
+#ifndef _WIN32
 	time_t time;		/**< Czas powrotu */
+#else
+	uint32_t time;		/**< Czas powrotu */
+#endif
 };
 
 /**
@@ -865,6 +1066,15 @@
 };
 
 /**
+ * Opis zdarzenia \c GG_EVENT_ACK110.
+ */
+struct gg_event_ack110 {
+	uint8_t msg_type;	/**< Rodzaj wiadomości (0x01 - zwykła, 0x02 - konferencja) */
+	uint32_t seq;		/**< Numer sekwencyjny */
+	uint32_t time;		/**< Czas zdarzenia */
+};
+
+/**
  * Opis zdarzenia \c GG_EVENT_USERLIST.
  */
 struct gg_event_userlist {
@@ -908,6 +1118,14 @@
 };
 
 /**
+ * Opis zdarzenia \c GG_EVENT_JSON_EVENT.
+ */
+struct gg_event_json_event {
+	char *data;		/**< Bufor z komunikatem */
+	char *type;		/**< Bufor z typem komunikatu */
+};
+
+/**
  * Opis zdarzenia \c GG_EVENT_DCC7_CONNECTED.
  */
 struct gg_event_dcc7_connected {
@@ -990,7 +1208,11 @@
 	uint32_t remote_addr;		/**< Adres sesji */
 	int status_flags;		/**< Flagi statusu sesji */
 	int protocol_features;		/**< Opcje protokolu sesji */
+#ifndef _WIN32
 	time_t logon_time;		/**< Czas zalogowania */
+#else
+	uint32_t logon_time;		/**< Czas zalogowania */
+#endif
 };
 
 /**
@@ -1019,6 +1241,62 @@
 };
 
 /**
+ * Opis zdarzenia \c GG_EVENT_IMTOKEN.
+ */
+struct gg_event_imtoken {
+	char *imtoken;			/**< Wartość IMTOKEN */
+};
+
+/**
+ * Opis zdarzenia \c GG_EVENT_PONG110.
+ */
+struct gg_event_pong110 {
+#ifndef _WIN32
+	time_t time;			/**< Aktualny czas na serwerze */
+#else
+	uint32_t time;			/**< Aktualny czas na serwerze */
+#endif
+};
+
+/**
+ * Opis zdarzenia \c GG_EVENT_CHAT_INFO.
+ */
+struct gg_event_chat_info {
+	uint64_t id;			/**< Identyfikator konferencji */
+	uint32_t version;		/**< Wersja informacji o konferencji */
+	uint32_t participants_count;	/**< Ilość uczestników */
+	uin_t *participants;		/**< Lista uczestników */
+};
+
+/**
+ * Opis zdarzenia \c GG_EVENT_CHAT_INFO_UPDATE.
+ */
+struct gg_event_chat_info_update {
+	uint64_t id;			/**< Identyfikator konferencji */
+	uint32_t type;			/**< Typ aktualizacji (\c GG_CHAT_INFO_UPDATE_*) */
+	uin_t participant;		/**< Uczestnik, którego dotyczy aktualizacja */
+	uin_t inviter;			/**< Uczestnik inicjujący aktualizację (zapraszający) */
+	uint32_t version;		/**< Wersja informacji o konferencji */
+	uint32_t time;			/**< Czas zdarzenia */
+};
+
+/**
+ * Opis zdarzenia \c GG_EVENT_CHAT_CREATED.
+ */
+struct gg_event_chat_created {
+	uint64_t id;			/**< Identyfikator konferencji */
+	uint32_t seq;			/**< Numer sekwencyjny */
+};
+
+/**
+ * Opis zdarzenia \c GG_EVENT_CHAT_INVITE_ACK.
+ */
+struct gg_event_chat_invite_ack {
+	uint64_t id;			/**< Identyfikator konferencji */
+	uint32_t seq;			/**< Numer sekwencyjny */
+};
+
+/**
  * Unia wszystkich zdarzeń zwracanych przez funkcje \c gg_watch_fd(), 
  * \c gg_dcc_watch_fd() i \c gg_dcc7_watch_fd().
  *
@@ -1033,11 +1311,13 @@
 	struct gg_event_notify60 *notify60;	/**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY60) */
 	struct gg_event_msg msg;	/**< Otrzymano wiadomość (\c GG_EVENT_MSG) */
 	struct gg_event_ack ack;	/**< Potwierdzenie wiadomości (\c GG_EVENT_ACK) */
+	struct gg_event_ack110 ack110;	/**< Potwierdzenie wysłania wiadomości (11.0) (\c GG_EVENT_ACK110) */
 	struct gg_event_image_request image_request;	/**< Żądanie wysłania obrazka (\c GG_EVENT_IMAGE_REQUEST) */
 	struct gg_event_image_reply image_reply;	/**< Odpowiedź z obrazkiem (\c GG_EVENT_IMAGE_REPLY) */
 	struct gg_event_userlist userlist;	/**< Odpowiedź listy kontaktów (\c GG_EVENT_USERLIST) */
 	gg_pubdir50_t pubdir50;	/**< Odpowiedź katalogu publicznego (\c GG_EVENT_PUBDIR50_*) */
 	struct gg_event_xml_event xml_event;	/**< Zdarzenie systemowe (\c GG_EVENT_XML_EVENT) */
+	struct gg_event_json_event json_event;	/**< Zdarzenie systemowe (\c GG_EVENT_JSON_EVENT) */
 	struct gg_dcc *dcc_new;	/**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC_NEW) */
 	enum gg_error_t dcc_error;	/**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC_ERROR) */
 	struct gg_event_dcc_voice_data dcc_voice_data;	/**< Dane połączenia głosowego (\c GG_EVENT_DCC_VOICE_DATA) */
@@ -1054,6 +1334,12 @@
 	struct gg_event_multilogon_info multilogon_info;	/**< Informacja o innych sesjach multilogowania (\c GG_EVENT_MULTILOGON_INFO) */
 	struct gg_event_userlist100_version userlist100_version;	/**< Informacja o numerze wersji listy kontaktów na serwerze (\c GG_EVENT_USERLIST100_VERSION) */
 	struct gg_event_userlist100_reply userlist100_reply;	/**< Odpowiedź listy kontaktów (10.0) (\c GG_EVENT_USERLIST100_REPLY) */
+	struct gg_event_imtoken imtoken;	/**< Ciąg IMTOKEN (11.0) (\c GG_EVENT_IMTOKEN) */
+	struct gg_event_pong110 pong110;	/**< Utrzymanie połączenia (11.0) (\c GG_EVENT_PONG110) */
+	struct gg_event_chat_info chat_info;	/**< Informacje o konferencji (11.0) (\c GG_EVENT_CHAT_INFO) */
+	struct gg_event_chat_info_update chat_info_update;	/**< Aktualizacja informacji o konferencji (11.0) (\c GG_EVENT_CHAT_INFO_UPDATE) */
+	struct gg_event_chat_created chat_created;	/**< Potwierdzenie utworzenia konferencji (11.0) (\c GG_EVENT_CHAT_CREATED) */
+	struct gg_event_chat_invite_ack chat_invite_ack;	/**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) (\c GG_EVENT_CHAT_INVITE_ACK) */
 };
 
 /**
@@ -1170,6 +1456,19 @@
 #endif	/* DOXYGEN */
 
 /**
+ * Powód błędu operacji na katalogu publicznym.
+ *
+ * \ingroup http
+ */
+typedef enum {
+	GG_PUBDIR_ERROR_NONE = 0,	/**< Brak błędu */
+	GG_PUBDIR_ERROR_OTHER,	/**< Nieznany błąd */
+	GG_PUBDIR_ERROR_TOKEN,	/**< Błędny token */
+	GG_PUBDIR_ERROR_OLD_PASSWORD,	/**< Niepoprawne stare hasło */
+	GG_PUBDIR_ERROR_NEW_PASSWORD,	/**< Niepoprawne nowe hasło */
+} gg_pubdir_error_t;
+
+/**
  * Wynik operacji na katalogu publicznym.
  *
  * \ingroup http
@@ -1177,6 +1476,7 @@
 struct gg_pubdir {
 	int success;		/**< Flaga powodzenia operacji */
 	uin_t uin;		/**< Otrzymany numer lub 0 w przypadku błędu */
+	gg_pubdir_error_t error;	/**< Powód błędu */
 };
 
 int gg_pubdir_watch_fd(struct gg_http *f);
@@ -1271,11 +1571,17 @@
 #define GG_DEBUG_DUMP 4		/**< Rejestracja zawartości pakietów */
 #define GG_DEBUG_FUNCTION 8	/**< Rejestracja wywołań funkcji */
 #define GG_DEBUG_MISC 16	/**< Rejestracja różnych informacji */
+#define GG_DEBUG_VERBOSE 32	/**< Rejestracja informacji szczegółowych */
+#define GG_DEBUG_WARNING 64	/**< Rejestracja ostrzeżeń */
+#define GG_DEBUG_ERROR 128	/**< Rejestracja błędów krytycznych */
 /** @} */
 
+const char *gg_debug_state(enum gg_state_t state);
+const char *gg_debug_event(enum gg_event_t event);
+
 #ifdef GG_DEBUG_DISABLE
-#define gg_debug(x, y...) do { } while(0)
-#define gg_debug_session(z, x, y...) do { } while(0)
+#define gg_debug(...) do { } while (0)
+#define gg_debug_session(...) do { } while (0)
 #else
 void gg_debug(int level, const char *format, ...);
 void gg_debug_session(struct gg_session *sess, int level, const char *format, ...);
@@ -1483,6 +1789,8 @@
 	uint32_t done;			/**< Rozmiar odebranych danych */
 
 	struct gg_image_queue *next;	/**< Kolejny element listy */
+
+	uint32_t packet_type;		/**< \brief Rodzaj odbieranych pakietów. W niektórych przypadkach (przy multilogowaniu) serwer wysyła nam dwie kopie obrazka jako dwa różne typy pakietów */
 } GG_DEPRECATED;
 
 int gg_dcc7_handle_id(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
@@ -1506,8 +1814,13 @@
 #define GG_HTTPS_PORT 443
 #define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
 
+#define GG_PROTOCOL_VERSION_100 0x2e
+#define GG_PROTOCOL_VERSION_110 0x40
+
+/* GG_DEPRECATED */
 #define GG_DEFAULT_CLIENT_VERSION "10.1.0.11070"
-#define GG_DEFAULT_PROTOCOL_VERSION 0x2e
+
+#define GG_DEFAULT_PROTOCOL_VERSION GG_PROTOCOL_VERSION_110
 #define GG_DEFAULT_TIMEOUT 30
 #define GG_HAS_AUDIO_MASK 0x40000000
 #define GG_HAS_AUDIO7_MASK 0x20000000
@@ -1663,12 +1976,17 @@
 #define GG_STATUS_INVISIBLE_DESCR 0x0016
 #define GG_STATUS_BLOCKED 0x0006
 
+#define GG_STATUS_GGPLUS 0x0020
+#define GG_STATUS_NOT_SET 0x0023
+#define GG_STATUS_UNKNOWN 0x0025
+
 #define GG_STATUS_IMAGE_MASK 0x0100
 #define GG_STATUS_DESCR_MASK 0x4000
 #define GG_STATUS_FRIENDS_MASK 0x8000
 
 #define GG_STATUS_FLAG_UNKNOWN 0x00000001
 #define GG_STATUS_FLAG_VIDEO 0x00000002
+#define GG_STATUS_FLAG_INHERIT 0x00000020
 #define GG_STATUS_FLAG_MOBILE 0x00100000
 #define GG_STATUS_FLAG_SPAM 0x00800000
 
@@ -1693,6 +2011,8 @@
 	GG_STATUS_INVISIBLE,		/**< Niewidoczny (tylko własny status) */
 	GG_STATUS_INVISIBLE_DESCR,	/**< Niewidoczny z opisem (tylko własny status) */
 	GG_STATUS_BLOCKED,		/**< Zablokowany (tylko status innych) */
+	GG_STATUS_GGPLUS,		/**< Status "Korzystam z GG Plus" */
+	GG_STATUS_NOT_SET,		/**< Status nie ustawiony (przy logowaniu się do sieci) */
 	GG_STATUS_IMAGE_MASK,		/**< Flaga bitowa oznaczająca opis graficzny (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
 	GG_STATUS_DESCR_MASK,		/**< Flaga bitowa oznaczająca status z opisem (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
 	GG_STATUS_FRIENDS_MASK,		/**< Flaga bitowa dostępności tylko dla znajomych */
@@ -1706,6 +2026,7 @@
 enum {
 	GG_STATUS_FLAG_UNKNOWN,		/**< Przeznaczenie nieznane, ale występuje zawsze */
 	GG_STATUS_FLAG_VIDEO,		/**< Klient obsługuje wideorozmowy */
+	GG_STATUS_FLAG_INHERIT,		/**< Synchronizacja statusu do innych klientów (przy logowaniu się do sieci) */
 	GG_STATUS_FLAG_MOBILE,		/**< Klient mobilny (ikona telefonu komórkowego) */
 	GG_STATUS_FLAG_SPAM,		/**< Klient chce otrzymywać linki od nieznajomych */
 };
@@ -2165,6 +2486,7 @@
 #ifndef DOXYGEN
 
 #define GG_USERLIST100_REPLY_LIST 0x00
+#define GG_USERLIST100_REPLY_UPTODATE 0x01
 #define GG_USERLIST100_REPLY_ACK 0x10
 #define GG_USERLIST100_REPLY_REJECT 0x12
 
@@ -2177,6 +2499,7 @@
  */
 enum {
 	GG_USERLIST100_REPLY_LIST,	/**< W odpowiedzi znajduje się aktualna lista kontaktów na serwerze. */
+	GG_USERLIST100_REPLY_UPTODATE,	/**< Komunikat o tym, że lista kontaktów jest już zsynchronizowana. */
 	GG_USERLIST100_REPLY_ACK,	/**< Potwierdzenie odebrania nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer nowej wersji listy kontaktów. */
 	GG_USERLIST100_REPLY_REJECT,	/**< Odmowa przyjęcia nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer wersji listy kontaktów aktualnie przechowywanej przez serwer. */
 };
@@ -2246,7 +2569,7 @@
 	uint32_t dunno1;		/* 0x00000000 */
 } GG_PACKED;
 
-// XXX API
+/* XXX API */
 #define GG_DCC7_TYPE_P2P 0x00000001	/**< Połączenie bezpośrednie */
 #define GG_DCC7_TYPE_SERVER 0x00000002	/**< Połączenie przez serwer */
 
@@ -2258,7 +2581,7 @@
 	uint32_t reason;		/**< Powód rozłączenia */
 } GG_PACKED;
 
-// XXX API
+/* XXX API */
 #define GG_DCC7_REJECT_BUSY 0x00000001	/**< Połączenie bezpośrednie już trwa, nie umiem obsłużyć więcej */
 #define GG_DCC7_REJECT_USER 0x00000002	/**< Użytkownik odrzucił połączenie */
 #define GG_DCC7_REJECT_VERSION 0x00000006	/**< Druga strona ma wersję klienta nieobsługującą połączeń bezpośrednich tego typu */
@@ -2269,7 +2592,7 @@
 	uint32_t type;			/**< Rodzaj tranmisji */
 } GG_PACKED;
 
-// XXX API
+/* XXX API */
 #define GG_DCC7_TYPE_VOICE 0x00000001	/**< Transmisja głosu */
 #define GG_DCC7_TYPE_FILE 0x00000004	/**< transmisja pliku */
 
@@ -2282,25 +2605,24 @@
 
 #define GG_DCC7_DUNNO1 0x24
 
-struct gg_dcc7_dunno1 {
-	// XXX
-} GG_PACKED;
-
 #define GG_DCC7_TIMEOUT_CONNECT 10	/* 10 sekund */
 #define GG_DCC7_TIMEOUT_SEND 1800	/* 30 minut */
 #define GG_DCC7_TIMEOUT_GET 1800	/* 30 minut */
 #define GG_DCC7_TIMEOUT_FILE_ACK 300	/* 5 minut */
 #define GG_DCC7_TIMEOUT_VOICE_ACK 300	/* 5 minut */
 
+#define GG_CHAT_INFO_UPDATE_ENTERED 0x01
+#define GG_CHAT_INFO_UPDATE_EXITED 0x03
+
 #ifdef __cplusplus
 }
 #endif
 
-#if defined(__cplusplus) || defined(_WIN32)
+#ifdef _WIN32
 #pragma pack(pop)
 #endif
 
-#endif /* __GG_LIBGADU_H */
+#endif /* LIBGADU_LIBGADU_H */
 
 /*
  * Local variables:

mercurial