From 4488f142195c33607dc5882de627dadcf5576d7e Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Sun, 11 Aug 2013 15:47:06 +0300 Subject: [PATCH] group: refactor group creation code --- src/core/sipe-group.c | 48 +++++++++++++++++++++++++++--------------------- src/core/sipe-group.h | 23 ++++++++++++++++++----- src/core/sipe-notify.c | 9 +++------ src/core/sipe-ucs.c | 16 ++++++---------- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/core/sipe-group.c b/src/core/sipe-group.c index 292d9e59..5c284558 100755 --- a/src/core/sipe-group.c +++ b/src/core/sipe-group.c @@ -67,7 +67,6 @@ process_add_group_response(struct sipe_core_private *sipe_private, sipe_xml *xml; const sipe_xml *node; char *group_id; - struct sipe_buddy *buddy; xml = sipe_xml_parse(msg->body, msg->bodylen); if (!xml) { @@ -86,16 +85,14 @@ process_add_group_response(struct sipe_core_private *sipe_private, return FALSE; } - group = g_new0(struct sipe_group, 1); - group->id = (int)g_ascii_strtod(group_id, NULL); + group = sipe_group_add(sipe_private, + ctx->group_name, + g_ascii_strtoull(group_id, NULL, 10)); g_free(group_id); - group->name = g_strdup(ctx->group_name); - sipe_group_add(sipe_private, group); - - if (ctx->user_name) { - buddy = sipe_buddy_find_by_uri(sipe_private, - ctx->user_name); + if (group && ctx->user_name) { + struct sipe_buddy *buddy = sipe_buddy_find_by_uri(sipe_private, + ctx->user_name); if (buddy) { buddy->groups = sipe_utils_slist_insert_unique_sorted(buddy->groups, group, @@ -118,7 +115,7 @@ sipe_group_compare(struct sipe_group *group1, struct sipe_group *group2) { struct sipe_group* sipe_group_find_by_id(struct sipe_core_private *sipe_private, - int id) + guint id) { struct sipe_group *group; GSList *entry; @@ -198,20 +195,29 @@ gboolean sipe_group_rename(struct sipe_core_private *sipe_private, return(renamed); } -void -sipe_group_add(struct sipe_core_private *sipe_private, - struct sipe_group * group) +struct sipe_group *sipe_group_add(struct sipe_core_private *sipe_private, + const gchar *name, + guint id) { - if (sipe_backend_buddy_group_add(SIPE_CORE_PUBLIC,group->name)) - { - SIPE_DEBUG_INFO("added group %s (id %d)", group->name, group->id); + struct sipe_group *group = NULL; + + if (!is_empty(name) && + sipe_backend_buddy_group_add(SIPE_CORE_PUBLIC, name)) { + + group = g_new0(struct sipe_group, 1); + group->name = g_strdup(name); + group->id = id; + sipe_private->groups->list = g_slist_append(sipe_private->groups->list, group); - } - else - { - SIPE_DEBUG_INFO("did not add group %s", group->name ? group->name : ""); - } + + SIPE_DEBUG_INFO("sipe_group_add: created backend group '%s' with id %d", + group->name, group->id); + } else + SIPE_DEBUG_INFO("sipe_group_add: backend group '%s' already exists", + name ? name : ""); + + return(group); } static void group_free(struct sipe_core_private *sipe_private, diff --git a/src/core/sipe-group.h b/src/core/sipe-group.h index 33257c83..ac1d0e34 100644 --- a/src/core/sipe-group.h +++ b/src/core/sipe-group.h @@ -26,26 +26,39 @@ struct sipe_core_private; struct sipe_group { gchar *name; - int id; + guint id; }; int sipe_group_compare(struct sipe_group *group1, struct sipe_group *group2); -struct sipe_group *sipe_group_find_by_id(struct sipe_core_private *sipe_private, int id); +struct sipe_group *sipe_group_find_by_id(struct sipe_core_private *sipe_private, + guint id); struct sipe_group *sipe_group_find_by_name(struct sipe_core_private *sipe_private, const gchar * name); void sipe_group_create(struct sipe_core_private *sipe_private, const gchar *name, - const gchar * who); + const gchar *who); gboolean sipe_group_rename(struct sipe_core_private *sipe_private, struct sipe_group *group, const gchar *name); -void sipe_group_add(struct sipe_core_private *sipe_private, - struct sipe_group * group); +/** + * Creates @c sipe_group structure for a new group and adds it into the group + * list of given account. If buddy is already in the list, its existing + * structure is returned. + * + * @param sipe_private SIPE core data + * @param name name of group (may be @c NULL) + * @param id numeric ID of group + * + * @return @c sipe_group structure or @c NULL if group creation failed + */ +struct sipe_group *sipe_group_add(struct sipe_core_private *sipe_private, + const gchar *name, + guint id); /* remove group from core & backend */ void sipe_group_remove(struct sipe_core_private *sipe_private, diff --git a/src/core/sipe-notify.c b/src/core/sipe-notify.c index c2787118..5bc51ee6 100644 --- a/src/core/sipe-notify.c +++ b/src/core/sipe-notify.c @@ -1085,12 +1085,9 @@ static const gchar *get_group_name(const sipe_xml *node) static void add_new_group(struct sipe_core_private *sipe_private, const sipe_xml *node) { - struct sipe_group *group = g_new0(struct sipe_group, 1); - - group->name = g_strdup(get_group_name(node)); - group->id = (int)g_ascii_strtod(sipe_xml_attribute(node, "id"), NULL); - - sipe_group_add(sipe_private, group); + sipe_group_add(sipe_private, + get_group_name(node), + sipe_xml_int_attribute(node, "id", 0)); } static void add_new_buddy(struct sipe_core_private *sipe_private, diff --git a/src/core/sipe-ucs.c b/src/core/sipe-ucs.c index 37d3ae8b..f7ff0a3e 100644 --- a/src/core/sipe-ucs.c +++ b/src/core/sipe-ucs.c @@ -308,16 +308,14 @@ static void sipe_ucs_get_im_item_list_response(struct sipe_core_private *sipe_pr group_node = sipe_xml_twin(group_node)) { gchar *name = sipe_xml_data(sipe_xml_child(group_node, "DisplayName")); + struct sipe_group *group = sipe_group_add(sipe_private, + name, + 0); + const sipe_xml *member_node; - if (!is_empty(name)) { - struct sipe_group *group = g_new0(struct sipe_group, 1); - const sipe_xml *member_node; - - group->name = name; - name = NULL; /* group takes ownership */ - - sipe_group_add(sipe_private, group); + g_free(name); + if (group) { for (member_node = sipe_xml_child(group_node, "MemberCorrelationKey/ItemId"); member_node; @@ -333,8 +331,6 @@ static void sipe_ucs_get_im_item_list_response(struct sipe_core_private *sipe_pr NULL); } } - - g_free(name); } /* Finished processing contact list */ -- 2.11.4.GIT