[ekg2-devel] chatstates i talk.google.com
Wiesław Ochmiński
wiechu w wiechu.com
Sob, 19 Sty 2008, 05:01:18 CET
On Sun, Jan 13, 2008 at 09:17:13AM +0100, Michał Górny wrote:
> On Sun, Jan 13, 2008 at 12:18:59AM +0100, =?ISO-8859-2?Q?Wies=B3aw_Ochmi=F1ski_ wrote:
> > przychodzących z talk.google.com. (google.com przysyła "<cha:composing"
> > a nie "<composing" i analogicznie z atrybutami: "xmlns:cha" zamiast
> > zakładenego "xmlns").
> >
> > [???]
>
> No, i mamy kolejną rzecz, którą trzeba napisać od nowa ??? by trzeba
> całego jabbera przepisać na nieco sensowniejszą obsługę namespace'ów???
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.
W pierszej wersji, której początek zrobiłem i ma to już bardzo
podstawową funkcjonalność, traci sens całe fragmenty dotychczasowego
kodu, które oparte są na wyszukiwaniu atrybutu "xmlns". Do tego trzeba
przejrzeć resztę nazw.
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.
Na ten drugi pomysł wpadłem, gdy miałem zrobione to co przesyłam
poniżej. No i teraz nie wiem: kończyć pierwszą wersję czy napisać to od
nowa w wersji drugiej.
Pozdrawiam,
Wiesław Ochmiski
Index: plugins/jabber/jabber.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber.c,v
retrieving revision 1.370
diff -r1.370 jabber.c
476a477
> debug_white("debug.ns.(wo) [xmlnode_handle_start] name=%s\n",name);
482c483
< if (/* !j->node && */ !(s->connected) && ((j->istlen && !xstrcmp(name, "s")) || (!j->istlen && !xstrcmp(name, "stream:stream")))) {
---
> if (/* !j->node && */ !(s->connected) && ((j->istlen && !xstrcmp(name, "s")) || (!j->istlen && !xstrcmp(name, "http://etherx.jabber.org/streams#stream")))) {
768a770,775
> static void xmlnode_handle_ns_start(void *data, const char *name, const char **atts) {
> }
>
> static void xmlnode_handle_ns_end(void *data, const char *prefix) {
>
> }
772c779
< if (!parser) parser = XML_ParserCreate("UTF-8"); /* new parser */
---
> if (!parser) parser = XML_ParserCreateNS("UTF-8", '#'); /* new parser */
776a784
> XML_SetNamespaceDeclHandler(parser, (XML_StartNamespaceDeclHandler)xmlnode_handle_ns_start, (XML_EndNamespaceDeclHandler) xmlnode_handle_ns_end);
Index: plugins/jabber/jabber_handlers.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber_handlers.c,v
retrieving revision 1.151
diff -r1.151 jabber_handlers.c
229c229
< if (!xstrcmp(ch->name, "starttls")) {
---
> if (!xstrcmp(ch->name, "urn:ietf:params:xml:ns:xmpp-tls#starttls")) {
234c234
< if (!xstrcmp(ch->name, "mechanisms")) {
---
> if (!xstrcmp(ch->name, "urn:ietf:params:xml:ns:xmpp-sasl#mechanisms")) {
237c237
< if (!xstrcmp(another->name, "mechanism")) {
---
> if (!xstrcmp(another->name, "urn:ietf:params:xml:ns:xmpp-sasl#mechanism")) {
262c262
< if (!xstrcmp(ch->name, "session"))
---
> if (!xstrcmp(ch->name, "urn:ietf:params:xml:ns:xmpp-session#session"))
264c264
< else if (!xstrcmp(ch->name, "bind"))
---
> else if (!xstrcmp(ch->name, "urn:ietf:params:xml:ns:xmpp-bind#bind"))
275c275
< if (!xstrcmp(n->name, "starttls")) {
---
> if (!xstrcmp(n->name, "urn:ietf:params:xml:ns:xmpp-tls#starttls")) {
278d277
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-tls", continue)
287,288c286,287
< } else if (!xstrcmp(n->name, "mechanisms") && !mech_node) { /* faster than xmlnode_find_child */
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-sasl", continue)
---
> } else if (!xstrcmp(n->name, "urn:ietf:params:xml:ns:xmpp-sasl#mechanisms") && !mech_node) { /* faster than xmlnode_find_child */
>
290c289,290
< } else if (!xstrcmp(n->name, "session")) {
---
>
> } else if (!xstrcmp(n->name, "urn:ietf:params:xml:ns:xmpp-session#session")) {
292d291
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-session", continue)
296c295
< } else if (!xstrcmp(n->name, "bind")) {
---
> } else if (!xstrcmp(n->name, "urn:ietf:params:xml:ns:xmpp-bind#bind")) {
298d296
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-bind", continue)
301c299
< } else if (!xstrcmp(n->name, "compression")) {
---
> } else if (!xstrcmp(n->name, "http://jabber.org/features/compress#compression")) {
310d307
< CHECK_XMLNS(n, "http://jabber.org/features/compress", continue)
393c390
< if (!xstrcmp(mech_node->name, "mechanism")) {
---
> if (!xstrcmp(mech_node->name, "urn:ietf:params:xml:ns:xmpp-sasl#mechanism")) {
453d449
< CHECK_XMLNS(n, "http://jabber.org/protocol/compress", return)
492d487
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-sasl", return)
596d590
< if (!xstrcmp(jabber_attr(n->atts, "xmlns"), "urn:ietf:params:xml:ns:xmpp-tls")) {
598c592
< debug_function("[jabber] proceed urn:ietf:params:xml:ns:xmpp-tls TLS let's rock\n");
---
> debug_function("[jabber] proceed urn:ietf:params:xml:ns:xmpp-tls TLS let's rock\n");
600,601c594,595
< /* XXX HERE WE SHOULD DISABLE RECV_WATCH && (SEND WATCH TOO?) */
< // j->send_watch->type = WATCH_NONE;
---
> /* XXX HERE WE SHOULD DISABLE RECV_WATCH && (SEND WATCH TOO?) */
> // j->send_watch->type = WATCH_NONE;
603c597
< jabber_handle_connect_ssl(-1, j->fd, WATCH_NONE, s);
---
> jabber_handle_connect_ssl(-1, j->fd, WATCH_NONE, s);
605c599
< debug_error("[jabber] proceed + urn:ietf:params:xml:ns:xmpp-tls but jabber compilated without ssl support?\n");
---
> debug_error("[jabber] proceed + urn:ietf:params:xml:ns:xmpp-tls but jabber compilated without ssl support?\n");
607d600
< } else debug_error("[jabber] proceed what's that xmlns: %s ?\n", jabber_attr(n->atts, "xmlns"));
629d621
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-sasl", return)
643d634
< CHECK_XMLNS(n, "urn:ietf:params:xml:ns:xmpp-sasl", return)
663,665c654,656
< { "message", jabber_handle_message },
< { "presence", jabber_handle_presence },
< { "iq", jabber_handle_iq },
---
> { "jabber:client#message", jabber_handle_message },
> { "jabber:client#presence", jabber_handle_presence },
> { "jabber:client#iq", jabber_handle_iq },
667c658
< { "stream:features", jabber_handle_stream_features },
---
> { "http://etherx.jabber.org/streams#features", jabber_handle_stream_features },
670,671c661,662
< { "challenge", jabber_handle_challenge },
< { "compressed", jabber_handle_compressed },
---
> { "urn:ietf:params:xml:ns:xmpp-sasl#challenge", jabber_handle_challenge },
> { "http://jabber.org/protocol/compress#compressed", jabber_handle_compressed },
673,675c664,666
< { "proceed", jabber_handle_proceed },
< { "success", jabber_handle_success },
< { "failure", jabber_handle_failure },
---
> { "urn:ietf:params:xml:ns:xmpp-tls#proceed", jabber_handle_proceed },
> { "urn:ietf:params:xml:ns:xmpp-sasl#success", jabber_handle_success },
> { "urn:ietf:params:xml:ns:xmpp-sasl#failure", jabber_handle_failure },
690a682
> debug_white("debug.ns.(wo) [jabber_handle] name=%s\n",n->name);
720c712,713
< xmlnode_t *nbody = xmlnode_find_child(n, "body");
---
> xmlnode_t *nbody = j->istlen ? xmlnode_find_child(n, "body")
> : xmlnode_find_child(n, "jabber:client#body");
728c721
< char *juid = jabber_unescape(from); /* was tmp */
---
> char *juid = tlenjabber_unescape(from); /* was tmp */
872,878c865
< /* x */ } else if (!xstrcmp(jabber_attr(xitem->atts, "xmlns"), "http://jabber.org/protocol/chatstates")) {
< composing = 3; /* disable + higher prio */
< if (!xstrcmp(xitem->name, "composing"))
< composing = 7; /* enable + higher prio */
< else if (!xstrcmp(xitem->name, "gone"))
< print_window(uid, s, 0, "jabber_gone", session_name(s), get_nickname(s, uid));
< /* chatstate */ } else if (!xstrcmp(xitem->name, "subject")) {
---
> /* x */ } else if (!xstrcmp(xitem->name, "subject")) {
882c869
< /* subject */ } else if (!xstrcmp(xitem->name, "body")) {
---
> /* subject */ } else if (!xstrcmp(xitem->name, "jabber:client#body") || ( j->istlen && !xstrcmp(xitem->name, "body") )) {
884,891c871,883
< 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);
< } else if (j->istlen && !xstrcmp(xitem->name, "no"))
---
> else if (!xstrcmp(xitem->name, "http://jabber.org/protocol/chatstates#active")) {
> composing = 3; /* disable + higher prio */
> } else if (!xstrcmp(xitem->name, "http://jabber.org/protocol/chatstates#composing")) {
> composing = 7; /* enable + higher prio */
> } else if (!xstrcmp(xitem->name, "http://jabber.org/protocol/chatstates#paused")) {
> composing = 3; /* disable + higher prio */
> } else if (!xstrcmp(xitem->name, "http://jabber.org/protocol/chatstates#inactive")) {
> composing = 3; /* disable + higher prio */
> } else if (!xstrcmp(xitem->name, "http://jabber.org/protocol/chatstates#gone")) {
> composing = 3; /* disable + higher prio */
> print_window(uid, s, 0, "jabber_gone", session_name(s), get_nickname(s, uid));
> } /* XXX, JEP-0085 end */
> else if (j->istlen && !xstrcmp(xitem->name, "no"))
Index: plugins/jabber/jabber_handlers_iq_result.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber_handlers_iq_result.c,v
retrieving revision 1.13
diff -r1.13 jabber_handlers_iq_result.c
376c376
< if (!xstrcmp(child->name, "mail-thread-info")) {
---
> if (!xstrcmp(child->name, "google:mail:notify#mail-thread-info")) {
392c392
< } else if (!xstrcmp(subchild->name, "subject")) {
---
> } else if (!xstrcmp(subchild->name, "google:mail:notify#subject")) {
398c398
< } else if (!xstrcmp(subchild->name, "senders")) {
---
> } else if (!xstrcmp(subchild->name, "google:mail:notify#senders")) {
419c419
< } else if (!xstrcmp(subchild->name, "labels")) { /* <labels> |
---
> } else if (!xstrcmp(subchild->name, "google:mail:notify#labels")) { /* <labels> |
421c421
< } else if (!xstrcmp(subchild->name, "snippet")) { /* <snippet> |
---
> } else if (!xstrcmp(subchild->name, "google:mail:notify#snippet")) { /* <snippet> |
526c526
< xmlnode_t *item = xmlnode_find_child(n, "item");
---
> xmlnode_t *item = xmlnode_find_child(n, "jabber:iq:roster#item");
927,928c927,928
< { "mailbox", "google:mail:notify", jabber_handle_gmail_result_mailbox }, /* not done */
< { "new-mail", "google:mail:notify", jabber_handle_iq_result_new_mail }, /* not done */
---
> { "google:mail:notify#mailbox", NULL, jabber_handle_gmail_result_mailbox }, /* not done */
> { "google:mail:notify#new-mail", NULL, jabber_handle_iq_result_new_mail }, /* not done */
936c936
< { NULL, "jabber:iq:roster", jabber_handle_iq_roster }, /* not done */
---
> { "jabber:iq:roster#query", NULL, jabber_handle_iq_roster }, /* not done */
945c945
< { "bind", "urn:ietf:params:xml:ns:xmpp-bind", jabber_handle_bind }, /* not done */
---
> { "urn:ietf:params:xml:ns:xmpp-bind#bind", NULL, jabber_handle_bind }, /* not done */
958c958
< { "new-mail", "google:mail:notify", jabber_handle_iq_set_new_mail },
---
> { "google:mail:notify#new-mail", NULL, jabber_handle_iq_set_new_mail },
Index: plugins/jabber/jabber_handlers_tlen.c
===================================================================
RCS file: /home/cvs/ekg2/plugins/jabber/jabber_handlers_tlen.c,v
retrieving revision 1.1
diff -r1.1 jabber_handlers_tlen.c
120a121,124
> /* tlen needs it (W.O) */
> { "message", jabber_handle_message },
> { "presence", jabber_handle_presence },
> { "iq", jabber_handle_iq },
-------------------------------------------------------------------------
--
Wiesław Ochmiński, Polska Północna, Malbork.
Więcej informacji o liście dyskusyjnej ekg2-devel