diff options
-rw-r--r-- | protocols/jabber/iq.c | 43 | ||||
-rw-r--r-- | protocols/jabber/jabber.c | 16 | ||||
-rw-r--r-- | protocols/jabber/jabber.h | 4 | ||||
-rw-r--r-- | protocols/jabber/presence.c | 16 |
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; +} |