changeset 2806:1ffac7cf4e94

[gaim-migrate @ 2819] thanks Arkadiusz Miskiewicz: Here is patch that adds ,,delete userlist from server'', updates protocol.txt and makes small cleanup with freeing webdata + with function names (all agg_ names are reserved for struct prpl functions ;) committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 27 Nov 2001 22:54:32 +0000
parents 9b3c7d2a6e9a
children f01e6a425136
files src/protocols/gg/gg.c src/protocols/gg/protocol.txt
diffstat 2 files changed, 151 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/protocols/gg/gg.c	Tue Nov 27 22:46:03 2001 +0000
+++ b/src/protocols/gg/gg.c	Tue Nov 27 22:54:32 2001 +0000
@@ -1,6 +1,6 @@
 /*
  * gaim - Gadu-Gadu Protocol Plugin
- * $Id: gg.c 2805 2001-11-26 21:22:56Z warmenhoven $
+ * $Id: gg.c 2819 2001-11-27 22:54:32Z warmenhoven $
  *
  * Copyright (C) 2001 Arkadiusz Mi�kiewicz <misiek@pld.ORG.PL>
  * 
@@ -79,6 +79,7 @@
 #define AGG_HTTP_SEARCH			1
 #define AGG_HTTP_USERLIST_IMPORT	2
 #define AGG_HTTP_USERLIST_EXPORT	3
+#define AGG_HTTP_USERLIST_DELETE	4
 
 #define UC_NORMAL 2
 
@@ -578,7 +579,6 @@
 	gd->sess->state = GG_STATE_CONNECTING_HTTP;
 	gd->sess->check = GG_CHECK_WRITE;
 	gd->sess->async = 1;
-	gd->sess->recv_left = 0;
 	gd->sess->fd = proxy_connect(GG_APPMSG_HOST, GG_APPMSG_PORT, login_callback, gc);
 
 	if (gd->sess->fd < 0) {
@@ -667,7 +667,6 @@
 
 	if ((ptr = strstr(webdata, "query_results:")) == NULL || (ptr = strchr(ptr, '\n')) == NULL) {
 		debug_printf("search_callback: pubdir result [%s]\n", webdata);
-		g_free(webdata);
 		do_error_dialog(_("Couldn't get search results"), _("Gadu-Gadu Error"));
 		return;
 	}
@@ -677,8 +676,6 @@
 
 	webdata_tbl = g_strsplit(ptr, "\n", AGG_PUBDIR_MAX_ENTRIES);
 
-	g_free(webdata);
-
 	j = 0;
 
 	/* Parse array */
@@ -768,28 +765,25 @@
 	g_free(buf);
 }
 
