# HG changeset patch # User pieter.loubser@mxit.com # Date 1301665810 0 # Node ID 80bbed4cb649834756082280780140a1e5d8ef4d # Parent a769e6da0a8eee15da9134ee09c83bc44d4a6a6b * extended the profile information shown for pending invites - avatar image - status message - invite image diff -r a769e6da0a8e -r 80bbed4cb649 libpurple/protocols/mxit/mxit.h --- a/libpurple/protocols/mxit/mxit.h Thu Mar 31 20:15:18 2011 +0000 +++ b/libpurple/protocols/mxit/mxit.h Fri Apr 01 13:50:10 2011 +0000 @@ -173,6 +173,7 @@ char rx_state; /* current receiver state */ gint64 last_rx; /* timestamp of last packet received */ GList* active_chats; /* list of all our contacts we received messages from (active chats) */ + GList* invites; /* list of all the invites that we have received */ /* groupchat */ GList* rooms; /* active groupchat rooms */ diff -r a769e6da0a8e -r 80bbed4cb649 libpurple/protocols/mxit/profile.c --- a/libpurple/protocols/mxit/profile.c Thu Mar 31 20:15:18 2011 +0000 +++ b/libpurple/protocols/mxit/profile.c Fri Apr 01 13:50:10 2011 +0000 @@ -214,6 +214,26 @@ /* hidden number */ purple_notify_user_info_add_pair( info, _( "Hidden Number" ), ( contact->flags & MXIT_CFLAG_HIDDEN ) ? _( "Yes" ) : _( "No" ) ); } + else { + /* this is an invite */ + contact = get_mxit_invite_contact( session, username ); + if ( contact ) { + /* invite found */ + + if ( contact->msg ) + purple_notify_user_info_add_pair( info, _( "Invite Message" ), contact->msg ); + + if ( contact->imgid ) { + /* this invite has a avatar */ + char* img_text; + img_text = g_strdup_printf( "", contact->imgid ); + purple_notify_user_info_add_pair( info, _( "Photo" ), img_text ); + } + + if ( contact->statusMsg ) + purple_notify_user_info_add_pair( info, _( "Status Message" ), contact->statusMsg ); + } + } purple_notify_userinfo( session->con, username, info, NULL, NULL ); purple_notify_user_info_destroy( info ); diff -r a769e6da0a8e -r 80bbed4cb649 libpurple/protocols/mxit/profile.h --- a/libpurple/protocols/mxit/profile.h Thu Mar 31 20:15:18 2011 +0000 +++ b/libpurple/protocols/mxit/profile.h Fri Apr 01 13:50:10 2011 +0000 @@ -33,7 +33,7 @@ /* required */ char loginname[64]; /* name user uses to log into MXit with (aka 'mxitid') */ char userid[51]; /* internal UserId (only in search results) */ - char nickname[101]; /* user's own display name (aka 'nickname', aka 'fullname', aka 'alias') in MXit */ + char nickname[101]; /* user's own display name (aka 'display name', aka 'fullname', aka 'alias') in MXit */ char birthday[16]; /* user's birthday "YYYY-MM-DD" */ gboolean male; /* true if the user's gender is male (otherwise female) */ char pin[16]; /* user's password */ diff -r a769e6da0a8e -r 80bbed4cb649 libpurple/protocols/mxit/protocol.c --- a/libpurple/protocols/mxit/protocol.c Thu Mar 31 20:15:18 2011 +0000 +++ b/libpurple/protocols/mxit/protocol.c Fri Apr 01 13:50:10 2011 +0000 @@ -1629,10 +1629,9 @@ if ( rec->fcount >= 5 ) { /* there is a personal invite message attached */ - contact->msg = strdup( rec->fields[4]->data ); + if ( ( rec->fields[4]->data ) && ( strlen( rec->fields[4]->data ) > 0 ) ) + contact->msg = strdup( rec->fields[4]->data ); } - else - contact->msg = NULL; /* handle the subscription */ if ( contact-> type == MXIT_TYPE_MULTIMX ) { /* subscription to a MultiMX room */ @@ -1870,13 +1869,43 @@ } if ( profile != session->profile ) { - /* update avatar (if necessary) */ - if ( avatarId ) - mxit_update_buddy_avatar( session, mxitId, avatarId ); - - /* if this is not our profile, just display it */ - mxit_show_profile( session, mxitId, profile ); - g_free( profile ); + /* not our own profile */ + struct contact* contact = NULL; + + contact = get_mxit_invite_contact( session, mxitId ); + if ( contact ) { + /* this is an invite, so update its profile info */ + if ( ( statusMsg ) && ( strlen( statusMsg ) > 0 ) ) { + /* update the status message */ + if ( contact->statusMsg ) + g_free( contact->statusMsg ); + contact->statusMsg = strdup( statusMsg ); + } + else + contact->statusMsg = NULL; + if ( contact->profile ) + g_free( contact->profile ); + contact->profile = profile; + if ( ( avatarId ) && ( strlen( avatarId ) > 0 ) ) { + /* avatar must be requested for this invite before we can display it */ + mxit_get_avatar( session, mxitId, avatarId ); + if ( contact->avatarId ) + g_free( contact->avatarId ); + contact->avatarId = strdup( avatarId ); + } + else { + /* display what we have */ + contact->avatarId = NULL; + mxit_show_profile( session, mxitId, profile ); + } + } + else { + /* this is a contact */ + if ( avatarId ) + mxit_update_buddy_avatar( session, mxitId, avatarId ); + mxit_show_profile( session, mxitId, profile ); + g_free( profile ); + } } } @@ -2052,6 +2081,7 @@ case CP_CHUNK_GET_AVATAR : /* get avatars */ { struct getavatar_chunk chunk; + struct contact* contact = NULL; /* decode the chunked data */ memset( &chunk, 0, sizeof ( struct getavatar_chunk ) ); @@ -2060,9 +2090,18 @@ /* update avatar image */ if ( chunk.data ) { purple_debug_info( MXIT_PLUGIN_ID, "updating avatar for contact '%s'\n", chunk.mxitid ); - purple_buddy_icons_set_for_user( session->acc, chunk.mxitid, g_memdup( chunk.data, chunk.length), chunk.length, chunk.avatarid ); + + contact = get_mxit_invite_contact( session, chunk.mxitid ); + if ( contact ) { + /* this is an invite (add image to the internal image store) */ + contact->imgid = purple_imgstore_add_with_id( chunk.data, chunk.length, NULL ); + mxit_show_profile( session, chunk.mxitid, contact->profile ); + } + else { + /* this is a contact's avatar, so update it */ + purple_buddy_icons_set_for_user( session->acc, chunk.mxitid, g_memdup( chunk.data, chunk.length), chunk.length, chunk.avatarid ); + } } - } break; @@ -2764,6 +2803,23 @@ g_list_free( session->active_chats ); session->active_chats = NULL; + /* clear the internal invites */ + while ( session->invites != NULL ) { + struct contact* contact = (struct contact*) session->invites->data; + + session->invites = g_list_remove( session->invites, contact ); + + if ( contact->msg ) + g_free( contact->msg ); + if ( contact->statusMsg ) + g_free( contact->statusMsg ); + if ( contact->profile ) + g_free( contact->profile ); + g_free( contact ); + } + g_list_free( session->invites ); + session->invites = NULL; + /* free profile information */ if ( session->profile ) free( session->profile ); diff -r a769e6da0a8e -r 80bbed4cb649 libpurple/protocols/mxit/roster.c --- a/libpurple/protocols/mxit/roster.c Thu Mar 31 20:15:18 2011 +0000 +++ b/libpurple/protocols/mxit/roster.c Fri Apr 01 13:50:10 2011 +0000 @@ -564,8 +564,8 @@ buddy = g_slist_nth_data( list, i ); if ( !purple_buddy_get_protocol_data( buddy ) ) { - const gchar *alias = purple_buddy_get_alias( buddy ); - const gchar *name = purple_buddy_get_name( buddy ); + const gchar* alias = purple_buddy_get_alias( buddy ); + const gchar* name = purple_buddy_get_name( buddy ); /* this buddy should be removed, because we did not receive him in our roster update from MXit */ purple_debug_info( MXIT_PLUGIN_ID, "Removed 'old' buddy from the blist '%s' (%s)\n", alias, name ); @@ -592,9 +592,16 @@ /* send a allow subscription packet to MXit */ mxit_send_allow_sub( invite->session, invite->contact->username, invite->contact->alias ); + /* remove the invite from our internal invites list */ + invite->session->invites = g_list_remove( invite->session->invites, invite->contact ); + /* freeup invite object */ if ( invite->contact->msg ) g_free( invite->contact->msg ); + if ( invite->contact->statusMsg ) + g_free( invite->contact->statusMsg ); + if ( invite->contact->profile ) + g_free( invite->contact->profile ); g_free( invite->contact ); g_free( invite ); } @@ -614,9 +621,16 @@ /* send a deny subscription packet to MXit */ mxit_send_deny_sub( invite->session, invite->contact->username ); + /* remove the invite from our internal invites list */ + invite->session->invites = g_list_remove( invite->session->invites, invite->contact ); + /* freeup invite object */ if ( invite->contact->msg ) g_free( invite->contact->msg ); + if ( invite->contact->statusMsg ) + g_free( invite->contact->statusMsg ); + if ( invite->contact->profile ) + g_free( invite->contact->profile ); g_free( invite->contact ); g_free( invite ); } @@ -639,12 +653,42 @@ invite->session = session; invite->contact = contact; + /* add the invite to our internal invites list */ + invite->session->invites = g_list_append( invite->session->invites, invite->contact ); + /* (reference: "libpurple/account.h") */ purple_account_request_authorization( session->acc, contact->username, NULL, contact->alias, contact->msg, FALSE, mxit_cb_buddy_auth, mxit_cb_buddy_deny, invite ); } /*------------------------------------------------------------------------ + * Return the contact object for a mxit invite + * + * @param session The MXit session object + * @param username The username of the contact + * @return The contact object for the inviting user + */ +struct contact* get_mxit_invite_contact( struct MXitSession* session, const char* username ) +{ + struct contact* con = NULL; + struct contact* match = NULL; + int i; + + /* run through all the invites and try and find the match */ + for ( i = 0; i < g_list_length( session->invites ); i++ ) { + con = g_list_nth_data( session->invites, i ); + if ( strcmp( con->username, username ) == 0 ) { + /* invite found */ + match = con; + break; + } + } + + return match; +} + + +/*------------------------------------------------------------------------ * Return TRUE if this is a MXit Chatroom contact. * * @param session The MXit session object diff -r a769e6da0a8e -r 80bbed4cb649 libpurple/protocols/mxit/roster.h --- a/libpurple/protocols/mxit/roster.h Thu Mar 31 20:15:18 2011 +0000 +++ b/libpurple/protocols/mxit/roster.h Fri Apr 01 13:50:10 2011 +0000 @@ -121,6 +121,10 @@ char customMood[16]; /* custom mood */ char* statusMsg; /* status message */ char* avatarId; /* avatarId */ + + /* invites only */ + void* profile; /* user's profile (if available) */ + int imgid; /* avatar image id in the imgstore */ }; /* Presence / Status */ @@ -140,6 +144,7 @@ void mxit_new_subscription( struct MXitSession* session, struct contact* contact ); void mxit_update_blist( struct MXitSession* session ); gboolean is_mxit_chatroom_contact( struct MXitSession* session, const char* username ); +struct contact* get_mxit_invite_contact( struct MXitSession* session, const char* username ); /* libPurple callbacks */ void mxit_add_buddy( PurpleConnection* gc, PurpleBuddy* buddy, PurpleGroup* group, const char* message );