diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-09-16 01:09:58 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-09-16 01:09:58 +0100 | 
| commit | bc676acb5f316f0688ab9f99dd2b73315a6ad50c (patch) | |
| tree | 813e8096aa3589d4b8d3f9be45d72f282aa31292 /protocols | |
| parent | ddca104c8c6e75e0b70bf804a23c98a78946fbdb (diff) | |
MSNP18 code. It logs in now but otherwise doesn't work all too well.
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/msn/msn.c | 8 | ||||
| -rw-r--r-- | protocols/msn/msn.h | 15 | ||||
| -rw-r--r-- | protocols/msn/ns.c | 50 | ||||
| -rw-r--r-- | protocols/msn/sb.c | 5 | 
4 files changed, 63 insertions, 15 deletions
| diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c index 03f28422..b05a2b85 100644 --- a/protocols/msn/msn.c +++ b/protocols/msn/msn.c @@ -231,13 +231,9 @@ static void msn_chat_msg( struct groupchat *c, char *message, int flags )  static void msn_chat_invite( struct groupchat *c, char *who, char *message )  {  	struct msn_switchboard *sb = msn_sb_by_chat( c ); -	char buf[1024];  	if( sb ) -	{ -		g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, who ); -		msn_sb_write( sb, buf, strlen( buf ) ); -	} +		msn_sb_write( sb, "CAL %d %s\r\n", ++sb->trId, who );  }  static void msn_chat_leave( struct groupchat *c ) @@ -245,7 +241,7 @@ static void msn_chat_leave( struct groupchat *c )  	struct msn_switchboard *sb = msn_sb_by_chat( c );  	if( sb ) -		msn_sb_write( sb, "OUT\r\n", 5 ); +		msn_sb_write( sb, "OUT\r\n" );  }  static struct groupchat *msn_chat_with( struct im_connection *ic, char *who ) diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index bf7cdfa8..f3e5b9b9 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -52,10 +52,15 @@  #define MSNP11_PROD_ID  "PROD01065C%ZFN6F"  */ +/* <= BitlBee 3.0.5  #define MSNP11_PROD_KEY "ILTXC!4IXB5FB*PX"  #define MSNP11_PROD_ID  "PROD0119GSJUC$18" -#define MSNP_VER        "MSNP15" -#define MSNP_BUILD      "8.5.1288" +*/ + +#define MSNP11_PROD_KEY "C1BX{V4W}Q3*10SM" +#define MSNP11_PROD_ID  "PROD0120PW!CCV9@" +#define MSNP_VER        "MSNP18" +#define MSNP_BUILD      "14.0.8117.416"  #define MSN_SB_NEW         -24062002 @@ -221,12 +226,14 @@ extern GSList *msn_connections;  extern GSList *msn_switchboards;  /* ns.c */ -int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... ); +int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... ) G_GNUC_PRINTF( 3, 4 );  gboolean msn_ns_connect( struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port );  void msn_ns_close( struct msn_handler_data *handler );  void msn_auth_got_passport_token( struct im_connection *ic, const char *token, const char *error );  void msn_auth_got_contact_list( struct im_connection *ic );  int msn_ns_finish_login( struct im_connection *ic ); +int msn_ns_sendmessage( struct im_connection *ic, struct bee_user *bu, const char *text ); +void msn_ns_oim_send_queue( struct im_connection *ic, GSList **msgq );  /* msn_util.c */  int msn_logged_in( struct im_connection *ic ); @@ -249,7 +256,7 @@ const struct msn_away_state *msn_away_state_by_name( char *name );  const struct msn_status_code *msn_status_by_number( int number );  /* sb.c */ -int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... ); +int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... ) G_GNUC_PRINTF( 2, 3 );;  struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session );  struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle );  struct msn_switchboard *msn_sb_by_chat( struct groupchat *c ); diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index 5436270e..4dac75c5 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -756,7 +756,7 @@ void msn_auth_got_passport_token( struct im_connection *ic, const char *token, c  	if( token )  	{ -		msn_ns_write( ic, -1, "USR %d SSO S %s %s\r\n", ++md->trId, md->tokens[0], token ); +		msn_ns_write( ic, -1, "USR %d SSO S %s %s {7535ef7c-ff92-11e1-8069-50e5493b06de}\r\n", ++md->trId, md->tokens[0], token );  	}  	else  	{ @@ -885,3 +885,51 @@ int msn_ns_finish_login( struct im_connection *ic )  	return 1;  } + +int msn_ns_sendmessage( struct im_connection *ic, bee_user_t *bu, const char *text ) +{ +	struct msn_data *md = ic->proto_data; +	char *buf; +	 +	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; +	 +	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 */ +	                          1, /* type == IM (not nudge/typing) */ +	                          strlen( buf ), buf ) ) +		return 1; +	else +		return 0; +} + +void msn_ns_oim_send_queue( struct im_connection *ic, GSList **msgq ) +{ +	GSList *l; +	 +	for( l = *msgq; l; l = l->next ) +	{ +		struct msn_message *m = l->data; +		bee_user_t *bu = bee_user_by_handle( ic->bee, ic, m->who ); +		 +		if( bu ) +			if( !msn_ns_sendmessage( ic, bu, m->text ) ) +				return; +	} +	 +	while( *msgq != NULL ) +	{ +		struct msn_message *m = (*msgq)->data; +		 +		g_free( m->who ); +		g_free( m->text ); +		g_free( m ); +		 +		*msgq = g_slist_remove( *msgq, m ); +	} +} diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c index 45e74cb0..14465c67 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -628,12 +628,9 @@ static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num  		/* If the person is offline, send an offline message instead,  		   and don't report an error. */ -		/* TODO: Support for OIMs that works. (#874) */ -		/*  		if( num == 217 ) -			msn_soap_oim_send_queue( ic, &sb->msgq ); +			msn_ns_oim_send_queue( ic, &sb->msgq );  		else -		*/  			imcb_error( ic, "Error reported by switchboard server: %s", err->text );  		if( err->flags & STATUS_SB_FATAL ) | 