-static void agg_import_buddies_results(struct gaim_connection *gc, gchar *webdata)
+static void import_buddies_server_results(struct gaim_connection *gc, gchar *webdata)
 {
 	gchar *ptr;
 	gchar **users_tbl;
 	int i;
 	if (strstr(webdata, "no_data:")) {
-		g_free(webdata);
 		do_error_dialog(_("There is no Buddy List stored on server. Sorry!"),
 				_("Gadu-Gadu Error"));
 		return;
 	}
 
 	if ((ptr = strstr(webdata, "get_results:")) == NULL || (ptr = strchr(ptr, ':')) == NULL) {
-		debug_printf("agg_import_buddies_list: import buddies result [%s]\n", webdata);
-		g_free(webdata);
+		debug_printf("import_buddies_server_results: import buddies result [%s]\n", webdata);
 		do_error_dialog(_("Couldn't Import Buddies List from Server"), _("Gadu-Gadu Error"));
 		return;
 	}
 	ptr++;
 
 	users_tbl = g_strsplit(ptr, "\n", AGG_PUBDIR_MAX_ENTRIES);
-	g_free(webdata);
 
 	/* Parse array of Buddies List */
 	for (i = 0; users_tbl[i] != NULL; i++) {
@@ -806,7 +800,7 @@
 			continue;
 		}
 
-		debug_printf("uin: %s\n", name);
+		debug_printf("import_buddies_server_results: uin: %s\n", name);
 		if (!find_buddy(gc, name)) {
 			/* Default group if none specified on server */
 			gchar *group = g_strdup("Gadu-Gadu");
@@ -828,20 +822,30 @@
 	g_strfreev(users_tbl);
 }
 
-static void agg_export_buddies_results(struct gaim_connection *gc, gchar *webdata)
+static void export_buddies_server_results(struct gaim_connection *gc, gchar *webdata)
 {
 	if (strstr(webdata, "put_success:")) {
-		g_free(webdata);
 		do_error_dialog(_("Buddies List sucessfully transfered into Server"),
 				_("Gadu-Gadu Information"));
 		return;
 	}
 
-	debug_printf("agg_export_buddies_results: webdata [%s]\n", webdata);
-	g_free(webdata);
+	debug_printf("export_buddies_server_results: webdata [%s]\n", webdata);
 	do_error_dialog(_("Couldn't transfer Buddies List into Server"), _("Gadu-Gadu Error"));
 }
 
+static void delete_buddies_server_results(struct gaim_connection *gc, gchar *webdata)
+{
+	if (strstr(webdata, "put_success:")) {
+		do_error_dialog(_("Buddies List sucessfully deleted from Server"),
+				_("Gadu-Gadu Information"));
+		return;
+	}
+
+	debug_printf("delete_buddies_server_results: webdata [%s]\n", webdata);
+	do_error_dialog(_("Couldn't delete Buddies List from Server"), _("Gadu-Gadu Error"));
+}
+
 static void http_results(gpointer data, gint source, GaimInputCondition cond)
 {
 	struct agg_http *hdata = data;
@@ -890,10 +894,13 @@
 		search_results(gc, webdata);
 		break;
 	case AGG_HTTP_USERLIST_IMPORT:
-		agg_import_buddies_results(gc, webdata);
+		import_buddies_server_results(gc, webdata);
 		break;
 	case AGG_HTTP_USERLIST_EXPORT:
-		agg_export_buddies_results(gc, webdata);
+		export_buddies_server_results(gc, webdata);
+		break;
+	case AGG_HTTP_USERLIST_DELETE:
+	        delete_buddies_server_results(gc, webdata);
 		break;
 	case AGG_HTTP_NONE:
 	default:
@@ -901,6 +908,7 @@
 		break;
 	}
 
+	g_free(webdata);
 	g_free(hdata);
 }
 
@@ -956,7 +964,7 @@
 	hdata->inpa = gaim_input_add(source, GAIM_INPUT_READ, http_results, hdata);
 }
 
-static void agg_import_buddies(struct gaim_connection *gc)
+static void import_buddies_server(struct gaim_connection *gc)
 {
 	struct agg_http *hi = g_new0(struct agg_http, 1);
 	static char msg[AGG_BUF_LEN];
@@ -977,7 +985,7 @@
 	}
 }
 
-static void agg_export_buddies(struct gaim_connection *gc)
+static void export_buddies_server(struct gaim_connection *gc)
 {
 	struct agg_http *he = g_new0(struct agg_http, 1);
 	static char msg[AGG_BUF_LEN];
@@ -1023,6 +1031,27 @@
 	}
 }
 
+static void delete_buddies_server(struct gaim_connection *gc)
+{
+	struct agg_http *he = g_new0(struct agg_http, 1);
+	static char msg[AGG_BUF_LEN];
+
+	he->gc = gc;
+	he->type = AGG_HTTP_USERLIST_DELETE;
+	he->form = AGG_PUBDIR_USERLIST_EXPORT_FORM;
+	he->host = GG_PUBDIR_HOST;
+	he->request = g_strdup_printf("FmNum=%s&Pass=%s&Delete=1", gc->username, gc->password);
+
+	if (proxy_connect(GG_PUBDIR_HOST, GG_PUBDIR_PORT, http_req_callback, he) < 0) {
+		g_snprintf(msg, sizeof(msg), _("Deletion of Buddies List from Server failed (%s)"),
+			   GG_PUBDIR_HOST);
+		do_error_dialog(msg, _("Gadu-Gadu Error"));
+		g_free(he->request);
+		g_free(he);
+		return;
+	}
+}
+
 static void agg_dir_search(struct gaim_connection *gc, char *first, char *middle,
 			   char *last, char *maiden, char *city, char *state, char *country, char *email)
 {
@@ -1066,9 +1095,11 @@
 	if (!strcmp(action, _("Directory Search"))) {
 		show_find_info(gc);
 	} else if (!strcmp(action, _("Import Buddies List from Server"))) {
-		agg_import_buddies(gc);
+		import_buddies_server(gc);
 	} else if (!strcmp(action, _("Export Buddies List to Server"))) {
-		agg_export_buddies(gc);
+		export_buddies_server(gc);
+	} else if (!strcmp(action, _("Delete Buddies List from Server"))) {
+	        delete_buddies_server(gc);
 	}
 }
 
