/pidgin/main: 4a87c767a037: MXit: Add support for typing notific...
Andrew Victor
andrew.victor at mxit.com
Tue Dec 18 08:54:13 EST 2012
Changeset: 4a87c767a037b093e00a730913c8066e14c49c8e
Author: Andrew Victor <andrew.victor at mxit.com>
Date: 2012-12-18 15:27 +0200
Branch: release-2.x.y
URL: http://hg.pidgin.im/pidgin/main/rev/4a87c767a037
Description:
MXit: Add support for typing notification.
diffstat:
ChangeLog | 1 +
libpurple/protocols/mxit/mxit.c | 55 ++++++++++++++++++++++++++++++++++++-
libpurple/protocols/mxit/protocol.c | 46 ++++++++++++++++++++++++++++++
libpurple/protocols/mxit/protocol.h | 11 ++++++-
libpurple/protocols/mxit/roster.h | 1 +
5 files changed, 112 insertions(+), 2 deletions(-)
diffs (194 lines):
diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -35,6 +35,7 @@ version 2.10.7:
MXit:
* Display farewell messages in a different colour to distinguish
them from normal messages.
+ * Add support for typing notification.
Yahoo!:
* Fix a double-free in profile/picture loading code. (Mihai Serban)
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
@@ -659,6 +659,59 @@ static GList* mxit_blist_menu( PurpleBli
return m;
}
+
+/*------------------------------------------------------------------------
+ * Send a typing indicator event.
+ *
+ * @param gc The connection object
+ * @param name The username of the contact
+ * @param state The typing state to be reported.
+ */
+static unsigned int mxit_send_typing( PurpleConnection *gc, const char *name, PurpleTypingState state )
+{
+ PurpleAccount* account = purple_connection_get_account( gc );
+ struct MXitSession* session = purple_connection_get_protocol_data( gc );
+ PurpleBuddy* buddy;
+ struct contact* contact;
+ gchar* messageId = NULL;
+
+ /* find the buddy information for this contact (reference: "libpurple/blist.h") */
+ buddy = purple_find_buddy( account, name );
+ if ( !buddy ) {
+ purple_debug_warning( MXIT_PLUGIN_ID, "mxit_send_typing: unable to find the buddy '%s'\n", name );
+ return 0;
+ }
+
+ contact = purple_buddy_get_protocol_data( buddy );
+ if ( !contact )
+ return 0;
+
+ /* does this contact support and want typing notification? */
+ if ( ! ( contact->capabilities & MXIT_PFLAG_TYPING ) )
+ return 0;
+
+ messageId = purple_uuid_random(); /* generate a unique message id */
+
+ switch ( state ) {
+ case PURPLE_TYPING : /* currently typing */
+ mxit_send_msgevent( session, name, messageId, CP_MSGEVENT_TYPING );
+ break;
+
+ case PURPLE_TYPED : /* stopped typing */
+ case PURPLE_NOT_TYPING : /* not typing / erased all text */
+ mxit_send_msgevent( session, name, messageId, CP_MSGEVENT_STOPPED );
+ break;
+
+ default:
+ break;
+ }
+
+ g_free( messageId );
+
+ return 0;
+}
+
+
/*========================================================================================================================*/
static PurplePluginProtocolInfo proto_info = {
@@ -685,7 +738,7 @@ static PurplePluginProtocolInfo proto_in
mxit_close, /* close */
mxit_send_im, /* send_im */
NULL, /* set_info */
- NULL, /* send_typing */
+ mxit_send_typing, /* send_typing */
mxit_get_info, /* get_info */
mxit_set_status, /* set_status */
NULL, /* set_idle */
diff --git a/libpurple/protocols/mxit/protocol.c b/libpurple/protocols/mxit/protocol.c
--- a/libpurple/protocols/mxit/protocol.c
+++ b/libpurple/protocols/mxit/protocol.c
@@ -2019,6 +2019,47 @@ static void mxit_parse_cmd_suggestcontac
g_list_foreach( entries, (GFunc)g_free, NULL );
}
+/*------------------------------------------------------------------------
+ * Process a received message event packet.
+ *
+ * @param session The MXit session object
+ * @param records The packet's data records
+ * @param rcount The number of data records
+ */
+static void mxit_parse_cmd_msgevent( struct MXitSession* session, struct record** records, int rcount )
+{
+ int event;
+
+ /*
+ * contactAddress \1 dateTime \1 id \1 event
+ */
+
+ /* strip off dummy domain */
+ mxit_strip_domain( records[0]->fields[0]->data );
+
+ event = atoi( records[0]->fields[3]->data );
+
+ switch ( event ) {
+ case CP_MSGEVENT_TYPING : /* user is typing */
+ case CP_MSGEVENT_ANGRY : /* user is typing angrily */
+ serv_got_typing( session->con, records[0]->fields[0]->data, 0, PURPLE_TYPING );
+ break;
+
+ case CP_MSGEVENT_STOPPED : /* user has stopped typing */
+ serv_got_typing_stopped( session->con, records[0]->fields[0]->data );
+ break;
+
+ case CP_MSGEVENT_ERASING : /* user is erasing text */
+ case CP_MSGEVENT_DELIVERED : /* message was delivered */
+ case CP_MSGEVENT_DISPLAYED : /* message was viewed */
+ /* these are currently not supported by libPurple */
+ break;
+
+ default:
+ purple_debug_error( MXIT_PLUGIN_ID, "Unknown message event received (%i)\n", event );
+ }
+}
+
/*------------------------------------------------------------------------
* Return the length of a multimedia chunk
@@ -2298,6 +2339,11 @@ static int process_success_response( str
mxit_parse_cmd_suggestcontacts( session, &packet->records[2], packet->rcount - 2 );
break;
+ case CP_CMD_GOT_MSGEVENT :
+ /* received message event */
+ mxit_parse_cmd_msgevent( session, &packet->records[2], packet->rcount - 2 );
+ break;
+
case CP_CMD_MOOD :
/* mood update */
case CP_CMD_UPDATE :
diff --git a/libpurple/protocols/mxit/protocol.h b/libpurple/protocols/mxit/protocol.h
--- a/libpurple/protocols/mxit/protocol.h
+++ b/libpurple/protocols/mxit/protocol.h
@@ -77,9 +77,13 @@
#define MXIT_CF_GAMING_UPDATE 0x800000
#define MXIT_CF_VOICE 0x1000000
#define MXIT_CF_VIDEO 0x2000000
+#define MXIT_CF_TOUCHSCREEN 0x4000000
+#define MXIT_CF_SVC_CONNECTION 0x8000000
+#define MXIT_CF_MXML 0x10000000
+#define MXIT_CF_TYPING_NOTIFY 0x20000000
/* Client features supported by this implementation */
-#define MXIT_CP_FEATURES ( MXIT_CF_FILE_TRANSFER | MXIT_CF_FILE_ACCESS | MXIT_CF_AUDIO | MXIT_CF_MARKUP | MXIT_CF_EXT_MARKUP | MXIT_CF_NO_GATEWAYS | MXIT_CF_IMAGES | MXIT_CF_COMMANDS | MXIT_CF_VIBES | MXIT_CF_MIDP2 )
+#define MXIT_CP_FEATURES ( MXIT_CF_FILE_TRANSFER | MXIT_CF_FILE_ACCESS | MXIT_CF_AUDIO | MXIT_CF_MARKUP | MXIT_CF_EXT_MARKUP | MXIT_CF_NO_GATEWAYS | MXIT_CF_IMAGES | MXIT_CF_COMMANDS | MXIT_CF_VIBES | MXIT_CF_MIDP2 | MXIT_CF_TYPING_NOTIFY )
#define MXIT_PING_INTERVAL ( 5 * 60 ) /* ping the server after X seconds of being idle (5 minutes) */
@@ -132,6 +136,7 @@
#define CP_CMD_SPLASHCLICK 0x001F /* (31) splash-screen clickthrough */
#define CP_CMD_STATUS 0x0020 /* (32) set shown presence & status */
#define CP_CMD_MSGEVENT 0x0023 /* (35) Raise message event */
+#define CP_CMD_GOT_MSGEVENT 0x0024 /* (36) Get message event */
#define CP_CMD_MOOD 0x0029 /* (41) set mood */
#define CP_CMD_KICK 0x002B /* (43) login kick */
#define CP_CMD_GRPCHAT_CREATE 0x002C /* (44) create new groupchat */
@@ -176,6 +181,10 @@
/* message event types */
#define CP_MSGEVENT_DELIVERED 0x02 /* message was delivered */
#define CP_MSGEVENT_DISPLAYED 0x04 /* message was viewed */
+#define CP_MSGEVENT_TYPING 0x10 /* user is typing */
+#define CP_MSGEVENT_STOPPED 0x20 /* user has stopped typing */
+#define CP_MSGEVENT_ANGRY 0x40 /* user is typing angrily */
+#define CP_MSGEVENT_ERASING 0x80 /* user is erasing text */
/* extended profile attribute fields */
#define CP_PROFILE_BIRTHDATE "birthdate" /* Birthdate (String - ISO 8601 format) */
diff --git a/libpurple/protocols/mxit/roster.h b/libpurple/protocols/mxit/roster.h
--- a/libpurple/protocols/mxit/roster.h
+++ b/libpurple/protocols/mxit/roster.h
@@ -82,6 +82,7 @@
/* MXit presence flags */
#define MXIT_PFLAG_VOICE 0x1
#define MXIT_PFLAG_VIDEO 0x2
+#define MXIT_PFLAG_TYPING 0x4
/* Subscription types */
More information about the Commits
mailing list