4 *****************************************************************************
5 *** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ***
7 *** THIS MODULE IS NO LONGER COMPILED ***
9 *** YES, IT IS INTENTIONALLY BROKEN.... ***
11 *** DO NOT ADD ANY NEW CODE TO THIS MODULE ***
13 *** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ***
14 *****************************************************************************
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>
27 * Thanks to Google's Summer of Code Program and the helpful mentors
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"
58 purple_blist_add_buddy_clone(PurpleGroup
* group
, PurpleBuddy
* buddy
)
60 struct sipe_core_private
*sipe_private
= PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE
;
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
,
70 server_alias
= sipe_backend_buddy_get_server_alias(SIPE_CORE_PUBLIC
,
73 sipe_backend_buddy_set_server_alias(SIPE_CORE_PUBLIC
,
79 email
= sipe_backend_buddy_get_string(SIPE_CORE_PUBLIC
,
81 SIPE_BUDDY_INFO_EMAIL
);
83 sipe_backend_buddy_set_string(SIPE_CORE_PUBLIC
,
85 SIPE_BUDDY_INFO_EMAIL
,
90 purple_presence_set_status_active(purple_buddy_get_presence(clone
),
91 purple_status_get_id(status
),
93 /* for UI to update */
94 sipe_backend_buddy_set_status(SIPE_CORE_PUBLIC
,
96 purple_status_get_id(status
));
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
);
116 b
= purple_blist_add_buddy_clone(group
, buddy
);
119 PurpleConnection
*gc
= purple_account_get_connection(b
->account
);
121 sipe_core_buddy_add(PURPLE_GC_TO_SIPE_CORE_PUBLIC
,
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"));
136 sipe_buddy_menu_send_email_cb(PurpleBuddy
*buddy
)
138 struct sipe_core_private
*sipe_private
= PURPLE_BUDDY_TO_SIPE_CORE_PRIVATE
;
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
,
144 SIPE_BUDDY_INFO_EMAIL
);
147 char *command_line
= g_strdup_printf(
153 " mailto:%s", email
);
154 SIPE_DEBUG_INFO("sipe_buddy_menu_send_email_cb: going to call email client: %s", command_line
);
157 g_spawn_command_line_async(command_line
, NULL
);
158 g_free(command_line
);
162 SIPE_DEBUG_INFO("sipe_buddy_menu_send_email_cb: no email address stored for buddy=%s", buddy
->name
);
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
,
175 /*--------------------- START WIP ------------------------------*/
178 email
= sipe_backend_buddy_get_string(SIPE_CORE_PUBLIC
,
180 SIPE_BUDDY_INFO_EMAIL
);
182 act
= purple_menu_action_new(_("Send email..."),
183 PURPLE_CALLBACK(sipe_buddy_menu_send_email_cb
),
185 menu
= g_list_prepend(menu
, act
);
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"),
195 NULL
, menu_access_levels
);
196 menu
= g_list_prepend(menu
, act
);
200 gr_parent
= purple_buddy_get_group(buddy
);
201 for (g_node
= purple_blist_get_root(); g_node
; g_node
= g_node
->next
) {
204 if (g_node
->type
!= PURPLE_BLIST_GROUP_NODE
)
207 group
= (PurpleGroup
*)g_node
;
208 if (group
== gr_parent
)
211 if (purple_find_buddy_in_group(buddy
->account
, buddy
->name
, group
))
214 act
= purple_menu_action_new(purple_group_get_name(group
),
215 PURPLE_CALLBACK(sipe_buddy_menu_copy_to_cb
),
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"),
225 menu
= g_list_prepend(menu
, act
);
227 /*--------------------- END WIP ------------------------------*/
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
,
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
),
271 buddy
->account
, NULL
, NULL
, gc
);
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
;
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
,
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
,
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
);
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
),
321 menu_access_levels
= g_list_prepend(menu_access_levels
, act
);
324 if (extra_menu
&& (container_id
>= 0)) {
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,
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
),
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
;
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
;
360 act
= purple_menu_action_new(_("People in my company"),
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"),
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"),
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
;
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
,
385 NULL
, sipe_get_access_levels_menu(sipe_private
, "domain", domain
, TRUE
));
386 menu_access_groups
= g_list_prepend(menu_access_groups
, act
);
391 g_slist_free(access_domains
);
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
),
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
;
409 sipe_get_access_control_menu(struct sipe_core_private
*sipe_private
,
412 GList
*menu_access_levels
= NULL
;
413 GList
*menu_access_groups
= NULL
;
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
,
427 NULL
, menu_access_groups
);
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
),
436 menu_access_levels
= g_list_append(menu_access_levels
, act
);
438 return menu_access_levels
;