core cleanup: move code for "copy to" menu to purple backend
[siplcs.git] / src / core / sipe.c
blob7d5fe6ffaff000acf86744648aa4bf958c06fecd
1 /**
2 * @file sipe.c
4 *****************************************************************************
5 *** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ***
6 *** ***
7 *** THIS MODULE IS NO LONGER COMPILED ***
8 *** ***
9 *** YES, IT IS INTENTIONALLY BROKEN.... ***
10 *** ***
11 *** DO NOT ADD ANY NEW CODE TO THIS MODULE ***
12 *** ***
13 *** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ***
14 *****************************************************************************
16 * pidgin-sipe
18 * Copyright (C) 2010-11 SIPE Project <http://sipe.sourceforge.net/>
19 * Copyright (C) 2010 pier11 <pier11@operamail.com>
20 * Copyright (C) 2009 Anibal Avelar <debianmx@gmail.com>
21 * Copyright (C) 2009 pier11 <pier11@operamail.com>
22 * Copyright (C) 2008 Novell, Inc., Anibal Avelar <debianmx@gmail.com>
23 * Copyright (C) 2007 Anibal Avelar <debianmx@gmail.com>
24 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
26 * ***
27 * Thanks to Google's Summer of Code Program and the helpful mentors
28 * ***
30 * Session-based SIP MESSAGE documentation:
31 * http://tools.ietf.org/html/draft-ietf-simple-im-session-00
33 * This program is free software; you can redistribute it and/or modify
34 * it under the terms of the GNU General Public License as published by
35 * the Free Software Foundation; either version 2 of the License, or
36 * (at your option) any later version.
38 * This program is distributed in the hope that it will be useful,
39 * but WITHOUT ANY WARRANTY; without even the implied warranty of
40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41 * GNU General Public License for more details.
43 * You should have received a copy of the GNU General Public License
44 * along with this program; if not, write to the Free Software
45 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
48 /** for Access levels menu */
49 #define INDENT_FMT " %s"
51 /** Member is indirectly belong to access level container.
52 * For example 'sameEnterprise' is in the container and user
53 * belongs to that same enterprise.
55 #define INDENT_MARKED_INHERITED_FMT "= %s"
57 static void
58 sipe_buddy_menu_access_level_help_cb(PurpleBuddy *buddy)
60 /** Translators: replace with URL to localized page
61 * If it doesn't exist copy the original URL */
62 purple_notify_uri(buddy->account->gc, _("https://sourceforge.net/apps/mediawiki/sipe/index.php?title=Access_Levels"));
65 static void
66 sipe_buddy_menu_access_level_cb(PurpleBuddy *buddy,
67 struct sipe_container *container)
69 struct sipe_core_private *sipe_private = PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE;
70 sipe_ocs2007_change_access_level_from_container(sipe_private,
71 container);
74 /*--------------------- START WIP ------------------------------*/
75 /* Access Level */
76 if (SIPE_CORE_PRIVATE_FLAG_IS(OCS2007)) {
77 GList *menu_access_levels = sipe_get_access_control_menu(sipe_private, buddy->name);
79 act = purple_menu_action_new(_("Access level"),
80 NULL,
81 NULL, menu_access_levels);
82 menu = g_list_prepend(menu, act);
84 /*--------------------- END WIP ------------------------------*/
86 static void
87 sipe_ask_access_domain_cb(PurpleConnection *gc, PurpleRequestFields *fields)
89 struct sipe_core_private *sipe_private = PURPLE_GC_TO_SIPE_CORE_PRIVATE;
90 const char *domain = purple_request_fields_get_string(fields, "access_domain");
91 guint index = purple_request_fields_get_choice(fields, "container_id");
92 sipe_ocs2007_change_access_level_for_domain(sipe_private,
93 domain,
94 index);
97 static void sipe_buddy_menu_access_level_add_domain_cb(PurpleBuddy *buddy)
99 PurpleConnection *gc = purple_account_get_connection(buddy->account);
100 PurpleRequestFields *fields;
101 PurpleRequestFieldGroup *g;
102 PurpleRequestField *f;
104 fields = purple_request_fields_new();
106 g = purple_request_field_group_new(NULL);
107 f = purple_request_field_string_new("access_domain", _("Domain"), "partner-company.com", FALSE);
108 purple_request_field_set_required(f, TRUE);
109 purple_request_field_group_add_field(g, f);
111 f = purple_request_field_choice_new("container_id", _("Access level"), 0);
112 purple_request_field_choice_add(f, _("Personal")); /* index 0 */
113 purple_request_field_choice_add(f, _("Team"));
114 purple_request_field_choice_add(f, _("Company"));
115 purple_request_field_choice_add(f, _("Public"));
116 purple_request_field_choice_add(f, _("Blocked")); /* index 4 */
117 purple_request_field_choice_set_default_value(f, 3); /* index */
118 purple_request_field_set_required(f, TRUE);
119 purple_request_field_group_add_field(g, f);
121 purple_request_fields_add_group(fields, g);
123 purple_request_fields(gc, _("Add new domain"),
124 _("Add new domain"), NULL, fields,
125 _("Add"), G_CALLBACK(sipe_ask_access_domain_cb),
126 _("Cancel"), NULL,
127 buddy->account, NULL, NULL, gc);
130 static GList *
131 sipe_get_access_levels_menu(struct sipe_core_private *sipe_private,
132 const char* member_type,
133 const char* member_value,
134 const gboolean extra_menu)
136 GList *menu_access_levels = NULL;
137 unsigned int i;
138 char *menu_name;
139 PurpleMenuAction *act;
140 struct sipe_container *container;
141 gboolean is_group_access = FALSE;
142 int container_id = sipe_ocs2007_find_access_level(sipe_private,
143 member_type,
144 member_value,
145 &is_group_access);
146 guint container_max = sipe_ocs2007_containers();
148 for (i = 1; i <= container_max; i++) {
149 /* to put Blocked level last in menu list.
150 * Blocked should remaim in the first place in the containers[] array.
152 unsigned int j = (i == container_max) ? 0 : i;
153 int container_j = sipe_ocs2007_container_id(j);
154 const gchar *acc_level_name = sipe_ocs2007_access_level_name(container_j);
156 container = sipe_ocs2007_create_container(j,
157 member_type,
158 member_value,
159 FALSE);
161 /* libpurple memory leak workaround */
162 sipe_blist_menu_remember_container(sipe_private, container);
164 /* current container/access level */
165 if (container_j == container_id) {
166 menu_name = is_group_access ?
167 g_strdup_printf(INDENT_MARKED_INHERITED_FMT, acc_level_name) :
168 g_strdup_printf(SIPE_OCS2007_INDENT_MARKED_FMT, acc_level_name);
169 } else {
170 menu_name = g_strdup_printf(INDENT_FMT, acc_level_name);
173 act = purple_menu_action_new(menu_name,
174 PURPLE_CALLBACK(sipe_buddy_menu_access_level_cb),
175 container, NULL);
176 g_free(menu_name);
177 menu_access_levels = g_list_prepend(menu_access_levels, act);
180 if (extra_menu && (container_id >= 0)) {
181 /* separator */
182 act = purple_menu_action_new(" --------------", NULL, NULL, NULL);
183 menu_access_levels = g_list_prepend(menu_access_levels, act);
185 if (!is_group_access) {
186 container = sipe_ocs2007_create_container(0,
187 member_type,
188 member_value,
189 TRUE);
191 /* libpurple memory leak workaround */
192 sipe_blist_menu_remember_container(sipe_private, container);
194 /* Translators: remove (clear) previously assigned access level */
195 menu_name = g_strdup_printf(INDENT_FMT, _("Unspecify"));
196 act = purple_menu_action_new(menu_name,
197 PURPLE_CALLBACK(sipe_buddy_menu_access_level_cb),
198 container, NULL);
199 g_free(menu_name);
200 menu_access_levels = g_list_prepend(menu_access_levels, act);
204 menu_access_levels = g_list_reverse(menu_access_levels);
205 return menu_access_levels;
208 static GList *
209 sipe_get_access_groups_menu(struct sipe_core_private *sipe_private)
211 GList *menu_access_groups = NULL;
212 PurpleMenuAction *act;
213 GSList *access_domains;
214 GSList *entry;
216 act = purple_menu_action_new(_("People in my company"),
217 NULL,
218 NULL, sipe_get_access_levels_menu(sipe_private, "sameEnterprise", NULL, FALSE));
219 menu_access_groups = g_list_prepend(menu_access_groups, act);
221 /* this is original name, don't edit */
222 act = purple_menu_action_new(_("People in domains connected with my company"),
223 NULL,
224 NULL, sipe_get_access_levels_menu(sipe_private, "federated", NULL, FALSE));
225 menu_access_groups = g_list_prepend(menu_access_groups, act);
227 act = purple_menu_action_new(_("People in public domains"),
228 NULL,
229 NULL, sipe_get_access_levels_menu(sipe_private, "publicCloud", NULL, TRUE));
230 menu_access_groups = g_list_prepend(menu_access_groups, act);
232 access_domains = sipe_ocs2007_get_access_domains(sipe_private);
233 entry = access_domains;
234 while (entry) {
235 gchar *domain = entry->data;
236 gchar *menu_name = g_strdup_printf(_("People at %s"), domain);
238 /* takes over ownership of entry->data (= domain) */
239 act = purple_menu_action_new(menu_name,
240 NULL,
241 NULL, sipe_get_access_levels_menu(sipe_private, "domain", domain, TRUE));
242 menu_access_groups = g_list_prepend(menu_access_groups, act);
243 g_free(menu_name);
245 entry = entry->next;
247 g_slist_free(access_domains);
249 /* separator */
250 /* People in domains connected with my company */
251 act = purple_menu_action_new("-------------------------------------------", NULL, NULL, NULL);
252 menu_access_groups = g_list_prepend(menu_access_groups, act);
254 act = purple_menu_action_new(_("Add new domain..."),
255 PURPLE_CALLBACK(sipe_buddy_menu_access_level_add_domain_cb),
256 NULL, NULL);
257 menu_access_groups = g_list_prepend(menu_access_groups, act);
259 menu_access_groups = g_list_reverse(menu_access_groups);
261 return menu_access_groups;
264 static GList *
265 sipe_get_access_control_menu(struct sipe_core_private *sipe_private,
266 const char* uri)
268 GList *menu_access_levels = NULL;
269 GList *menu_access_groups = NULL;
270 char *menu_name;
271 PurpleMenuAction *act;
273 /* libpurple memory leak workaround */
274 sipe_blist_menu_free_containers(sipe_private);
276 menu_access_levels = sipe_get_access_levels_menu(sipe_private, "user", sipe_get_no_sip_uri(uri), TRUE);
278 menu_access_groups = sipe_get_access_groups_menu(sipe_private);
280 menu_name = g_strdup_printf(INDENT_FMT, _("Access groups"));
281 act = purple_menu_action_new(menu_name,
282 NULL,
283 NULL, menu_access_groups);
284 g_free(menu_name);
285 menu_access_levels = g_list_append(menu_access_levels, act);
287 menu_name = g_strdup_printf(INDENT_FMT, _("Online help..."));
288 act = purple_menu_action_new(menu_name,
289 PURPLE_CALLBACK(sipe_buddy_menu_access_level_help_cb),
290 NULL, NULL);
291 g_free(menu_name);
292 menu_access_levels = g_list_append(menu_access_levels, act);
294 return menu_access_levels;
298 Local Variables:
299 mode: c
300 c-file-style: "bsd"
301 indent-tabs-mode: t
302 tab-width: 8
303 End: