diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-05-09 19:05:55 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-05-09 19:05:55 +0100 |
commit | 7aadd714313ba3e966720e7565f72118b97bd551 (patch) | |
tree | e9ae885742564d381504b0c05f5f8a702b53ac56 /protocols/bee_user.c | |
parent | 9ac3ed11de72046c318398481603c6680af37cf2 (diff) |
Keep track of contact groups in a slightly more efficient way.
Diffstat (limited to 'protocols/bee_user.c')
-rw-r--r-- | protocols/bee_user.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/protocols/bee_user.c b/protocols/bee_user.c index 0dd40cab..fdf84934 100644 --- a/protocols/bee_user.c +++ b/protocols/bee_user.c @@ -102,6 +102,54 @@ int bee_user_msg( bee_t *bee, bee_user_t *bu, const char *msg, int flags ) } +/* Groups */ +static bee_group_t *bee_group_new( bee_t *bee, const char *name ) +{ + bee_group_t *bg = g_new0( bee_group_t, 1 ); + + bg->name = g_strdup( name ); + bg->key = g_utf8_casefold( name, -1 ); + bee->groups = g_slist_prepend( bee->groups, bg ); + + return bg; +} + +bee_group_t *bee_group_by_name( bee_t *bee, const char *name, gboolean creat ) +{ + GSList *l; + char *key; + + if( name == NULL ) + return NULL; + + key = g_utf8_casefold( name, -1 ); + for( l = bee->groups; l; l = l->next ) + { + bee_group_t *bg = l->data; + if( strcmp( bg->key, key ) == 0 ) + break; + } + g_free( key ); + + if( !l ) + return creat ? bee_group_new( bee, name ) : NULL; + else + return l->data; +} + +void bee_group_free( bee_t *bee ) +{ + while( bee->groups ) + { + bee_group_t *bg = bee->groups->data; + g_free( bg->name ); + g_free( bg->key ); + g_free( bg ); + bee->groups = g_slist_remove( bee->groups, bee->groups->data ); + } +} + + /* IM->UI callbacks */ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, const char *state, const char *message ) { |