@@ -1079,6 +1110,7 @@
 	m = g_list_append(m, _("Directory Search"));
 	m = g_list_append(m, _("Import Buddies List from Server"));
 	m = g_list_append(m, _("Export Buddies List to Server"));
+	m = g_list_append(m, _("Delete Buddies List from Server"));
 
 	return m;
 }
--- a/src/protocols/gg/protocol.txt	Tue Nov 27 22:46:03 2001 +0000
+++ b/src/protocols/gg/protocol.txt	Tue Nov 27 22:54:32 2001 +0000
@@ -1,12 +1,20 @@
 ---------------------------------------------------------------------------
 
-                         protok鶻 g*du-g*du 4.x
-        (c) copyright 2001 by wojtek kaniewski <wojtekka@irc.pl>
+                          Protok鶻 G*du-G*du 4.x
+
+     (C) Copyright 2001 by Wojtek Kaniewski <wojtekka@irc.pl>,
+                           Robert J. Wo�ny <speedy@atman.pl>,
+                           Tomasz Jarzynka <tomee@cpi.pl>,
+                           Adam Ludwikowski <adam.ludwikowski@wp.pl>,
+                           Marek Kozina <klith@hybrid.art.pl>,
+			   Rafa� Florek <raf@regionet.regionet.pl>,
+			   Igor Popik <igipop@wsfiz.edu.pl>
 
 --- 0) disclaimer ---------------------------------------------------------
 
-wszystkie informacje bazuj� na do�wiadczeniach przeprowadzonych na moim
-domowym komputerze. �aden klient g*du-g*du nie zosta� skrzywdzony podczas
+opis protoko�u bazuj� na do�wiadczeniach przeprowadzonych na moim
+domowym komputerze oraz informacjach przys�anych do mnie przez r鷽nych
+ludzi. �aden klient g*du-g*du nie zosta� skrzywdzony podczas
 przeprowadzania bada�, blabla.
 
 --- 1) transmisja, format wszystkich pakiet�w -----------------------------
@@ -37,7 +45,19 @@
 	User-Agent: Mozilla/4.7 [en] (Win98; I)
 	Pragma: no-cache
 
