/pidgin/main: 5bf94c596f83: Merge 33555 from release-2.x.y
Richard Laager
rlaager at pidgin.im
Sun Jan 13 17:02:39 EST 2013
Changeset: 5bf94c596f832fd6c9a6dea056035cd61d8784ed
Author: Richard Laager <rlaager at pidgin.im>
Date: 2013-01-13 15:24 -0600
Branch: default
URL: http://hg.pidgin.im/pidgin/main/rev/5bf94c596f83
Description:
Merge 33555 from release-2.x.y
diffstat:
ChangeLog | 6 ++++
libpurple/protocols/mxit/actions.c | 25 +++++++++++++++++
libpurple/protocols/mxit/markup.c | 10 ++++++-
libpurple/protocols/mxit/profile.c | 36 +++++++++++++++++++++++++
libpurple/protocols/mxit/profile.h | 14 +++++++++
libpurple/protocols/mxit/protocol.c | 52 ++++++++++++++++++++++++++++++++++++-
libpurple/protocols/mxit/roster.h | 1 +
7 files changed, 142 insertions(+), 2 deletions(-)
diffs (277 lines):
diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -88,6 +88,12 @@ version 2.10.7:
* Fix a crash when removing a user before its icon is loaded. (Mark
Barfield) (#15217)
+ MXit:
+ * Display farewell messages in a different colour to distinguish
+ them from normal messages.
+ * Add support for typing notification.
+ * Add support for the Relationship Status profile attribute.
+
Yahoo!:
* Fix a double-free in profile/picture loading code. (Mihai Serban)
(#15053)
diff --git a/libpurple/protocols/mxit/actions.c b/libpurple/protocols/mxit/actions.c
--- a/libpurple/protocols/mxit/actions.c
+++ b/libpurple/protocols/mxit/actions.c
@@ -48,6 +48,7 @@ static void mxit_profile_cb( PurpleConne
const char* name = NULL;
const char* bday = NULL;
const char* err = NULL;
+ GList* entry = NULL;
purple_debug_info( MXIT_PLUGIN_ID, "mxit_profile_cb\n" );
@@ -166,6 +167,14 @@ out:
g_string_append( attributes, attrib );
acount++;
+ /* relationship status */
+ field = purple_request_fields_get_field( fields, "relationship" );
+ entry = g_list_first( purple_request_field_list_get_selected( field ) );
+ profile->relationship = atoi( purple_request_field_list_get_data( field, entry->data ) );
+ g_snprintf( attrib, sizeof( attrib ), "\01%s\01%i\01%i", CP_PROFILE_RELATIONSHIP, CP_PROFILE_TYPE_SHORT, profile->relationship );
+ g_string_append( attributes, attrib );
+ acount++;
+
/* update flags */
field = purple_request_fields_get_field( fields, "searchable" );
if ( purple_request_field_bool_get_value( field ) ) /* is searchable -> clear not-searchable flag */
@@ -253,6 +262,22 @@ static void mxit_profile_action( PurpleP
field = purple_request_field_string_new( "whereami", _( "Where I Live" ), profile->whereami, FALSE);
purple_request_field_group_add_field( public_group, field );
+ /* relationship status */
+ field = purple_request_field_list_new( "relationship", _( "Relationship Status" ) );
+ purple_request_field_list_set_multi_select( field, FALSE );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_UNKNOWN ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_UNKNOWN ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_DONTSAY ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_DONTSAY ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_SINGLE ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_SINGLE ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_INVOLVED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_INVOLVED ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_ENGAGED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_ENGAGED ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_MARRIED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_MARRIED ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_COMPLICATED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_COMPLICATED ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_WIDOWED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_WIDOWED ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_SEPARATED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_SEPARATED ) );
+ purple_request_field_list_add_icon( field, mxit_relationship_to_name( MXIT_RELATIONSHIP_DIVORCED ), NULL, g_strdup_printf( "%i", MXIT_RELATIONSHIP_DIVORCED ) );
+ purple_request_field_list_add_selected( field, mxit_relationship_to_name( profile->relationship ) );
+ purple_request_field_group_add_field( public_group, field );
+
purple_request_fields_add_group( fields, public_group );
}
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
@@ -60,7 +60,9 @@ struct tag {
};
-#define MXIT_VIBE_MSG_COLOR "#9933FF"
+#define MXIT_VIBE_MSG_COLOR "#9933FF"
+#define MXIT_FAREWELL_MSG_COLOR "#949494"
+
/* vibes */
static const char* vibes[] = {
@@ -1004,6 +1006,12 @@ void mxit_parse_markup( struct RXMsgData
break;
}
}
+
+ if ( msgflags & CP_MSG_FAREWELL ) {
+ /* this is a farewell message */
+ g_string_prepend( mx->msg, "<font color=\""MXIT_FAREWELL_MSG_COLOR"\"><i>" );
+ g_string_append( mx->msg, "</i></font>" );
+ }
}
diff --git a/libpurple/protocols/mxit/profile.c b/libpurple/protocols/mxit/profile.c
--- a/libpurple/protocols/mxit/profile.c
+++ b/libpurple/protocols/mxit/profile.c
@@ -35,6 +35,40 @@
/*------------------------------------------------------------------------
+ * Return the MXit Relationship status as a string.
+ *
+ * @param id The Relationship status value (see profile.h)
+ * @return The relationship status as a text string.
+ */
+const char* mxit_relationship_to_name( short id )
+{
+ switch ( id ) {
+ case MXIT_RELATIONSHIP_UNKNOWN :
+ return _( "Unknown" );
+ case MXIT_RELATIONSHIP_DONTSAY :
+ return _( "Don't want to say" );
+ case MXIT_RELATIONSHIP_SINGLE :
+ return _( "Single" );
+ case MXIT_RELATIONSHIP_INVOLVED :
+ return _( "In a relationship" );
+ case MXIT_RELATIONSHIP_ENGAGED :
+ return _( "Engaged" );
+ case MXIT_RELATIONSHIP_MARRIED :
+ return _( "Married" );
+ case MXIT_RELATIONSHIP_COMPLICATED :
+ return _( "It's complicated" );
+ case MXIT_RELATIONSHIP_WIDOWED :
+ return _( "Widowed" );
+ case MXIT_RELATIONSHIP_SEPARATED :
+ return _( "Separated" );
+ case MXIT_RELATIONSHIP_DIVORCED :
+ return _( "Divorced" );
+ default :
+ return "";
+ }
+}
+
+/*------------------------------------------------------------------------
* Returns true if it is a valid date.
*
* @param bday Date-of-Birth string (YYYY-MM-DD)
@@ -195,6 +229,8 @@ void mxit_show_profile( struct MXitSessi
if ( *profile->whereami )
purple_notify_user_info_add_pair_plaintext( info, _( "Where I Live" ), profile->whereami );
+ purple_notify_user_info_add_pair_plaintext( info, _( "Relationship Status" ), mxit_relationship_to_name( profile->relationship ) );
+
purple_notify_user_info_add_section_break( info );
if ( contact ) {
diff --git a/libpurple/protocols/mxit/profile.h b/libpurple/protocols/mxit/profile.h
--- a/libpurple/protocols/mxit/profile.h
+++ b/libpurple/protocols/mxit/profile.h
@@ -29,6 +29,18 @@
#include <glib.h>
+/* MXit relationship status types */
+#define MXIT_RELATIONSHIP_UNKNOWN 0
+#define MXIT_RELATIONSHIP_DONTSAY 1
+#define MXIT_RELATIONSHIP_SINGLE 2
+#define MXIT_RELATIONSHIP_INVOLVED 3
+#define MXIT_RELATIONSHIP_ENGAGED 4
+#define MXIT_RELATIONSHIP_MARRIED 5
+#define MXIT_RELATIONSHIP_COMPLICATED 6
+#define MXIT_RELATIONSHIP_WIDOWED 7
+#define MXIT_RELATIONSHIP_SEPARATED 8
+#define MXIT_RELATIONSHIP_DIVORCED 9
+
struct MXitProfile {
/* required */
char loginname[64]; /* name user uses to log into MXit with (aka 'mxitid') */
@@ -47,6 +59,7 @@ struct MXitProfile {
char regcountry[3]; /* user's registered country code */
char whereami[51]; /* where am I / where I live */
char aboutme[513]; /* about me */
+ int relationship; /* relationship status */
int flags; /* user's profile flags */
gint64 lastonline; /* user's last-online timestamp */
@@ -55,6 +68,7 @@ struct MXitProfile {
struct MXitSession;
void mxit_show_profile( struct MXitSession* session, const char* username, struct MXitProfile* profile );
void mxit_show_search_results( struct MXitSession* session, int searchType, int maxResults, GList* entries );
+const char* mxit_relationship_to_name( short id );
gboolean validateDate( const char* bday );
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
@@ -1451,7 +1451,7 @@ static void mxit_parse_cmd_login( struct
const char* statusmsg;
const char* profilelist[] = { CP_PROFILE_BIRTHDATE, CP_PROFILE_GENDER, CP_PROFILE_FULLNAME,
CP_PROFILE_TITLE, CP_PROFILE_FIRSTNAME, CP_PROFILE_LASTNAME, CP_PROFILE_EMAIL,
- CP_PROFILE_MOBILENR, CP_PROFILE_WHEREAMI, CP_PROFILE_ABOUTME, CP_PROFILE_FLAGS };
+ CP_PROFILE_MOBILENR, CP_PROFILE_WHEREAMI, CP_PROFILE_ABOUTME, CP_PROFILE_RELATIONSHIP, CP_PROFILE_FLAGS };
purple_account_set_int( session->acc, MXIT_CONFIG_STATE, MXIT_STATE_LOGIN );
@@ -1878,6 +1878,10 @@ static void mxit_parse_cmd_extprofile( s
/* about me */
g_strlcpy( profile->aboutme, fvalue, sizeof( profile->aboutme ) );
}
+ else if ( strcmp( CP_PROFILE_RELATIONSHIP, fname ) == 0) {
+ /* relatinship status */
+ profile->relationship = strtol( fvalue, NULL, 10 );
+ }
else {
/* invalid profile attribute */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid profile attribute received '%s' \n", fname );
@@ -2031,6 +2035,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
@@ -2310,6 +2355,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/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