/pidgin/main: 554bc9cc52a8: MXit: When sending a structured resp...
Andrew Victor
andrew.victor at mxit.com
Wed Jan 16 09:34:42 EST 2013
Changeset: 554bc9cc52a833d0c258e1a8a66f09612230107c
Author: Andrew Victor <andrew.victor at mxit.com>
Date: 2013-01-16 15:08 +0200
Branch: release-2.x.y
URL: http://hg.pidgin.im/pidgin/main/rev/554bc9cc52a8
Description:
MXit: When sending a structured response when the user clicks on a link, the format of the response message was not totally correct.
It would still work for 99% of services, but this fix improves the handling of structured response messages.
diffstat:
libpurple/protocols/mxit/formcmds.c | 25 +++++++++++++++----------
libpurple/protocols/mxit/markup.c | 26 ++++++++++++++++++--------
libpurple/protocols/mxit/markup.h | 2 +-
libpurple/protocols/mxit/mxit.c | 14 +++++++-------
4 files changed, 41 insertions(+), 26 deletions(-)
diffs (178 lines):
diff --git a/libpurple/protocols/mxit/formcmds.c b/libpurple/protocols/mxit/formcmds.c
--- a/libpurple/protocols/mxit/formcmds.c
+++ b/libpurple/protocols/mxit/formcmds.c
@@ -248,8 +248,8 @@ static void command_clear(struct MXitSes
/*------------------------------------------------------------------------
* Process a Reply MXit command.
- * [::op=cmd|type=reply|replymsg=back|selmsg=b) Back|id=12345:]
- * [::op=cmd|nm=rep|type=reply|replymsg=back|selmsg=b) Back|id=12345:]
+ * [::op=cmd|type=reply|replymsg=back|selmsg=b) Back|displaymsg=Processing|id=12345:]
+ * [::op=cmd|nm=rep|type=reply|replymsg=back|selmsg=b) Back|displaymsg=Processing|id=12345:]
*
* @param mx The received message data object
* @param hash The MXit command <key,value> map
@@ -260,22 +260,26 @@ static void command_reply(struct RXMsgDa
char* selmsg;
char* nm;
- selmsg = g_hash_table_lookup(hash, "selmsg"); /* find the selection message */
- replymsg = g_hash_table_lookup(hash, "replymsg"); /* find the reply message */
+ selmsg = g_hash_table_lookup(hash, "selmsg"); /* selection message */
+ replymsg = g_hash_table_lookup(hash, "replymsg"); /* reply message */
nm = g_hash_table_lookup(hash, "nm"); /* name parameter */
- if ((selmsg) && (replymsg) && (nm)) {
+
+ if ((selmsg == NULL) || (replymsg == NULL))
+ return; /* these parameters are required */
+
+ if (nm) { /* indicates response must be a structured response */
gchar* seltext = g_markup_escape_text(purple_url_decode(selmsg), -1);
- gchar* replycmd = g_strdup_printf("::type=reply|nm=%s|res=%s|err=0:", nm, replymsg);
+ gchar* replycmd = g_strdup_printf("type=reply|nm=%s|res=%s|err=0", nm, replymsg);
- mxit_add_html_link( mx, replycmd, seltext );
+ mxit_add_html_link( mx, replycmd, TRUE, seltext );
g_free(seltext);
g_free(replycmd);
}
- else if ((selmsg) && (replymsg)) {
+ else {
gchar* seltext = g_markup_escape_text(purple_url_decode(selmsg), -1);
- mxit_add_html_link( mx, purple_url_decode(replymsg), seltext );
+ mxit_add_html_link( mx, purple_url_decode(replymsg), FALSE, seltext );
g_free(seltext);
}
@@ -312,6 +316,7 @@ static void command_platformreq(GHashTab
/*------------------------------------------------------------------------
* Process an inline image MXit command.
+ * [::op=img|dat=ASDF23408asdflkj2309flkjsadf%3d%3d|algn=1|w=120|h=12|t=100|replymsg=text:]
*
* @param mx The received message data object
* @param hash The MXit command <key,value> map
@@ -367,7 +372,7 @@ static void command_image(struct RXMsgDa
reply = g_hash_table_lookup(hash, "replymsg");
if (reply) {
g_string_append_printf(msg, "\n");
- mxit_add_html_link(mx, reply, _( "click here" ));
+ mxit_add_html_link(mx, purple_url_decode(reply), FALSE, _( "click here" ));
}
}
diff --git a/libpurple/protocols/mxit/markup.c b/libpurple/protocols/mxit/markup.c
--- a/libpurple/protocols/mxit/markup.c
+++ b/libpurple/protocols/mxit/markup.c
@@ -126,10 +126,11 @@ static void hex_dump( const char* buf, i
* Adds a link to a message
*
* @param mx The Markup message object
- * @param linkname This is the what will be returned when the link gets clicked
- * @param displayname This is the name for the link which will be displayed in the UI
+ * @param replydata This is the what will be returned when the link gets clicked
+ * @param isStructured Indicates that the reply is a structured reply
+ * @param displaytext This is the text for the link which will be displayed in the UI
*/
-void mxit_add_html_link( struct RXMsgData* mx, const char* linkname, const char* displayname )
+void mxit_add_html_link( struct RXMsgData* mx, const char* replydata, gboolean isStructured, const char* displaytext )
{
#ifdef MXIT_LINK_CLICK
char retstr[256];
@@ -137,15 +138,24 @@ void mxit_add_html_link( struct RXMsgDat
char link[256];
int len;
- len = g_snprintf( retstr, sizeof( retstr ), "%s|%s|%s|%s|%s", MXIT_LINK_KEY, purple_account_get_username( mx->session->acc ),
- purple_account_get_protocol_id( mx->session->acc ), mx->from, linkname );
+ /*
+ * The link content is encoded as follows:
+ * MXIT_LINK_KEY | ACCOUNT_USER | ACCOUNT_PROTO | REPLY_TO | REPLY_FORMAT | REPLY_DATA
+ */
+ len = g_snprintf( retstr, sizeof( retstr ), "%s|%s|%s|%s|%i|%s",
+ MXIT_LINK_KEY,
+ purple_account_get_username( mx->session->acc ),
+ purple_account_get_protocol_id( mx->session->acc ),
+ mx->from,
+ isStructured ? 1 : 0,
+ replydata );
retstr64 = purple_base64_encode( (const unsigned char*) retstr, len );
g_snprintf( link, sizeof( link ), "%s%s", MXIT_LINK_PREFIX, retstr64 );
g_free( retstr64 );
- g_string_append_printf( mx->msg, "<a href=\"%s\">%s</a>", link, displayname );
+ g_string_append_printf( mx->msg, "<a href=\"%s\">%s</a>", link, displaytext );
#else
- g_string_append_printf( mx->msg, "<b>%s</b>", linkname );
+ g_string_append_printf( mx->msg, "<b>%s</b>", replydata );
#endif
}
@@ -826,7 +836,7 @@ void mxit_parse_markup( struct RXMsgData
if ( ch ) {
/* end found */
*ch = '\0';
- mxit_add_html_link( mx, &message[i + 1], &message[i + 1] );
+ mxit_add_html_link( mx, &message[i + 1], FALSE, &message[i + 1] );
*ch = '$';
i += ( ch - &message[i + 1] ) + 1;
}
diff --git a/libpurple/protocols/mxit/markup.h b/libpurple/protocols/mxit/markup.h
--- a/libpurple/protocols/mxit/markup.h
+++ b/libpurple/protocols/mxit/markup.h
@@ -31,7 +31,7 @@
void mxit_parse_markup( struct RXMsgData* mx, char* message, int len, short msgtype, int msgflags );
char* mxit_convert_markup_tx( const char* message, int* msgtype );
-void mxit_add_html_link( struct RXMsgData* mx, const char* linkname, const char* displayname );
+void mxit_add_html_link( struct RXMsgData* mx, const char* replydata, gboolean isStructured, const char* displaytext );
void mxit_show_message( struct RXMsgData* mx );
void mxit_free_emoticon_cache( struct MXitSession* session );
diff --git a/libpurple/protocols/mxit/mxit.c b/libpurple/protocols/mxit/mxit.c
--- a/libpurple/protocols/mxit/mxit.c
+++ b/libpurple/protocols/mxit/mxit.c
@@ -58,7 +58,7 @@ static int not_link_ref_count = 0;
static void* mxit_link_click( const char* link64 )
{
PurpleAccount* account;
- PurpleConnection* con;
+ PurpleConnection* gc;
gchar** parts = NULL;
gchar* link = NULL;
gsize len;
@@ -75,10 +75,10 @@ static void* mxit_link_click( const char
link = (gchar*) purple_base64_decode( link64 + strlen( MXIT_LINK_PREFIX ), &len );
purple_debug_info( MXIT_PLUGIN_ID, "Clicked Link: '%s'\n", link );
- parts = g_strsplit( link, "|", 5 );
+ parts = g_strsplit( link, "|", 6 );
/* check if this is a valid mxit link */
- if ( ( !parts ) || ( !parts[0] ) || ( !parts[1] ) || ( !parts[2] ) || ( !parts[3] ) || ( !parts[4] ) ) {
+ if ( ( !parts ) || ( !parts[0] ) || ( !parts[1] ) || ( !parts[2] ) || ( !parts[3] ) || ( !parts[4] ) || ( !parts[5] ) ) {
/* this is not for us */
goto skip;
}
@@ -91,15 +91,15 @@ static void* mxit_link_click( const char
account = purple_accounts_find( parts[1], parts[2] );
if ( !account )
goto skip;
- con = purple_account_get_connection( account );
- if ( !con )
+ gc = purple_account_get_connection( account );
+ if ( !gc )
goto skip;
/* determine if it's a command-response to send */
- is_command = g_str_has_prefix( parts[4], "::type=reply|" );
+ is_command = ( atoi( parts[4] ) == 1 );
/* send click message back to MXit */
- mxit_send_message( con->proto_data, parts[3], parts[4], FALSE, is_command );
+ mxit_send_message( purple_connection_get_protocol_data( gc ), parts[3], parts[5], FALSE, is_command );
g_free( link );
link = NULL;
More information about the Commits
mailing list