[ekg2-devel] chatstates i talk.google.com

Wiesław Ochmiński wiechu w wiechu.com
Sob, 19 Sty 2008, 15:10:44 CET


On Sat, Jan 19, 2008 at 09:28:20AM +0100, Michał Górny wrote:
> On Sat, Jan 19, 2008 at 05:01:18AM +0100, =?ISO-8859-2?Q?Wies=B3aw_Ochmi=F1ski_ wrote:
> > Tamto rozwiązania, które napisałem na szybko nie podobało mi się i teraz
> > użyłem XML_ParserCreateNS. Chciałbym poddać pod dyskusję dwa warianty.
> > 
[...]
> > Drugi wariant, to przywrócenie nazwy na początku xmlnode_handle_start()
> > i dodanie atrybutu "xmlns" do istniejących. Wtedy nie trzeba zmieniać
> > reszty kodu plugina.
> 
> Dalej nie to.
> 
> Raczej rozważalibyśmy pójście jeszcze krok dalej i dopisanie
> do xmlnode_t pola 'xmlns'. Do tego jakaś ładne dziedziczenie, usuwanie
> prefiksów na rzecz wpisania odpowiedniego xmlns, itd. Tyle że to
> naprawdę sporo roboty. Aczkolwiek, jeśli jesteś chętny ??? będzie nam
> bardzo miło powitać Cię w ???gronie zasłużonych??? ( ;.

Nasz klient (jabbera), nasz pan. Dodałem pole xmlns i (nie wiem, po co) nsname.
Nazwy są takie jak bez parsowania NS paresrem.
Tymczasowo "xmlns" można też znaleźć w atrybutach, ale to do wyrzucenia.

Uwaga: przy tym rozwiązaniu należy się wystrzegać wyszukiwania nazw typu jakas:nazwa,
bo z przyczyn oczywistych nie zostanie to znalezione. Używać wtedy nsname albo name i xmlns.

    Pozdrawiam,
	WO.

-------------------------------------------------------------------------------------------
Index: jabber.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber.c,v
retrieving revision 1.370
diff -r1.370 jabber.c
482c482,488
<         if (/* !j->node && */ !(s->connected) && ((j->istlen && !xstrcmp(name, "s")) || (!j->istlen && !xstrcmp(name, "stream:stream")))) {
---
> 	/* (WO) Nie można, bo przetwarzanie rozpoczęoby się dopiero po skompletowaniu, czyli po otrzymaniu </stream:stream>
> 	 * Wątpię, by ktoś chciał czekać aż to nastąpi, ale ładniej byłoby gdyby cała ta część po if wylądowała
> 	 * w jakiejś jabber_just_like_starting_over()
> 	 */
> 
>         if (/* !j->node && */ !(s->connected) && ((j->istlen && !xstrcmp(name, "s")) || (!j->istlen && !xstrcmp(name, "http://etherx.jabber.org/streams|stream")))) {
> //        if (/* !j->node && */ !(s->connected) && ((j->istlen && !xstrcmp(name, "s")) || (!j->istlen && !xstrcmp(name, "stream:stream")))) {
529a536,548
> 
> 		newnode->nsname = xstrdup(name);
> 
> 		char *x=NULL;
> 		char *tmp=xstrdup(name);
> 		char *sep=xstrchr(tmp,'|');
> 		if (sep) {
> 			*(sep++)='\0';
> 			name=sep;
> 			x=xstrdup(tmp);
> 		}
> 		xfree(tmp);
> 
530a550
> 		newnode->xmlns = xstrdup(x);
549a570,582
> #define _WO_TMP_ADD_XMLNS_2_ATTS 1
> 
> 	    /* (WO) tymczasowo dodaję xmlns do atrybutów choć jest już pole xmlns, ale nie chciało mi się
> 	     * robić poprawek w całym kodzie. Do wyrzucenia w przyszłości.
> 	     */
> 
> #ifdef _WO_TMP_ADD_XMLNS_2_ATTS
> 		int c = x ? 3 : 1;
> 		i=0;
> 
> 		if (arrcount +c > 1) {		/* we don't need to allocate table if arrcount = 0 */
> 			newnode->atts = xmalloc((arrcount + c) * sizeof(char *));
> #else
551a585
> #endif
556a591,599
> #ifdef _WO_TMP_ADD_XMLNS_2_ATTS
> 		if (x) {
> 			newnode->atts[i++]=xstrdup("xmlns");
> 			newnode->atts[i]=xstrdup(x);
> 		}
> #endif
> 
> 		xfree(x);
> 
772c815
< 	if (!parser) 	parser = XML_ParserCreate("UTF-8");	/*   new parser */
---
> 	if (!parser) 	parser = XML_ParserCreateNS("UTF-8",'|');	/*   new parser */
Index: jabber.h
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber.h,v
retrieving revision 1.81
diff -r1.81 jabber.h
33a34,35
> 	char *xmlns;
> 	char *nsname;	/* WO czy nie wiem, czy komu to na coś, ale tworzę przy okazji w xmlnode_handle_start */
Index: jabber_handlers.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber_handlers.c,v
retrieving revision 1.151
diff -r1.151 jabber_handlers.c
667,668c667,670
< 	{ "stream:features",	jabber_handle_stream_features },
< 	{ "stream:error",	jabber_handle_stream_error },
---
> //	{ "stream:features",	jabber_handle_stream_features },
> 	{ "features",	jabber_handle_stream_features },
> //	{ "stream:error",	jabber_handle_stream_error },
> 	{ "error",	jabber_handle_stream_error },
872c874
< /* x */		} else if (!xstrcmp(jabber_attr(xitem->atts, "xmlns"), "http://jabber.org/protocol/chatstates")) {
---
> /* x */		} else if (!xstrcmp(xitem->xmlns, "http://jabber.org/protocol/chatstates")) {
874c876,877
< 			if (!xstrcmp(xitem->name, "composing"))
---
> 			if (!xstrcmp(xitem->name, "active")) { 
> 			} else if (!xstrcmp(xitem->name, "composing")) {
876c879,881
< 			else if (!xstrcmp(xitem->name, "gone"))
---
> 			} else if (!xstrcmp(xitem->name, "paused")) {
> 			} else if (!xstrcmp(xitem->name, "inactive")) {
> 			} else if (!xstrcmp(xitem->name, "gone")) {
877a883
> 			} else debug_error("[JABBER, MESSAGE]: INVALID CHATSTATE: %s\n", xitem->name);
883,890d888
< 		} /* XXX, JEP-0085 here */
< 		else if (!xstrcmp(jabber_attr(xitem->atts, "xmlns"), "http://jabber.org/protocol/chatstates")) {
< 			if (!xstrcmp(xitem->name, "active"))		{ }
< 			else if (!xstrcmp(xitem->name, "composing"))	{ } 
< 			else if (!xstrcmp(xitem->name, "paused"))	{ } 
< 			else if (!xstrcmp(xitem->name, "inactive"))	{ } 
< 			else if (!xstrcmp(xitem->name, "gone")) 	{ } 
< 			else debug_error("[JABBER, MESSAGE]: INVALID CHATSTATE: %s\n", xitem->name);
Index: xmlnode.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/xmlnode.c,v
retrieving revision 1.15
diff -r1.15 xmlnode.c
22a23,25
> 	xfree(n->nsname);
> 	xfree(n->xmlns);
> 
-------------------------------------------------------------------------------------------


-- 
 Wiesław Ochmiński, Polska Północna, Malbork.


Więcej informacji o liście dyskusyjnej ekg2-devel