Changeset 814aa52 for protocols/msn


Ignore:
Timestamp:
2010-06-03T11:00:45Z (14 years ago)
Author:
Sven Moritz Hallberg <pesco@…>
Branches:
master
Children:
a6b2f13
Parents:
5f8ab6a9 (diff), f4bcc22 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge in bitlbee 1.2.6

Location:
protocols/msn
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • protocols/msn/msn.c

    r5f8ab6a9 r814aa52  
    3131GSList *msn_switchboards;
    3232
    33 static char *msn_set_display_name( set_t *set, char *value );
     33static char *set_eval_display_name( set_t *set, char *value );
    3434
    3535static void msn_init( account_t *acc )
    3636{
    37         set_t *s;
    38        
    39         s = set_add( &acc->set, "display_name", NULL, msn_set_display_name, acc );
    40         s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY;
    41 
    42         s = set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
     37        set_add( &acc->set, "display_name", NULL, set_eval_display_name, acc );
     38        set_add( &acc->set, "local_display_name", "false", set_eval_bool, acc );
     39        set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
     40        set_add( &acc->set, "switchboard_keepalives", "false", set_eval_bool, acc );
    4341}
    4442
     
    167165static void msn_set_my_name( struct im_connection *ic, char *info )
    168166{
    169         msn_set_display_name( set_find( &ic->acc->set, "display_name" ), info );
     167        msn_set_display_name( ic, info );
    170168}
    171169
     
    283281}
    284282
    285 static char *msn_set_display_name( set_t *set, char *value )
     283static char *set_eval_display_name( set_t *set, char *value )
    286284{
    287285        account_t *acc = set->data;
    288286        struct im_connection *ic = acc->ic;
    289         struct msn_data *md;
    290         char buf[1024], *fn;
    291        
    292         /* Double-check. */
     287       
     288        /* Allow any name if we're offline. */
    293289        if( ic == NULL )
    294                 return NULL;
    295        
    296         md = ic->proto_data;
     290                return value;
    297291       
    298292        if( strlen( value ) > 129 )
     
    301295                return NULL;
    302296        }
    303        
    304         fn = msn_http_encode( value );
    305        
    306         g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, ic->acc->user, fn );
    307         msn_write( ic, buf, strlen( buf ) );
    308         g_free( fn );
    309297       
    310298        /* Returning NULL would be better, because the server still has to
    311299           confirm the name change. However, it looks a bit confusing to the
    312300           user. */
    313         return value;
     301        return msn_set_display_name( ic, value ) ? value : NULL;
    314302}
    315303
  • protocols/msn/msn.h

    r5f8ab6a9 r814aa52  
    3131#define TYPING_NOTIFICATION_MESSAGE "\r\r\rBEWARE, ME R TYPINK MESSAGE!!!!\r\r\r"
    3232#define GROUPCHAT_SWITCHBOARD_MESSAGE "\r\r\rME WANT TALK TO MANY PEOPLE\r\r\r"
     33#define SB_KEEPALIVE_MESSAGE "\r\r\rDONT HANG UP ON ME!\r\r\r"
    3334
    3435#ifdef DEBUG_MSN
     
    5354                           "TypingUser: %s\r\n" \
    5455                           "\r\n\r\n"
     56
     57#define SB_KEEPALIVE_HEADERS "MIME-Version: 1.0\r\n" \
     58                             "Content-Type: text/x-ping\r\n" \
     59                             "\r\n\r\n"
    5560
    5661#define PROFILE_URL "http://members.msn.com/"
     
    8388        gint inp;
    8489        struct msn_handler_data *handler;
     90        gint keepalive;
    8591       
    8692        int trId;
     
    161167char *msn_http_encode( const char *input );
    162168void msn_msgq_purge( struct im_connection *ic, GSList **list );
     169gboolean msn_set_display_name( struct im_connection *ic, const char *rawname );
    163170
    164171/* tables.c */
     
    179186gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond );
    180187int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m );
     188void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial );
     189void msn_sb_stop_keepalives( struct msn_switchboard *sb );
    181190
    182191#endif //_MSN_H
  • protocols/msn/msn_util.c

    r5f8ab6a9 r814aa52  
    3838                imcb_error( ic, "Short write() to main server" );
    3939                imc_logout( ic, TRUE );
    40                 return( 0 );
    41         }
    42        
    43         return( 1 );
     40                return 0;
     41        }
     42       
     43        return 1;
    4444}
    4545
     
    377377        g_string_free( ret, TRUE );
    378378}
     379
     380gboolean msn_set_display_name( struct im_connection *ic, const char *rawname )
     381{
     382        char *fn = msn_http_encode( rawname );
     383        struct msn_data *md = ic->proto_data;
     384        char buf[1024];
     385       
     386        g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, ic->acc->user, fn );
     387        g_free( fn );
     388       
     389        return msn_write( ic, buf, strlen( buf ) ) != 0;
     390}
  • protocols/msn/ns.c

    r5f8ab6a9 r814aa52  
    3535
    3636static void msn_auth_got_passport_token( struct msn_auth_data *mad );
     37static gboolean msn_ns_got_display_name( struct im_connection *ic, char *name );
    3738
    3839gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond )
     
    231232                else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 )
    232233                {
    233                         set_t *s;
    234                        
    235234                        if( num_parts == 7 )
    236                         {
    237                                 http_decode( cmd[4] );
    238                                
    239                                 strncpy( ic->displayname, cmd[4], sizeof( ic->displayname ) );
    240                                 ic->displayname[sizeof(ic->displayname)-1] = 0;
    241                                
    242                                 if( ( s = set_find( &ic->acc->set, "display_name" ) ) )
    243                                 {
    244                                         g_free( s->value );
    245                                         s->value = g_strdup( cmd[4] );
    246                                 }
    247                         }
     235                                msn_ns_got_display_name( ic, cmd[4] );
    248236                        else
    249                         {
    250237                                imcb_log( ic, "Warning: Friendly name in server response was corrupted" );
    251                         }
    252238                       
    253239                        imcb_log( ic, "Authenticated, getting buddy list" );
     
    422408        else if( strcmp( cmd[0], "FLN" ) == 0 )
    423409        {
    424                 if( cmd[1] )
    425                         imcb_buddy_status( ic, cmd[1], 0, NULL, NULL );
     410                if( cmd[1] == NULL )
     411                        return 1;
     412               
     413                imcb_buddy_status( ic, cmd[1], 0, NULL, NULL );
     414               
     415                msn_sb_start_keepalives( msn_sb_by_handle( ic, cmd[1] ), TRUE );
    426416        }
    427417        else if( strcmp( cmd[0], "NLN" ) == 0 )
     
    449439                                   ( st != msn_away_state_list ? OPT_AWAY : 0 ),
    450440                                   st->name, NULL );
     441               
     442                msn_sb_stop_keepalives( msn_sb_by_handle( ic, cmd[2] ) );
    451443        }
    452444        else if( strcmp( cmd[0], "RNG" ) == 0 )
     
    553545                return( 0 );
    554546        }
     547#if 0
     548        /* Discard this one completely for now since I don't care about the ack
     549           and since MSN servers can apparently screw up the formatting. */
    555550        else if( strcmp( cmd[0], "REA" ) == 0 )
    556551        {
     
    583578                }
    584579        }
     580#endif
    585581        else if( strcmp( cmd[0], "IPG" ) == 0 )
    586582        {
     
    732728        }
    733729}
     730
     731static gboolean msn_ns_got_display_name( struct im_connection *ic, char *name )
     732{
     733        set_t *s;
     734       
     735        if( ( s = set_find( &ic->acc->set, "display_name" ) ) == NULL )
     736                return FALSE; /* Shouldn't happen.. */
     737       
     738        http_decode( name );
     739       
     740        if( s->value && strcmp( s->value, name ) == 0 )
     741        {
     742                return TRUE;
     743                /* The names match, nothing to worry about. */
     744        }
     745        else if( s->value != NULL &&
     746                 ( strcmp( name, ic->acc->user ) == 0 ||
     747                   set_getbool( &ic->acc->set, "local_display_name" ) ) )
     748        {
     749                /* The server thinks our display name is our e-mail address
     750                   which is probably wrong, or the user *wants* us to do this:
     751                   Always use the locally set display_name. */
     752                return msn_set_display_name( ic, s->value );
     753        }
     754        else
     755        {
     756                if( s->value && *s->value )
     757                        imcb_log( ic, "BitlBee thinks your display name is `%s' but "
     758                                      "the MSN server says it's `%s'. Using the MSN "
     759                                      "server's name. Set local_display_name to true "
     760                                      "to use the local name.", s->value, name );
     761               
     762                if( g_utf8_validate( name, -1, NULL ) )
     763                {
     764                        g_free( s->value );
     765                        s->value = g_strdup( name );
     766                }
     767                else
     768                {
     769                        imcb_log( ic, "Warning: Friendly name in server response was corrupted" );
     770                }
     771               
     772                return TRUE;
     773        }
     774}
  • protocols/msn/sb.c

    r5f8ab6a9 r814aa52  
    168168               
    169169                /* Build the message. Convert LF to CR-LF for normal messages. */
    170                 if( strcmp( text, TYPING_NOTIFICATION_MESSAGE ) != 0 )
     170                if( strcmp( text, TYPING_NOTIFICATION_MESSAGE ) == 0 )
     171                {
     172                        i = strlen( MSN_TYPING_HEADERS ) + strlen( sb->ic->acc->user );
     173                        buf = g_new0( char, i );
     174                        i = g_snprintf( buf, i, MSN_TYPING_HEADERS, sb->ic->acc->user );
     175                }
     176                else if( strcmp( text, SB_KEEPALIVE_MESSAGE ) == 0 )
     177                {
     178                        buf = g_strdup( SB_KEEPALIVE_HEADERS );
     179                        i = strlen( buf );
     180                }
     181                else
    171182                {
    172183                        buf = g_new0( char, sizeof( MSN_MESSAGE_HEADERS ) + strlen( text ) * 2 + 1 );
     
    182193                        }
    183194                }
    184                 else
    185                 {
    186                         i = strlen( MSN_TYPING_HEADERS ) + strlen( sb->ic->acc->user );
    187                         buf = g_new0( char, i );
    188                         i = g_snprintf( buf, i, MSN_TYPING_HEADERS, sb->ic->acc->user );
    189                 }
    190195               
    191196                /* Build the final packet (MSG command + the message). */
     
    250255       
    251256        msn_msgq_purge( ic, &sb->msgq );
     257        msn_sb_stop_keepalives( sb );
    252258       
    253259        if( sb->key ) g_free( sb->key );
     
    471477               
    472478                sb->ready = 1;
     479               
     480                msn_sb_start_keepalives( sb, FALSE );
    473481        }
    474482        else if( strcmp( cmd[0], "CAL" ) == 0 )
     
    520528                        }
    521529                       
     530                        msn_sb_start_keepalives( sb, FALSE );
     531                       
    522532                        return( st );
    523533                }
     
    581591                if( sb->who )
    582592                {
     593                        msn_sb_stop_keepalives( sb );
     594                       
    583595                        /* This is a single-person chat, and the other person is leaving. */
    584596                        g_free( sb->who );
     
    764776        return( 1 );
    765777}
     778
     779static gboolean msn_sb_keepalive( gpointer data, gint source, b_input_condition cond )
     780{
     781        struct msn_switchboard *sb = data;
     782        return sb->ready && msn_sb_sendmessage( sb, SB_KEEPALIVE_MESSAGE );
     783}
     784
     785void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial )
     786{
     787        struct buddy *b;
     788       
     789        if( sb && sb->who && sb->keepalive == 0 &&
     790            ( b = imcb_find_buddy( sb->ic, sb->who ) ) && !b->present &&
     791            set_getbool( &sb->ic->acc->set, "switchboard_keepalives" ) )
     792        {
     793                if( initial )
     794                        msn_sb_keepalive( sb, 0, 0 );
     795               
     796                sb->keepalive = b_timeout_add( 20000, msn_sb_keepalive, sb );
     797        }
     798}
     799
     800void msn_sb_stop_keepalives( struct msn_switchboard *sb )
     801{
     802        if( sb && sb->keepalive > 0 )
     803        {
     804                b_event_remove( sb->keepalive );
     805                sb->keepalive = 0;
     806        }
     807}
Note: See TracChangeset for help on using the changeset viewer.