Changeset 98de2cc for protocols


Ignore:
Timestamp:
2008-06-21T23:51:18Z (13 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
424e663
Parents:
3e6764a
Message:

Now preserving case in JID resources, and handling them with case sensitivity
since apparently that's how the RFC wants it. (While the rest of the JID
should be case IN-sensitive. Consistency is hard to find these days...) Also
extended the unittests a little bit. Closes #422.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/jabber_util.c

    r3e6764a r98de2cc  
    290290        len = strlen( orig );
    291291        new = g_new( char, len + 1 );
    292         for( i = 0; i < len; i ++ )
     292       
     293        /* So it turns out the /resource part is case sensitive. Yeah, and
     294           it's Unicode but feck Unicode. :-P So stop once we see a slash. */
     295        for( i = 0; i < len && orig[i] != '/' ; i ++ )
    293296                new[i] = tolower( orig[i] );
     297        for( ; orig[i]; i ++ )
     298                new[i] = orig[i];
    294299       
    295300        new[i] = 0;
     
    334339                {
    335340                        /* Check for dupes. */
    336                         if( g_strcasecmp( bi->resource, s + 1 ) == 0 )
     341                        if( strcmp( bi->resource, s + 1 ) == 0 )
    337342                        {
    338343                                *s = '/';
     
    387392        if( ( s = strchr( jid, '/' ) ) )
    388393        {
    389                 int none_found = 0;
     394                int bare_exists = 0;
    390395               
    391396                *s = 0;
     
    410415                        /* See if there's an exact match. */
    411416                        for( ; bud; bud = bud->next )
    412                                 if( g_strcasecmp( bud->resource, s + 1 ) == 0 )
     417                                if( strcmp( bud->resource, s + 1 ) == 0 )
    413418                                        break;
    414419                }
    415420                else
    416421                {
    417                         /* This hack is there to make sure that O_CREAT will
    418                            work if there's already another resouce present
    419                            for this JID, even if it's an unknown buddy. This
    420                            is done to handle conferences properly. */
    421                         none_found = 1;
    422                         /* TODO(wilmer): Find out what I was thinking when I
    423                            wrote this??? And then fix it. This makes me sad... */
    424                 }
    425                
    426                 if( bud == NULL && ( flags & GET_BUDDY_CREAT ) && ( imcb_find_buddy( ic, jid ) || !none_found ) )
     422                        /* This variable tells the if down here that the bare
     423                           JID already exists and we should feel free to add
     424                           more resources, if the caller asked for that. */
     425                        bare_exists = 1;
     426                }
     427               
     428                if( bud == NULL && ( flags & GET_BUDDY_CREAT ) &&
     429                    ( !bare_exists || imcb_find_buddy( ic, jid ) ) )
    427430                {
    428431                        *s = '/';
     
    449452                        /* We want an exact match, so in thise case there shouldn't be a /resource. */
    450453                        return NULL;
    451                 else if( ( bud->resource == NULL || bud->next == NULL ) )
     454                else if( bud->resource == NULL || bud->next == NULL )
    452455                        /* No need for selection if there's only one option. */
    453456                        return bud;
     
    527530                if( bud->next == NULL &&
    528531                    ( ( s == NULL && bud->resource == NULL ) ||
    529                       ( bud->resource && s && g_strcasecmp( bud->resource, s + 1 ) == 0 ) ) )
     532                      ( bud->resource && s && strcmp( bud->resource, s + 1 ) == 0 ) ) )
    530533                {
    531534                        g_hash_table_remove( jd->buddies, bud->bare_jid );
     
    550553                {
    551554                        for( bi = bud, prev = NULL; bi; bi = (prev=bi)->next )
    552                                 if( g_strcasecmp( bi->resource, s + 1 ) == 0 )
     555                                if( strcmp( bi->resource, s + 1 ) == 0 )
    553556                                        break;
    554557                       
Note: See TracChangeset for help on using the changeset viewer.