diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-09-24 22:00:09 +0200 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-09-24 22:00:09 +0200 |
commit | a214954bda17730b6251e5c5c26f6d4d23eb1ed9 (patch) | |
tree | 940a75e73ae5dda3c78637194dd04adc4bfe716f /protocols/jabber/jabber.c | |
parent | 4ecdc69c19546fd7256e138d7be3cf49d299b36b (diff) |
Added some experimental stuff with typing notifications that seems to show
that Gaim doesn't support the official JEP-0085 standard (yet?)...
And added simple garbage collection for the node_cache. Will improve it
later.
Diffstat (limited to 'protocols/jabber/jabber.c')
-rw-r--r-- | protocols/jabber/jabber.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index 05ff8047..32bc7563 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -117,11 +117,20 @@ static void jabber_close( struct gaim_connection *gc ) static int jabber_send_im( struct gaim_connection *gc, char *who, char *message, int len, int away ) { - struct xt_node *node; + struct xt_node *node, *event; int st; + /* + event = xt_new_node( "active", NULL, NULL ); + xt_add_attr( event, "xlmns", "http://jabber.org/protocol/chatstates" ); + + event = xt_new_node( "x", NULL, xt_new_node( "composing", NULL, NULL ) ); + xt_add_attr( event, "xmlns", "jabber:x:event" ); + */ + node = xt_new_node( "body", message, NULL ); node = jabber_make_packet( "message", "chat", who, node ); + xt_add_child( node, event ); st = jabber_write_packet( gc, node ); xt_free_node( node ); @@ -168,8 +177,39 @@ static void jabber_remove_buddy( struct gaim_connection *gc, char *who, char *gr static void jabber_keepalive( struct gaim_connection *gc ) { + struct jabber_data *jd = gc->proto_data; + struct xt_node *c, *prev; + /* Just any whitespace character is enough as a keepalive for XMPP sessions. */ jabber_write( gc, "\n", 1 ); + + /* Let's abuse this keepalive for garbage collection of the node cache too. + It runs every minute, so let's mark every node with a special flag the + first time we see it, and clean it up the second time (clean up all + packets with the flag set). + + node->flags is normally only used by xmltree itself for parsing/handling, + so it should be safe to use the variable for gc. */ + + /* This horrible loop is explained in xmltree.c. Makes me wonder if maybe I + didn't choose the perfect data structure... */ + for( prev = NULL, c = jd->node_cache->children; c; prev = c, c = c ? c->next : jd->node_cache->children ) + { + if( c->flags == 0 ) + { + c->flags ++; + } + else + { + if( prev ) + prev->next = c->next; + else + jd->node_cache->children = c->next; + + xt_free_node( c ); + c = prev; + } + } } static void jabber_add_permit( struct gaim_connection *gc, char *who ) |