Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/nogaim.c

    r449a51d rfa295e36  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2010 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2006 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    3333
    3434#define BITLBEE_CORE
     35#include "nogaim.h"
    3536#include <ctype.h>
    36 
    37 #include "nogaim.h"
    38 #include "chat.h"
    3937
    4038static int remove_chat_buddy_silent( struct groupchat *b, const char *handle );
     
    9896void register_protocol (struct prpl *p)
    9997{
    100         int i;
    101         gboolean refused = global.conf->protocols != NULL;
    102  
    103         for (i = 0; global.conf->protocols && global.conf->protocols[i]; i++)
    104         {
    105                 if (g_strcasecmp(p->name, global.conf->protocols[i]) == 0)
    106                         refused = FALSE;
    107         }
    108 
    109         if (refused)
    110                 log_message(LOGLVL_WARNING, "Protocol %s disabled\n", p->name);
    111         else
    112                 protocols = g_list_append(protocols, p);
     98        protocols = g_list_append(protocols, p);
    11399}
    114100
     
    280266        ic->flags |= OPT_LOGGED_IN;
    281267       
    282         /* Necessary to send initial presence status, even if we're not away. */
    283         imc_away_send_update( ic );
     268        /* Also necessary when we're not away, at least for some of the
     269           protocols. */
     270        imc_set_away( ic, u->away );
    284271       
    285272        /* Apparently we're connected successfully, so reset the
     
    383370/* list.c */
    384371
    385 void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group )
     372void imcb_add_buddy( struct im_connection *ic, char *handle, char *group )
    386373{
    387374        user_t *u;
     
    457444}
    458445
    459 void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname )
     446void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname )
    460447{
    461448        user_t *u = user_findhandle( ic, handle );
    462         char *set;
    463449       
    464450        if( !u || !realname ) return;
     
    473459                        imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
    474460        }
    475        
    476         set = set_getstr( &ic->acc->set, "nick_source" );
    477         if( strcmp( set, "handle" ) != 0 )
    478         {
    479                 char *name = g_strdup( realname );
    480                
    481                 if( strcmp( set, "first_name" ) == 0 )
    482                 {
    483                         int i;
    484                         for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {}
    485                         name[i] = '\0';
    486                 }
    487                
    488                 imcb_buddy_nick_hint( ic, handle, name );
    489                
    490                 g_free( name );
    491         }
    492 }
    493 
    494 void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group )
     461}
     462
     463void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group )
    495464{
    496465        user_t *u;
     
    502471/* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM
    503472   modules to suggest a nickname for a handle. */
    504 void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick )
     473void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick )
    505474{
    506475        user_t *u = user_findhandle( ic, handle );
     
    647616        oo = u->online;
    648617       
    649         g_free( u->away );
    650         g_free( u->status_msg );
    651         u->away = u->status_msg = NULL;
     618        if( u->away )
     619        {
     620                g_free( u->away );
     621                u->away = NULL;
     622        }
    652623       
    653624        if( ( flags & OPT_LOGGED_IN ) && !u->online )
     
    687658                }
    688659        }
    689         else
    690         {
    691                 u->status_msg = g_strdup( message );
    692         }
     660        /* else waste_any_state_information_for_now(); */
    693661       
    694662        /* LISPy... */
     
    715683}
    716684
    717 void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at )
     685void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at )
    718686{
    719687        irc_t *irc = ic->irc;
     
    848816}
    849817
    850 void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at )
     818void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at )
    851819{
    852820        struct im_connection *ic = c->ic;
     
    920888/* buddy_chat.c */
    921889
    922 void imcb_chat_add_buddy( struct groupchat *b, const char *handle )
     890void imcb_chat_add_buddy( struct groupchat *b, char *handle )
    923891{
    924892        user_t *u = user_findhandle( b->ic, handle );
     
    955923
    956924/* This function is one BIG hack... :-( EREWRITE */
    957 void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason )
     925void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason )
    958926{
    959927        user_t *u;
     
    11001068}
    11011069
    1102 static char *imc_away_state_find( GList *gcm, char *away, char **message );
    1103 
    1104 int imc_away_send_update( struct im_connection *ic )
    1105 {
    1106         char *away, *msg = NULL;
    1107        
    1108         away = set_getstr( &ic->acc->set, "away" ) ?
    1109              : set_getstr( &ic->irc->set, "away" );
    1110         if( away && *away )
    1111         {
    1112                 GList *m = ic->acc->prpl->away_states( ic );
    1113                 msg = ic->acc->flags & ACC_FLAG_AWAY_MESSAGE ? away : NULL;
    1114                 away = imc_away_state_find( m, away, &msg ) ? : m->data;
    1115         }
    1116         else if( ic->acc->flags & ACC_FLAG_STATUS_MESSAGE )
    1117         {
    1118                 away = NULL;
    1119                 msg = set_getstr( &ic->acc->set, "status" ) ?
    1120                     : set_getstr( &ic->irc->set, "status" );
    1121         }
    1122        
    1123         ic->acc->prpl->set_away( ic, away, msg );
    1124        
    1125         return 1;
     1070static char *imc_away_alias_find( GList *gcm, char *away );
     1071
     1072int imc_set_away( struct im_connection *ic, char *away )
     1073{
     1074        GList *m, *ms;
     1075        char *s;
     1076       
     1077        if( !away ) away = "";
     1078        ms = m = ic->acc->prpl->away_states( ic );
     1079       
     1080        while( m )
     1081        {
     1082                if( *away )
     1083                {
     1084                        if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 )
     1085                                break;
     1086                }
     1087                else
     1088                {
     1089                        if( g_strcasecmp( m->data, "Available" ) == 0 )
     1090                                break;
     1091                        if( g_strcasecmp( m->data, "Online" ) == 0 )
     1092                                break;
     1093                }
     1094                m = m->next;
     1095        }
     1096       
     1097        if( m )
     1098        {
     1099                ic->acc->prpl->set_away( ic, m->data, *away ? away : NULL );
     1100        }
     1101        else
     1102        {
     1103                s = imc_away_alias_find( ms, away );
     1104                if( s )
     1105                {
     1106                        ic->acc->prpl->set_away( ic, s, away );
     1107                        if( set_getbool( &ic->irc->set, "debug" ) )
     1108                                imcb_log( ic, "Setting away state to %s", s );
     1109                }
     1110                else
     1111                        ic->acc->prpl->set_away( ic, GAIM_AWAY_CUSTOM, away );
     1112        }
     1113       
     1114        return( 1 );
    11261115}
    11271116
     
    11381127};
    11391128
    1140 static char *imc_away_state_find( GList *gcm, char *away, char **message )
     1129static char *imc_away_alias_find( GList *gcm, char *away )
    11411130{
    11421131        GList *m;
    11431132        int i, j;
    11441133       
    1145         for( m = gcm; m; m = m->next )
    1146                 if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 )
    1147                 {
    1148                         /* At least the Yahoo! module works better if message
    1149                            contains no data unless it adds something to what
    1150                            we have in state already. */
    1151                         if( strlen( m->data ) == strlen( away ) )
    1152                                 *message = NULL;
    1153                        
    1154                         return m->data;
    1155                 }
    1156        
    11571134        for( i = 0; *imc_away_alias_list[i]; i ++ )
    11581135        {
    1159                 int keep_message;
    1160                
    11611136                for( j = 0; imc_away_alias_list[i][j]; j ++ )
    11621137                        if( g_strncasecmp( away, imc_away_alias_list[i][j], strlen( imc_away_alias_list[i][j] ) ) == 0 )
    1163                         {
    1164                                 keep_message = strlen( away ) != strlen( imc_away_alias_list[i][j] );
    11651138                                break;
    1166                         }
    11671139               
    11681140                if( !imc_away_alias_list[i][j] )        /* If we reach the end, this row */
     
    11721144                for( j = 0; imc_away_alias_list[i][j]; j ++ )
    11731145                {
    1174                         for( m = gcm; m; m = m->next )
     1146                        m = gcm;
     1147                        while( m )
     1148                        {
    11751149                                if( g_strcasecmp( imc_away_alias_list[i][j], m->data ) == 0 )
    1176                                 {
    1177                                         if( !keep_message )
    1178                                                 *message = NULL;
    1179                                        
    1180                                         return imc_away_alias_list[i][j];
    1181                                 }
    1182                 }
    1183                
    1184                 /* No need to look further, apparently this state doesn't
    1185                    have any good alias for this protocol. */
    1186                 break;
    1187         }
    1188        
    1189         return NULL;
     1150                                        return( imc_away_alias_list[i][j] );
     1151                                m = m->next;
     1152                        }
     1153                }
     1154        }
     1155       
     1156        return( NULL );
    11901157}
    11911158
Note: See TracChangeset for help on using the changeset viewer.