Changeset 1ba7e8f for protocols


Ignore:
Timestamp:
2008-02-15T17:38:57Z (17 years ago)
Author:
ulim <a.sporto+bee@…>
Branches:
master
Children:
506e61b
Parents:
0fbd3a6d (diff), eeb85a8 (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:

Merged with upstream r328

Wilmer van der Gaast 2008-02-11 Got rid of some noise at startup: complaining when the default configuration

Wilmer van der Gaast 2008-02-10 Added support for password-protected Jabber chatrooms.
Wilmer van der Gaast 2008-02-10 Making AI_ADDRCONFIG optional, it doesn't exist on at least NetBSD and
Wilmer van der Gaast 2008-02-09 Restored "add -tmp". A bit hackish, but it will do for now.
Wilmer van der Gaast 2008-02-07 Fixed getnameinfo() calls, this fixes Solaris stability issues. Thanks to
Wilmer van der Gaast 2008-02-04 Added bogus G_GNUC_MALLOC to restore GLib 2.4 compatibility (hopefully).
Wilmer van der Gaast 2008-02-03 Messages from the user are also included in backlogs when joining a Jabber
Wilmer van der Gaast 2008-02-03 Disabling "Unknown command" warnings since they're very noisy and pretty
Wilmer van der Gaast 2008-02-03 Implemented XEP-0115. This adds some info to the <presence/> tags so
Wilmer van der Gaast 2008-02-03 Saner garbage collection of cached packets in the Jabber module. Now
Wilmer van der Gaast 2008-02-02 Added help_free() and cleaned up some very stale help-related stuff I
Wilmer van der Gaast 2008-01-30 Fixed handling of OSCAR multi-part messages... They're not arrays, they're
Wilmer van der Gaast 2008-01-24 Keeping track of valid Jabber connections so _connected() events will be
Wilmer van der Gaast 2008-01-24 Fixed two valgrind warnings (partially uninitialized "struct tm" vars.)
Wilmer van der Gaast 2008-01-20 The Jabber module now uses imcb_chat_log() instead of imcb_log() where
Wilmer van der Gaast 2008-01-20 Added imcb_chat_log() for chatroom system messages, so they can be
Wilmer van der Gaast 2008-01-20 GET_BUDDY_FIRST wasn't actually implemented, even though it was in use
Wilmer van der Gaast 2008-01-19 Using test -f instead of test -e. This breaks if the include files are
Wilmer van der Gaast 2008-01-19 Added byte swapping code to the new MD5 checksumming code to make it work
Wilmer van der Gaast 2008-01-18 Moving imcb_chat_new() to a saner location (no code changes) and fixing
Wilmer van der Gaast 2008-01-17 Apparently ext_yahoo_got_im can be called with msg=NULL, so it should be
Wilmer van der Gaast 2008-01-17 Fixing some Solaris compiler warnings (u_int->uint, adding some typecasts
Wilmer van der Gaast 2008-01-13 Fixed handing of failed groupchat joins.
Wilmer van der Gaast 2008-01-13 Fixed "Conditional jump or move depends on uninitialised value(s)" at
Wilmer van der Gaast 2008-01-13 Fixed quickstart2. (Bug #349.)
Wilmer van der Gaast 2008-01-13 Different handling of charset mismatches before login time. Ignoring a
Wilmer van der Gaast 2008-01-12 When a switchboard connection dies (at the TCP level) and there are still
Wilmer van der Gaast 2008-01-12 Killed info_string_append() and now showing the IP address of ICQ users
Wilmer van der Gaast 2008-01-11 Fixing bug #344, now away states should always be correct, even when people
Wilmer van der Gaast 2008-01-11 Adding own handle to protocol name in blist output for people with multiple
Wilmer van der Gaast 2008-01-10 Now setting odata->icq properly again, this got lost some time ago, which
Wilmer van der Gaast 2008-01-06 More consistency in error/warning errors. Until now "WARNING:" was usually
Wilmer van der Gaast 2008-01-06 Changed warning message about unsent MSN messages. It should show the actual
Wilmer van der Gaast 2008-01-05 Added "mail_notifications" setting. Who needs those notifications anyway?
Wilmer van der Gaast 2008-01-05 Build fix from vmiklos.
Wilmer van der Gaast 2008-01-05 Added handling of MSN switchboard NAK messages. Untested, but hey, it
Wilmer van der Gaast 2008-01-05 Removed closure->result. I was planning to add some more stuff, but will
Miklos Vajna 2007-12-31 encode: md5.c is no longer in protocols/, it's in lib/
Wilmer van der Gaast 2007-12-28 Fixed return value check in proxy_connect(), since on some systems
Wilmer van der Gaast 2007-12-28 Added missing return in jabber_login().
Wilmer van der Gaast 2007-12-16 Implemented XEP-0199 (patch from misc@…).
Wilmer van der Gaast 2007-12-12 Checking conn->xcred before trying to clean it up since GnuTLS doesn't
Wilmer van der Gaast 2007-12-12 Killed the <server> parameter to "account add" and changed the default
Wilmer van der Gaast 2007-12-12 Fixed sockerr_again() usage in Jabber module to (hopefully) fix a 100% CPU
Wilmer van der Gaast 2007-12-10 Don't allow nicks that start with a number.
Wilmer van der Gaast 2007-12-10 Fixed "set xxx" syntax (it showed all settings instead of just xxx).
Wilmer van der Gaast 2007-12-09 If I keep forgetting to credit people in commit msgs I should probably add
Wilmer van der Gaast 2007-12-09 Added /invite support for Jabber chatrooms (and fixed the argument order

Location:
protocols
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/conference.c

    r0fbd3a6d r1ba7e8f  
    3737        xt_add_attr( node, "xmlns", XMLNS_MUC );
    3838        node = jabber_make_packet( "presence", NULL, roomjid, node );
     39        if( password )
     40                xt_add_child( node, xt_new_node( "password", password, NULL ) );
    3941        jabber_cache_add( ic, node, jabber_chat_join_failed );
    4042       
     
    7375       
    7476        room = xt_find_attr( orig, "to" );
    75         if( ( bud = jabber_buddy_by_jid( ic, room, 0 ) ) )
    76                 jabber_chat_free( jabber_chat_by_jid( ic, bud->bare_jid ) );
    77        
     77        bud = jabber_buddy_by_jid( ic, room, 0 );
    7878        err = jabber_error_parse( xt_find_node( node->children, "error" ), XMLNS_STANZA_ERROR );
    7979        if( err )
    8080        {
    81                 imcb_error( ic, "Error joining groupchat %s: %s%s%s",
    82                             bud->bare_jid, err->code, err->text ? ": " : "",
    83                             err->text ? err->text : "" );
     81                imcb_error( ic, "Error joining groupchat %s: %s%s%s", room, err->code,
     82                            err->text ? ": " : "", err->text ? err->text : "" );
    8483                jabber_error_free( err );
    8584        }
     85        if( bud )
     86                jabber_chat_free( jabber_chat_by_jid( ic, bud->bare_jid ) );
    8687       
    8788        return XT_HANDLED;
     
    123124        struct jabber_chat *jc = c->data;
    124125        struct xt_node *node;
     126       
     127        jc->flags |= JCFLAG_MESSAGE_SENT;
    125128       
    126129        node = xt_new_node( "body", message, NULL );
     
    296299        struct xt_node *subject = xt_find_node( node->children, "subject" );
    297300        struct xt_node *body = xt_find_node( node->children, "body" );
    298         struct groupchat *chat;
     301        struct groupchat *chat = bud ? jabber_chat_by_jid( ic, bud->bare_jid ) : NULL;
     302        struct jabber_chat *jc = chat ? chat->data : NULL;
    299303        char *s;
    300304       
    301         if( bud == NULL )
    302         {
     305        if( bud == NULL || ( jc && ~jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me ) )
     306        {
     307                char *nick;
     308               
     309                if( body == NULL || body->text_len == 0 )
     310                        /* Meh. Empty messages aren't very interesting, no matter
     311                           how much some servers love to send them. */
     312                        return;
     313               
    303314                s = xt_find_attr( node, "from" ); /* pkt_message() already NULL-checked this one. */
    304                 if( strchr( s, '/' ) == NULL )
     315                nick = strchr( s, '/' );
     316                if( nick )
     317                {
     318                        /* If this message included a resource/nick we don't know,
     319                           we might still know the groupchat itself. */
     320                        *nick = 0;
     321                        chat = jabber_chat_by_jid( ic, s );
     322                        *nick = '/';
     323                       
     324                        nick ++;
     325                }
     326                else
     327                {
     328                        /* message.c uses the EXACT_JID option, so bud should
     329                           always be NULL here for bare JIDs. */
     330                        chat = jabber_chat_by_jid( ic, s );
     331                }
     332               
     333                if( nick == NULL )
     334                {
    305335                        /* This is fine, the groupchat itself isn't in jd->buddies. */
    306                         imcb_log( ic, "System message from groupchat %s: %s", s, body? body->text : "NULL" );
     336                        if( chat )
     337                                imcb_chat_log( chat, "From conference server: %s", body->text );
     338                        else
     339                                imcb_log( ic, "System message from unknown groupchat %s: %s", s, body->text );
     340                }
    307341                else
    308                         /* This, however, isn't fine! */
    309                         imcb_log( ic, "Groupchat message from unknown participant %s: %s", s, body ? body->text : "NULL" );
     342                {
     343                        /* This can happen too, at least when receiving a backlog when
     344                           just joining a channel. */
     345                        if( chat )
     346                                imcb_chat_log( chat, "Message from unknown participant %s: %s", nick, body->text );
     347                        else
     348                                imcb_log( ic, "Groupchat message from unknown JID %s: %s", s, body->text );
     349                }
    310350               
    311351                return;
    312352        }
    313         else if( ( chat = jabber_chat_by_jid( ic, bud->bare_jid ) ) == NULL )
     353        else if( chat == NULL )
    314354        {
    315355                /* How could this happen?? We could do kill( self, 11 )
  • protocols/jabber/io.c

    r0fbd3a6d r1ba7e8f  
    249249        struct im_connection *ic = data;
    250250       
     251        if( g_slist_find( jabber_connections, ic ) == NULL )
     252                return FALSE;
     253       
    251254        if( source == -1 )
    252255        {
     
    264267{
    265268        struct im_connection *ic = data;
    266         struct jabber_data *jd = ic->proto_data;
     269        struct jabber_data *jd;
     270       
     271        if( g_slist_find( jabber_connections, ic ) == NULL )
     272                return FALSE;
     273       
     274        jd = ic->proto_data;
    267275       
    268276        if( source == NULL )
  • protocols/jabber/iq.c

    r0fbd3a6d r1ba7e8f  
    5454                    !( s = xt_find_attr( c, "xmlns" ) ) )
    5555                {
    56                         imcb_log( ic, "WARNING: Received incomplete IQ-%s packet", type );
     56                        imcb_log( ic, "Warning: Received incomplete IQ-%s packet", type );
    5757                        return XT_HANDLED;
    5858                }
     
    9292                else if( strcmp( s, XMLNS_DISCO_INFO ) == 0 )
    9393                {
    94                         const char *features[] = { XMLNS_VERSION,
     94                        const char *features[] = { XMLNS_DISCO_INFO,
     95                                                   XMLNS_VERSION,
    9596                                                   XMLNS_TIME,
    9697                                                   XMLNS_CHATSTATES,
     
    132133                    !( s = xt_find_attr( c, "xmlns" ) ) )
    133134                {
    134                         imcb_log( ic, "WARNING: Received incomplete IQ-%s packet", type );
     135                        imcb_log( ic, "Warning: Received incomplete IQ-%s packet", type );
    135136                        return XT_HANDLED;
    136137                } else if( strcmp( s, XMLNS_ROSTER ) == 0 )
     
    152153                        else
    153154                        {
    154                                 imcb_log( ic, "WARNING: %s tried to fake a roster push!", s ? s : "(unknown)" );
     155                                imcb_log( ic, "Warning: %s tried to fake a roster push!", s ? s : "(unknown)" );
    155156                               
    156157                                xt_free_node( reply );
     
    220221        if( !( query = xt_find_node( node->children, "query" ) ) )
    221222        {
    222                 imcb_log( ic, "WARNING: Received incomplete IQ packet while authenticating" );
     223                imcb_log( ic, "Warning: Received incomplete IQ packet while authenticating" );
    223224                imc_logout( ic, FALSE );
    224225                return XT_HANDLED;
     
    278279        if( !( type = xt_find_attr( node, "type" ) ) )
    279280        {
    280                 imcb_log( ic, "WARNING: Received incomplete IQ packet while authenticating" );
     281                imcb_log( ic, "Warning: Received incomplete IQ packet while authenticating" );
    281282                imc_logout( ic, FALSE );
    282283                return XT_HANDLED;
     
    354355        if( !( query = xt_find_node( node->children, "query" ) ) )
    355356        {
    356                 imcb_log( ic, "WARNING: Received NULL roster packet" );
     357                imcb_log( ic, "Warning: Received NULL roster packet" );
    357358                return XT_HANDLED;
    358359        }
  • protocols/jabber/jabber.c

    r0fbd3a6d r1ba7e8f  
    3535#include "base64.h"
    3636
     37GSList *jabber_connections;
     38
    3739static void jabber_init( account_t *acc )
    3840{
     
    7072        struct ns_srv_reply *srv = NULL;
    7173        char *connect_to, *s;
     74       
     75        /* For now this is needed in the _connected() handlers if using
     76           GLib event handling, to make sure we're not handling events
     77           on dead connections. */
     78        jabber_connections = g_slist_prepend( jabber_connections, ic );
    7279       
    7380        jd->ic = ic;
     
    197204                imcb_error( ic, "Could not connect to server" );
    198205                imc_logout( ic, TRUE );
     206               
     207                return;
    199208        }
    200209       
     
    261270        g_free( jd->username );
    262271        g_free( jd );
     272       
     273        jabber_connections = g_slist_remove( jabber_connections, ic );
    263274}
    264275
  • protocols/jabber/jabber.h

    r0fbd3a6d r1ba7e8f  
    2929#include "xmltree.h"
    3030#include "bitlbee.h"
     31
     32extern GSList *jabber_connections;
    3133
    3234typedef enum
     
    4749typedef enum
    4850{
    49         JBFLAG_PROBED_XEP85 = 1,        /* Set this when we sent our probe packet to make
     51        JBFLAG_PROBED_XEP85 = 1,        /* Set this when we sent our probe packet to make
    5052                                           sure it gets sent only once. */
    51         JBFLAG_DOES_XEP85 = 2,          /* Set this when the resource seems to support
     53        JBFLAG_DOES_XEP85 = 2,          /* Set this when the resource seems to support
    5254                                           XEP85 (typing notification shite). */
    53         JBFLAG_IS_CHATROOM = 4,         /* It's convenient to use this JID thingy for
     55        JBFLAG_IS_CHATROOM = 4,         /* It's convenient to use this JID thingy for
    5456                                           groupchat state info too. */
    55         JBFLAG_IS_ANONYMOUS = 8,        /* For anonymous chatrooms, when we don't have
     57        JBFLAG_IS_ANONYMOUS = 8,        /* For anonymous chatrooms, when we don't have
    5658                                           have a real JID. */
    5759} jabber_buddy_flags_t;
     
    6466        char port[6];
    6567} jabber_streamhost_t;
     68
     69typedef enum
     70{
     71        JCFLAG_MESSAGE_SENT = 1,        /* Set this after sending the first message, so
     72                                           we can detect echoes/backlogs. */
     73} jabber_chat_flags_t;
    6674
    6775struct jabber_data
     
    105113struct jabber_cache_entry
    106114{
     115        time_t saved_at;
    107116        struct xt_node *node;
    108117        jabber_cache_event func;
     
    175184#define JABBER_PACKET_ID "BeeP"
    176185#define JABBER_CACHED_ID "BeeC"
     186
     187/* The number of seconds to keep cached packets before garbage collecting
     188   them. This gc is done on every keepalive (every minute). */
     189#define JABBER_CACHE_MAX_AGE 600
    177190
    178191/* RFC 392[01] stuff */
     
    198211#define XMLNS_MUC          "http://jabber.org/protocol/muc"                      /* XEP-0045 */
    199212#define XMLNS_MUC_USER     "http://jabber.org/protocol/muc#user"                 /* XEP-0045 */
     213#define XMLNS_CAPS         "http://jabber.org/protocol/caps"                     /* XEP-0115 */
    200214#define XMLNS_FEATURE      "http://jabber.org/protocol/feature-neg"              /* XEP-0020 */
    201215#define XMLNS_SI           "http://jabber.org/protocol/si"                       /* XEP-0095 */
  • protocols/jabber/jabber_util.c

    r0fbd3a6d r1ba7e8f  
    146146        entry->node = node;
    147147        entry->func = func;
     148        entry->saved_at = time( NULL );
    148149        g_hash_table_insert( jd->node_cache, xt_find_attr( node, "id" ), entry );
    149150}
     
    167168{
    168169        struct jabber_data *jd = ic->proto_data;
    169        
    170         g_hash_table_foreach_remove( jd->node_cache, jabber_cache_clean_entry, NULL );
    171 }
    172 
    173 gboolean jabber_cache_clean_entry( gpointer key, gpointer entry_, gpointer nullpointer )
     170        time_t threshold = time( NULL ) - JABBER_CACHE_MAX_AGE;
     171       
     172        g_hash_table_foreach_remove( jd->node_cache, jabber_cache_clean_entry, &threshold );
     173}
     174
     175gboolean jabber_cache_clean_entry( gpointer key, gpointer entry_, gpointer threshold_ )
    174176{
    175177        struct jabber_cache_entry *entry = entry_;
    176         struct xt_node *node = entry->node;
    177        
    178         if( node->flags & XT_SEEN )
    179                 return TRUE;
    180         else
    181         {
    182                 node->flags |= XT_SEEN;
    183                 return FALSE;
    184         }
     178        time_t *threshold = threshold_;
     179       
     180        return entry->saved_at < *threshold;
    185181}
    186182
     
    204200        if( entry == NULL )
    205201        {
    206                 imcb_log( ic, "WARNING: Received %s-%s packet with unknown/expired ID %s!",
     202                imcb_log( ic, "Warning: Received %s-%s packet with unknown/expired ID %s!",
    207203                              node->name, xt_find_attr( node, "type" ) ? : "(no type)", s );
    208204        }
     
    403399                if( ( bud = g_hash_table_lookup( jd->buddies, jid ) ) )
    404400                {
     401                        /* Just return the first one for this bare JID. */
     402                        if( flags & GET_BUDDY_FIRST )
     403                        {
     404                                *s = '/';
     405                                g_free( jid );
     406                                return bud;
     407                        }
     408                       
    405409                        /* Is this one of those no-resource buddies? */
    406410                        if( bud->resource == NULL )
    407411                        {
     412                                *s = '/';
    408413                                g_free( jid );
    409414                                return NULL;
    410415                        }
    411                         else
    412                         {
    413                                 /* See if there's an exact match. */
    414                                 for( ; bud; bud = bud->next )
    415                                         if( g_strcasecmp( bud->resource, s + 1 ) == 0 )
    416                                                 break;
    417                         }
     416                       
     417                        /* See if there's an exact match. */
     418                        for( ; bud; bud = bud->next )
     419                                if( g_strcasecmp( bud->resource, s + 1 ) == 0 )
     420                                        break;
    418421                }
    419422                else
     
    424427                           is done to handle conferences properly. */
    425428                        none_found = 1;
     429                        /* TODO(wilmer): Find out what I was thinking when I
     430                           wrote this??? And then fix it. This makes me sad... */
    426431                }
    427432               
     
    453458                else if( ( bud->resource == NULL || bud->next == NULL ) )
    454459                        /* No need for selection if there's only one option. */
     460                        return bud;
     461                else if( flags & GET_BUDDY_FIRST )
     462                        /* Looks like the caller doesn't care about details. */
    455463                        return bud;
    456464               
  • protocols/jabber/presence.c

    r0fbd3a6d r1ba7e8f  
    2929        char *from = xt_find_attr( node, "from" );
    3030        char *type = xt_find_attr( node, "type" );      /* NULL should mean the person is online. */
    31         struct xt_node *c;
    32         struct jabber_buddy *bud;
    33         int is_chat = 0, is_away = 0;
     31        struct xt_node *c, *cap;
     32        struct jabber_buddy *bud, *send_presence = NULL;
     33        int is_chat = 0;
    3434        char *s;
    3535       
     
    5050                {
    5151                        if( set_getbool( &ic->irc->set, "debug" ) )
    52                                 imcb_log( ic, "WARNING: Could not handle presence information from JID: %s", from );
     52                                imcb_log( ic, "Warning: Could not handle presence information from JID: %s", from );
    5353                        return XT_HANDLED;
    5454                }
     
    6363                {
    6464                        bud->away_state = (void*) jabber_away_state_by_code( c->text );
    65                         if( strcmp( c->text, "chat" ) != 0 )
    66                                 is_away = OPT_AWAY;
    6765                }
    6866                else
     
    7977                        bud->priority = 0;
    8078               
     79                if( bud && ( cap = xt_find_node( node->children, "c" ) ) &&
     80                    ( s = xt_find_attr( cap, "xmlns" ) ) && strcmp( s, XMLNS_CAPS ) == 0 )
     81                {
     82                        /* This <presence> stanza includes an XEP-0115
     83                           capabilities part. Not too interesting, but we can
     84                           see if it has an ext= attribute. */
     85                        s = xt_find_attr( cap, "ext" );
     86                        if( s && ( strstr( s, "cstates" ) || strstr( s, "chatstate" ) ) )
     87                                bud->flags |= JBFLAG_DOES_XEP85;
     88                       
     89                        /* This field can contain more information like xhtml
     90                           support, but we don't support that ourselves.
     91                           Officially the ext= tag was deprecated, but enough
     92                           clients do send it.
     93                           
     94                           (I'm aware that this is not the right way to use
     95                           this field.) See for an explanation of ext=:
     96                           http://www.xmpp.org/extensions/attic/xep-0115-1.3.html*/
     97                }
     98               
    8199                if( is_chat )
    82100                        jabber_chat_pkt_presence( ic, bud, node );
    83                 else if( bud == jabber_buddy_by_jid( ic, bud->bare_jid, 0 ) )
    84                         imcb_buddy_status( ic, bud->bare_jid, OPT_LOGGED_IN | is_away,
    85                                            ( is_away && bud->away_state ) ? bud->away_state->full_name : NULL,
    86                                            bud->away_message );
     101                else
     102                        send_presence = jabber_buddy_by_jid( ic, bud->bare_jid, 0 );
    87103        }
    88104        else if( strcmp( type, "unavailable" ) == 0 )
     
    91107                {
    92108                        if( set_getbool( &ic->irc->set, "debug" ) )
    93                                 imcb_log( ic, "WARNING: Received presence information from unknown JID: %s", from );
     109                                imcb_log( ic, "Warning: Received presence information from unknown JID: %s", from );
    94110                        return XT_HANDLED;
    95111                }
     
    119135                        /* If another resource is still available, send its presence
    120136                           information. */
    121                         if( ( bud = jabber_buddy_by_jid( ic, from, 0 ) ) )
    122                         {
    123                                 if( bud->away_state && ( *bud->away_state->code == 0 ||
    124                                     strcmp( bud->away_state->code, "chat" ) == 0 ) )
    125                                         is_away = OPT_AWAY;
    126                                
    127                                 imcb_buddy_status( ic, bud->bare_jid, OPT_LOGGED_IN | is_away,
    128                                                    ( is_away && bud->away_state ) ? bud->away_state->full_name : NULL,
    129                                                    bud->away_message );
    130                         }
    131                         else
     137                        if( ( send_presence = jabber_buddy_by_jid( ic, from, 0 ) ) == NULL )
    132138                        {
    133139                                /* Otherwise, count him/her as offline now. */
     
    177183                } */
    178184        }
     185
     186        if( send_presence )
     187        {
     188                int is_away = 0;
     189
     190                if( send_presence->away_state && !( *send_presence->away_state->code == 0 ||
     191                    strcmp( send_presence->away_state->code, "chat" ) == 0 ) )
     192                        is_away = OPT_AWAY;
     193
     194                imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away,
     195                                   ( is_away && send_presence->away_state ) ?
     196                                   send_presence->away_state->full_name : NULL,
     197                                   send_presence->away_message );
     198        }
    179199       
    180200        return XT_HANDLED;
     
    186206{
    187207        struct jabber_data *jd = ic->proto_data;
    188         struct xt_node *node;
     208        struct xt_node *node, *cap;
    189209        char *show = jd->away_state->code;
    190210        char *status = jd->away_message;
     
    199219                xt_add_child( node, xt_new_node( "status", status, NULL ) );
    200220       
     221        /* This makes the packet slightly bigger, but clients interested in
     222           capabilities can now cache the discovery info. This reduces the
     223           usual post-login iq-flood. See XEP-0115. At least libpurple and
     224           Trillian seem to do this right. */
     225        cap = xt_new_node( "c", NULL, NULL );
     226        xt_add_attr( cap, "xmlns", XMLNS_CAPS );
     227        xt_add_attr( cap, "node", "http://bitlbee.org/xmpp/caps" );
     228        xt_add_attr( cap, "ver", BITLBEE_VERSION ); /* The XEP wants this hashed, but nobody's doing that. */
     229        xt_add_child( node, cap );
     230       
    201231        st = jabber_write_packet( ic, node );
    202232       
  • protocols/msn/msn.c

    r0fbd3a6d r1ba7e8f  
    3535        s = set_add( &acc->set, "display_name", NULL, msn_set_display_name, acc );
    3636        s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY;
     37
     38        s = set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
    3739}
    3840
     
    8890                        msn_sb_destroy( md->switchboards->data );
    8991               
    90                 if( md->msgq )
    91                 {
    92                         struct msn_message *m;
    93                        
    94                         for( l = md->msgq; l; l = l->next )
    95                         {
    96                                 m = l->data;
    97                        
    98                                 imcb_log( ic, "Warning: Closing down MSN connection with unsent message to %s, you'll have to resend it.", m->who );
    99                                 g_free( m->who );
    100                                 g_free( m->text );
    101                                 g_free( m );
    102                         }
    103                         g_slist_free( md->msgq );
    104                 }
     92                msn_msgq_purge( ic, &md->msgq );
    10593               
    10694                while( md->groupcount > 0 )
  • protocols/msn/msn.h

    r0fbd3a6d r1ba7e8f  
    2929#define GROUPCHAT_SWITCHBOARD_MESSAGE "\r\r\rME WANT TALK TO MANY PEOPLE\r\r\r"
    3030
    31 #ifdef _WIN32
    32 #define debug 
     31#ifdef DEBUG
     32#define debug( text... ) imcb_log( ic, text );
    3333#else
    34 #define debug( text... ) irc_usermsg( IRC, text );
    35 #undef debug
    3634#define debug( text... )
    3735#endif
     
    6664        GSList *msgq;
    6765        GSList *switchboards;
     66        int sb_failures;
     67        time_t first_sb_failure;
     68       
    6869        const struct msn_away_state *away_state;
    69        
    7070        int buddycount;
    7171        int groupcount;
     
    158158int msn_handler( struct msn_handler_data *h );
    159159char *msn_http_encode( const char *input );
     160void msn_msgq_purge( struct im_connection *ic, GSList **list );
    160161
    161162/* tables.c */
  • protocols/msn/msn_util.c

    r0fbd3a6d r1ba7e8f  
    339339        return ret;
    340340}
     341
     342void msn_msgq_purge( struct im_connection *ic, GSList **list )
     343{
     344        struct msn_message *m;
     345        GString *ret;
     346        GSList *l;
     347       
     348        l = *list;
     349        if( l == NULL )
     350                return;
     351       
     352        m = l->data;
     353        ret = g_string_sized_new( 1024 );
     354        g_string_printf( ret, "Warning: Cleaning up MSN (switchboard) connection with unsent "
     355                              "messages to %s:", m->who ? m->who : "unknown recipient" );
     356       
     357        while( l )
     358        {
     359                m = l->data;
     360               
     361                g_string_append_printf( ret, "\n%s", m->text );
     362               
     363                g_free( m->who );
     364                g_free( m->text );
     365                g_free( m );
     366               
     367                l = l->next;
     368        }
     369        g_slist_free( *list );
     370        *list = NULL;
     371       
     372        imcb_log( ic, ret->str );
     373        g_string_free( ret, TRUE );
     374}
  • protocols/msn/ns.c

    r0fbd3a6d r1ba7e8f  
    584584        else
    585585        {
    586                 debug( "Received unknown command from main server: %s", cmd[0] );
     586                /* debug( "Received unknown command from main server: %s", cmd[0] ); */
    587587        }
    588588       
     
    643643                                char *folders = msn_findheader( body, "Folders-Unread:", blen );
    644644                               
    645                                 if( inbox && folders )
     645                                if( inbox && folders && set_getbool( &ic->acc->set, "mail_notifications" ) )
    646646                                {
    647647                                        imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
     
    653653                                char *fromname = msn_findheader( body, "From:", blen );
    654654                               
    655                                 if( from && fromname )
     655                                if( from && fromname && set_getbool( &ic->acc->set, "mail_notifications" ) )
    656656                                {
    657657                                        imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from );
  • protocols/msn/sb.c

    r0fbd3a6d r1ba7e8f  
    128128                if( strcmp( text, TYPING_NOTIFICATION_MESSAGE ) != 0 )
    129129                {
    130                         buf = g_new0( char, sizeof( MSN_MESSAGE_HEADERS ) + strlen( text ) * 2 );
     130                        buf = g_new0( char, sizeof( MSN_MESSAGE_HEADERS ) + strlen( text ) * 2 + 1 );
    131131                        i = strlen( MSN_MESSAGE_HEADERS );
    132132                       
     
    207207        debug( "Destroying switchboard: %s", sb->who ? sb->who : sb->key ? sb->key : "" );
    208208       
    209         if( sb->msgq )
    210         {
    211                 struct msn_message *m;
    212                 GSList *l;
    213                
    214                 for( l = sb->msgq; l; l = l->next )
    215                 {
    216                         m = l->data;
    217 
    218                         g_free( m->who );
    219                         g_free( m->text );
    220                         g_free( m );
    221                 }
    222                 g_slist_free( sb->msgq );
    223                
    224                 imcb_log( ic, "Warning: Closing down MSN switchboard connection with "
    225                                    "unsent message to %s, you'll have to resend it.",
    226                                    sb->who ? sb->who : "(unknown)" );
    227         }
     209        msn_msgq_purge( ic, &sb->msgq );
    228210       
    229211        if( sb->key ) g_free( sb->key );
     
    266248        if( source != sb->fd )
    267249        {
    268                 debug( "ERROR %d while connecting to switchboard server", 1 );
     250                debug( "Error %d while connecting to switchboard server", 1 );
    269251                msn_sb_destroy( sb );
    270252                return FALSE;
     
    287269                sb->inp = b_input_add( sb->fd, GAIM_INPUT_READ, msn_sb_callback, sb );
    288270        else
    289                 debug( "ERROR %d while connecting to switchboard server", 2 );
     271                debug( "Error %d while connecting to switchboard server", 2 );
    290272       
    291273        return FALSE;
     
    295277{
    296278        struct msn_switchboard *sb = data;
     279        struct im_connection *ic = sb->ic;
     280        struct msn_data *md = ic->proto_data;
    297281       
    298282        if( msn_handler( sb->handler ) == -1 )
    299283        {
    300                 debug( "ERROR: Switchboard died" );
     284                time_t now = time( NULL );
     285               
     286                if( now - md->first_sb_failure > 600 )
     287                {
     288                        /* It's not really the first one, but the start of this "series".
     289                           With this, the warning below will be shown only if this happens
     290                           at least three times in ten minutes. This algorithm isn't
     291                           perfect, but for this purpose it will do. */
     292                        md->first_sb_failure = now;
     293                        md->sb_failures = 0;
     294                }
     295               
     296                debug( "Error: Switchboard died" );
     297                if( ++ md->sb_failures >= 3 )
     298                        imcb_log( ic, "Warning: Many switchboard failures on MSN connection. "
     299                                      "There might be problems delivering your messages." );
     300               
     301                if( sb->msgq != NULL )
     302                {
     303                        char buf[1024];
     304                       
     305                        if( md->msgq == NULL )
     306                        {
     307                                md->msgq = sb->msgq;
     308                        }
     309                        else
     310                        {
     311                                GSList *l;
     312                               
     313                                for( l = md->msgq; l->next; l = l->next );
     314                                l->next = sb->msgq;
     315                        }
     316                        sb->msgq = NULL;
     317                       
     318                        debug( "Moved queued messages back to the main queue, creating a new switchboard to retry." );
     319                        g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId );
     320                        if( !msn_write( ic, buf, strlen( buf ) ) )
     321                                return FALSE;
     322                }
     323               
    301324                msn_sb_destroy( sb );
    302325               
     
    304327        }
    305328        else
     329        {
    306330                return TRUE;
     331        }
    307332}
    308333
     
    491516                }
    492517        }
     518        else if( strcmp( cmd[0], "NAK" ) == 0 )
     519        {
     520                if( sb->who )
     521                {
     522                        imcb_log( ic, "The MSN servers could not deliver one of your messages to %s.", sb->who );
     523                }
     524                else
     525                {
     526                        imcb_log( ic, "The MSN servers could not deliver one of your groupchat messages to all participants." );
     527                }
     528        }
    493529        else if( strcmp( cmd[0], "BYE" ) == 0 )
    494530        {
     
    544580                        if( sb->who )
    545581                        {
    546                                 struct msn_message *m;
    547                                 GSList *l;
    548                                
    549582                                /* Apparently some invitation failed. We might want to use this
    550583                                   board later, so keep it as a spare. */
     
    553586                               
    554587                                /* Also clear the msgq, otherwise someone else might get them. */
    555                                 for( l = sb->msgq; l; l = l->next )
    556                                 {
    557                                         m = l->data;
    558                                         g_free( m->who );
    559                                         g_free( m->text );
    560                                         g_free( m );
    561                                 }
    562                                 g_slist_free( sb->msgq );
    563                                 sb->msgq = NULL;
     588                                msn_msgq_purge( ic, &sb->msgq );
    564589                        }
    565590                       
     
    569594        else
    570595        {
    571                 debug( "Received unknown command from switchboard server: %s", cmd[0] );
     596                /* debug( "Received unknown command from switchboard server: %s", cmd[0] ); */
    572597        }
    573598       
  • protocols/nogaim.c

    r0fbd3a6d r1ba7e8f  
    625625}
    626626
    627 void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, u_int32_t flags, time_t sent_at )
     627void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at )
    628628{
    629629        irc_t *irc = ic->irc;
     
    676676}
    677677
    678 void imcb_buddy_typing( struct im_connection *ic, char *handle, u_int32_t flags )
     678void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags )
    679679{
    680680        user_t *u;
     
    690690                irc_privmsg( ic->irc, u, "PRIVMSG", ic->irc->nick, NULL, buf );
    691691        }
     692}
     693
     694struct groupchat *imcb_chat_new( struct im_connection *ic, char *handle )
     695{
     696        struct groupchat *c;
     697       
     698        /* This one just creates the conversation structure, user won't see anything yet */
     699       
     700        if( ic->groupchats )
     701        {
     702                for( c = ic->groupchats; c->next; c = c->next );
     703                c = c->next = g_new0( struct groupchat, 1 );
     704        }
     705        else
     706                ic->groupchats = c = g_new0( struct groupchat, 1 );
     707       
     708        c->ic = ic;
     709        c->title = g_strdup( handle );
     710        c->channel = g_strdup_printf( "&chat_%03d", ic->irc->c_id++ );
     711        c->topic = g_strdup_printf( "BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->title );
     712       
     713        if( set_getbool( &ic->irc->set, "debug" ) )
     714                imcb_log( ic, "Creating new conversation: (id=%p,handle=%s)", c, handle );
     715       
     716        return c;
    692717}
    693718
     
    728753                g_free( c->channel );
    729754                g_free( c->title );
     755                g_free( c->topic );
    730756                g_free( c );
    731757        }
    732758}
    733759
    734 void imcb_chat_msg( struct groupchat *c, char *who, char *msg, u_int32_t flags, time_t sent_at )
     760void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at )
    735761{
    736762        struct im_connection *ic = c->ic;
     
    758784        }
    759785        g_free( wrapped );
     786}
     787
     788void imcb_chat_log( struct groupchat *c, char *format, ... )
     789{
     790        irc_t *irc = c->ic->irc;
     791        va_list params;
     792        char *text;
     793        user_t *u;
     794       
     795        va_start( params, format );
     796        text = g_strdup_vprintf( format, params );
     797        va_end( params );
     798       
     799        u = user_find( irc, irc->mynick );
     800       
     801        irc_privmsg( irc, u, "PRIVMSG", c->channel, "System message: ", text );
     802       
     803        g_free( text );
    760804}
    761805
     
    781825        if( c->joined && u )
    782826                irc_write( ic->irc, ":%s!%s@%s TOPIC %s :%s", u->nick, u->user, u->host, c->channel, topic );
    783 }
    784 
    785 struct groupchat *imcb_chat_new( struct im_connection *ic, char *handle )
    786 {
    787         struct groupchat *c;
    788        
    789         /* This one just creates the conversation structure, user won't see anything yet */
    790        
    791         if( ic->groupchats )
    792         {
    793                 for( c = ic->groupchats; c->next; c = c->next );
    794                 c = c->next = g_new0( struct groupchat, 1 );
    795         }
    796         else
    797                 ic->groupchats = c = g_new0( struct groupchat, 1 );
    798        
    799         c->ic = ic;
    800         c->title = g_strdup( handle );
    801         c->channel = g_strdup_printf( "&chat_%03d", ic->irc->c_id++ );
    802         c->topic = g_strdup_printf( "%s :BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->channel, c->title );
    803        
    804         if( set_getbool( &ic->irc->set, "debug" ) )
    805                 imcb_log( ic, "Creating new conversation: (id=%p,handle=%s)", c, handle );
    806        
    807         return c;
    808827}
    809828
  • protocols/nogaim.h

    r0fbd3a6d r1ba7e8f  
    6969{
    7070        account_t *acc;
    71         u_int32_t flags;
     71        uint32_t flags;
    7272       
    7373        /* each connection then can have its own protocol-specific data */
     
    286286/* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle );
    287287/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
    288 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, u_int32_t flags, time_t sent_at );
    289 G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, u_int32_t flags );
     288G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at );
     289G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
    290290G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
    291291
     
    303303G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason );
    304304/* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */
    305 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, char *who, char *msg, u_int32_t flags, time_t sent_at );
     305G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at );
     306/* System messages specific to a groupchat, so they can be displayed in the right context. */
     307G_MODULE_EXPORT void imcb_chat_log( struct groupchat *c, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
    306308/* To tell BitlBee 'who' changed the topic of 'c' to 'topic'. */
    307309G_MODULE_EXPORT void imcb_chat_topic( struct groupchat *c, char *who, char *topic, time_t set_at );
  • protocols/oscar/oscar.c

    r0fbd3a6d r1ba7e8f  
    9191        gboolean icq;
    9292        GSList *evilhack;
     93       
     94        GHashTable *ips;
    9395
    9496        struct {
     
    356358        struct oscar_data *odata = ic->proto_data = g_new0(struct oscar_data, 1);
    357359
    358         if (!isdigit(acc->user[0])) {
     360        if (isdigit(acc->user[0]))
     361                odata->icq = TRUE;
     362        else
    359363                ic->flags |= OPT_DOES_HTML;
    360         }
    361364
    362365        sess = g_new0(aim_session_t, 1);
     
    411414                g_free(cr);
    412415        }
     416        if (odata->ips)
     417                g_hash_table_destroy(odata->ips);
    413418        if (odata->email)
    414419                g_free(odata->email);
     
    987992                signon = time(NULL) - info->sessionlen;
    988993
     994        if (info->present & AIM_USERINFO_PRESENT_ICQIPADDR) {
     995                uint32_t *uin = g_new0(uint32_t, 1);
     996               
     997                if (od->ips == NULL)
     998                        od->ips = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL);
     999               
     1000                if (sscanf(info->sn, "%d", uin) == 1)
     1001                        g_hash_table_insert(od->ips, uin, (gpointer) (long) info->icqinfo.ipaddr);
     1002        }
     1003
    9891004        tmp = g_strdup(normalize(ic->acc->user));
    9901005        if (!strcmp(tmp, normalize(info->sn)))
     
    10511066                g_snprintf(tmp, BUF_LONG, "%s", args->msg);
    10521067        } else {
    1053                 int i;
     1068                aim_mpmsg_section_t *part;
    10541069               
    10551070                *tmp = 0;
    1056                 for (i = 0; i < args->mpmsg.numparts; i ++) {
    1057                         g_strlcat(tmp, (char*) args->mpmsg.parts[i].data, BUF_LONG);
    1058                         g_strlcat(tmp, "\n", BUF_LONG);
     1071                for (part = args->mpmsg.parts; part; part = part->next) {
     1072                        if (part->data) {
     1073                                g_strlcat(tmp, (char*) part->data, BUF_LONG);
     1074                                g_strlcat(tmp, "\n", BUF_LONG);
     1075                        }
    10591076                }
    10601077        }
     
    22192236static int gaim_icqinfo(aim_session_t *sess, aim_frame_t *fr, ...)
    22202237{
    2221         struct im_connection *ic = sess->aux_data;
    2222         gchar who[16];
    2223         GString *str;
    2224         va_list ap;
    2225         struct aim_icq_info *info;
    2226 
    2227         va_start(ap, fr);
    2228         info = va_arg(ap, struct aim_icq_info *);
    2229         va_end(ap);
    2230 
    2231         if (!info->uin)
    2232                 return 0;
    2233 
    2234         str = g_string_sized_new(100);
    2235         g_snprintf(who, sizeof(who), "%u", info->uin);
    2236 
    2237         g_string_sprintfa(str, "%s: %s - %s: %s", _("UIN"), who, _("Nick"),
    2238                                 info->nick ? info->nick : "-");
    2239         info_string_append(str, "\n", _("First Name"), info->first);
    2240         info_string_append(str, "\n", _("Last Name"), info->last);
    2241                 info_string_append(str, "\n", _("Email Address"), info->email);
    2242         if (info->numaddresses && info->email2) {
    2243                 int i;
    2244                 for (i = 0; i < info->numaddresses; i++) {
    2245                                         info_string_append(str, "\n", _("Email Address"), info->email2[i]);
    2246                 }
    2247         }
    2248         info_string_append(str, "\n", _("Mobile Phone"), info->mobile);
    2249         if (info->gender != 0)
    2250                 info_string_append(str, "\n", _("Gender"), info->gender==1 ? _("Female") : _("Male"));
    2251         if (info->birthyear || info->birthmonth || info->birthday) {
    2252                 char date[30];
    2253                 struct tm tm;
    2254                 tm.tm_mday = (int)info->birthday;
    2255                 tm.tm_mon = (int)info->birthmonth-1;
    2256                 tm.tm_year = (int)info->birthyear%100;
    2257                 strftime(date, sizeof(date), "%Y-%m-%d", &tm);
    2258                 info_string_append(str, "\n", _("Birthday"), date);
    2259         }
    2260         if (info->age) {
    2261                 char age[5];
    2262                 g_snprintf(age, sizeof(age), "%hhd", info->age);
    2263                 info_string_append(str, "\n", _("Age"), age);
    2264         }
    2265                 info_string_append(str, "\n", _("Personal Web Page"), info->personalwebpage);
    2266         if (info->info && info->info[0]) {
    2267                 g_string_sprintfa(str, "\n%s:\n%s\n%s", _("Additional Information"),
    2268                                                 info->info, _("End of Additional Information"));
    2269         }
    2270         g_string_sprintfa(str, "\n");
    2271         if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) {
    2272                 g_string_sprintfa(str, "%s:", _("Home Address"));
    2273                 info_string_append(str, "\n", _("Address"), info->homeaddr);
    2274                 info_string_append(str, "\n", _("City"), info->homecity);
    2275                 info_string_append(str, "\n", _("State"), info->homestate);
    2276                                 info_string_append(str, "\n", _("Zip Code"), info->homezip);
    2277                 g_string_sprintfa(str, "\n");
    2278         }
    2279         if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) {
    2280                 g_string_sprintfa(str, "%s:", _("Work Address"));
    2281                 info_string_append(str, "\n", _("Address"), info->workaddr);
    2282                 info_string_append(str, "\n", _("City"), info->workcity);
    2283                 info_string_append(str, "\n", _("State"), info->workstate);
    2284                                 info_string_append(str, "\n", _("Zip Code"), info->workzip);
    2285                 g_string_sprintfa(str, "\n");
    2286         }
    2287         if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) {
    2288                 g_string_sprintfa(str, "%s:", _("Work Information"));
    2289                 info_string_append(str, "\n", _("Company"), info->workcompany);
    2290                 info_string_append(str, "\n", _("Division"), info->workdivision);
    2291                 info_string_append(str, "\n", _("Position"), info->workposition);
    2292                 if (info->workwebpage && info->workwebpage[0]) {
    2293                         info_string_append(str, "\n", _("Web Page"), info->workwebpage);
    2294                 }
    2295                 g_string_sprintfa(str, "\n");
    2296         }
    2297 
    2298                 imcb_log(ic, "%s\n%s", _("User Info"), str->str);
    2299         g_string_free(str, TRUE);
    2300 
    2301         return 1;
     2238        struct im_connection *ic = sess->aux_data;
     2239        struct oscar_data *od = ic->proto_data;
     2240        gchar who[16];
     2241        GString *str;
     2242        va_list ap;
     2243        struct aim_icq_info *info;
     2244        uint32_t ip;
     2245
     2246        va_start(ap, fr);
     2247        info = va_arg(ap, struct aim_icq_info *);
     2248        va_end(ap);
     2249
     2250        if (!info->uin)
     2251                return 0;
     2252
     2253        str = g_string_sized_new(512);
     2254        g_snprintf(who, sizeof(who), "%u", info->uin);
     2255
     2256        g_string_printf(str, "%s: %s - %s: %s", _("UIN"), who, _("Nick"),
     2257        info->nick ? info->nick : "-");
     2258        g_string_append_printf(str, "\n%s: %s", _("First Name"), info->first);
     2259        g_string_append_printf(str, "\n%s: %s", _("Last Name"), info->last);
     2260        g_string_append_printf(str, "\n%s: %s", _("Email Address"), info->email);
     2261        if (info->numaddresses && info->email2) {
     2262                int i;
     2263                for (i = 0; i < info->numaddresses; i++) {
     2264                        g_string_append_printf(str, "\n%s: %s", _("Email Address"), info->email2[i]);
     2265                }
     2266        }
     2267        if ((ip = (long) g_hash_table_lookup(od->ips, &info->uin)) != 0) {
     2268                g_string_append_printf(str, "\n%s: %d.%d.%d.%d", _("Last used IP address"),
     2269                                       (ip >> 24), (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
     2270        }
     2271        g_string_append_printf(str, "\n%s: %s", _("Mobile Phone"), info->mobile);
     2272        if (info->gender != 0)
     2273                g_string_append_printf(str, "\n%s: %s", _("Gender"), info->gender==1 ? _("Female") : _("Male"));
     2274        if (info->birthyear || info->birthmonth || info->birthday) {
     2275                char date[30];
     2276                struct tm tm;
     2277                memset(&tm, 0, sizeof(struct tm));
     2278                tm.tm_mday = (int)info->birthday;
     2279                tm.tm_mon = (int)info->birthmonth-1;
     2280                tm.tm_year = (int)info->birthyear%100;
     2281                strftime(date, sizeof(date), "%Y-%m-%d", &tm);
     2282                g_string_append_printf(str, "\n%s: %s", _("Birthday"), date);
     2283        }
     2284        if (info->age) {
     2285                char age[5];
     2286                g_snprintf(age, sizeof(age), "%hhd", info->age);
     2287                g_string_append_printf(str, "\n%s: %s", _("Age"), age);
     2288        }
     2289        g_string_append_printf(str, "\n%s: %s", _("Personal Web Page"), info->personalwebpage);
     2290        if (info->info && info->info[0]) {
     2291                g_string_sprintfa(str, "\n%s:\n%s\n%s", _("Additional Information"),
     2292                info->info, _("End of Additional Information"));
     2293        }
     2294        g_string_append_c(str, '\n');
     2295        if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) {
     2296                g_string_append_printf(str, "%s:", _("Home Address"));
     2297                g_string_append_printf(str, "\n%s: %s", _("Address"), info->homeaddr);
     2298                g_string_append_printf(str, "\n%s: %s", _("City"), info->homecity);
     2299                g_string_append_printf(str, "\n%s: %s", _("State"), info->homestate);
     2300                g_string_append_printf(str, "\n%s: %s", _("Zip Code"), info->homezip);
     2301                g_string_append_c(str, '\n');
     2302        }
     2303        if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) {
     2304                g_string_append_printf(str, "%s:", _("Work Address"));
     2305                g_string_append_printf(str, "\n%s: %s", _("Address"), info->workaddr);
     2306                g_string_append_printf(str, "\n%s: %s", _("City"), info->workcity);
     2307                g_string_append_printf(str, "\n%s: %s", _("State"), info->workstate);
     2308                g_string_append_printf(str, "\n%s: %s", _("Zip Code"), info->workzip);
     2309                g_string_append_c(str, '\n');
     2310        }
     2311        if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) {
     2312                g_string_append_printf(str, "%s:", _("Work Information"));
     2313                g_string_append_printf(str, "\n%s: %s", _("Company"), info->workcompany);
     2314                g_string_append_printf(str, "\n%s: %s", _("Division"), info->workdivision);
     2315                g_string_append_printf(str, "\n%s: %s", _("Position"), info->workposition);
     2316                if (info->workwebpage && info->workwebpage[0]) {
     2317                        g_string_append_printf(str, "\n%s: %s", _("Web Page"), info->workwebpage);
     2318                }
     2319                g_string_append_c(str, '\n');
     2320        }
     2321
     2322        imcb_log(ic, "%s\n%s", _("User Info"), str->str);
     2323        g_string_free(str, TRUE);
     2324
     2325        return 1;
    23022326
    23032327}
     
    24332457                /* User has stopped typing */
    24342458                imcb_buddy_typing(ic, sn, 0);
    2435         }       
     2459        }
    24362460       
    24372461        return 1;
  • protocols/oscar/service.c

    r0fbd3a6d r1ba7e8f  
    894894*/
    895895                } else
    896                         imcb_error(sess->aux_data, "WARNING: unknown hash request");
     896                        imcb_error(sess->aux_data, "Warning: unknown hash request");
    897897
    898898        }
  • protocols/oscar/txqueue.c

    r0fbd3a6d r1ba7e8f  
    8080
    8181        if (!fr->conn) {
    82                 imcb_error(sess->aux_data, "WARNING: enqueueing packet with no connection");
     82                imcb_error(sess->aux_data, "Warning: enqueueing packet with no connection");
    8383                fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS);
    8484        }
  • protocols/yahoo/yahoo.c

    r0fbd3a6d r1ba7e8f  
    125125       
    126126        return( g_strndup( in, len ) );
     127}
     128
     129static void byahoo_init( account_t *acc )
     130{
     131        set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
    127132}
    128133
     
    349354        struct prpl *ret = g_new0(struct prpl, 1);
    350355        ret->name = "yahoo";
     356        ret->init = byahoo_init;
    351357       
    352358        ret->login = byahoo_login;
     
    618624{
    619625        struct im_connection *ic = byahoo_get_ic_by_id( id );
    620         char *m = byahoo_strip( msg );
    621        
    622         imcb_buddy_msg( ic, (char*) who, (char*) m, 0, 0 );
    623         g_free( m );
     626        char *m;
     627       
     628        if( msg )
     629        {
     630                m = byahoo_strip( msg );
     631                imcb_buddy_msg( ic, (char*) who, (char*) m, 0, 0 );
     632                g_free( m );
     633        }
    624634}
    625635
     
    923933        struct im_connection *ic = byahoo_get_ic_by_id( id );
    924934       
    925         if( from && subj )
     935        if( !set_getbool( &ic->acc->set, "mail_notifications" ) )
     936                ; /* The user doesn't care. */
     937        else if( from && subj )
    926938                imcb_log( ic, "Received e-mail message from %s with subject `%s'", from, subj );
    927939        else if( cnt > 0 )
Note: See TracChangeset for help on using the changeset viewer.