Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/msn/msn.c

    r1c3008a rc6ca3ee  
    2727#include "msn.h"
    2828
     29int msn_chat_id;
     30GSList *msn_connections;
     31GSList *msn_switchboards;
     32
    2933static char *msn_set_display_name( set_t *set, char *value );
    3034
     
    7781        if( md )
    7882        {
    79                 while( md->filetransfers ) {
    80                         imcb_file_canceled( md->filetransfers->data, "Closing connection" );
    81                 }
    82                
    8383                if( md->fd >= 0 )
    8484                        closesocket( md->fd );
     
    117117{
    118118        struct msn_switchboard *sb;
     119        struct msn_data *md = ic->proto_data;
    119120       
    120121        if( ( sb = msn_sb_by_handle( ic, who ) ) )
     
    125126        {
    126127                struct msn_message *m;
     128                char buf[1024];
    127129               
    128130                /* Create a message. We have to arrange a usable switchboard, and send the message later. */
     
    131133                m->text = g_strdup( message );
    132134               
    133                 return msn_sb_write_msg( ic, m );
     135                /* FIXME: *CHECK* the reliability of using spare sb's! */
     136                if( ( sb = msn_sb_spare( ic ) ) )
     137                {
     138                        debug( "Trying to use a spare switchboard to message %s", who );
     139                       
     140                        sb->who = g_strdup( who );
     141                        g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, who );
     142                        if( msn_sb_write( sb, buf, strlen( buf ) ) )
     143                        {
     144                                /* He/She should join the switchboard soon, let's queue the message. */
     145                                sb->msgq = g_slist_append( sb->msgq, m );
     146                                return( 1 );
     147                        }
     148                }
     149               
     150                debug( "Creating a new switchboard to message %s", who );
     151               
     152                /* If we reach this line, there was no spare switchboard, so let's make one. */
     153                g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId );
     154                if( !msn_write( ic, buf, strlen( buf ) ) )
     155                {
     156                        g_free( m->who );
     157                        g_free( m->text );
     158                        g_free( m );
     159                       
     160                        return( 0 );
     161                }
     162               
     163                /* And queue the message to md. We'll pick it up when the switchboard comes up. */
     164                md->msgq = g_slist_append( md->msgq, m );
     165               
     166                /* FIXME: If the switchboard creation fails, the message will not be sent. */
     167               
     168                return( 1 );
    134169        }
    135170       
     
    221256{
    222257        struct msn_switchboard *sb;
     258        struct msn_data *md = ic->proto_data;
     259        char buf[1024];
    223260       
    224261        if( ( sb = msn_sb_by_handle( ic, who ) ) )
     
    230267        {
    231268                struct msn_message *m;
     269               
     270                if( ( sb = msn_sb_spare( ic ) ) )
     271                {
     272                        debug( "Trying to reuse an existing switchboard as a groupchat with %s", who );
     273                        g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, who );
     274                        if( msn_sb_write( sb, buf, strlen( buf ) ) )
     275                                return msn_sb_to_chat( sb );
     276                }
     277               
     278                /* If the stuff above failed for some reason: */
     279                debug( "Creating a new switchboard to groupchat with %s", who );
     280               
     281                /* Request a new switchboard. */
     282                g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId );
     283                if( !msn_write( ic, buf, strlen( buf ) ) )
     284                        return( 0 );
    232285               
    233286                /* Create a magic message. This is quite hackish, but who cares? :-P */
     
    236289                m->text = g_strdup( GROUPCHAT_SWITCHBOARD_MESSAGE );
    237290               
    238                 msn_sb_write_msg( ic, m );
    239 
     291                /* Queue the magic message and cross your fingers. */
     292                md->msgq = g_slist_append( md->msgq, m );
     293               
     294                /* FIXME: Can I try to return something here already? */
    240295                return NULL;
    241296        }
     
    342397        ret->send_typing = msn_send_typing;
    343398        ret->handle_cmp = g_strcasecmp;
    344         ret->transfer_request = msn_ftp_transfer_request;
    345399
    346400        register_protocol(ret);
Note: See TracChangeset for help on using the changeset viewer.