# HG changeset patch # User Marcus Lundblad # Date 1240770450 0 # Node ID bbf174c5d331725e23fe562eaf58e3087adae5d3 # Parent 3c35dcebefe77f90a4701095b66efa74e4de00fc# Parent 74dcea0f845780417d0a0c4ff8117b6c27cca138 propagate from branch 'im.pidgin.pidgin' (head 371b6104658ad98c418ac711643192c2e34428ea) to branch 'im.pidgin.cpw.malu.client_type' (head fe7a27aab708bdcffc946a3c059459b4293ccdc3) diff -r 3c35dcebefe7 -r bbf174c5d331 finch/finch.c --- a/finch/finch.c Sun Apr 26 17:01:05 2009 +0000 +++ b/finch/finch.c Sun Apr 26 18:27:30 2009 +0000 @@ -65,6 +65,7 @@ g_hash_table_insert(ui_info, "version", VERSION); g_hash_table_insert(ui_info, "website", "http://pidgin.im"); g_hash_table_insert(ui_info, "dev_website", "http://developer.pidgin.im"); + g_hash_table_insert(ui_info, "client_type", "console"); } return ui_info; diff -r 3c35dcebefe7 -r bbf174c5d331 libpurple/core.h --- a/libpurple/core.h Sun Apr 26 17:01:05 2009 +0000 +++ b/libpurple/core.h Sun Apr 26 18:27:30 2009 +0000 @@ -186,6 +186,10 @@ * *
dev_website
*
the UI's development/support website, such as http://developer.pidgin.im.
+ * + *
client_type
+ *
the type of UI (pc, console, phone, handheld, web, bot)
+ * * * * @return A GHashTable with strings for keys and values. This diff -r 3c35dcebefe7 -r bbf174c5d331 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Sun Apr 26 17:01:05 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Sun Apr 26 18:27:30 2009 +0000 @@ -2607,3 +2607,22 @@ return jabber_resource_has_capability(jbr, cap); } +const gchar * +jabber_resource_get_identity_category_type(const JabberBuddyResource *jbr, + const gchar *category) +{ + const GList *iter = NULL; + + if (jbr->caps) { + for (iter = jbr->caps->identities ; iter ; iter = g_list_next(iter)) { + const JabberCapsIdentity *identity = + (JabberCapsIdentity *) iter->data; + + if (strcmp(identity->category, category) == 0) { + return identity->type; + } + } + } + + return NULL; +} diff -r 3c35dcebefe7 -r bbf174c5d331 libpurple/protocols/jabber/buddy.h --- a/libpurple/protocols/jabber/buddy.h Sun Apr 26 17:01:05 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.h Sun Apr 26 18:27:30 2009 +0000 @@ -122,4 +122,8 @@ const gchar *cap); gboolean jabber_buddy_has_capability(const JabberBuddy *jb, const gchar *cap); +const gchar * +jabber_resource_get_identity_category_type(const JabberBuddyResource *jbr, + const gchar *category); + #endif /* PURPLE_JABBER_BUDDY_H_ */ diff -r 3c35dcebefe7 -r bbf174c5d331 libpurple/protocols/jabber/disco.c --- a/libpurple/protocols/jabber/disco.c Sun Apr 26 17:01:05 2009 +0000 +++ b/libpurple/protocols/jabber/disco.c Sun Apr 26 18:27:30 2009 +0000 @@ -20,6 +20,7 @@ */ #include "internal.h" +#include "core.h" #include "prefs.h" #include "debug.h" @@ -112,11 +113,24 @@ xmlnode_set_attrib(query, "node", node); if(!node || !strcmp(node, CAPS0115_NODE "#" VERSION)) { + GHashTable *ui_info = purple_core_get_ui_info(); + const gchar *ui_type = g_hash_table_lookup(ui_info, "client_type"); + const gchar *type = "pc"; /* default client type, if unknown or + unspecified */ + + if (ui_type) { + if (strcmp(ui_type, "pc") == 0 || + strcmp(ui_type, "console") == 0 || + strcmp(ui_type, "phone") == 0 || + strcmp(ui_type, "handheld") == 0 || + strcmp(ui_type, "web") == 0 || + strcmp(ui_type, "bot") == 0) { + type = ui_type; + } + } identity = xmlnode_new_child(query, "identity"); xmlnode_set_attrib(identity, "category", "client"); - xmlnode_set_attrib(identity, "type", "pc"); /* XXX: bot, console, - * handheld, pc, phone, - * web */ + xmlnode_set_attrib(identity, "type", type); xmlnode_set_attrib(identity, "name", PACKAGE); SUPPORT_FEATURE("jabber:iq:last") diff -r 3c35dcebefe7 -r bbf174c5d331 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sun Apr 26 17:01:05 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sun Apr 26 18:27:30 2009 +0000 @@ -1670,7 +1670,7 @@ JabberStream *js; JabberBuddy *jb = NULL; PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(b)); - + if(!gc) return NULL; @@ -1683,6 +1683,28 @@ !(jb->subscription & JABBER_SUB_TO))) return "not-authorized"; } + + if (jb) { + JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, NULL); + if (jbr) { + const gchar *client_type = + jabber_resource_get_identity_category_type(jbr, "client"); + + if (client_type) { + if (strcmp(client_type, "phone") == 0) { + return "mobile"; + } else if (strcmp(client_type, "web") == 0) { + return "external"; + } else if (strcmp(client_type, "handheld") == 0) { + return "hiptop"; + } else if (strcmp(client_type, "bot") == 0) { + return "bot"; + } + /* the default value "pc" falls through and has no emblem */ + } + } + } + return NULL; } diff -r 3c35dcebefe7 -r bbf174c5d331 libpurple/protocols/msn/state.c --- a/libpurple/protocols/msn/state.c Sun Apr 26 17:01:05 2009 +0000 +++ b/libpurple/protocols/msn/state.c Sun Apr 26 18:27:30 2009 +0000 @@ -21,6 +21,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ + +#include "internal.h" +#include "core.h" + #include "msn.h" #include "state.h" @@ -288,10 +292,29 @@ MsnUser *user; MsnObject *msnobj; const char *state_text; - + GHashTable *ui_info = purple_core_get_ui_info(); + MsnClientCaps caps = MSN_CLIENT_ID; + g_return_if_fail(session != NULL); g_return_if_fail(session->notification != NULL); + /* set client caps based on what the UI tells us it is... */ + if (ui_info) { + const gchar *client_type = g_hash_table_lookup(ui_info, "client_type"); + if (client_type) { + if (strcmp(client_type, "phone") == 0 || + strcmp(client_type, "handheld") == 0) { + caps |= MSN_CLIENT_CAP_WIN_MOBILE; + } else if (strcmp(client_type, "web")) { + caps |= MSN_CLIENT_CAP_WEBMSGR; + } else if (strcmp(client_type, "bot")) { + caps |= MSN_CLIENT_CAP_BOT; + } + /* MSN doesn't a "console" type... + What, they have no ncurses UI? :-) */ + } + } + account = session->account; cmdproc = session->notification->cmdproc; user = session->user; @@ -307,8 +330,7 @@ if (msnobj == NULL) { - msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text, - MSN_CLIENT_ID); + msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text, caps); } else { @@ -317,7 +339,7 @@ msnobj_str = msn_object_to_string(msnobj); msn_cmdproc_send(cmdproc, "CHG", "%s %d %s", state_text, - MSN_CLIENT_ID, purple_url_encode(msnobj_str)); + caps, purple_url_encode(msnobj_str)); g_free(msnobj_str); } diff -r 3c35dcebefe7 -r bbf174c5d331 pidgin/gtkmain.c --- a/pidgin/gtkmain.c Sun Apr 26 17:01:05 2009 +0000 +++ b/pidgin/gtkmain.c Sun Apr 26 18:27:30 2009 +0000 @@ -353,6 +353,7 @@ g_hash_table_insert(ui_info, "version", VERSION); g_hash_table_insert(ui_info, "website", "http://pidgin.im"); g_hash_table_insert(ui_info, "dev_website", "http://developer.pidgin.im"); + g_hash_table_insert(ui_info, "client_type", "pc"); } return ui_info;