-na co powinni�my dosta� odpowied� w stylu:
+oryginalny klient mo�e wys�a� jeden z podanych identyfikator�w przegl�darki:
+
+	Mozilla/4.04 [en] (Win95; I ;Nav)
+	Mozilla/4.7 [en] (Win98; I)
+	Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
+	Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
+	Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
+	Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
+
+nowsze wersje klienta do zapytania dodaj� r�wnie� `version=...' opisuj�ce,
+z jakim klientem serwer ma do czynienia. jednak ze wzgl�du na mo�liwe
+r鷽nice w protokole, lepiej pomija� ten parametr i uwaga� GG 4.0. w ka�dym
+razie na to zapytanie serwer powinien odpowiedzie�:
 
 	HTTP/1.0 200 OK
 	
@@ -47,10 +67,12 @@
 przemy�lany i w przysz�o�ci b�dzie mo�na u�ywa� r鷽nych serwer�w do r鷽nych
 rzeczy, typu szukanie, obs�uga klient�w itd. p�ki co, 咳czy� si� trzeba na
 pierwszy adres (tak, ten z portem).
+Je�eli po咳czenie z portem 8074 nie wyjdzie z jaki� specyficznych powod�w -
+mo�na si� 咳czy� na port 443. 
 
 --- 3) logowanie si� -------------------------------------------------------
 
-po po咳czeniu si� portem 8074 serwera g*du-g*du, dostajemy pakiet typu 0x0001,
+po po咳czeniu si� portem serwera g*du-g*du, dostajemy pakiet typu 0x0001,
 kt�ry na potrzeby tego dokumentu nazwiemy:
 
 	#define GG_WELCOME 0x0001
@@ -72,7 +94,7 @@
 		int uin;		/* tw�j numerek */
 		int hash;		/* hash has�a */
 		int status;		/* status na dzie� dobry */
-		int dunno1;		/* == 0x0b */
+		int version;		/* wersja klienta */
 		int local_ip;		/* m�j adres ip */
 		short local_port;	/* port, na kt�rym s�ucham */
 	};
@@ -84,8 +106,19 @@
 	for (hash = 1; *passwd; passwd++)
 		hash *= (*passwd) + 1;
 
-zrozumia�e, racja? je�li wszystko si� powiedzie, dostaniemy w odpowiedzi
-pakiet typu
+zrozumia�e, racja? liczba oznaczaj�ca wersj� mo�e by� jedn� z poni�szych:
+
+	0x11 - 4.6.1
+	0x10 - 4.5.22, 4.5.21, 4.5.19, 4.5.17, 4.5.15
+	0x0f - 4.5.12
+	0x0b - 4.0.30, 4.0.29, 4.0.28, 4.0.25
+
+oczywi�cie nie s� to wszystkie mo�liwe wersje klient�w, lecz te, kt�re
+uda�o si� sprawdzi�. najbezpieczniej b�dzie przedstawia� si� jako ta
+wersja, kt�rej ficzer�w u�ywamy. wiadomo, �e 4.0.x nie obs�ugiwa�y trybu
+ukrytego, ani tylko dla znajomych itd.
+
+je�li wszystko si� powiedzie, dostaniemy w odpowiedzi pakiet typu
 
 	#define GG_LOGIN_OK 0x0003
 
@@ -137,14 +170,16 @@
 		int status;		/* status danej osoby */
 		int remote_ip;		/* adres ip delikwenta */
 		short remote_port;	/* port, na kt�rym s�ucha klient */
-		int dunno1;		/* == 0x0b */
-		short dunno2;		/* znowu port? */
+		int version;		/* wersja klienta */
+		short dunno1;		/* znowu port? */
 	};
 
 je�li klient nie obs�uguje po咳cze� mi�dzy klientami (np. g*du-g*du 3.x)
-zamiast adresu ip jest 0, zamiast portu jest 2. niewa�ne ;) w ka�dym razie,
-je�li kto� si� pojawi w trakcie pracy, r�wnie� zostanie przys�any ten
-pakiet. proste? proste :)
+zamiast adresu ip jest 0, zamiast portu mo�e by� 0, 1, 2... niewa�ne ;)
+port mo�e przyjmowa� warto倶 1, je�li klient znajduje si� za jakim�
+firewallem lub innym urz�dzeniem robi�cym NAT. w ka�dym razie, je�li kto�
+si� pojawi w trakcie pracy, r�wnie� zostanie przys�any ten pakiet.
+proste? proste :)
 
 �eby doda� kogo� do listy w trakcie pracy, trzeba wys�a� ni�ej opisany
 pakiet. jego format jest identyczny jak przy GG_NOTIFY.
@@ -171,8 +206,10 @@
 
 	#define GG_SEND_MSG 0x000b
 
+	#define GG_CLASS_QUEUED 0x0001	/* tylko przy odbieraniu */
 	#define GG_CLASS_MSG 0x0004
 	#define GG_CLASS_CHAT 0x0008
+	#define GG_CLASS_UNKNOWN_1 0x0020
 
 	struct gg_send_msg {
 		int recipient;
@@ -186,8 +223,27 @@
 rozmowy za pomoc� cz蟠ci bajt�w, ale raczej nie ma znaczenia. klasa
 wiadomo�ci pozwala odr鷽ni�, czy wiadomo倶 ma si� pokaza� w osobym
 okienku czy jako kolejna linijka w okienku rozmowy. wygl�da na to,
-�e to jaka� bitmapa, wi�c najlepiej ola� inne bity ni� 0x0f. (czasem
-klienty wysy�aj� 0x04, czasem 0x24)
+�e to jaka� bitmapa, wi�c najlepiej ola� inne bity ni� 0x0e. (czasem
+klienty wysy�aj� 0x04, czasem 0x24 -- widocznie 0x20 to te� jaka�
+flaga). je�li odbiorca by� niedost�pny podczas wysy�ania wiadomo�ci,
+zostanie zaznaczony bit 0x01.
+
+oryginalny klient wysy�aj�c wiadomo倶 do kilku u�ytkownik�w, wysy�a po
+prostu kilka takich samych pakiet�w z r鷽nymi numerkami odbiorc�w. nie
+ma osobnego pakietu do tego. natomiast je�li chodzi o ,,konferencyjn�''
+do pakietu doklejana jest za ,,char message[];'' nast�puj�ca struktura:
+
+	struct gg_send_recipients {
+		char flag;		/* == 1 */
+		int count;		/* ilo倶 odbiorc�w */
+		int recipients[];	/* tablica odbiorc�w */
+	};
+
+na przyk�ad, by wys�a� do trzech ludzi, nale�y wys�a� pakiet:
+
+	- -- --- --+--+--+--+--+--+--+-----------+-----------+
+          tre倶    |\0|\1|    0x02   |    uin1   |   uin2    |
+	- -- -- ---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 
 serwer po otrzymaniu wiadomo�ci odsy�a informacj� o tym. przy okazji
 m�wi, czy wiadomo倶 dotar�a do odbiorcy (status == GG_ACK_DELIVERED),
@@ -208,26 +264,29 @@
 
 --- 7) otrzymywanie wiadomo�ci ---------------------------------------------
 
-zbyt wiele wyja�nie� chyba nie trzeba. wiadomo od kogo. nieznane pola to
-co� a'la numer sekwencyjny albo identyfikator okienka z rozmow� albo nowe
-dane dla setiathome. klasa wiadomo�ci taka sama jak przy wysy�aniu:
+zbyt wiele wyja�nie� chyba nie trzeba. wiadomo od kogo. drugie pole to
+najprawdopodobniej jaki� numerek sekwencyjny. trzecie oznacza czas nadania
+wiadomo�ci. klasa wiadomo�ci taka sama jak przy wysy�aniu:
 
 	#define GG_RECV_MSG 0x000a
 	
 	struct gg_recv_msg {
 		int sender;
-		int dunno1;
-		int dunno2;
+		int seq;
+		int time;
 		int class;
 		char message[];
 	};
 
---- 8) otrzymywanie wiadomo�ci ---------------------------------------------
+w przypadku pakiet�w ,,konferencyjnych'' na koncu pakietu doklejona jest
+struktura identyczna ze struct gg_send_recipients zawieraj�ca pozosta�ych
+rozm�wc�w.
+
+--- 8) ping/pong -----------------------------------------------------------
 
 od czasu do czasu klient wysy�a pakiet a'la ping do serwera i dostaje pust�
-odpowied�. ci蠖ko stwierdzi�, czy serwer wywala, je�li nie dostanie pinga
-przez jaki� czas, czy klient si� roz咳cza, je�li serwer mu nie odpowie.
-jako� nie chce mi si� sprawdza� ;)
+odpowied�. o ile dobrze pami�tam, serwer roz咳cza si� po up�ywie 5 minut od
+otrzymania ostatniej informacji.
 
 	#define GG_PING 0x0008
 	
@@ -239,10 +298,21 @@
 
 --- 9) podzi�kowania -------------------------------------------------------
 
-sw�j wk�ad w poznanie protoko�u mia� Robert Wo�ny, kt�ry opisa� nowo�ci
-w GG 4.6.
+sw�j wk�ad w poznanie protoko�u mieli:
+ - Robert J. Wo�ny <speedy@atman.pl>:
+   opis nowo�ci w protokole GG 4.6,
+ - Tomasz Jarzynka <tomee@cpi.pl>:
+   badanie timeout�w,
+ - Adam Ludwikowski <adam.ludwikowski@wp.pl>:
+   wiele r鷽nych poprawek do tekstu, badanie wersji,
+ - Marek Kozina <klith@hybrid.art.pl>:
+   czas otrzymania wiadomo�ci,
+ - Rafa� Florek <raf@regionet.regionet.pl>:
+   konferencje,
+ - Igor Popik <igipop@wsfiz.edu.pl>:
+   klasy wiadomo�ci przy odbieraniu zakolejkowanej.
 
 ----------------------------------------------------------------------------
 
-$Id: protocol.txt 2406 2001-09-29 23:06:30Z warmenhoven $
+$Id: protocol.txt 2819 2001-11-27 22:54:32Z warmenhoven $