Mercurial > pidgin.yaz
diff libpurple/protocols/myspace/myspace.c @ 17899:61f0b36b9891
Retrieve information for profile ("Get Info") from server, instead of from
cached buddy list information. Allows getting info for not only online users,
but also offline users, and users not on buddy list (by username or uid).
author | Jeffrey Connelly <jaconnel@calpoly.edu> |
---|---|
date | Thu, 21 Jun 2007 05:50:41 +0000 |
parents | 60f614824207 |
children | f903418147f6 |
line wrap: on
line diff
--- a/libpurple/protocols/myspace/myspace.c Wed Jun 20 04:52:01 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Thu Jun 21 05:50:41 2007 +0000 @@ -777,70 +777,127 @@ return 0; } -/** Retrieve a user's profile. */ -void msim_get_info(PurpleConnection *gc, const gchar *name) +/** Callback for msim_get_info(), for when user info is received. */ +void msim_get_info_cb(MsimSession *session, MsimMessage *user_info_msg, gpointer data) { + GHashTable *body; + gchar *body_str; + MsimMessage *msg; + gchar *user; PurpleNotifyUserInfo *user_info; PurpleBuddy *buddy; - MsimSession *session; + gchar *song; + - session = (MsimSession *)gc->proto_data; + /* Get user{name,id} from msim_get_info, passed as an MsimMessage for orthogonality. */ + msg = (MsimMessage *)data; + user = g_strdup(msim_msg_get_string(msg, "user")); + purple_debug_info("msim", "msim_get_info_cb: got for user: %s\n", user); + msim_msg_free(msg); + + + body_str = msim_msg_get_string(user_info_msg, "body"); + body = msim_parse_body(body_str); + g_free(body_str); + + buddy = purple_find_buddy(session->account, user); + /* Note: don't assume buddy is non-NULL; will be if lookup random user not on blist. */ user_info = purple_notify_user_info_new(); - buddy = purple_find_buddy(session->account, name); - if (!buddy) - { - /* TODO: profile of buddies not on blist! Wouldn't be too hard, - * just have to schedule a lookup, and when receive reply, - * call purple_notify_userinfo() etc. - */ - purple_notify_user_info_add_pair(user_info, NULL, - "Sorry, currently user information can only be retrieved from users on your buddy list."); - purple_notify_userinfo(gc, name, user_info, NULL, NULL); - purple_notify_user_info_destroy(user_info); - return; - } + /* Identification */ + purple_notify_user_info_add_pair(user_info, _("User"), user); - - /* Identification */ - purple_notify_user_info_add_pair(user_info, "User Name", - purple_blist_node_get_string(&buddy->node, "UserName")); - - - purple_notify_user_info_add_pair(user_info, "User ID", - g_strdup_printf("%d", purple_blist_node_get_int(&buddy->node, "UserID"))); - - purple_notify_user_info_add_pair(user_info, "Display Name", - purple_blist_node_get_string(&buddy->node, "DisplayName")); - + /* note: g_hash_table_lookup does not create a new string! */ + purple_notify_user_info_add_pair(user_info, _("User ID"), + g_strdup(g_hash_table_lookup(body, "UserID"))); /* a/s/l...the vitals */ - purple_notify_user_info_add_pair(user_info, "Age", - g_strdup_printf("%d", purple_blist_node_get_int(&buddy->node, "Age"))); + purple_notify_user_info_add_pair(user_info, _("Age"), + g_strdup(g_hash_table_lookup(body, "Age"))); - purple_notify_user_info_add_pair(user_info, "Gender", - purple_blist_node_get_string(&buddy->node, "Gender")); + purple_notify_user_info_add_pair(user_info, _("Gender"), + g_strdup(g_hash_table_lookup(body, "Gender"))); - purple_notify_user_info_add_pair(user_info, "Location", - purple_blist_node_get_string(&buddy->node, "Location")); + purple_notify_user_info_add_pair(user_info, _("Location"), + g_strdup(g_hash_table_lookup(body, "Location"))); /* Other information */ - if (purple_blist_node_get_string(&buddy->node, "Headline")) + + /* Headline comes from buddy status messages */ + if (buddy && purple_blist_node_get_string(&buddy->node, "Headline")) purple_notify_user_info_add_pair(user_info, "Headline", purple_blist_node_get_string(&buddy->node, "Headline")); - purple_notify_user_info_add_pair(user_info, "Song", - g_strdup_printf("%s - %s", - purple_blist_node_get_string(&buddy->node, "BandName"), - purple_blist_node_get_string(&buddy->node, "SongName"))); - - purple_notify_user_info_add_pair(user_info, "Total Friends", - g_strdup_printf("%d", purple_blist_node_get_int(&buddy->node, "TotalFriends"))); + song = g_strdup_printf("%s - %s", + (gchar *)g_hash_table_lookup(body, "BandName"), + (gchar *)g_hash_table_lookup(body, "SongName")); - purple_notify_userinfo(gc, name, user_info, NULL, NULL); - purple_notify_user_info_destroy(user_info); + purple_notify_user_info_add_pair(user_info, _("Song"), song); + /* Do not free song - used by user_info. */ + + /* Total friends only available if looked up by uid, not username. */ + if (g_hash_table_lookup(body, "TotalFriends")) + purple_notify_user_info_add_pair(user_info, _("Total Friends"), + g_strdup(g_hash_table_lookup(body, "TotalFriends"))); + + purple_notify_userinfo(session->gc, user, user_info, NULL, NULL); + purple_debug_info("msim", "msim_get_info_cb: username=%s\n", user); + //purple_notify_user_info_destroy(user_info); + /* Do not free username, since it will be used by user_info. */ + + //g_hash_table_destroy(body); +} + +/** Retrieve a user's profile. */ +void msim_get_info(PurpleConnection *gc, const gchar *user) +{ + PurpleBuddy *buddy; + MsimSession *session; + guint uid; + gchar *user_to_lookup; + MsimMessage *user_msg; + + session = (MsimSession *)gc->proto_data; + + /* Obtain uid of buddy. */ + buddy = purple_find_buddy(session->account, user); + if (buddy) + { + uid = purple_blist_node_get_int(&buddy->node, "UserID"); + if (!uid) + { + PurpleNotifyUserInfo *user_info; + + user_info = purple_notify_user_info_new(); + purple_notify_user_info_add_pair(user_info, NULL, + _("This buddy appears to not have a userid stored in the buddy list, can't look up. Is the user really on the buddy list?")); + + purple_notify_userinfo(session->gc, user, user_info, NULL, NULL); + purple_notify_user_info_destroy(user_info); + return; + } + + user_to_lookup = g_strdup_printf("%d", uid); + } else { + + /* Looking up buddy not on blist. Lookup by whatever user entered. */ + user_to_lookup = g_strdup(user); + } + + /* Pass the username to msim_get_info_cb(), because since we lookup + * by userid, the userinfo message will only contain the uid (not + * the username). + */ + user_msg = msim_msg_new(TRUE, + "user", MSIM_TYPE_STRING, g_strdup(user), + NULL); + purple_debug_info("msim", "msim_get_info, setting up lookup, user=%s\n", user); + + msim_lookup_user(session, user_to_lookup, msim_get_info_cb, user_msg); + + g_free(user_to_lookup); } /** After a uid is resolved to username, tag it with the username and submit for processing. @@ -1001,10 +1058,14 @@ return msim_process(session, msg); } else { + gchar *from; + /* Send lookup request. */ /* XXX: where is msim_msg_get_string() freed? make _strdup and _nonstrdup. */ purple_debug_info("msim", "msim_incoming: sending lookup, setting up callback\n"); - msim_lookup_user(session, msim_msg_get_string(msg, "f"), msim_incoming_resolved, msim_msg_clone(msg)); + from = msim_msg_get_string(msg, "f"); + msim_lookup_user(session, from, msim_incoming_resolved, msim_msg_clone(msg)); + g_free(from); /* indeterminate */ return TRUE; @@ -1952,7 +2013,7 @@ * Asynchronously lookup user information, calling callback when receive result. * * @param session - * @param user The user id, email address, or username. + * @param user The user id, email address, or username. Not freed. * @param cb Callback, called with user information when available. * @param data An arbitray data pointer passed to the callback. */ @@ -2097,31 +2158,30 @@ purple_blist_node_get_string(&buddy->node, "DisplayName")); */ /* Useful to identify the account the tooltip refers to. Other prpls show this. */ - purple_notify_user_info_add_pair(user_info, "Account", - purple_blist_node_get_string(&buddy->node, "UserName")); - + purple_notify_user_info_add_pair(user_info, _("User Name"), + (purple_blist_node_get_string(&buddy->node, "UserName"))); /* a/s/l...the vitals */ - purple_notify_user_info_add_pair(user_info, "Age", + purple_notify_user_info_add_pair(user_info, _("Age"), g_strdup_printf("%d", purple_blist_node_get_int(&buddy->node, "Age"))); - purple_notify_user_info_add_pair(user_info, "Gender", - purple_blist_node_get_string(&buddy->node, "Gender")); + purple_notify_user_info_add_pair(user_info, _("Gender"), + (purple_blist_node_get_string(&buddy->node, "Gender"))); - purple_notify_user_info_add_pair(user_info, "Location", - purple_blist_node_get_string(&buddy->node, "Location")); + purple_notify_user_info_add_pair(user_info, _("Location"), + (purple_blist_node_get_string(&buddy->node, "Location"))); /* Other information */ if (purple_blist_node_get_string(&buddy->node, "Headline")) - purple_notify_user_info_add_pair(user_info, "Headline", - purple_blist_node_get_string(&buddy->node, "Headline")); + purple_notify_user_info_add_pair(user_info, _("Headline"), + (purple_blist_node_get_string(&buddy->node, "Headline"))); - purple_notify_user_info_add_pair(user_info, "Song", + purple_notify_user_info_add_pair(user_info, _("Song"), g_strdup_printf("%s - %s", purple_blist_node_get_string(&buddy->node, "BandName"), purple_blist_node_get_string(&buddy->node, "SongName"))); - purple_notify_user_info_add_pair(user_info, "Total Friends", + purple_notify_user_info_add_pair(user_info, _("Total Friends"), g_strdup_printf("%d", purple_blist_node_get_int(&buddy->node, "TotalFriends"))); }