aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/jabber
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2006-09-24 20:08:07 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2006-09-24 20:08:07 +0200
commitcfbb3a6e5e11a8d2d162d80958d6ce997104e9d3 (patch)
tree2f6d7e89fa70833e64575fe809e998c0c0e7a7f2 /protocols/jabber
parente101506a3e660d3165a89aab0898293b367e2b5b (diff)
Added add_buddy/remove_buddy functions. Removing a contact doesn't seem
to work perfectly though.
Diffstat (limited to 'protocols/jabber')
-rw-r--r--protocols/jabber/iq.c43
-rw-r--r--protocols/jabber/jabber.c16
-rw-r--r--protocols/jabber/jabber.h4
-rw-r--r--protocols/jabber/presence.c16
4 files changed, 77 insertions, 2 deletions
diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c
index 5c108379..ac5e0932 100644
--- a/protocols/jabber/iq.c
+++ b/protocols/jabber/iq.c
@@ -183,3 +183,46 @@ int jabber_get_roster( struct gaim_connection *gc )
xt_free_node( node );
return st;
}
+
+int jabber_add_to_roster( struct gaim_connection *gc, char *handle, char *name )
+{
+ struct xt_node *node;
+ int st;
+
+ /* Build the item entry */
+ node = xt_new_node( "item", NULL, NULL );
+ xt_add_attr( node, "jid", handle );
+ if( name )
+ xt_add_attr( node, "name", name );
+
+ /* And pack it into a roster-add packet */
+ node = xt_new_node( "query", NULL, node );
+ xt_add_attr( node, "xmlns", "jabber:iq:roster" );
+ node = jabber_make_packet( "iq", "set", NULL, node );
+
+ st = jabber_write_packet( gc, node );
+
+ xt_free_node( node );
+ return st;
+}
+
+int jabber_remove_from_roster( struct gaim_connection *gc, char *handle )
+{
+ struct xt_node *node;
+ int st;
+
+ /* Build the item entry */
+ node = xt_new_node( "item", NULL, NULL );
+ xt_add_attr( node, "jid", handle );
+ xt_add_attr( node, "subscription", "remove" );
+
+ /* And pack it into a roster-add packet */
+ node = xt_new_node( "query", NULL, node );
+ xt_add_attr( node, "xmlns", "jabber:iq:roster" );
+ node = jabber_make_packet( "iq", "set", NULL, node );
+
+ st = jabber_write_packet( gc, node );
+
+ xt_free_node( node );
+ return st;
+}
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index a337dd68..21633973 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -154,6 +154,18 @@ static void jabber_set_away( struct gaim_connection *gc, char *state_txt, char *
presence_send_update( gc );
}
+static void jabber_add_buddy( struct gaim_connection *gc, char *who )
+{
+ if( jabber_add_to_roster( gc, who, NULL ) )
+ presence_send_request( gc, who, "subscribe" );
+}
+
+static void jabber_remove_buddy( struct gaim_connection *gc, char *who, char *group )
+{
+ if( jabber_remove_from_roster( gc, who ) )
+ presence_send_request( gc, who, "unsubscribe" );
+}
+
static void jabber_keepalive( struct gaim_connection *gc )
{
/* Just any whitespace character is enough as a keepalive for XMPP sessions. */
@@ -174,8 +186,8 @@ void jabber_init()
ret->set_away = jabber_set_away;
// ret->set_info = jabber_set_info;
// ret->get_info = jabber_get_info;
-// ret->add_buddy = jabber_add_buddy;
-// ret->remove_buddy = jabber_remove_buddy;
+ ret->add_buddy = jabber_add_buddy;
+ ret->remove_buddy = jabber_remove_buddy;
// ret->chat_send = jabber_chat_send;
// ret->chat_invite = jabber_chat_invite;
// ret->chat_leave = jabber_chat_leave;
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index cf84a6e8..7a2c7783 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -72,12 +72,16 @@ struct jabber_away_state
xt_status jabber_pkt_iq( struct xt_node *node, gpointer data );
int jabber_start_iq_auth( struct gaim_connection *gc );
int jabber_get_roster( struct gaim_connection *gc );
+int jabber_add_to_roster( struct gaim_connection *gc, char *handle, char *name );
+int jabber_remove_from_roster( struct gaim_connection *gc, char *handle );
+/* message.c */
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_send_update( struct gaim_connection *gc );
+int presence_send_request( struct gaim_connection *gc, char *handle, char *request );
/* 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 d9053c5f..fa9c1248 100644
--- a/protocols/jabber/presence.c
+++ b/protocols/jabber/presence.c
@@ -77,3 +77,19 @@ int presence_send_update( struct gaim_connection *gc )
xt_free_node( node );
return st;
}
+
+/* Send a subscribe/unsubscribe request to a buddy. */
+int presence_send_request( struct gaim_connection *gc, char *handle, char *request )
+{
+ struct xt_node *node;
+ int st;
+
+ node = jabber_make_packet( "presence", NULL, NULL, NULL );
+ xt_add_attr( node, "to", handle );
+ xt_add_attr( node, "type", request );
+
+ st = jabber_write_packet( gc, node );
+
+ xt_free_node( node );
+ return st;
+}