aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/msn/msn.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/msn/msn.c')
-rw-r--r--protocols/msn/msn.c60
1 files changed, 45 insertions, 15 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index 8bf61aa1..29b7cecc 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -78,6 +78,12 @@ static void msn_logout( struct im_connection *ic )
if( md )
{
+ /** Disabling MSN ft support for now.
+ while( md->filetransfers ) {
+ imcb_file_canceled( md->filetransfers->data, "Closing connection" );
+ }
+ */
+
if( md->fd >= 0 )
closesocket( md->fd );
@@ -97,6 +103,15 @@ static void msn_logout( struct im_connection *ic )
g_free( md->grouplist[--md->groupcount] );
g_free( md->grouplist );
+ while( md->grpq )
+ {
+ struct msn_groupadd *ga = md->grpq->data;
+ g_free( ga->group );
+ g_free( ga->who );
+ g_free( ga );
+ md->grpq = g_slist_remove( md->grpq, ga );
+ }
+
g_free( md );
}
@@ -115,6 +130,14 @@ static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, in
{
struct msn_switchboard *sb;
+#ifdef DEBUG
+ if( strcmp( who, "raw" ) == 0 )
+ {
+ msn_write( ic, message, strlen( message ) );
+ msn_write( ic, "\r\n", 2 );
+ }
+ else
+#endif
if( ( sb = msn_sb_by_handle( ic, who ) ) )
{
return( msn_sb_sendmessage( sb, message ) );
@@ -152,11 +175,10 @@ static void msn_set_away( struct im_connection *ic, char *state, char *message )
char buf[1024];
struct msn_data *md = ic->proto_data;
- if( state )
- md->away_state = msn_away_state_by_name( state ) ? :
- msn_away_state_list + 1;
- else
+ if( state == NULL )
md->away_state = msn_away_state_list;
+ else if( ( md->away_state = msn_away_state_by_name( state ) ) == NULL )
+ md->away_state = msn_away_state_list + 1;
g_snprintf( buf, sizeof( buf ), "CHG %d %s\r\n", ++md->trId, md->away_state->code );
msn_write( ic, buf, strlen( buf ) );
@@ -175,12 +197,16 @@ static void msn_get_info(struct im_connection *ic, char *who)
static void msn_add_buddy( struct im_connection *ic, char *who, char *group )
{
- msn_buddy_list_add( ic, "FL", who, who );
+ struct bee_user *bu = bee_user_by_handle( ic->bee, ic, who );
+
+ msn_buddy_list_add( ic, "FL", who, who, group );
+ if( bu && bu->group )
+ msn_buddy_list_remove( ic, "FL", who, bu->group->name );
}
static void msn_remove_buddy( struct im_connection *ic, char *who, char *group )
{
- msn_buddy_list_remove( ic, "FL", who );
+ msn_buddy_list_remove( ic, "FL", who, NULL );
}
static void msn_chat_msg( struct groupchat *c, char *message, int flags )
@@ -216,6 +242,7 @@ static void msn_chat_leave( struct groupchat *c )
static struct groupchat *msn_chat_with( struct im_connection *ic, char *who )
{
struct msn_switchboard *sb;
+ struct groupchat *c = imcb_chat_new( ic, who );
if( ( sb = msn_sb_by_handle( ic, who ) ) )
{
@@ -233,10 +260,8 @@ static struct groupchat *msn_chat_with( struct im_connection *ic, char *who )
msn_sb_write_msg( ic, m );
- return NULL;
+ return c;
}
-
- return NULL;
}
static void msn_keepalive( struct im_connection *ic )
@@ -246,19 +271,19 @@ static void msn_keepalive( struct im_connection *ic )
static void msn_add_permit( struct im_connection *ic, char *who )
{
- msn_buddy_list_add( ic, "AL", who, who );
+ msn_buddy_list_add( ic, "AL", who, who, NULL );
}
static void msn_rem_permit( struct im_connection *ic, char *who )
{
- msn_buddy_list_remove( ic, "AL", who );
+ msn_buddy_list_remove( ic, "AL", who, NULL );
}
static void msn_add_deny( struct im_connection *ic, char *who )
{
struct msn_switchboard *sb;
- msn_buddy_list_add( ic, "BL", who, who );
+ msn_buddy_list_add( ic, "BL", who, who, NULL );
/* If there's still a conversation with this person, close it. */
if( ( sb = msn_sb_by_handle( ic, who ) ) )
@@ -269,15 +294,19 @@ static void msn_add_deny( struct im_connection *ic, char *who )
static void msn_rem_deny( struct im_connection *ic, char *who )
{
- msn_buddy_list_remove( ic, "BL", who );
+ msn_buddy_list_remove( ic, "BL", who, NULL );
}
static int msn_send_typing( struct im_connection *ic, char *who, int typing )
{
- if( typing & OPT_TYPING )
+ struct bee_user *bu = bee_user_by_handle( ic->bee, ic, who );
+
+ if( !( bu->flags & BEE_USER_ONLINE ) )
+ return 0;
+ else if( typing & OPT_TYPING )
return( msn_buddy_msg( ic, who, TYPING_NOTIFICATION_MESSAGE, 0 ) );
else
- return( 1 );
+ return 1;
}
static char *set_eval_display_name( set_t *set, char *value )
@@ -328,6 +357,7 @@ void msn_initmodule()
ret->rem_deny = msn_rem_deny;
ret->send_typing = msn_send_typing;
ret->handle_cmp = g_strcasecmp;
+ //ret->transfer_request = msn_ftp_transfer_request;
register_protocol(ret);
}