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 ) |