diff options
| -rw-r--r-- | protocols/msn/msn.c | 29 | ||||
| -rw-r--r-- | protocols/msn/msn.h | 1 | ||||
| -rw-r--r-- | protocols/msn/ns.c | 15 | 
3 files changed, 40 insertions, 5 deletions
| diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c index 8e10e202..71570ce0 100644 --- a/protocols/msn/msn.c +++ b/protocols/msn/msn.c @@ -139,6 +139,8 @@ static void msn_logout( struct im_connection *ic )  static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, int away )  { +	struct bee_user *bu = bee_user_by_handle( ic->bee, ic, who ); +	struct msn_buddy_data *bd = bu ? bu->data : NULL;  	struct msn_switchboard *sb;  #ifdef DEBUG @@ -148,7 +150,11 @@ static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, in  	}  	else  #endif -	if( ( sb = msn_sb_by_handle( ic, who ) ) ) +	if( bd && bd->flags & MSN_BUDDY_FED ) +	{ +		msn_ns_sendmessage( ic, bu, message ); +	} +	else if( ( sb = msn_sb_by_handle( ic, who ) ) )  	{  		return( msn_sb_sendmessage( sb, message ) );  	} @@ -354,8 +360,27 @@ static char *set_eval_display_name( set_t *set, char *value )  static void msn_buddy_data_add( bee_user_t *bu )  {  	struct msn_data *md = bu->ic->proto_data; -	bu->data = g_new0( struct msn_buddy_data, 1 ); +	struct msn_buddy_data *bd; +	char *handle; +	 +	bd = bu->data = g_new0( struct msn_buddy_data, 1 );  	g_tree_insert( md->domaintree, bu->handle, bu ); +	 +	for( handle = bu->handle; isdigit( *handle ); handle ++ ); +	if( *handle == ':' ) +	{ +		/* Pass a nick hint so hopefully the stupid numeric prefix +		   won't show up to the user.  */ +		char *s = strchr( ++handle, '@' ); +		if( s ) +		{ +			handle = g_strndup( handle, s - handle ); +			imcb_buddy_nick_hint( bu->ic, bu->handle, handle ); +			g_free( handle ); +		} +		 +		bd->flags |= MSN_BUDDY_FED; +	}  }  static void msn_buddy_data_free( bee_user_t *bu ) diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index 7c23f282..1dcb0071 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -197,6 +197,7 @@ typedef enum  	MSN_BUDDY_RL = 8,  	MSN_BUDDY_PL = 16,  	MSN_BUDDY_ADL_SYNCED = 256, +	MSN_BUDDY_FED = 512,  } msn_buddy_flags_t;  struct msn_buddy_data diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index fb85c989..49ccc5de 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -971,18 +971,27 @@ int msn_ns_finish_login( struct im_connection *ic )  int msn_ns_sendmessage( struct im_connection *ic, bee_user_t *bu, const char *text )  {  	struct msn_data *md = ic->proto_data; -	char *buf; +	int type = 0; +	char *buf, *handle;  	if( strncmp( text, "\r\r\r", 3 ) == 0 )  		/* Err. Shouldn't happen but I guess it can. Don't send others  		   any of the "SHAKE THAT THING" messages. :-D */  		return 1; +	/* This might be a federated contact. Get its network number, +	   prefixed to bu->handle with a colon. Default is 1. */ +	for( handle = bu->handle; isdigit( *handle ); handle ++ ) +		type = type * 10 + *handle - '0'; +	if( *handle == ':' ) +		handle ++; +	else +		type = 1; +	  	buf = g_strdup_printf( "%s%s", MSN_MESSAGE_HEADERS, text );  	if( msn_ns_write( ic, -1, "UUM %d %s %d %d %zd\r\n%s", -	                          ++md->trId, bu->handle, -	                          1, /* type == MSN (offline) message */ +	                          ++md->trId, handle, type,  	                          1, /* type == IM (not nudge/typing) */  	                          strlen( buf ), buf ) )  		return 1; | 
