core cleanup: separate code for make call menu entries
[siplcs.git] / src / core / sipe.c
blobf21784f1e6499c71e4a6d612479b5ae6213d3801
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 PurpleBuddy *
58 purple_blist_add_buddy_clone(PurpleGroup * group, PurpleBuddy * buddy)
60 struct sipe_core_private *sipe_private = PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE;
61 PurpleBuddy *clone;
62 gchar *server_alias, *email;
63 const PurpleStatus *status = purple_presence_get_active_status(purple_buddy_get_presence(buddy));
65 clone = sipe_backend_buddy_add(SIPE_CORE_PUBLIC,
66 buddy->name,
67 buddy->alias,
68 group->name);
70 server_alias = sipe_backend_buddy_get_server_alias(SIPE_CORE_PUBLIC,
71 buddy);
72 if (server_alias) {
73 sipe_backend_buddy_set_server_alias(SIPE_CORE_PUBLIC,
74 clone,
75 server_alias);
76 g_free(server_alias);
79 email = sipe_backend_buddy_get_string(SIPE_CORE_PUBLIC,
80 buddy,
81 SIPE_BUDDY_INFO_EMAIL);
82 if (email) {
83 sipe_backend_buddy_set_string(SIPE_CORE_PUBLIC,
84 clone,
85 SIPE_BUDDY_INFO_EMAIL,
86 email);
87 g_free(email);
90 purple_presence_set_status_active(purple_buddy_get_presence(clone),
91 purple_status_get_id(status),
92 TRUE);
93 /* for UI to update */
94 sipe_backend_buddy_set_status(SIPE_CORE_PUBLIC,
95 buddy->name,
96 purple_status_get_id(status));
98 return clone;
101 static void
102 sipe_buddy_menu_copy_to_cb(PurpleBlistNode *node, const char *group_name)
104 PurpleBuddy *buddy, *b;
105 PurpleGroup * group = purple_find_group(group_name);
107 g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
109 buddy = (PurpleBuddy *)node;
111 SIPE_DEBUG_INFO("sipe_buddy_menu_copy_to_cb: copying %s to %s",
112 buddy->name, group_name);
114 b = purple_find_buddy_in_group(buddy->account, buddy->name, group);
115 if (!b)
116 b = purple_blist_add_buddy_clone(group, buddy);
118 if (b && group) {
119 PurpleConnection *gc = purple_account_get_connection(b->account);
121 sipe_core_buddy_add(PURPLE_GC_TO_SIPE_CORE_PUBLIC,
122 b->name,
123 group->name);
127 static void
128 sipe_buddy_menu_access_level_help_cb(PurpleBuddy *buddy)
130 /** Translators: replace with URL to localized page
131 * If it doesn't exist copy the original URL */
132 purple_notify_uri(buddy->account->gc, _("https://sourceforge.net/apps/mediawiki/sipe/index.php?title=Access_Levels"));
135 static void
136 sipe_buddy_menu_send_email_cb(PurpleBuddy *buddy)
138 struct sipe_core_private *sipe_private = PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE;
139 gchar *email;
140 SIPE_DEBUG_INFO("sipe_buddy_menu_send_email_cb: buddy->name=%s", buddy->name);
142 email = sipe_backend_buddy_get_string(SIPE_CORE_PUBLIC,
143 buddy,
144 SIPE_BUDDY_INFO_EMAIL);
145 if (email)
147 char *command_line = g_strdup_printf(
148 #ifdef _WIN32
149 "cmd /c start"
150 #else
151 "xdg-email"
152 #endif
153 " mailto:%s", email);
154 SIPE_DEBUG_INFO("sipe_buddy_menu_send_email_cb: going to call email client: %s", command_line);
156 g_free(email);
157 g_spawn_command_line_async(command_line, NULL);
158 g_free(command_line);
160 else
162 SIPE_DEBUG_INFO("sipe_buddy_menu_send_email_cb: no email address stored for buddy=%s", buddy->name);
166 static void
167 sipe_buddy_menu_access_level_cb(PurpleBuddy *buddy,
168 struct sipe_container *container)
170 struct sipe_core_private *sipe_private = PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE;
171 sipe_ocs2007_change_access_level_from_container(sipe_private,
172 container);
175 /*--------------------- START WIP ------------------------------*/
178 email = sipe_backend_buddy_get_string(SIPE_CORE_PUBLIC,
179 buddy,
180 SIPE_BUDDY_INFO_EMAIL);
181 if (email) {
182 act = purple_menu_action_new(_("Send email..."),
183 PURPLE_CALLBACK(sipe_buddy_menu_send_email_cb),
184 NULL, NULL);
185 menu = g_list_prepend(menu, act);
186 g_free(email);
189 /* Access Level */
190 if (SIPE_CORE_PRIVATE_FLAG_IS(OCS2007)) {
191 GList *menu_access_levels = sipe_get_access_control_menu(sipe_private, buddy->name);
193 act = purple_menu_action_new(_("Access level"),
194 NULL,
195 NULL, menu_access_levels);
196 menu = g_list_prepend(menu, act);
199 /* Copy to */
200 gr_parent = purple_buddy_get_group(buddy);
201 for (g_node = purple_blist_get_root(); g_node; g_node = g_node->next) {
202 PurpleGroup *group;
204 if (g_node->type != PURPLE_BLIST_GROUP_NODE)
205 continue;
207 group = (PurpleGroup *)g_node;
208 if (group == gr_parent)
209 continue;
211 if (purple_find_buddy_in_group(buddy->account, buddy->name, group))
212 continue;
214 act = purple_menu_action_new(purple_group_get_name(group),
215 PURPLE_CALLBACK(sipe_buddy_menu_copy_to_cb),
216 group->name, NULL);
217 menu_groups = g_list_prepend(menu_groups, act);
219 /* Coverity complains about RESOURCE_LEAK here - no idea how to fix it */
220 menu_groups = g_list_reverse(menu_groups);
222 act = purple_menu_action_new(_("Copy to"),
223 NULL,
224 NULL, menu_groups);
225 menu = g_list_prepend(menu, act);
227 /*--------------------- END WIP ------------------------------*/
230 static void
231 sipe_ask_access_domain_cb(PurpleConnection *gc, PurpleRequestFields *fields)
233 struct sipe_core_private *sipe_private = PURPLE_GC_TO_SIPE_CORE_PRIVATE;
234 const char *domain = purple_request_fields_get_string(fields, "access_domain");
235 guint index = purple_request_fields_get_choice(fields, "container_id");
236 sipe_ocs2007_change_access_level_for_domain(sipe_private,
237 domain,
238 index);
241 static void sipe_buddy_menu_access_level_add_domain_cb(PurpleBuddy *buddy)
243 PurpleConnection *gc = purple_account_get_connection(buddy->account);
244 PurpleRequestFields *fields;
245 PurpleRequestFieldGroup *g;
246 PurpleRequestField *f;
248 fields = purple_request_fields_new();
250 g = purple_request_field_group_new(NULL);
251 f = purple_request_field_string_new("access_domain", _("Domain"), "partner-company.com", FALSE);
252 purple_request_field_set_required(f, TRUE);
253 purple_request_field_group_add_field(g, f);
255 f = purple_request_field_choice_new("container_id", _("Access level"), 0);
256 purple_request_field_choice_add(f, _("Personal")); /* index 0 */
257 purple_request_field_choice_add(f, _("Team"));
258 purple_request_field_choice_add(f, _("Company"));
259 purple_request_field_choice_add(f, _("Public"));
260 purple_request_field_choice_add(f, _("Blocked")); /* index 4 */
261 purple_request_field_choice_set_default_value(f, 3); /* index */
262 purple_request_field_set_required(f, TRUE);
263 purple_request_field_group_add_field(g, f);
265 purple_request_fields_add_group(fields, g);
267 purple_request_fields(gc, _("Add new domain"),
268 _("Add new domain"), NULL, fields,
269 _("Add"), G_CALLBACK(sipe_ask_access_domain_cb),
270 _("Cancel"), NULL,
271 buddy->account, NULL, NULL, gc);
274 static GList *
275 sipe_get_access_levels_menu(struct sipe_core_private *sipe_private,
276 const char* member_type,
277 const char* member_value,
278 const gboolean extra_menu)
280 GList *menu_access_levels = NULL;
281 unsigned int i;
282 char *menu_name;
283 PurpleMenuAction *act;
284 struct sipe_container *container;
285 gboolean is_group_access = FALSE;
286 int container_id = sipe_ocs2007_find_access_level(sipe_private,
287 member_type,
288 member_value,
289 &is_group_access);
290 guint container_max = sipe_ocs2007_containers();
292 for (i = 1; i <= container_max; i++) {
293 /* to put Blocked level last in menu list.
294 * Blocked should remaim in the first place in the containers[] array.
296 unsigned int j = (i == container_max) ? 0 : i;
297 int container_j = sipe_ocs2007_container_id(j);
298 const gchar *acc_level_name = sipe_ocs2007_access_level_name(container_j);
300 container = sipe_ocs2007_create_container(j,
301 member_type,
302 member_value,
303 FALSE);
305 /* libpurple memory leak workaround */
306 sipe_blist_menu_remember_container(sipe_private, container);
308 /* current container/access level */
309 if (container_j == container_id) {
310 menu_name = is_group_access ?
311 g_strdup_printf(INDENT_MARKED_INHERITED_FMT, acc_level_name) :
312 g_strdup_printf(SIPE_OCS2007_INDENT_MARKED_FMT, acc_level_name);
313 } else {
314 menu_name = g_strdup_printf(INDENT_FMT, acc_level_name);
317 act = purple_menu_action_new(menu_name,
318 PURPLE_CALLBACK(sipe_buddy_menu_access_level_cb),
319 container, NULL);
320 g_free(menu_name);
321 menu_access_levels = g_list_prepend(menu_access_levels, act);
324 if (extra_menu && (container_id >= 0)) {
325 /* separator */
326 act = purple_menu_action_new(" --------------", NULL, NULL, NULL);
327 menu_access_levels = g_list_prepend(menu_access_levels, act);
329 if (!is_group_access) {
330 container = sipe_ocs2007_create_container(0,
331 member_type,
332 member_value,
333 TRUE);
335 /* libpurple memory leak workaround */
336 sipe_blist_menu_remember_container(sipe_private, container);
338 /* Translators: remove (clear) previously assigned access level */
339 menu_name = g_strdup_printf(INDENT_FMT, _("Unspecify"));
340 act = purple_menu_action_new(menu_name,
341 PURPLE_CALLBACK(sipe_buddy_menu_access_level_cb),
342 container, NULL);
343 g_free(menu_name);
344 menu_access_levels = g_list_prepend(menu_access_levels, act);
348 menu_access_levels = g_list_reverse(menu_access_levels);
349 return menu_access_levels;
352 static GList *
353 sipe_get_access_groups_menu(struct sipe_core_private *sipe_private)
355 GList *menu_access_groups = NULL;
356 PurpleMenuAction *act;
357 GSList *access_domains;
358 GSList *entry;
360 act = purple_menu_action_new(_("People in my company"),
361 NULL,
362 NULL, sipe_get_access_levels_menu(sipe_private, "sameEnterprise", NULL, FALSE));
363 menu_access_groups = g_list_prepend(menu_access_groups, act);
365 /* this is original name, don't edit */
366 act = purple_menu_action_new(_("People in domains connected with my company"),
367 NULL,
368 NULL, sipe_get_access_levels_menu(sipe_private, "federated", NULL, FALSE));
369 menu_access_groups = g_list_prepend(menu_access_groups, act);
371 act = purple_menu_action_new(_("People in public domains"),
372 NULL,
373 NULL, sipe_get_access_levels_menu(sipe_private, "publicCloud", NULL, TRUE));
374 menu_access_groups = g_list_prepend(menu_access_groups, act);
376 access_domains = sipe_ocs2007_get_access_domains(sipe_private);
377 entry = access_domains;
378 while (entry) {
379 gchar *domain = entry->data;
380 gchar *menu_name = g_strdup_printf(_("People at %s"), domain);
382 /* takes over ownership of entry->data (= domain) */
383 act = purple_menu_action_new(menu_name,
384 NULL,
385 NULL, sipe_get_access_levels_menu(sipe_private, "domain", domain, TRUE));
386 menu_access_groups = g_list_prepend(menu_access_groups, act);
387 g_free(menu_name);
389 entry = entry->next;
391 g_slist_free(access_domains);
393 /* separator */
394 /* People in domains connected with my company */
395 act = purple_menu_action_new("-------------------------------------------", NULL, NULL, NULL);
396 menu_access_groups = g_list_prepend(menu_access_groups, act);
398 act = purple_menu_action_new(_("Add new domain..."),
399 PURPLE_CALLBACK(sipe_buddy_menu_access_level_add_domain_cb),
400 NULL, NULL);
401 menu_access_groups = g_list_prepend(menu_access_groups, act);
403 menu_access_groups = g_list_reverse(menu_access_groups);
405 return menu_access_groups;
408 static GList *
409 sipe_get_access_control_menu(struct sipe_core_private *sipe_private,
410 const char* uri)
412 GList *menu_access_levels = NULL;
413 GList *menu_access_groups = NULL;
414 char *menu_name;
415 PurpleMenuAction *act;
417 /* libpurple memory leak workaround */
418 sipe_blist_menu_free_containers(sipe_private);
420 menu_access_levels = sipe_get_access_levels_menu(sipe_private, "user", sipe_get_no_sip_uri(uri), TRUE);
422 menu_access_groups = sipe_get_access_groups_menu(sipe_private);
424 menu_name = g_strdup_printf(INDENT_FMT, _("Access groups"));
425 act = purple_menu_action_new(menu_name,
426 NULL,
427 NULL, menu_access_groups);
428 g_free(menu_name);
429 menu_access_levels = g_list_append(menu_access_levels, act);
431 menu_name = g_strdup_printf(INDENT_FMT, _("Online help..."));
432 act = purple_menu_action_new(menu_name,
433 PURPLE_CALLBACK(sipe_buddy_menu_access_level_help_cb),
434 NULL, NULL);
435 g_free(menu_name);
436 menu_access_levels = g_list_append(menu_access_levels, act);
438 return menu_access_levels;
442 Local Variables:
443 mode: c
444 c-file-style: "bsd"
445 indent-tabs-mode: t
446 tab-width: 8
447 End: