# HG changeset patch # User Andreas Monitzer # Date 1182296056 0 # Node ID 906ed2836a04243bf66ce1cc7c4c0acbfea38afd # Parent 3f2b5e2ab5c5dd2d56d0a00f892074c1312a652d Implemented logging in/out of gateways, as explained in XEP-0100. diff -r 3f2b5e2ab5c5 -r 906ed2836a04 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Tue Jun 19 16:10:36 2007 +0000 +++ b/libpurple/protocols/jabber/buddy.c Tue Jun 19 23:34:16 2007 +0000 @@ -1578,6 +1578,47 @@ jabber_presence_subscription_set(js, buddy->name, "unsubscribe"); } +static void jabber_buddy_login(PurpleBlistNode *node, gpointer data) { + if(PURPLE_BLIST_NODE_IS_BUDDY(node)) { + /* simply create a directed presence of the current status */ + PurpleBuddy *buddy = (PurpleBuddy *) node; + PurpleConnection *gc = purple_account_get_connection(buddy->account); + JabberStream *js = gc->proto_data; + PurpleAccount *account = purple_connection_get_account(gc); + PurplePresence *gpresence = purple_account_get_presence(account); + PurpleStatus *status = purple_presence_get_active_status(gpresence); + xmlnode *presence; + JabberBuddyState state; + char *msg; + int priority; + + purple_status_to_jabber(status, &state, &msg, &priority); + presence = jabber_presence_create_js(js, state, msg, priority); + + g_free(msg); + + xmlnode_set_attrib(presence, "to", buddy->name); + + jabber_send(js, presence); + xmlnode_free(presence); + } +} + +static void jabber_buddy_logout(PurpleBlistNode *node, gpointer data) { + if(PURPLE_BLIST_NODE_IS_BUDDY(node)) { + /* simply create a directed unavailable presence */ + PurpleBuddy *buddy = (PurpleBuddy *) node; + JabberStream *js = purple_account_get_connection(buddy->account)->proto_data; + xmlnode *presence; + + presence = jabber_presence_create_js(js, JABBER_BUDDY_STATE_UNAVAILABLE, NULL, 0); + + xmlnode_set_attrib(presence, "to", buddy->name); + + jabber_send(js, presence); + xmlnode_free(presence); + } +} static GList *jabber_buddy_menu(PurpleBuddy *buddy) { @@ -1628,6 +1669,25 @@ NULL, NULL); m = g_list_append(m, act); } + + /* + * This if-condition implements parts of XEP-0100: Gateway Interaction + * + * According to stpeter, there is no way to know if a jid on the roster is a gateway without sending a disco#info. + * However, since the gateway might appear offline to us, we cannot get that information. Therefore, I just assume + * that gateways on the roster can be identified by having no '@' in their jid. This is a faily safe assumption, since + * people don't tend to have a server or other service there. + */ + if (g_utf8_strchr(buddy->name, -1, '@') == NULL) { + act = purple_menu_action_new(_("Log In"), + PURPLE_CALLBACK(jabber_buddy_login), + NULL, NULL); + m = g_list_append(m, act); + act = purple_menu_action_new(_("Log Out"), + PURPLE_CALLBACK(jabber_buddy_logout), + NULL, NULL); + m = g_list_append(m, act); + } return m; }