aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/jabber
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2006-09-20 22:26:47 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2006-09-20 22:26:47 +0200
commit0b4a0db448d033b8f35f32060bf261374fd81bd8 (patch)
treec2bf290d6e69573f08d47485b9e2b8061d24a52d /protocols/jabber
parent70f6aab8f4b6a1bbd9991e800dde91a02cc363f0 (diff)
Now parsing roster properly. (Hopefully...)
Diffstat (limited to 'protocols/jabber')
-rw-r--r--protocols/jabber/iq.c19
-rw-r--r--protocols/jabber/jabber.h3
-rw-r--r--protocols/jabber/presence.c15
3 files changed, 37 insertions, 0 deletions
diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c
index 0f1b1036..119176f9 100644
--- a/protocols/jabber/iq.c
+++ b/protocols/jabber/iq.c
@@ -86,6 +86,25 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
return st ? XT_HANDLED : XT_ABORT;
}
+ if( strcmp( type, "result" ) == 0 && xmlns && strcmp( xmlns, "jabber:iq:roster" ) == 0 )
+ {
+ struct xt_node *node;
+
+ node = query->children;
+ while( ( node = xt_find_node( node, "item" ) ) )
+ {
+ char *jid = xt_find_attr( node, "jid" );
+ char *name = xt_find_attr( node, "name" );
+ char *sub = xt_find_attr( node, "subscription" );
+
+ if( jid && sub && ( strcmp( sub, "both" ) == 0 || strcmp( sub, "to" ) == 0 ) )
+ add_buddy( gc, NULL, jid, name );
+
+ node = node->next;
+ }
+
+ presence_announce( gc );
+ }
else if( strcmp( type, "result" ) == 0 )
{
/* If we weren't authenticated yet, let's assume we are now.
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index fcf8bbd3..85765628 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -41,7 +41,10 @@ int jabber_start_auth( struct gaim_connection *gc );
int jabber_get_roster( struct gaim_connection *gc );
xt_status jabber_pkt_message( struct xt_node *node, gpointer data );
+
+/* presence.c */
xt_status jabber_pkt_presence( struct xt_node *node, gpointer data );
+int presence_announce( struct gaim_connection *gc );
/* jabber_util.c */
char *set_eval_resprio( set_t *set, char *value );
diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c
index 83b69013..46e2b3b2 100644
--- a/protocols/jabber/presence.c
+++ b/protocols/jabber/presence.c
@@ -33,3 +33,18 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data )
return XT_HANDLED;
}
+int presence_announce( struct gaim_connection *gc )
+{
+ struct xt_node *node;
+ int st;
+
+ node = jabber_make_packet( "presence", NULL, NULL, NULL );
+
+ st = jabber_write_packet( gc, node );
+
+ if( st )
+ account_online( gc );
+
+ xt_free_node( node );
+ return st;
+}