aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/msn/msn_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/msn/msn_util.c')
-rw-r--r--protocols/msn/msn_util.c108
1 files changed, 87 insertions, 21 deletions
diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c
index 59363439..954ee716 100644
--- a/protocols/msn/msn_util.c
+++ b/protocols/msn/msn_util.c
@@ -38,10 +38,10 @@ int msn_write( struct im_connection *ic, char *s, int len )
{
imcb_error( ic, "Short write() to main server" );
imc_logout( ic, TRUE );
- return( 0 );
+ return 0;
}
- return( 1 );
+ return 1;
}
int msn_logged_in( struct im_connection *ic )
@@ -51,32 +51,82 @@ int msn_logged_in( struct im_connection *ic )
return( 0 );
}
-int msn_buddy_list_add( struct im_connection *ic, char *list, char *who, char *realname_ )
+int msn_buddy_list_add( struct im_connection *ic, const char *list, const char *who, const char *realname_, const char *group )
{
struct msn_data *md = ic->proto_data;
- char buf[1024], *realname;
-
- realname = msn_http_encode( realname_ );
+ char buf[1024], *realname, groupid[8];
- g_snprintf( buf, sizeof( buf ), "ADD %d %s %s %s\r\n", ++md->trId, list, who, realname );
- if( msn_write( ic, buf, strlen( buf ) ) )
+ *groupid = '\0';
+ if( group )
{
- g_free( realname );
+ int i;
+ for( i = 0; i < md->groupcount; i ++ )
+ if( g_strcasecmp( md->grouplist[i], group ) == 0 )
+ {
+ g_snprintf( groupid, sizeof( groupid ), " %d", i );
+ break;
+ }
- return( 1 );
+ if( *groupid == '\0' )
+ {
+ /* Have to create this group, it doesn't exist yet. */
+ struct msn_groupadd *ga;
+ GSList *l;
+
+ for( l = md->grpq; l; l = l->next )
+ {
+ ga = l->data;
+ if( g_strcasecmp( ga->group, group ) == 0 )
+ break;
+ }
+
+ ga = g_new0( struct msn_groupadd, 1 );
+ ga->who = g_strdup( who );
+ ga->group = g_strdup( group );
+ md->grpq = g_slist_prepend( md->grpq, ga );
+
+ if( l == NULL )
+ {
+ char *groupname = msn_http_encode( group );
+ g_snprintf( buf, sizeof( buf ), "ADG %d %s %d\r\n", ++md->trId, groupname, 0 );
+ g_free( groupname );
+ return msn_write( ic, buf, strlen( buf ) );
+ }
+ else
+ {
+ /* This can happen if the user's doing lots of adds to a
+ new group at once; we're still waiting for the server
+ to confirm group creation. */
+ return 1;
+ }
+ }
}
+ realname = msn_http_encode( realname_ );
+ g_snprintf( buf, sizeof( buf ), "ADD %d %s %s %s%s\r\n", ++md->trId, list, who, realname, groupid );
g_free( realname );
- return( 0 );
+ return msn_write( ic, buf, strlen( buf ) );
}
-int msn_buddy_list_remove( struct im_connection *ic, char *list, char *who )
+int msn_buddy_list_remove( struct im_connection *ic, char *list, const char *who, const char *group )
{
struct msn_data *md = ic->proto_data;
- char buf[1024];
+ char buf[1024], groupid[8];
+
+ *groupid = '\0';
+ if( group )
+ {
+ int i;
+ for( i = 0; i < md->groupcount; i ++ )
+ if( g_strcasecmp( md->grouplist[i], group ) == 0 )
+ {
+ g_snprintf( groupid, sizeof( groupid ), " %d", i );
+ break;
+ }
+ }
- g_snprintf( buf, sizeof( buf ), "REM %d %s %s\r\n", ++md->trId, list, who );
+ g_snprintf( buf, sizeof( buf ), "REM %d %s %s%s\r\n", ++md->trId, list, who, groupid );
if( msn_write( ic, buf, strlen( buf ) ) )
return( 1 );
@@ -94,10 +144,9 @@ static void msn_buddy_ask_yes( void *data )
{
struct msn_buddy_ask_data *bla = data;
- msn_buddy_list_add( bla->ic, "AL", bla->handle, bla->realname );
+ msn_buddy_list_add( bla->ic, "AL", bla->handle, bla->realname, NULL );
- if( imcb_find_buddy( bla->ic, bla->handle ) == NULL )
- imcb_ask_add( bla->ic, bla->handle, NULL );
+ imcb_ask_add( bla->ic, bla->handle, NULL );
g_free( bla->handle );
g_free( bla->realname );
@@ -108,7 +157,7 @@ static void msn_buddy_ask_no( void *data )
{
struct msn_buddy_ask_data *bla = data;
- msn_buddy_list_add( bla->ic, "BL", bla->handle, bla->realname );
+ msn_buddy_list_add( bla->ic, "BL", bla->handle, bla->realname, NULL );
g_free( bla->handle );
g_free( bla->realname );
@@ -349,6 +398,7 @@ void msn_msgq_purge( struct im_connection *ic, GSList **list )
struct msn_message *m;
GString *ret;
GSList *l;
+ int n = 0;
l = *list;
if( l == NULL )
@@ -363,7 +413,11 @@ void msn_msgq_purge( struct im_connection *ic, GSList **list )
{
m = l->data;
- g_string_append_printf( ret, "\n%s", m->text );
+ if( strncmp( m->text, "\r\r\r", 3 ) != 0 )
+ {
+ g_string_append_printf( ret, "\n%s", m->text );
+ n ++;
+ }
g_free( m->who );
g_free( m->text );
@@ -374,10 +428,23 @@ void msn_msgq_purge( struct im_connection *ic, GSList **list )
g_slist_free( *list );
*list = NULL;
- imcb_log( ic, "%s", ret->str );
+ if( n > 0 )
+ imcb_log( ic, "%s", ret->str );
g_string_free( ret, TRUE );
}
+gboolean msn_set_display_name( struct im_connection *ic, const char *rawname )
+{
+ char *fn = msn_http_encode( rawname );
+ struct msn_data *md = ic->proto_data;
+ char buf[1024];
+
+ g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, ic->acc->user, fn );
+ g_free( fn );
+
+ return msn_write( ic, buf, strlen( buf ) ) != 0;
+}
+
unsigned int little_endian( unsigned int dw )
{
#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN
@@ -400,7 +467,6 @@ unsigned int little_endian( unsigned int dw )
}
/* Copied and heavily modified from http://tmsnc.sourceforge.net/chl.c */
-
char *msn_p11_challenge( char *challenge )
{
char *output, buf[256];