aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/bee_user.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-05-09 19:05:55 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-05-09 19:05:55 +0100
commit7aadd714313ba3e966720e7565f72118b97bd551 (patch)
treee9ae885742564d381504b0c05f5f8a702b53ac56 /protocols/bee_user.c
parent9ac3ed11de72046c318398481603c6680af37cf2 (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.c48
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 )
{