[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