# HG changeset patch # User Paul Aurich # Date 1244334425 0 # Node ID 08c6a0c88b2b95272a8033e84c32033c6acb60a3 # Parent d46acd32a18dbac09880ce9c0b3d29cb23cd4985# Parent 74c0031a2eb28fe2f52f8e42df2513ec189d6eee propagate from branch 'im.pidgin.pidgin' (head 505516826b01aed6390e0c2aa38706c0e2da163e) to branch 'im.pidgin.cpw.malu.client_type' (head 16f243728b922b28b331a8d06cfdcfe064a68f6b) diff -r 74c0031a2eb2 -r 08c6a0c88b2b ChangeLog.API --- a/ChangeLog.API Sat Jun 06 23:14:17 2009 +0000 +++ b/ChangeLog.API Sun Jun 07 00:27:05 2009 +0000 @@ -66,6 +66,8 @@ update type is emitted when receiving an IM. Previously, the typing state was modified (and the buddy-typing-stopped signal emitted), but this signal was not emitted. + * Added a client_type field in the get_ui_info core UI op. See + core.h for details. Deprecated: * buddy-added and buddy-removed blist signals diff -r 74c0031a2eb2 -r 08c6a0c88b2b finch/finch.c --- a/finch/finch.c Sat Jun 06 23:14:17 2009 +0000 +++ b/finch/finch.c Sun Jun 07 00:27:05 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 74c0031a2eb2 -r 08c6a0c88b2b libpurple/core.h --- a/libpurple/core.h Sat Jun 06 23:14:17 2009 +0000 +++ b/libpurple/core.h Sun Jun 07 00:27:05 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 74c0031a2eb2 -r 08c6a0c88b2b libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Sat Jun 06 23:14:17 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Sun Jun 07 00:27:05 2009 +0000 @@ -2520,3 +2520,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.info) { + for (iter = jbr->caps.info->identities ; iter ; iter = g_list_next(iter)) { + const JabberIdentity *identity = + (JabberIdentity *) iter->data; + + if (strcmp(identity->category, category) == 0) { + return identity->type; + } + } + } + + return NULL; +} diff -r 74c0031a2eb2 -r 08c6a0c88b2b libpurple/protocols/jabber/buddy.h --- a/libpurple/protocols/jabber/buddy.h Sat Jun 06 23:14:17 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.h Sun Jun 07 00:27:05 2009 +0000 @@ -123,4 +123,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 74c0031a2eb2 -r 08c6a0c88b2b libpurple/protocols/jabber/disco.c diff -r 74c0031a2eb2 -r 08c6a0c88b2b libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sat Jun 06 23:14:17 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sun Jun 07 00:27:05 2009 +0000 @@ -23,6 +23,7 @@ #include "account.h" #include "accountopt.h" #include "blist.h" +#include "core.h" #include "cmds.h" #include "connection.h" #include "conversation.h" @@ -1919,6 +1920,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; } @@ -3396,9 +3419,26 @@ void jabber_init_plugin(PurplePlugin *plugin) { + GHashTable *ui_info = purple_core_get_ui_info(); + const gchar *ui_type; + const gchar *type = "pc"; /* default client type, if unknown or + unspecified */ + jabber_plugin = plugin; - jabber_add_identity("client", "pc", NULL, PACKAGE); + ui_type = ui_info ? g_hash_table_lookup(ui_info, "client_type") : NULL; + 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; + } + } + + jabber_add_identity("client", type, NULL, PACKAGE); /* initialize jabber_features list */ jabber_add_feature("jabber:iq:last", 0); diff -r 74c0031a2eb2 -r 08c6a0c88b2b libpurple/protocols/msn/state.c --- a/libpurple/protocols/msn/state.c Sat Jun 06 23:14:17 2009 +0000 +++ b/libpurple/protocols/msn/state.c Sun Jun 07 00:27:05 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 74c0031a2eb2 -r 08c6a0c88b2b pidgin/gtkmain.c --- a/pidgin/gtkmain.c Sat Jun 06 23:14:17 2009 +0000 +++ b/pidgin/gtkmain.c Sun Jun 07 00:27:05 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;