From e581ea8e3dc38bf70c836788823d9ce593877cdf Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 2 Jun 2009 01:41:44 -0500 Subject: [PATCH] presence: Add set_metadata() and delete_metadata(). --- include/client.h | 3 +++ src/client.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/client.h b/include/client.h index 3e3fd360..0060788a 100644 --- a/include/client.h +++ b/include/client.h @@ -614,4 +614,7 @@ extern char *generate_uid(void); void allocate_away(struct Client *); void free_away(struct Client *); +void set_metadata(struct Client *, const char *, const char *); +void delete_metadata(struct Client *, const char *); + #endif /* INCLUDED_client_h */ diff --git a/src/client.c b/src/client.c index b372e881..e94e393d 100644 --- a/src/client.c +++ b/src/client.c @@ -77,6 +77,7 @@ static rb_bh *lclient_heap = NULL; static rb_bh *pclient_heap = NULL; static rb_bh *user_heap = NULL; static rb_bh *away_heap = NULL; +static rb_bh *metadata_heap = NULL; static char current_uid[IDLEN]; struct Dictionary *nd_dict = NULL; @@ -120,6 +121,7 @@ init_client(void) lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap"); pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap"); user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE, "user_heap"); + metadata_heap = rb_bh_create(sizeof(struct MetadataEntry), USER_HEAP_SIZE, "metadata_heap"); away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap"); rb_event_addish("check_pings", check_pings, NULL, 30); @@ -1746,6 +1748,36 @@ free_away(struct Client *client_p) } } +void +set_metadata(struct Client *client_p, const char *key, const char *value) +{ + struct MetadataEntry *md; + + if(client_p->user != NULL) + { + md = rb_bh_alloc(metadata_heap); + rb_strlcpy(md->key, key, NICKLEN); + rb_strlcpy(md->value, value, TOPICLEN); + + irc_dictionary_add(client_p->user->metadata, key, md); + } +} + +void +delete_metadata(struct Client *client_p, const char *key) +{ + struct MetadataEntry *md; + + if(client_p->user != NULL) + { + md = irc_dictionary_delete(client_p->user->metadata, key); + if (md == NULL) + return; + + rb_free(md); + } +} + void init_uid(void) {