aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/msn/msn.c27
-rw-r--r--protocols/msn/msn.h41
-rw-r--r--protocols/msn/msn_util.c4
-rw-r--r--protocols/msn/ns.c114
-rw-r--r--protocols/msn/sb.c12
5 files changed, 105 insertions, 93 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index f37b802e..c5c05087 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -52,7 +52,6 @@ static void msn_login( account_t *acc )
struct msn_data *md = g_new0( struct msn_data, 1 );
ic->proto_data = md;
- md->fd = -1;
if( strchr( acc->user, '@' ) == NULL )
{
@@ -61,21 +60,14 @@ static void msn_login( account_t *acc )
return;
}
- imcb_log( ic, "Connecting" );
-
- md->fd = proxy_connect( "messenger.hotmail.com", 1863, msn_ns_connected, ic );
- if( md->fd < 0 )
- {
- imcb_error( ic, "Could not connect to server" );
- imc_logout( ic, TRUE );
- return;
- }
-
md->ic = ic;
md->away_state = msn_away_state_list;
md->domaintree = g_tree_new( msn_domaintree_cmp );
- msn_connections = g_slist_append( msn_connections, ic );
+ msn_connections = g_slist_prepend( msn_connections, ic );
+
+ imcb_log( ic, "Connecting" );
+ msn_ns_connect( ic, md->ns, MSN_NS_HOST, MSN_NS_PORT );
}
static void msn_logout( struct im_connection *ic )
@@ -92,15 +84,8 @@ static void msn_logout( struct im_connection *ic )
}
*/
- if( md->fd >= 0 )
- closesocket( md->fd );
-
- if( md->handler )
- {
- if( md->handler->rxq ) g_free( md->handler->rxq );
- if( md->handler->cmd_text ) g_free( md->handler->cmd_text );
- g_free( md->handler );
- }
+ msn_ns_close( md->ns );
+ msn_ns_close( md->auth );
while( md->switchboards )
msn_sb_destroy( md->switchboards->data );
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index dae115ef..5a195348 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -43,6 +43,9 @@
#define MSNP11_PROD_ID "PROD0101{0RM?UBW"
*/
+#define MSN_NS_HOST "messenger.hotmail.com"
+#define MSN_NS_PORT 1863
+
/* Some other version.
#define MSNP11_PROD_KEY "O4BG@C7BWLYQX?5G"
#define MSNP11_PROD_ID "PROD01065C%ZFN6F"
@@ -79,12 +82,27 @@ typedef enum
MSN_DONE_ADL = 4,
} msn_flags_t;
+struct msn_handler_data
+{
+ int fd, inpa;
+ int rxlen;
+ char *rxq;
+
+ int msglen;
+ char *cmd_text;
+
+ /* Either ic or sb */
+ gpointer data;
+
+ int (*exec_command) ( struct msn_handler_data *handler, char **cmd, int count );
+ int (*exec_message) ( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int count );
+};
+
struct msn_data
{
struct im_connection *ic;
- int fd;
- struct msn_handler_data *handler;
+ struct msn_handler_data ns[1], auth[1];
msn_flags_t flags;
int trId;
@@ -110,6 +128,7 @@ struct msn_switchboard
{
struct im_connection *ic;
+ /* The following two are also in the handler. TODO: Clean up. */
int fd;
gint inp;
struct msn_handler_data *handler;
@@ -151,21 +170,6 @@ struct msn_groupadd
char *group;
};
-struct msn_handler_data
-{
- int fd;
- int rxlen;
- char *rxq;
-
- int msglen;
- char *cmd_text;
-
- gpointer data;
-
- int (*exec_command) ( gpointer data, char **cmd, int count );
- int (*exec_message) ( gpointer data, char *msg, int msglen, char **cmd, int count );
-};
-
typedef enum
{
MSN_BUDDY_FL = 1, /* Warning: FL,AL,BL *must* be 1,2,4. */
@@ -208,7 +212,8 @@ extern GSList *msn_switchboards;
/* ns.c */
int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... );
-gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond );
+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 );
diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c
index 6a16ba17..7fa68915 100644
--- a/protocols/msn/msn_util.c
+++ b/protocols/msn/msn_util.c
@@ -350,7 +350,7 @@ int msn_handler( struct msn_handler_data *h )
cmd_text = g_strndup( h->rxq, i );
cmd = msn_linesplit( cmd_text );
for( count = 0; cmd[count]; count ++ );
- st = h->exec_command( h->data, cmd, count );
+ st = h->exec_command( h, cmd, count );
g_free( cmd_text );
/* If the connection broke, don't continue. We don't even exist anymore. */
@@ -385,7 +385,7 @@ int msn_handler( struct msn_handler_data *h )
cmd = msn_linesplit( h->cmd_text );
for( count = 0; cmd[count]; count ++ );
- st = h->exec_message( h->data, msg, h->msglen, cmd, count );
+ st = h->exec_message( h, msg, h->msglen, cmd, count );
g_free( msg );
g_free( h->cmd_text );
h->cmd_text = NULL;
diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c
index 23a1951d..6260e300 100644
--- a/protocols/msn/ns.c
+++ b/protocols/msn/ns.c
@@ -30,9 +30,10 @@
#include "soap.h"
#include "xmltree.h"
+static gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond );
static gboolean msn_ns_callback( gpointer data, gint source, b_input_condition cond );
-static int msn_ns_command( gpointer data, char **cmd, int num_parts );
-static int msn_ns_message( gpointer data, char *msg, int msglen, char **cmd, int num_parts );
+static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num_parts );
+static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int num_parts );
static void msn_ns_send_adl_start( struct im_connection *ic );
static void msn_ns_send_adl( struct im_connection *ic );
@@ -50,7 +51,7 @@ int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... )
va_end( params );
if( fd < 0 )
- fd = md->fd;
+ fd = md->ns->fd;
if( getenv( "BITLBEE_DEBUG" ) )
fprintf( stderr, "->NS%d:%s", fd, out );
@@ -68,56 +69,79 @@ int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... )
return 1;
}
-gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond )
+gboolean msn_ns_connect( struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port )
{
- struct im_connection *ic = data;
- struct msn_data *md;
-
- if( !g_slist_find( msn_connections, ic ) )
- return FALSE;
+ if( handler->fd >= 0 )
+ closesocket( handler->fd );
- if( source == -1 )
+ handler->exec_command = msn_ns_command;
+ handler->exec_message = msn_ns_message;
+ handler->data = ic;
+ handler->fd = proxy_connect( host, port, msn_ns_connected, handler );
+ if( handler->fd < 0 )
{
imcb_error( ic, "Could not connect to server" );
imc_logout( ic, TRUE );
return FALSE;
}
+ return TRUE;
+}
+
+static gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond )
+{
+ struct msn_handler_data *handler = data;
+ struct im_connection *ic = handler->data;
+ struct msn_data *md;
+
+ if( !g_slist_find( msn_connections, ic ) )
+ return FALSE;
+
md = ic->proto_data;
- if( !md->handler )
- {
- md->handler = g_new0( struct msn_handler_data, 1 );
- md->handler->data = ic;
- md->handler->exec_command = msn_ns_command;
- md->handler->exec_message = msn_ns_message;
- }
- else
+ if( source == -1 )
{
- if( md->handler->rxq )
- g_free( md->handler->rxq );
-
- md->handler->rxlen = 0;
+ imcb_error( ic, "Could not connect to server" );
+ imc_logout( ic, TRUE );
+ return FALSE;
}
- md->handler->fd = md->fd;
- md->handler->rxq = g_new0( char, 1 );
+ g_free( handler->rxq );
+ handler->rxlen = 0;
+ handler->rxq = g_new0( char, 1 );
if( msn_ns_write( ic, -1, "VER %d %s CVR0\r\n", ++md->trId, MSNP_VER ) )
{
- ic->inpa = b_input_add( md->fd, B_EV_IO_READ, msn_ns_callback, ic );
+ handler->inpa = b_input_add( handler->fd, B_EV_IO_READ, msn_ns_callback, handler );
imcb_log( ic, "Connected to server, waiting for reply" );
}
return FALSE;
}
+void msn_ns_close( struct msn_handler_data *handler )
+{
+ if( handler->fd >= 0 )
+ {
+ closesocket( handler->fd );
+ b_event_remove( handler->inpa );
+ }
+
+ handler->fd = handler->inpa = -1;
+ g_free( handler->rxq );
+ g_free( handler->cmd_text );
+
+ handler->rxlen = 0;
+ handler->rxq = NULL;
+ handler->cmd_text = NULL;
+}
+
static gboolean msn_ns_callback( gpointer data, gint source, b_input_condition cond )
{
- struct im_connection *ic = data;
- struct msn_data *md = ic->proto_data;
+ struct msn_handler_data *handler = data;
+ struct im_connection *ic = handler->data;
- if( msn_handler( md->handler ) == -1 ) /* Don't do this on ret == 0, it's already done then. */
+ if( msn_handler( handler ) == -1 ) /* Don't do this on ret == 0, it's already done then. */
{
imcb_error( ic, "Error while reading from server" );
imc_logout( ic, TRUE );
@@ -128,9 +152,9 @@ static gboolean msn_ns_callback( gpointer data, gint source, b_input_condition c
return TRUE;
}
-static int msn_ns_command( gpointer data, char **cmd, int num_parts )
+static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num_parts )
{
- struct im_connection *ic = data;
+ struct im_connection *ic = handler->data;
struct msn_data *md = ic->proto_data;
if( num_parts == 0 )
@@ -163,9 +187,8 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
if( num_parts >= 6 && strcmp( cmd[2], "NS" ) == 0 )
{
- b_event_remove( ic->inpa );
- ic->inpa = 0;
- closesocket( md->fd );
+ b_event_remove( handler->inpa );
+ handler->inpa = -1;
server = strchr( cmd[3], ':' );
if( !server )
@@ -179,8 +202,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
server = cmd[3];
imcb_log( ic, "Transferring to other server" );
-
- md->fd = proxy_connect( server, port, msn_ns_connected, ic );
+ return msn_ns_connect( ic, handler, server, port );
}
else if( num_parts >= 6 && strcmp( cmd[2], "SB" ) == 0 )
{
@@ -272,9 +294,9 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
return( 0 );
}
- md->handler->msglen = atoi( cmd[3] );
+ handler->msglen = atoi( cmd[3] );
- if( md->handler->msglen <= 0 )
+ if( handler->msglen <= 0 )
{
imcb_error( ic, "Syntax error" );
imc_logout( ic, TRUE );
@@ -295,7 +317,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
}
else if( num_parts >= 3 )
{
- md->handler->msglen = atoi( cmd[2] );
+ handler->msglen = atoi( cmd[2] );
}
}
else if( strcmp( cmd[0], "PRP" ) == 0 )
@@ -459,9 +481,9 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
{
imcb_error( ic, "Received IPG command, we don't handle them yet." );
- md->handler->msglen = atoi( cmd[1] );
+ handler->msglen = atoi( cmd[1] );
- if( md->handler->msglen <= 0 )
+ if( handler->msglen <= 0 )
{
imcb_error( ic, "Syntax error" );
imc_logout( ic, TRUE );
@@ -518,20 +540,20 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
{
/* Coming up is cmd[2] bytes of stuff we're supposed to
censore. Meh. */
- md->handler->msglen = atoi( cmd[2] );
+ handler->msglen = atoi( cmd[2] );
}
else if( strcmp( cmd[0], "UBX" ) == 0 )
{
/* Status message. */
if( num_parts >= 4 )
- md->handler->msglen = atoi( cmd[3] );
+ handler->msglen = atoi( cmd[3] );
}
else if( strcmp( cmd[0], "NOT" ) == 0 )
{
/* Some kind of notification, poorly documented but
apparently used to announce address book changes. */
if( num_parts >= 2 )
- md->handler->msglen = atoi( cmd[1] );
+ handler->msglen = atoi( cmd[1] );
}
else if( isdigit( cmd[0][0] ) )
{
@@ -548,7 +570,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
/* Oh yes, errors can have payloads too now. Discard them for now. */
if( num_parts >= 3 )
- md->handler->msglen = atoi( cmd[2] );
+ handler->msglen = atoi( cmd[2] );
}
else
{
@@ -558,9 +580,9 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
return( 1 );
}
-static int msn_ns_message( gpointer data, char *msg, int msglen, char **cmd, int num_parts )
+static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int num_parts )
{
- struct im_connection *ic = data;
+ struct im_connection *ic = handler->data;
char *body;
int blen = 0;
diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c
index d10d7c19..898fb34f 100644
--- a/protocols/msn/sb.c
+++ b/protocols/msn/sb.c
@@ -31,8 +31,8 @@
#include "invitation.h"
static gboolean msn_sb_callback( gpointer data, gint source, b_input_condition cond );
-static int msn_sb_command( gpointer data, char **cmd, int num_parts );
-static int msn_sb_message( gpointer data, char *msg, int msglen, char **cmd, int num_parts );
+static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num_parts );
+static int msn_sb_message( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int num_parts );
int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... )
{
@@ -391,9 +391,9 @@ static gboolean msn_sb_callback( gpointer data, gint source, b_input_condition c
return FALSE;
}
-static int msn_sb_command( gpointer data, char **cmd, int num_parts )
+static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num_parts )
{
- struct msn_switchboard *sb = data;
+ struct msn_switchboard *sb = handler->data;
struct im_connection *ic = sb->ic;
if( !num_parts )
@@ -664,9 +664,9 @@ static int msn_sb_command( gpointer data, char **cmd, int num_parts )
return( 1 );
}
-static int msn_sb_message( gpointer data, char *msg, int msglen, char **cmd, int num_parts )
+static int msn_sb_message( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int num_parts )
{
- struct msn_switchboard *sb = data;
+ struct msn_switchboard *sb = handler->data;
struct im_connection *ic = sb->ic;
char *body;
int blen = 0;