# HG changeset patch # User Jeffrey Connelly # Date 1181775474 0 # Node ID 4cb842e0649c07b3bc052df3ac956a9296f56b65 # Parent 7abd1eca3d18ac1acc46ec9ecf65f32bf9f1aaca Make msim_remove_buddy() functional. It now sends the delbuddy, persist, and blocklist commands, each using msim_postprocess_outgoing(). Tested by removing a buddy, restarting Pidgin, and ensuring it did not reappear. msim_postprocess_outgoing() and msim_postprocess_outgoing_cb() now both use msim_do_postprocessing() to do the actual postprocessing -- insertion of the uid into the message. msim_postprocess_outgoing() calls msim_do_postprocessing() if the uid is immediately available (for example, from the buddy list), while msim_postprocess_outgoing_cb() calls it when the uid was looked up from the server. The new function avoids code duplication, which is important now because of the additional feature of having "" within a string replaced with the uid, i instead of adding a new integer field of the uid. msim_remove_buddy uses this to insert the uid into the "body" field. diff -r 7abd1eca3d18 -r 4cb842e0649c libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Wed Jun 13 22:44:26 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Wed Jun 13 22:57:54 2007 +0000 @@ -1273,6 +1273,59 @@ #endif } +/** Perform actual postprocessing on a message, adding userid as specified. + * + * @param msg The message to postprocess. + * @param uid_before Name of field where to insert new field before, or NULL for end. + * @param uid_field_name Name of field to add uid to. + * @param uid The userid to insert. + * + * If the field named by uid_field_name already exists, then its string contents will + * be used for the field, except "" will be replaced by the userid. + * + * If the field named by uid_field_name does not exist, it will be added before the + * field named by uid_before, as an integer, with the userid. + * + * Does not handle sending, or scheduling userid lookup. For that, see msim_postprocess_outgoing(). + */ +MsimMessage *msim_do_postprocessing(MsimMessage *msg, gchar *uid_before, gchar *uid_field_name, guint uid) +{ + purple_debug_info("msim", "msim_do_postprocessing called with ufn=%s, ub=%s, uid=%d\n", + uid_field_name, uid_before, uid); + msim_msg_dump("msim_do_postprocessing msg: %s\n", msg); + + /* First, check - if the field already exists, treat it as a format string. */ + if (msim_msg_get(msg, uid_field_name)) + { + MsimMessageElement *elem; + gchar *fmt_string; + gchar *uid_str; + + /* Warning: this probably violates the encapsulation of MsimMessage */ + + elem = msim_msg_get(msg, uid_field_name); + g_return_val_if_fail(elem->type == MSIM_TYPE_STRING, NULL); + + /* Get the raw string, not with msim_msg_get_string() since that copies it. + * Want the original string so can free it. */ + fmt_string = (gchar *)(elem->data); + + uid_str = g_strdup_printf("%d", uid); + elem->data = str_replace(fmt_string, "", uid_str); + g_free(uid_str); + g_free(fmt_string); + + purple_debug_info("msim", "msim_postprocess_outgoing_cb: formatted new string, %s\n", + elem->data); + + } else { + /* Otherwise, insert new field into outgoing message. */ + msg = msim_msg_insert_before(msg, uid_before, uid_field_name, MSIM_TYPE_INTEGER, GUINT_TO_POINTER(uid)); + } + + return msg; +} + /** Callback for msim_postprocess_outgoing() to add a userid to a message, and send it (once receiving userid). * * @param session @@ -1285,12 +1338,7 @@ * _uid_before: string, name of field before field to insert, or NULL for end * * - * If the field named by _uid_field_name already exists, then its string contents will - * be treated as a format string, containing a "%d", to be replaced by the userid. - * - * If the field named by _uid_field_name does not exist, it will be added before the - * field named by _uid_before, as an integer, with the userid. - */ +*/ void msim_postprocess_outgoing_cb(MsimSession *session, MsimMessage *userinfo, gpointer data) { gchar *body_str; @@ -1314,34 +1362,15 @@ uid_field_name = msim_msg_get_string(msg, "_uid_field_name"); uid_before = msim_msg_get_string(msg, "_uid_before"); - /* First, check - if the field already exists, treat it as a format string. */ - if (msim_msg_get(msg, uid_field_name)) - { - MsimMessageElement *elem; - gchar *fmt_string; - - elem = msim_msg_get(msg, uid_field_name); - g_return_if_fail(elem->type == MSIM_TYPE_STRING); + msg = msim_do_postprocessing(msg, uid_before, uid_field_name, atol(uid)); - /* Get the raw string, not with msim_msg_get_string() since that copies it. - * Want the original string so can free it. */ - fmt_string = (gchar *)(elem->data); - - /* Format string: ....%d... */ - elem->data = g_strdup_printf(fmt_string, uid); - - g_free(fmt_string); - } else { - /* Otherwise, insert new field into outgoing message. */ - msg = msim_msg_insert_before(msg, uid_before, uid_field_name, MSIM_TYPE_STRING, uid); - } - /* Send */ if (!msim_msg_send(session, msg)) { purple_debug_info("msim", "msim_postprocess_outgoing_cb: sending failed for message: %s\n", msg); } + /* Free field names AFTER sending message, because MsimMessage does NOT copy * field names - instead, treats them as static strings (which they usually are). */ @@ -1371,6 +1400,7 @@ /* Store information for msim_postprocess_outgoing_cb(). */ purple_debug_info("msim", "msim_postprocess_outgoing(u=%s,ufn=%s,ub=%s)\n", username, uid_field_name, uid_before); + msim_msg_dump("msim_postprocess_outgoing: msg before=%s\n", msg); msg = msim_msg_append(msg, "_username", MSIM_TYPE_STRING, g_strdup(username)); msg = msim_msg_append(msg, "_uid_field_name", MSIM_TYPE_STRING, g_strdup(uid_field_name)); msg = msim_msg_append(msg, "_uid_before", MSIM_TYPE_STRING, g_strdup(uid_before)); @@ -1391,6 +1421,7 @@ if (!buddy || !uid) { + /* Don't have uid offhand - need to ask for it, and wait until hear back before sending. */ purple_debug_info("msim", ">>> msim_postprocess_outgoing: couldn't find username %s in blist\n", username); msim_msg_dump("msim_postprocess_outgoing - scheduling lookup, msg=%s\n", msg); @@ -1400,12 +1431,14 @@ } } - /* Already have uid, insert it and send msg immediately. */ + /* Already have uid, postprocess and send msg immediately. */ purple_debug_info("msim", "msim_postprocess_outgoing: found username %s has uid %d\n", username, uid); - msg = msim_msg_insert_before(msg, uid_before, uid_field_name, MSIM_TYPE_INTEGER, GUINT_TO_POINTER(uid)); + msg = msim_do_postprocessing(msg, uid_before, uid_field_name, uid); + msim_msg_dump("msim_postprocess_outgoing: msg after (uid immediate)=%s\n", msg); + rc = msim_msg_send(session, msg); //msim_msg_free(msg); @@ -1417,24 +1450,25 @@ void msim_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { MsimSession *session; - MsimMessage *msg; + MsimMessage *delbuddy_msg; MsimMessage *persist_msg; + MsimMessage *blocklist_msg; session = (MsimSession *)gc->proto_data; - msg = msim_msg_new(FALSE, + delbuddy_msg = msim_msg_new(TRUE, "delbuddy", MSIM_TYPE_BOOLEAN, TRUE, "sesskey", MSIM_TYPE_INTEGER, session->sesskey, /* 'delprofileid' with uid will be inserted here. */ NULL); /* TODO: free msg */ - if (!msim_postprocess_outgoing(session, msg, buddy->name, "delprofileid", NULL)) + if (!msim_postprocess_outgoing(session, delbuddy_msg, buddy->name, "delprofileid", NULL)) { purple_notify_error(NULL, NULL, _("Failed to remove buddy"), _("'delbuddy' command failed")); return; } - persist_msg = msim_msg_new(FALSE, + persist_msg = msim_msg_new(TRUE, "persist", MSIM_TYPE_INTEGER, 1, "sesskey", MSIM_TYPE_INTEGER, session->sesskey, "cmd", MSIM_TYPE_INTEGER, MSIM_CMD_BIT_ACTION | MSIM_CMD_DELETE, @@ -1442,16 +1476,30 @@ "lid", MSIM_TYPE_INTEGER, MD_DELETE_BUDDY_LID, "uid", MSIM_TYPE_INTEGER, session->userid, "rid", MSIM_TYPE_INTEGER, session->next_rid++, - "body", MSIM_TYPE_STRING, g_strdup("ContactID=%d"), + /* will be replaced by postprocessing */ + "body", MSIM_TYPE_STRING, g_strdup("ContactID="), NULL); /* TODO: free msg */ - if (!msim_postprocess_outgoing(session, msg, buddy->name, "body", NULL)) + if (!msim_postprocess_outgoing(session, persist_msg, buddy->name, "body", NULL)) { purple_notify_error(NULL, NULL, _("Failed to remove buddy"), _("persist command failed")); return; } + blocklist_msg = msim_msg_new(TRUE, + "blocklist", MSIM_TYPE_BOOLEAN, TRUE, + "sesskey", MSIM_TYPE_INTEGER, session->sesskey, + /* TODO: MsimMessage lists */ + "idlist", MSIM_TYPE_STRING, g_strdup("a-||b-|"), + NULL); + + if (!msim_postprocess_outgoing(session, blocklist_msg, buddy->name, "idlist", NULL)) + { + purple_notify_error(NULL, NULL, _("Failed to remove buddy"), _("blocklist command failed")); + return; + } + /* TODO: update blocklist */ } diff -r 7abd1eca3d18 -r 4cb842e0649c libpurple/protocols/myspace/myspace.h --- a/libpurple/protocols/myspace/myspace.h Wed Jun 13 22:44:26 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.h Wed Jun 13 22:57:54 2007 +0000 @@ -171,6 +171,7 @@ gboolean msim_process(MsimSession *session, MsimMessage *msg); +MsimMessage *msim_do_postprocessing(MsimMessage *msg, gchar *uid_field_name, gchar *uid_before, guint uid); void msim_postprocess_outgoing_cb(MsimSession *session, MsimMessage *userinfo, gpointer data); gboolean msim_postprocess_outgoing(MsimSession *session, MsimMessage *msg, gchar *username, gchar *uid_field_name, gchar *uid_before);