# HG changeset patch # User Jeffrey Connelly # Date 1181769708 0 # Node ID 2aff11bb5e72a625b12562f637bd0c8c514e4a56 # Parent d9aaccef87214944cceb84a0b0dbdb8dacc7a578 Several small changes to work towards a working msim_remove_buddy(): (Note: I'm not there yet) Change MsimSession.userid to an integer. Change msim_postprocess_outgoing() to accept a format string in the _uid_field_name field, having "%d" replaced with the userid (instead of adding a new field with the userid). Added so that the "body" field can be postprocessed. Enable msim_remove_buddy() to send the persistance buddy delete message, but it does not yet work. Add msim_new_reply_callback() for setting up a persistance reply callback, instead of having to manually insert into the hash tables. Add msim_msg_get_own_uid{,_cb}() to get our own userid. Rename MG_YOUR_MYSPACE_INFO to MG_OWN_MYSPACE_INFO. diff -r d9aaccef8721 -r 2aff11bb5e72 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Tue Jun 12 03:40:38 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Wed Jun 13 21:21:48 2007 +0000 @@ -260,7 +260,6 @@ purple_connection_error(gc, _("Couldn't create socket")); return; } - } /** * Process a login challenge, sending a response. @@ -943,14 +942,12 @@ purple_connection_update_progress(session->gc, _("Connected"), 3, 4); - /* Freed in msim_session_destroy */ session->sesskey = msim_msg_get_integer(msg, "sesskey"); purple_debug_info("msim", "SESSKEY=<%d>\n", session->sesskey); /* Comes with: proof,profileid,userid,uniquenick -- all same values - * (at least for me). */ - /* Freed in msim_session_destroy */ - session->userid = msim_msg_get_string(msg, "userid"); + * some of the time, but can vary. */ + session->userid = msim_msg_get_integer(msg, "userid"); purple_connection_set_state(session->gc, PURPLE_CONNECTED); @@ -1276,7 +1273,24 @@ #endif } -/* Callback for msim_postprocess_outgoing() to add a uid field, after resolving username/email. */ +/** Callback for msim_postprocess_outgoing() to add a userid to a message, and send it (once receiving userid). + * + * @param session + * @param userinfo The user information reply message, containing the user ID + * @param data The message to postprocess and send. + * + * The data message should contain these fields: + * + * _uid_field_name: string, name of field to add with userid from userinfo message + * _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; @@ -1297,11 +1311,30 @@ uid = g_strdup(g_hash_table_lookup(body, "UserID")); g_hash_table_destroy(body); - /* Insert into outgoing message. */ uid_field_name = msim_msg_get_string(msg, "_uid_field_name"); uid_before = msim_msg_get_string(msg, "_uid_before"); - msg = msim_msg_insert_before(msg, uid_before, uid_field_name, MSIM_TYPE_STRING, uid); + /* 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); + + /* 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)) @@ -1385,6 +1418,7 @@ { MsimSession *session; MsimMessage *msg; + MsimMessage *persist_msg; session = (MsimSession *)gc->proto_data; @@ -1399,11 +1433,8 @@ purple_notify_error(NULL, NULL, _("Failed to remove buddy"), _("'delbuddy' command failed")); return; } - - /* TODO */ -#if 0 - if (!msim_send(session, + persist_msg = msim_msg_new(FALSE, "persist", MSIM_TYPE_INTEGER, 1, "sesskey", MSIM_TYPE_INTEGER, session->sesskey, "cmd", MSIM_TYPE_INTEGER, MSIM_CMD_BIT_ACTION | MSIM_CMD_DELETE, @@ -1411,13 +1442,15 @@ "lid", MSIM_TYPE_INTEGER, MD_DELETE_BUDDY_LID, "uid", MSIM_TYPE_INTEGER, 42, /* TODO: put YOUR userid here */ "rid", MSIM_TYPE_INTEGER, session->next_rid++, - "body", MSIM_TYPE_STRING, g_strdup_printf("ContactID=%s", buddy->name), - NULL)) + "body", MSIM_TYPE_STRING, g_strdup("ContactID=%d"), + NULL); + + /* TODO: free msg */ + if (!msim_postprocess_outgoing(session, msg, buddy->name, "body", NULL)) { purple_notify_error(NULL, NULL, _("Failed to remove buddy"), _("persist command failed")); return; } -#endif /* TODO: update blocklist */ } @@ -1553,6 +1586,55 @@ } } +/* Setup a callback, to be called when a reply is received with the returned rid. + * + * @param cb The callback, an MSIM_USER_LOOKUP_CB. + * @param data Arbitrary user data to be passed to callback (probably an MsimMessage *). + * + * @return The request/reply ID, used to link replies with requests. Put the rid in your request. + * + * TODO: Make more generic and more specific: + * 1) MSIM_USER_LOOKUP_CB - make it for PERSIST_REPLY, not just user lookup + * 2) data - make it an MsimMessage? + */ +guint msim_new_reply_callback(MsimSession *session, MSIM_USER_LOOKUP_CB cb, gpointer data) +{ + guint rid; + + rid = session->next_rid++; + + g_hash_table_insert(session->user_lookup_cb, GUINT_TO_POINTER(rid), cb); + g_hash_table_insert(session->user_lookup_cb_data, GUINT_TO_POINTER(rid), data); + + return rid; +} + +/** Process reply to get our own userid. */ +void msim_get_own_uid_cb(MsimSession *session, MsimMessage *userinfo, gpointer data) +{ + /* TODO */ + msim_msg_dump("msim_get_own_uid_cb: %s\n", userinfo); +} + +/** Request our own userid. */ +void msim_get_own_uid(MsimSession *session) +{ + guint rid; + + rid = msim_new_reply_callback(session, msim_get_own_uid_cb, NULL); + + g_return_if_fail(msim_send(session, + "persist", MSIM_TYPE_INTEGER, 1, + "sesskey", MSIM_TYPE_INTEGER, session->sesskey, + "cmd", MSIM_TYPE_INTEGER, 1, + "dsn", MSIM_TYPE_INTEGER, MG_OWN_MYSPACE_INFO_DSN, + "lid", MSIM_TYPE_INTEGER, MG_OWN_MYSPACE_INFO_LID, + "rid", MSIM_TYPE_INTEGER, rid, + "body", MSIM_TYPE_STRING, g_strdup(""), + NULL)); +} + + /** * Callback when connected. Sets up input handlers. * @@ -1568,7 +1650,7 @@ g_return_if_fail(data != NULL); gc = (PurpleConnection *)data; - session = gc->proto_data; + session = (MsimSession *)gc->proto_data; if (source < 0) { @@ -1738,12 +1820,8 @@ } #endif - rid = session->next_rid; - ++session->next_rid; - /* Setup callback. Response will be associated with request using 'rid'. */ - g_hash_table_insert(session->user_lookup_cb, GUINT_TO_POINTER(rid), cb); - g_hash_table_insert(session->user_lookup_cb_data, GUINT_TO_POINTER(rid), data); + rid = msim_new_reply_callback(session, cb, data); /* Send request */ diff -r d9aaccef8721 -r 2aff11bb5e72 libpurple/protocols/myspace/myspace.h --- a/libpurple/protocols/myspace/myspace.h Tue Jun 12 03:40:38 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.h Wed Jun 13 21:21:48 2007 +0000 @@ -114,7 +114,7 @@ PurpleAccount *account; PurpleConnection *gc; guint sesskey; /**< Session key from server */ - gchar *userid; /**< This user's numeric user ID */ + guint userid; /**< This user's numeric user ID */ gint fd; /**< File descriptor to/from server */ /* TODO: Remove. */ @@ -184,6 +184,12 @@ void msim_input_cb(gpointer gc_uncasted, gint source, PurpleInputCondition cond); + +guint msim_new_reply_callback(MsimSession *session, MSIM_USER_LOOKUP_CB cb, gpointer data); + +void msim_get_own_uid_cb(MsimSession *session, MsimMessage *userinfo, gpointer data); +void msim_get_own_uid(MsimSession *session); + void msim_connect_cb(gpointer data, gint source, const gchar *error_message); diff -r d9aaccef8721 -r 2aff11bb5e72 libpurple/protocols/myspace/persist.h --- a/libpurple/protocols/myspace/persist.h Tue Jun 12 03:40:38 2007 +0000 +++ b/libpurple/protocols/myspace/persist.h Wed Jun 13 21:21:48 2007 +0000 @@ -62,7 +62,7 @@ MSIM_PERSIST_DSN_LID(MG_IM_INFO_BY_ID, 1, 17) MSIM_PERSIST_DSN_LID(MG_LIST_ALL_GROUPS, 2, 6) MSIM_PERSIST_DSN_LID(MG_MYSPACE_INFO_BY_ID, 4, 3) -MSIM_PERSIST_DSN_LID(MG_YOUR_MYSPACE_INFO, 4, 5) +MSIM_PERSIST_DSN_LID(MG_OWN_MYSPACE_INFO, 4, 5) MSIM_PERSIST_DSN_LID(MG_MYSPACE_INFO_BY_STRING, 5, 7) MSIM_PERSIST_DSN_LID(MG_CHECK_MAIL, 7, 18) MSIM_PERSIST_DSN_LID(MG_WEB_CHALLENGE, 17, 26)