aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/msn/msn.c12
-rw-r--r--protocols/msn/msn.h13
-rw-r--r--protocols/msn/msn_util.c32
-rw-r--r--protocols/msn/soap.c18
4 files changed, 67 insertions, 8 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index 679ac65e..00c01dc3 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -106,14 +106,20 @@ static void msn_logout( struct im_connection *ic )
msn_msgq_purge( ic, &md->msgq );
- while( md->groupcount > 0 )
- g_free( md->grouplist[--md->groupcount] );
- g_free( md->grouplist );
g_free( md->tokens[0] );
g_free( md->tokens[1] );
g_free( md->tokens[2] );
g_free( md->lock_key );
+ while( md->groups )
+ {
+ struct msn_group *mg = md->groups->data;
+ g_free( mg->id );
+ g_free( mg->name );
+ g_free( mg );
+ md->groups = g_slist_remove( md->groups, mg );
+ }
+
g_tree_destroy( md->domaintree );
md->domaintree = NULL;
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index 862d1ef7..c7529803 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -90,12 +90,9 @@ struct msn_data
GSList *switchboards;
int sb_failures;
time_t first_sb_failure;
- GSList *filetransfers;
const struct msn_away_state *away_state;
- int buddycount;
- int groupcount;
- char **grouplist;
+ GSList *groups;
GTree *domaintree;
};
@@ -174,6 +171,12 @@ struct msn_buddy_data
msn_buddy_flags_t flags;
};
+struct msn_group
+{
+ char *name;
+ char *id;
+};
+
/* Bitfield values for msn_status_code.flags */
#define STATUS_FATAL 1
#define STATUS_SB_FATAL 2
@@ -210,6 +213,8 @@ void msn_msgq_purge( struct im_connection *ic, GSList **list );
gboolean msn_set_display_name( struct im_connection *ic, const char *rawname );
char *msn_p11_challenge( char *challenge );
gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ );
+struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name );
+struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id );
/* tables.c */
const struct msn_away_state *msn_away_state_by_number( int number );
diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c
index 069e68b8..cf8ab4db 100644
--- a/protocols/msn/msn_util.c
+++ b/protocols/msn/msn_util.c
@@ -565,3 +565,35 @@ gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ )
return ret;
}
+
+struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name )
+{
+ struct msn_data *md = ic->proto_data;
+ GSList *l;
+
+ for( l = md->groups; l; l = l->next )
+ {
+ struct msn_group *mg = l->data;
+
+ if( g_strcasecmp( mg->name, name ) == 0 )
+ return mg;
+ }
+
+ return NULL;
+}
+
+struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id )
+{
+ struct msn_data *md = ic->proto_data;
+ GSList *l;
+
+ for( l = md->groups; l; l = l->next )
+ {
+ struct msn_group *mg = l->data;
+
+ if( g_strcasecmp( mg->id, id ) == 0 )
+ return mg;
+ }
+
+ return NULL;
+}
diff --git a/protocols/msn/soap.c b/protocols/msn/soap.c
index 5d641542..b8762ce1 100644
--- a/protocols/msn/soap.c
+++ b/protocols/msn/soap.c
@@ -631,6 +631,7 @@ static xt_status msn_soap_addressbook_group( struct xt_node *node, gpointer data
struct xt_node *p;
char *id = NULL, *name = NULL;
struct msn_soap_req_data *soap_req = data;
+ struct msn_data *md = soap_req->ic->proto_data;
if( ( p = xt_find_path( node, "../groupId" ) ) )
id = p->text;
@@ -638,6 +639,14 @@ static xt_status msn_soap_addressbook_group( struct xt_node *node, gpointer data
if( ( p = xt_find_node( node->children, "name" ) ) )
name = p->text;
+ if( id && name )
+ {
+ struct msn_group *mg = g_new0( struct msn_group, 1 );
+ mg->id = g_strdup( id );
+ mg->name = g_strdup( name );
+ md->groups = g_slist_prepend( md->groups, mg );
+ }
+
printf( "%s %s\n", id, name );
return XT_HANDLED;
@@ -648,9 +657,11 @@ static xt_status msn_soap_addressbook_contact( struct xt_node *node, gpointer da
bee_user_t *bu;
struct msn_buddy_data *bd;
struct xt_node *p;
- char *id = NULL, *type = NULL, *handle = NULL, *display_name = NULL;
+ char *id = NULL, *type = NULL, *handle = NULL,
+ *display_name = NULL, *group_id = NULL;
struct msn_soap_req_data *soap_req = data;
struct im_connection *ic = soap_req->ic;
+ struct msn_group *group;
if( ( p = xt_find_path( node, "../contactId" ) ) )
id = p->text;
@@ -660,6 +671,8 @@ static xt_status msn_soap_addressbook_contact( struct xt_node *node, gpointer da
handle = p->text;
if( ( p = xt_find_node( node->children, "displayName" ) ) )
display_name = p->text;
+ if( ( p = xt_find_path( node, "groupIds/guid" ) ) )
+ group_id = p->text;
if( type && g_strcasecmp( type, "me" ) == 0 )
{
@@ -684,6 +697,9 @@ static xt_status msn_soap_addressbook_contact( struct xt_node *node, gpointer da
imcb_rename_buddy( ic, handle, display_name );
+ if( group_id && ( group = msn_group_by_id( ic, group_id ) ) )
+ imcb_add_buddy( ic, handle, group->name );
+
printf( "%s %s %s %s\n", id, type, handle, display_name );
return XT_HANDLED;