aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2012-09-16 01:09:58 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2012-09-16 01:09:58 +0100
commitbc676acb5f316f0688ab9f99dd2b73315a6ad50c (patch)
tree813e8096aa3589d4b8d3f9be45d72f282aa31292 /protocols
parentddca104c8c6e75e0b70bf804a23c98a78946fbdb (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.c8
-rw-r--r--protocols/msn/msn.h15
-rw-r--r--protocols/msn/ns.c50
-rw-r--r--protocols/msn/sb.c5
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 )