Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/msn/msn.c

    r823de9d rc6ca3ee  
    2626#include "nogaim.h"
    2727#include "msn.h"
     28
     29int msn_chat_id;
     30GSList *msn_connections;
     31GSList *msn_switchboards;
    2832
    2933static char *msn_set_display_name( set_t *set, char *value );
     
    113117{
    114118        struct msn_switchboard *sb;
     119        struct msn_data *md = ic->proto_data;
    115120       
    116121        if( ( sb = msn_sb_by_handle( ic, who ) ) )
     
    121126        {
    122127                struct msn_message *m;
     128                char buf[1024];
    123129               
    124130                /* Create a message. We have to arrange a usable switchboard, and send the message later. */
     
    127133                m->text = g_strdup( message );
    128134               
    129                 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 );
    130169        }
    131170       
     
    217256{
    218257        struct msn_switchboard *sb;
     258        struct msn_data *md = ic->proto_data;
     259        char buf[1024];
    219260       
    220261        if( ( sb = msn_sb_by_handle( ic, who ) ) )
     
    226267        {
    227268                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 );
    228285               
    229286                /* Create a magic message. This is quite hackish, but who cares? :-P */
     
    232289                m->text = g_strdup( GROUPCHAT_SWITCHBOARD_MESSAGE );
    233290               
    234                 msn_sb_write_msg( ic, m );
    235 
     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? */
    236295                return NULL;
    237296        }
     
    317376       
    318377        ret->name = "msn";
    319     ret->mms = 1409;         /* this guess taken from libotr UPGRADING file */
    320378        ret->login = msn_login;
    321379        ret->init = msn_init;
Note: See TracChangeset for help on using the changeset viewer.