core cleanup: separate code for send email menu entry
[siplcs.git] / src / core / sipe.c
blob00f93245087ad83b70604e2ff76de192334a03ea
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_access_level_cb(PurpleBuddy *buddy,
137 struct sipe_container *container)
139 struct sipe_core_private *sipe_private = PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE;
140 sipe_ocs2007_change_access_level_from_container(sipe_private,
141 container);
144 /*--------------------- START WIP ------------------------------*/
147 /* Access Level */
148 if (SIPE_CORE_PRIVATE_FLAG_IS(OCS2007)) {
149 GList *menu_access_levels = sipe_get_access_control_menu(sipe_private, buddy->name);
151 act = purple_menu_action_new(_("Access level"),
152 NULL,
153 NULL, menu_access_levels);
154 menu = g_list_prepend(menu, act);
157 /* Copy to */
158 gr_parent = purple_buddy_get_group(buddy);
159 for (g_node = purple_blist_get_root(); g_node; g_node = g_node->next) {
160 PurpleGroup *group;
162 if (g_node->type != PURPLE_BLIST_GROUP_NODE)
163 continue;
165 group = (PurpleGroup *)g_node;
166 if (group == gr_parent)
167 continue;
169 if (purple_find_buddy_in_group(buddy->account, buddy->name, group))
170 continue;
172 act = purple_menu_action_new(purple_group_get_name(group),
173 PURPLE_CALLBACK(sipe_buddy_menu_copy_to_cb),
174 group->name, NULL);
175 menu_groups = g_list_prepend(menu_groups, act);
177 /* Coverity complains about RESOURCE_LEAK here - no idea how to fix it */
178 menu_groups = g_list_reverse(menu_groups);
180 act = purple_menu_action_new(_("Copy to"),
181 NULL,
182 NULL, menu_groups);
183 menu = g_list_prepend(menu, act);
185 /*--------------------- END WIP ------------------------------*/
188 static void
189 sipe_ask_access_domain_cb(PurpleConnection *gc, PurpleRequestFields *fields)
191 struct sipe_core_private *sipe_private = PURPLE_GC_TO_SIPE_CORE_PRIVATE;
192 const char *domain = purple_request_fields_get_string(fields, "access_domain");
193 guint index = purple_request_fields_get_choice(fields, "container_id");
194 sipe_ocs2007_change_access_level_for_domain(sipe_private,
195 domain,
196 index);
199 static void sipe_buddy_menu_access_level_add_domain_cb(PurpleBuddy *buddy)
201 PurpleConnection *gc = purple_account_get_connection(buddy->account);
202 PurpleRequestFields *fields;
203 PurpleRequestFieldGroup *g;
204 PurpleRequestField *f;
206 fields = purple_request_fields_new();
208 g = purple_request_field_group_new(NULL);
209 f = purple_request_field_string_new("access_domain", _("Domain"), "partner-company.com", FALSE);
210 purple_request_field_set_required(f, TRUE);
211 purple_request_field_group_add_field(g, f);
213 f = purple_request_field_choice_new("container_id", _("Access level"), 0);
214 purple_request_field_choice_add(f, _("Personal")); /* index 0 */
215 purple_request_field_choice_add(f, _("Team"));
216 purple_request_field_choice_add(f, _("Company"));
217 purple_request_field_choice_add(f, _("Public"));
218 purple_request_field_choice_add(f, _("Blocked")); /* index 4 */
219 purple_request_field_choice_set_default_value(f, 3); /* index */
220 purple_request_field_set_required(f, TRUE);
221 purple_request_field_group_add_field(g, f);
223 purple_request_fields_add_group(fields, g);
225 purple_request_fields(gc, _("Add new domain"),
226 _("Add new domain"), NULL, fields,
227 _("Add"), G_CALLBACK(sipe_ask_access_domain_cb),
228 _("Cancel"), NULL,
229 buddy->account, NULL, NULL, gc);
232 static GList *
233 sipe_get_access_levels_menu(struct sipe_core_private *sipe_private,
234 const char* member_type,
235 const char* member_value,
236 const gboolean extra_menu)
238 GList *menu_access_levels = NULL;
239 unsigned int i;
240 char *menu_name;
241 PurpleMenuAction *act;
242 struct sipe_container *container;
243 gboolean is_group_access = FALSE;
244 int container_id = sipe_ocs2007_find_access_level(sipe_private,
245 member_type,
246 member_value,
247 &is_group_access);
248 guint container_max = sipe_ocs2007_containers();
250 for (i = 1; i <= container_max; i++) {
251 /* to put Blocked level last in menu list.
252 * Blocked should remaim in the first place in the containers[] array.
254 unsigned int j = (i == container_max) ? 0 : i;
255 int container_j = sipe_ocs2007_container_id(j);
256 const gchar *acc_level_name = sipe_ocs2007_access_level_name(container_j);
258 container = sipe_ocs2007_create_container(j,
259 member_type,
260 member_value,
261 FALSE);
263 /* libpurple memory leak workaround */
264 sipe_blist_menu_remember_container(sipe_private, container);
266 /* current container/access level */
267 if (container_j == container_id) {
268 menu_name = is_group_access ?
269 g_strdup_printf(INDENT_MARKED_INHERITED_FMT, acc_level_name) :
270 g_strdup_printf(SIPE_OCS2007_INDENT_MARKED_FMT, acc_level_name);
271 } else {
272 menu_name = g_strdup_printf(INDENT_FMT, acc_level_name);
275 act = purple_menu_action_new(menu_name,
276 PURPLE_CALLBACK(sipe_buddy_menu_access_level_cb),
277 container, NULL);
278 g_free(menu_name);
279 menu_access_levels = g_list_prepend(menu_access_levels, act);
282 if (extra_menu && (container_id >= 0)) {
283 /* separator */
284 act = purple_menu_action_new(" --------------", NULL, NULL, NULL);
285 menu_access_levels = g_list_prepend(menu_access_levels, act);
287 if (!is_group_access) {
288 container = sipe_ocs2007_create_container(0,
289 member_type,
290 member_value,
291 TRUE);
293 /* libpurple memory leak workaround */
294 sipe_blist_menu_remember_container(sipe_private, container);
296 /* Translators: remove (clear) previously assigned access level */
297 menu_name = g_strdup_printf(INDENT_FMT, _("Unspecify"));
298 act = purple_menu_action_new(menu_name,
299 PURPLE_CALLBACK(sipe_buddy_menu_access_level_cb),
300 container, NULL);
301 g_free(menu_name);
302 menu_access_levels = g_list_prepend(menu_access_levels, act);
306 menu_access_levels = g_list_reverse(menu_access_levels);
307 return menu_access_levels;
310 static GList *
311 sipe_get_access_groups_menu(struct sipe_core_private *sipe_private)
313 GList *menu_access_groups = NULL;
314 PurpleMenuAction *act;
315 GSList *access_domains;
316 GSList *entry;
318 act = purple_menu_action_new(_("People in my company"),
319 NULL,
320 NULL, sipe_get_access_levels_menu(sipe_private, "sameEnterprise", NULL, FALSE));
321 menu_access_groups = g_list_prepend(menu_access_groups, act);
323 /* this is original name, don't edit */
324 act = purple_menu_action_new(_("People in domains connected with my company"),
325 NULL,
326 NULL, sipe_get_access_levels_menu(sipe_private, "federated", NULL, FALSE));
327 menu_access_groups = g_list_prepend(menu_access_groups, act);
329 act = purple_menu_action_new(_("People in public domains"),
330 NULL,
331 NULL, sipe_get_access_levels_menu(sipe_private, "publicCloud", NULL, TRUE));
332 menu_access_groups = g_list_prepend(menu_access_groups, act);
334 access_domains = sipe_ocs2007_get_access_domains(sipe_private);
335 entry = access_domains;
336 while (entry) {
337 gchar *domain = entry->data;
338 gchar *menu_name = g_strdup_printf(_("People at %s"), domain);
340 /* takes over ownership of entry->data (= domain) */
341 act = purple_menu_action_new(menu_name,
342 NULL,
343 NULL, sipe_get_access_levels_menu(sipe_private, "domain", domain, TRUE));
344 menu_access_groups = g_list_prepend(menu_access_groups, act);
345 g_free(menu_name);
347 entry = entry->next;
349 g_slist_free(access_domains);
351 /* separator */
352 /* People in domains connected with my company */
353 act = purple_menu_action_new("-------------------------------------------", NULL, NULL, NULL);
354 menu_access_groups = g_list_prepend(menu_access_groups, act);
356 act = purple_menu_action_new(_("Add new domain..."),
357 PURPLE_CALLBACK(sipe_buddy_menu_access_level_add_domain_cb),
358 NULL, NULL);
359 menu_access_groups = g_list_prepend(menu_access_groups, act);
361 menu_access_groups = g_list_reverse(menu_access_groups);
363 return menu_access_groups;
366 static GList *
367 sipe_get_access_control_menu(struct sipe_core_private *sipe_private,
368 const char* uri)
370 GList *menu_access_levels = NULL;
371 GList *menu_access_groups = NULL;
372 char *menu_name;
373 PurpleMenuAction *act;
375 /* libpurple memory leak workaround */
376 sipe_blist_menu_free_containers(sipe_private);
378 menu_access_levels = sipe_get_access_levels_menu(sipe_private, "user", sipe_get_no_sip_uri(uri), TRUE);
380 menu_access_groups = sipe_get_access_groups_menu(sipe_private);
382 menu_name = g_strdup_printf(INDENT_FMT, _("Access groups"));
383 act = purple_menu_action_new(menu_name,
384 NULL,
385 NULL, menu_access_groups);
386 g_free(menu_name);
387 menu_access_levels = g_list_append(menu_access_levels, act);
389 menu_name = g_strdup_printf(INDENT_FMT, _("Online help..."));
390 act = purple_menu_action_new(menu_name,
391 PURPLE_CALLBACK(sipe_buddy_menu_access_level_help_cb),
392 NULL, NULL);
393 g_free(menu_name);
394 menu_access_levels = g_list_append(menu_access_levels, act);
396 return menu_access_levels;
400 Local Variables:
401 mode: c
402 c-file-style: "bsd"
403 indent-tabs-mode: t
404 tab-width: 8
405 End: