diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2008-08-10 10:15:26 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2008-08-10 10:15:26 +0100 |
commit | a8305126a38eb977c51046dd4ec3ac258a20a98f (patch) | |
tree | ffc37850692af42a9aab469a1e68dc38997445e7 | |
parent | 4230221725b0cd0f6a9b84f726759d20ff9f0e62 (diff) |
Added msn_sb_write_msg() (patch from ulim).
-rw-r--r-- | protocols/msn/msn.c | 61 | ||||
-rw-r--r-- | protocols/msn/msn.h | 6 | ||||
-rw-r--r-- | protocols/msn/sb.c | 42 |
3 files changed, 51 insertions, 58 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c index a2e8519a..046b2772 100644 --- a/protocols/msn/msn.c +++ b/protocols/msn/msn.c @@ -112,7 +112,6 @@ static void msn_logout( struct im_connection *ic ) static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, int away ) { struct msn_switchboard *sb; - struct msn_data *md = ic->proto_data; if( ( sb = msn_sb_by_handle( ic, who ) ) ) { @@ -121,47 +120,13 @@ static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, in else { struct msn_message *m; - char buf[1024]; /* Create a message. We have to arrange a usable switchboard, and send the message later. */ m = g_new0( struct msn_message, 1 ); m->who = g_strdup( who ); m->text = g_strdup( message ); - /* FIXME: *CHECK* the reliability of using spare sb's! */ - if( ( sb = msn_sb_spare( ic ) ) ) - { - debug( "Trying to use a spare switchboard to message %s", who ); - - sb->who = g_strdup( who ); - g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, who ); - if( msn_sb_write( sb, buf, strlen( buf ) ) ) - { - /* He/She should join the switchboard soon, let's queue the message. */ - sb->msgq = g_slist_append( sb->msgq, m ); - return( 1 ); - } - } - - debug( "Creating a new switchboard to message %s", who ); - - /* If we reach this line, there was no spare switchboard, so let's make one. */ - g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); - if( !msn_write( ic, buf, strlen( buf ) ) ) - { - g_free( m->who ); - g_free( m->text ); - g_free( m ); - - return( 0 ); - } - - /* And queue the message to md. We'll pick it up when the switchboard comes up. */ - md->msgq = g_slist_append( md->msgq, m ); - - /* FIXME: If the switchboard creation fails, the message will not be sent. */ - - return( 1 ); + return msn_sb_write_msg( ic, m ); } return( 0 ); @@ -251,8 +216,6 @@ static void msn_chat_leave( struct groupchat *c ) static struct groupchat *msn_chat_with( struct im_connection *ic, char *who ) { struct msn_switchboard *sb; - struct msn_data *md = ic->proto_data; - char buf[1024]; if( ( sb = msn_sb_by_handle( ic, who ) ) ) { @@ -263,31 +226,13 @@ static struct groupchat *msn_chat_with( struct im_connection *ic, char *who ) { struct msn_message *m; - if( ( sb = msn_sb_spare( ic ) ) ) - { - debug( "Trying to reuse an existing switchboard as a groupchat with %s", who ); - g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, who ); - if( msn_sb_write( sb, buf, strlen( buf ) ) ) - return msn_sb_to_chat( sb ); - } - - /* If the stuff above failed for some reason: */ - debug( "Creating a new switchboard to groupchat with %s", who ); - - /* Request a new switchboard. */ - g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); - if( !msn_write( ic, buf, strlen( buf ) ) ) - return( 0 ); - /* Create a magic message. This is quite hackish, but who cares? :-P */ m = g_new0( struct msn_message, 1 ); m->who = g_strdup( who ); m->text = g_strdup( GROUPCHAT_SWITCHBOARD_MESSAGE ); - /* Queue the magic message and cross your fingers. */ - md->msgq = g_slist_append( md->msgq, m ); - - /* FIXME: Can I try to return something here already? */ + msn_sb_write_msg( ic, m ); + return NULL; } diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index 63759303..7c849acf 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -23,6 +23,9 @@ Suite 330, Boston, MA 02111-1307 USA */ +#ifndef _MSN_H +#define _MSN_H + /* Some hackish magicstrings to make special-purpose messages/switchboards. */ #define TYPING_NOTIFICATION_MESSAGE "\r\r\rBEWARE, ME R TYPINK MESSAGE!!!!\r\r\r" @@ -175,3 +178,6 @@ int msn_sb_sendmessage( struct msn_switchboard *sb, char *text ); struct groupchat *msn_sb_to_chat( struct msn_switchboard *sb ); void msn_sb_destroy( struct msn_switchboard *sb ); gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond ); +int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m ); + +#endif //_MSN_H diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c index 18c41ef5..e9526234 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -47,6 +47,48 @@ int msn_sb_write( struct msn_switchboard *sb, char *s, int len ) return( 1 ); } +int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m ) +{ + struct msn_data *md = ic->proto_data; + struct msn_switchboard *sb; + char buf[1024]; + + /* FIXME: *CHECK* the reliability of using spare sb's! */ + if( ( sb = msn_sb_spare( ic ) ) ) + { + debug( "Trying to use a spare switchboard to message %s", m->who ); + + sb->who = g_strdup( m->who ); + g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, m->who ); + if( msn_sb_write( sb, buf, strlen( buf ) ) ) + { + /* He/She should join the switchboard soon, let's queue the message. */ + sb->msgq = g_slist_append( sb->msgq, m ); + return( 1 ); + } + } + + debug( "Creating a new switchboard to message %s", m->who ); + + /* If we reach this line, there was no spare switchboard, so let's make one. */ + g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); + if( !msn_write( ic, buf, strlen( buf ) ) ) + { + g_free( m->who ); + g_free( m->text ); + g_free( m ); + + return( 0 ); + } + + /* And queue the message to md. We'll pick it up when the switchboard comes up. */ + md->msgq = g_slist_append( md->msgq, m ); + + /* FIXME: If the switchboard creation fails, the message will not be sent. */ + + return( 1 ); +} + struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session ) { struct msn_data *md = ic->proto_data; |