From 824258cbf3ac850e98423a3fb5f23b2384d04349 Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Sun, 11 Dec 2011 20:53:56 +0200 Subject: [PATCH] core cleanup: add second level of access levels menu Also removed all functions from sipe-ocs2007.h that don't need to be public. There is only one function and one menu callback left in sipe.c... --- src/api/sipe-backend.h | 4 + src/api/sipe-core.h | 7 ++ src/core/sipe-ocs2007.c | 260 ++++++++++++++++++++++++++++------------------ src/core/sipe-ocs2007.h | 18 +--- src/core/sipe.c | 100 ------------------ src/purple/purple-buddy.c | 61 +++++++++++ 6 files changed, 232 insertions(+), 218 deletions(-) diff --git a/src/api/sipe-backend.h b/src/api/sipe-backend.h index b5f26295..e5a1535a 100644 --- a/src/api/sipe-backend.h +++ b/src/api/sipe-backend.h @@ -894,6 +894,7 @@ enum sipe_buddy_menu_type { SIPE_BUDDY_MENU_MAKE_CALL, SIPE_BUDDY_MENU_SEND_EMAIL, SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP, + SIPE_BUDDY_MENU_ADD_NEW_DOMAIN, SIPE_BUDDY_MENU_TYPES }; @@ -903,6 +904,9 @@ struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(struct sipe_core_pub const gchar *label, enum sipe_buddy_menu_type type, gpointer parameter); +struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(struct sipe_core_public *sipe_public, + struct sipe_backend_buddy_menu *menu, + const gchar *label); struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(struct sipe_core_public *sipe_public, struct sipe_backend_buddy_menu *menu, const gchar *label, diff --git a/src/api/sipe-core.h b/src/api/sipe-core.h index 367050ae..21df8198 100644 --- a/src/api/sipe-core.h +++ b/src/api/sipe-core.h @@ -165,6 +165,13 @@ void sipe_core_schedule_execute(gpointer data); void sipe_core_update_calendar(struct sipe_core_public *sipe_public); void sipe_core_reset_status(struct sipe_core_public *sipe_public); +/* access levels */ +void sipe_core_change_access_level_from_container(struct sipe_core_public *sipe_public, + gpointer parameter); +void sipe_core_change_access_level_for_domain(struct sipe_core_public *sipe_public, + const gchar *domain, + guint index); + /** * Activity * - core: maps this to OCS protocol values diff --git a/src/core/sipe-ocs2007.c b/src/core/sipe-ocs2007.c index 07091ea2..274a7792 100644 --- a/src/core/sipe-ocs2007.c +++ b/src/core/sipe-ocs2007.c @@ -253,11 +253,6 @@ struct sipe_container_member { static const guint containers[] = {32000, 400, 300, 200, 100}; #define CONTAINERS_LEN (sizeof(containers) / sizeof(guint)) -guint sipe_ocs2007_containers(void) -{ - return(CONTAINERS_LEN); -} - static void free_container_member(struct sipe_container_member *member) { if (!member) return; @@ -301,89 +296,10 @@ static void blist_menu_remember_container(struct sipe_core_private *sipe_private container); } -/** - * for Access levels menu - */ -#define INDENT_FMT " %s" - -/** - * Member is indirectly belong to access level container. - * For example 'sameEnterprise' is in the container and user - * belongs to that same enterprise. - */ -#define INDENT_MARKED_INHERITED_FMT "= %s" - -static struct sipe_backend_buddy_menu *access_levels_menu(struct sipe_core_private *sipe_private, - struct sipe_backend_buddy_menu *menu, - const gchar *member_type, - const gchar *member_value, - const gboolean extra_menu) -{ - (void) sipe_private; - (void) member_type; - (void) member_value; - (void) extra_menu; - (void) blist_menu_remember_container; - return(menu); -} - -static struct sipe_backend_buddy_menu *access_groups_menu(struct sipe_core_private *sipe_private) -{ - struct sipe_backend_buddy_menu *menu = sipe_backend_buddy_menu_start(SIPE_CORE_PUBLIC); - (void) sipe_private; - return(menu); -} - -struct sipe_backend_buddy_menu *sipe_ocs2007_access_control_menu(struct sipe_core_private *sipe_private, - const gchar *buddy_name) -{ - struct sipe_backend_buddy_menu *menu = sipe_backend_buddy_menu_start(SIPE_CORE_PUBLIC); - gchar *label; - - /* - * Workaround for missing libpurple API to release resources allocated - * during blist_node_menu() callback. See also: - * - * - * - * We remember all memory blocks in a list and deallocate them when - * - * - the next time we enter the callback, or - * - the account is disconnected - * - * That means that after the buddy menu has been closed we have unused - * resources but at least we don't leak them anymore... - */ - sipe_core_buddy_menu_free(SIPE_CORE_PUBLIC); - - label = g_strdup_printf(INDENT_FMT, _("Online help...")); - menu = sipe_backend_buddy_menu_add(SIPE_CORE_PUBLIC, - menu, - label, - SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP, - NULL); - g_free(label); - - label = g_strdup_printf(INDENT_FMT, _("Access groups")); - menu = sipe_backend_buddy_sub_menu_add(SIPE_CORE_PUBLIC, - menu, - label, - access_groups_menu(sipe_private)); - g_free(label); - - menu = access_levels_menu(sipe_private, - menu, - "user", - sipe_get_no_sip_uri(buddy_name), - TRUE); - - return(menu); -} - -struct sipe_container *sipe_ocs2007_create_container(guint index, - const gchar *member_type, - const gchar *member_value, - gboolean is_group) +static struct sipe_container *create_container(guint index, + const gchar *member_type, + const gchar *member_value, + gboolean is_group) { struct sipe_container *container = g_new0(struct sipe_container, 1); struct sipe_container_member *member = g_new0(struct sipe_container_member, 1); @@ -552,11 +468,6 @@ const gchar *sipe_ocs2007_access_level_name(guint id) return _("Unknown"); } -int sipe_ocs2007_container_id(guint index) -{ - return(containers[index]); -} - /** Member type: user, domain, sameEnterprise, federated, publicCloud; everyone */ int sipe_ocs2007_find_access_level(struct sipe_core_private *sipe_private, const gchar *type, @@ -607,7 +518,7 @@ int sipe_ocs2007_find_access_level(struct sipe_core_private *sipe_private, return container_id; } -GSList *sipe_ocs2007_get_access_domains(struct sipe_core_private *sipe_private) +static GSList *get_access_domains(struct sipe_core_private *sipe_private) { struct sipe_container *container; struct sipe_container_member *member; @@ -750,9 +661,10 @@ void sipe_ocs2007_change_access_level(struct sipe_core_private *sipe_private, g_free(container_xmls); } -void sipe_ocs2007_change_access_level_from_container(struct sipe_core_private *sipe_private, - struct sipe_container *container) +void sipe_core_change_access_level_from_container(struct sipe_core_public *sipe_public, + gpointer parameter) { + struct sipe_container *container = parameter; struct sipe_container_member *member; if (!container || !container->members) return; @@ -764,29 +676,28 @@ void sipe_ocs2007_change_access_level_from_container(struct sipe_core_private *s SIPE_DEBUG_INFO("sipe_ocs2007_change_access_level_from_container: container->id=%d, member->type=%s, member->value=%s", container->id, member->type, member->value ? member->value : ""); - sipe_ocs2007_change_access_level(sipe_private, + sipe_ocs2007_change_access_level(SIPE_CORE_PRIVATE, container->id, member->type, member->value); } -void sipe_ocs2007_change_access_level_for_domain(struct sipe_core_private *sipe_private, - const gchar *domain, - guint index) +void sipe_core_change_access_level_for_domain(struct sipe_core_public *sipe_public, + const gchar *domain, + guint index) { /* move Blocked first */ guint i = (index == 4) ? 0 : index + 1; guint container_id = containers[i]; - SIPE_DEBUG_INFO("sipe_ocs2007_change_access_level_from_id: domain=%s, container_id=(%d)%d", + SIPE_DEBUG_INFO("sipe_core_change_access_level_from_id: domain=%s, container_id=(%d)%d", domain ? domain : "", index, container_id); - sipe_ocs2007_change_access_level(sipe_private, + sipe_ocs2007_change_access_level(SIPE_CORE_PRIVATE, container_id, "domain", domain); - } /** @@ -2440,6 +2351,149 @@ void sipe_ocs2007_process_roaming_self(struct sipe_core_private *sipe_private, g_free(to); } +/** + * for Access levels menu + */ +#define INDENT_FMT " %s" + +/** + * Member is indirectly belong to access level container. + * For example 'sameEnterprise' is in the container and user + * belongs to that same enterprise. + */ +#define INDENT_MARKED_INHERITED_FMT "= %s" + +static struct sipe_backend_buddy_menu *access_levels_menu(struct sipe_core_private *sipe_private, + struct sipe_backend_buddy_menu *menu, + const gchar *member_type, + const gchar *member_value, + const gboolean extra_menu) +{ + if (!menu) + menu = sipe_backend_buddy_menu_start(SIPE_CORE_PUBLIC); + + (void) member_type; + (void) member_value; + (void) extra_menu; + (void) blist_menu_remember_container; + (void) create_container; + return(menu); +} + +static struct sipe_backend_buddy_menu *access_groups_menu(struct sipe_core_private *sipe_private) +{ + struct sipe_backend_buddy_menu *menu = sipe_backend_buddy_menu_start(SIPE_CORE_PUBLIC); + GSList *access_domains, *entry; + + menu = sipe_backend_buddy_sub_menu_add(SIPE_CORE_PUBLIC, + menu, + _("People in my company"), + access_levels_menu(sipe_private, + NULL, + "sameEnterprise", + NULL, + FALSE)); + + /* this is original name, don't edit */ + menu = sipe_backend_buddy_sub_menu_add(SIPE_CORE_PUBLIC, + menu, + _("People in domains connected with my company"), + access_levels_menu(sipe_private, + NULL, + "federated", + NULL, + FALSE)); + + menu = sipe_backend_buddy_sub_menu_add(SIPE_CORE_PUBLIC, + menu, + _("People in public domains"), + access_levels_menu(sipe_private, + NULL, + "publicCloud", + NULL, + TRUE)); + + entry = access_domains = get_access_domains(sipe_private); + while (entry) { + gchar *domain = entry->data; + gchar *menu_name = g_strdup_printf(_("People at %s"), domain); + + /* takes over ownership of entry->data (= domain) */ + menu = sipe_backend_buddy_sub_menu_add(SIPE_CORE_PUBLIC, + menu, + menu_name, + access_levels_menu(sipe_private, + NULL, + "domain", + domain, + TRUE)); + g_free(menu_name); + + entry = entry->next; + } + g_slist_free(access_domains); + + /* separator */ + /* People in domains connected with my company */ + menu = sipe_backend_buddy_menu_separator(SIPE_CORE_PUBLIC, + menu, + "-------------------------------------------"); + + menu = sipe_backend_buddy_menu_add(SIPE_CORE_PUBLIC, + menu, + _("Add new domain..."), + SIPE_BUDDY_MENU_ADD_NEW_DOMAIN, + NULL); + + return(menu); +} + +struct sipe_backend_buddy_menu *sipe_ocs2007_access_control_menu(struct sipe_core_private *sipe_private, + const gchar *buddy_name) +{ + struct sipe_backend_buddy_menu *menu = sipe_backend_buddy_menu_start(SIPE_CORE_PUBLIC); + gchar *label; + + /* + * Workaround for missing libpurple API to release resources allocated + * during blist_node_menu() callback. See also: + * + * + * + * We remember all memory blocks in a list and deallocate them when + * + * - the next time we enter the callback, or + * - the account is disconnected + * + * That means that after the buddy menu has been closed we have unused + * resources but at least we don't leak them anymore... + */ + sipe_core_buddy_menu_free(SIPE_CORE_PUBLIC); + + label = g_strdup_printf(INDENT_FMT, _("Online help...")); + menu = sipe_backend_buddy_menu_add(SIPE_CORE_PUBLIC, + menu, + label, + SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP, + NULL); + g_free(label); + + label = g_strdup_printf(INDENT_FMT, _("Access groups")); + menu = sipe_backend_buddy_sub_menu_add(SIPE_CORE_PUBLIC, + menu, + label, + access_groups_menu(sipe_private)); + g_free(label); + + menu = access_levels_menu(sipe_private, + menu, + "user", + sipe_get_no_sip_uri(buddy_name), + TRUE); + + return(menu); +} + /* Local Variables: mode: c diff --git a/src/core/sipe-ocs2007.h b/src/core/sipe-ocs2007.h index 35c45a44..007ab191 100644 --- a/src/core/sipe-ocs2007.h +++ b/src/core/sipe-ocs2007.h @@ -53,16 +53,10 @@ void sipe_ocs2007_reset_status(struct sipe_core_private *sipe_private); void sipe_ocs2007_process_roaming_self(struct sipe_core_private *sipe_private, struct sipmsg *msg); - -/* this API needs to be refactored once access level menu creation is - refactored correctly to the backend out of sipe.c */ -guint sipe_ocs2007_containers(void); +/** + * OCS2007 Access Levels + */ const gchar *sipe_ocs2007_access_level_name(guint id); -int sipe_ocs2007_container_id(guint index); -struct sipe_container *sipe_ocs2007_create_container(guint index, - const gchar *member_type, - const gchar *member_value, - gboolean is_group); int sipe_ocs2007_find_access_level(struct sipe_core_private *sipe_private, const gchar *type, const gchar *value, @@ -71,12 +65,6 @@ void sipe_ocs2007_change_access_level(struct sipe_core_private *sipe_private, const int container_id, const gchar *type, const gchar *value); -void sipe_ocs2007_change_access_level_from_container(struct sipe_core_private *sipe_private, - struct sipe_container *container); -void sipe_ocs2007_change_access_level_for_domain(struct sipe_core_private *sipe_private, - const gchar *domain, - guint index); -GSList *sipe_ocs2007_get_access_domains(struct sipe_core_private *sipe_private); /* buddy menu */ struct sipe_backend_buddy_menu *sipe_ocs2007_access_control_menu(struct sipe_core_private *sipe_private, diff --git a/src/core/sipe.c b/src/core/sipe.c index 2df9a848..e90f27f1 100644 --- a/src/core/sipe.c +++ b/src/core/sipe.c @@ -54,50 +54,6 @@ sipe_buddy_menu_access_level_cb(PurpleBuddy *buddy, container); } -static void -sipe_ask_access_domain_cb(PurpleConnection *gc, PurpleRequestFields *fields) -{ - struct sipe_core_private *sipe_private = PURPLE_GC_TO_SIPE_CORE_PRIVATE; - const char *domain = purple_request_fields_get_string(fields, "access_domain"); - guint index = purple_request_fields_get_choice(fields, "container_id"); - sipe_ocs2007_change_access_level_for_domain(sipe_private, - domain, - index); -} - -static void sipe_buddy_menu_access_level_add_domain_cb(PurpleBuddy *buddy) -{ - PurpleConnection *gc = purple_account_get_connection(buddy->account); - PurpleRequestFields *fields; - PurpleRequestFieldGroup *g; - PurpleRequestField *f; - - fields = purple_request_fields_new(); - - g = purple_request_field_group_new(NULL); - f = purple_request_field_string_new("access_domain", _("Domain"), "partner-company.com", FALSE); - purple_request_field_set_required(f, TRUE); - purple_request_field_group_add_field(g, f); - - f = purple_request_field_choice_new("container_id", _("Access level"), 0); - purple_request_field_choice_add(f, _("Personal")); /* index 0 */ - purple_request_field_choice_add(f, _("Team")); - purple_request_field_choice_add(f, _("Company")); - purple_request_field_choice_add(f, _("Public")); - purple_request_field_choice_add(f, _("Blocked")); /* index 4 */ - purple_request_field_choice_set_default_value(f, 3); /* index */ - purple_request_field_set_required(f, TRUE); - purple_request_field_group_add_field(g, f); - - purple_request_fields_add_group(fields, g); - - purple_request_fields(gc, _("Add new domain"), - _("Add new domain"), NULL, fields, - _("Add"), G_CALLBACK(sipe_ask_access_domain_cb), - _("Cancel"), NULL, - buddy->account, NULL, NULL, gc); -} - static GList * sipe_get_access_levels_menu(struct sipe_core_private *sipe_private, const char* member_type, @@ -176,62 +132,6 @@ sipe_get_access_levels_menu(struct sipe_core_private *sipe_private, return menu_access_levels; } -static GList * -sipe_get_access_groups_menu(struct sipe_core_private *sipe_private) -{ - GList *menu_access_groups = NULL; - PurpleMenuAction *act; - GSList *access_domains; - GSList *entry; - - act = purple_menu_action_new(_("People in my company"), - NULL, - NULL, sipe_get_access_levels_menu(sipe_private, "sameEnterprise", NULL, FALSE)); - menu_access_groups = g_list_prepend(menu_access_groups, act); - - /* this is original name, don't edit */ - act = purple_menu_action_new(_("People in domains connected with my company"), - NULL, - NULL, sipe_get_access_levels_menu(sipe_private, "federated", NULL, FALSE)); - menu_access_groups = g_list_prepend(menu_access_groups, act); - - act = purple_menu_action_new(_("People in public domains"), - NULL, - NULL, sipe_get_access_levels_menu(sipe_private, "publicCloud", NULL, TRUE)); - menu_access_groups = g_list_prepend(menu_access_groups, act); - - access_domains = sipe_ocs2007_get_access_domains(sipe_private); - entry = access_domains; - while (entry) { - gchar *domain = entry->data; - gchar *menu_name = g_strdup_printf(_("People at %s"), domain); - - /* takes over ownership of entry->data (= domain) */ - act = purple_menu_action_new(menu_name, - NULL, - NULL, sipe_get_access_levels_menu(sipe_private, "domain", domain, TRUE)); - menu_access_groups = g_list_prepend(menu_access_groups, act); - g_free(menu_name); - - entry = entry->next; - } - g_slist_free(access_domains); - - /* separator */ - /* People in domains connected with my company */ - act = purple_menu_action_new("-------------------------------------------", NULL, NULL, NULL); - menu_access_groups = g_list_prepend(menu_access_groups, act); - - act = purple_menu_action_new(_("Add new domain..."), - PURPLE_CALLBACK(sipe_buddy_menu_access_level_add_domain_cb), - NULL, NULL); - menu_access_groups = g_list_prepend(menu_access_groups, act); - - menu_access_groups = g_list_reverse(menu_access_groups); - - return menu_access_groups; -} - /* Local Variables: mode: c diff --git a/src/purple/purple-buddy.c b/src/purple/purple-buddy.c index 5774c28b..4307d1db 100644 --- a/src/purple/purple-buddy.c +++ b/src/purple/purple-buddy.c @@ -31,6 +31,7 @@ #include "blist.h" #include "notify.h" #include "privacy.h" +#include "request.h" #include "version.h" #include "sipe-common.h" @@ -487,6 +488,55 @@ static void sipe_purple_buddy_access_level_help_cb(PurpleBuddy *buddy, _("https://sourceforge.net/apps/mediawiki/sipe/index.php?title=Access_Levels")); } +static void sipe_purple_ask_access_domain_cb(PurpleConnection *gc, + PurpleRequestFields *fields) +{ + const gchar *domain = purple_request_fields_get_string(fields, "access_domain"); + guint index = purple_request_fields_get_choice(fields, "container_id"); + sipe_core_change_access_level_for_domain(PURPLE_GC_TO_SIPE_CORE_PUBLIC, + domain, + index); +} + +static void sipe_purple_buddy_add_new_domain_cb(PurpleBuddy *buddy, + SIPE_UNUSED_PARAMETER gpointer parameter) +{ + PurpleConnection *gc = purple_account_get_connection(buddy->account); + PurpleRequestFields *fields; + PurpleRequestFieldGroup *g; + PurpleRequestField *f; + + fields = purple_request_fields_new(); + + g = purple_request_field_group_new(NULL); + f = purple_request_field_string_new("access_domain", + _("Domain"), + "partner-company.com", + FALSE); + purple_request_field_set_required(f, TRUE); + purple_request_field_group_add_field(g, f); + + f = purple_request_field_choice_new("container_id", + _("Access level"), + 0); + purple_request_field_choice_add(f, _("Personal")); /* index 0 */ + purple_request_field_choice_add(f, _("Team")); + purple_request_field_choice_add(f, _("Company")); + purple_request_field_choice_add(f, _("Public")); + purple_request_field_choice_add(f, _("Blocked")); /* index 4 */ + purple_request_field_choice_set_default_value(f, 3); /* index */ + purple_request_field_set_required(f, TRUE); + purple_request_field_group_add_field(g, f); + + purple_request_fields_add_group(fields, g); + + purple_request_fields(gc, _("Add new domain"), + _("Add new domain"), NULL, fields, + _("Add"), G_CALLBACK(sipe_purple_ask_access_domain_cb), + _("Cancel"), NULL, + buddy->account, NULL, NULL, gc); +} + typedef void (*buddy_menu_callback)(PurpleBuddy *buddy, gpointer parameter); static const buddy_menu_callback callback_map[SIPE_BUDDY_MENU_TYPES] = { @@ -497,6 +547,8 @@ static const buddy_menu_callback callback_map[SIPE_BUDDY_MENU_TYPES] = { /* SIPE_BUDDY_MENU_MAKE_CALL */ sipe_purple_buddy_make_call_cb, /* SIPE_BUDDY_MENU_SEND_EMAIL */ sipe_purple_buddy_send_email_cb, /* SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP */ sipe_purple_buddy_access_level_help_cb, + /* SIPE_BUDDY_MENU_ADD_NEW_DOMAIN */ sipe_purple_buddy_add_new_domain_cb, + }; struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public) @@ -517,6 +569,15 @@ struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(SIPE_UNUSED_PARAMETE parameter, NULL))); } +struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public, + struct sipe_backend_buddy_menu *menu, + const gchar *label) +{ + return((struct sipe_backend_buddy_menu *) + g_list_prepend((GList *) menu, + purple_menu_action_new(label, NULL, NULL, NULL))); +} + struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public, struct sipe_backend_buddy_menu *menu, const gchar *label, -- 2.11.4.GIT