purple: remove purple >= 2.7.0 flagging
[siplcs.git] / src / purple / purple-buddy.c
blob8cd6d19346d64650e853b595d315e4e985b2eb3e
1 /**
2 * @file purple-buddy.c
4 * pidgin-sipe
6 * Copyright (C) 2010-2017 SIPE Project <http://sipe.sourceforge.net/>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
27 #include <glib.h>
29 #include "notify.h"
30 #include "request.h"
32 #include "version.h"
33 #if PURPLE_VERSION_CHECK(3,0,0)
34 #include "account.h"
35 #include "buddylist.h"
36 #else
37 #include "blist.h"
38 #include "privacy.h"
39 #define purple_account_privacy_check(a, n) purple_privacy_check(a, n)
40 #define purple_account_privacy_deny_add(a, n, l) purple_privacy_deny_add(a, n, l)
41 #define purple_account_privacy_deny_remove(a, n, l) purple_privacy_deny_remove(a, n, l)
42 #define purple_blist_find_buddies(a, n) purple_find_buddies(a, n)
43 #define purple_blist_find_buddy(a, n) purple_find_buddy(a, n)
44 #define purple_blist_find_buddy_in_group(a, n, g) purple_find_buddy_in_group(a, n, g)
45 #define purple_blist_find_group(n) purple_find_group(n)
46 #define purple_buddy_set_local_alias(b, n) purple_blist_alias_buddy(b, n)
47 #define purple_buddy_set_server_alias(b, n) purple_blist_server_alias_buddy(b, n)
48 #define purple_buddy_set_name(b, n) purple_blist_rename_buddy(b, n)
49 #define purple_group_set_name(g, n) purple_blist_rename_group(g, n)
50 #define purple_notify_user_info_add_pair_html(i, k, v) purple_notify_user_info_add_pair(i, k, v)
51 #define purple_protocol_got_user_status purple_prpl_got_user_status
52 #define PURPLE_IS_BUDDY(b) PURPLE_BLIST_NODE_IS_BUDDY(b)
53 #define PURPLE_IS_GROUP(b) PURPLE_BLIST_NODE_IS_GROUP(b)
54 #endif
56 #include "sipe-common.h"
57 #include "sipe-backend.h"
58 #include "sipe-core.h"
59 #include "sipe-nls.h"
61 #include "purple-private.h"
63 static const struct {
64 const gchar *property; /* property name to store in blist.xml */
65 const gchar *description; /* label for "Get Info" dialog */
66 } buddy_info_map[] = {
67 /* SIPE_BUDDY_INFO_DISPLAY_NAME */ { "alias", N_("Display name") },
68 /* SIPE_BUDDY_INFO_JOB_TITLE */ { "title", N_("Job title") },
69 /* SIPE_BUDDY_INFO_CITY */ { "address-city", N_("City") },
70 /* SIPE_BUDDY_INFO_STATE */ { "address-state", N_("State") },
71 /* SIPE_BUDDY_INFO_OFFICE */ { "office", N_("Office") },
72 /* SIPE_BUDDY_INFO_DEPARTMENT */ { "department", NULL },
73 /* SIPE_BUDDY_INFO_COUNTRY */ { "address-country-code", N_("Country") },
74 /* SIPE_BUDDY_INFO_WORK_PHONE */ { "phone", N_("Business phone") },
75 /* SIPE_BUDDY_INFO_WORK_PHONE_DISPLAY */ { "phone-display", NULL },
76 /* SIPE_BUDDY_INFO_COMPANY */ { "company", N_("Company") },
77 /* SIPE_BUDDY_INFO_EMAIL */ { "email", N_("Email address") },
78 /* SIPE_BUDDY_INFO_SITE */ { "site", N_("Site") },
79 /* SIPE_BUDDY_INFO_ZIPCODE */ { "address-zipcode", NULL },
80 /* SIPE_BUDDY_INFO_STREET */ { "address-street", NULL },
81 /* SIPE_BUDDY_INFO_MOBILE_PHONE */ { "phone-mobile", NULL },
82 /* SIPE_BUDDY_INFO_MOBILE_PHONE_DISPLAY */ { "phone-mobile-display", NULL },
83 /* SIPE_BUDDY_INFO_HOME_PHONE */ { "phone-home", NULL },
84 /* SIPE_BUDDY_INFO_HOME_PHONE_DISPLAY */ { "phone-home-display", NULL },
85 /* SIPE_BUDDY_INFO_OTHER_PHONE */ { "phone-other", NULL },
86 /* SIPE_BUDDY_INFO_OTHER_PHONE_DISPLAY */ { "phone-other-display", NULL },
87 /* SIPE_BUDDY_INFO_CUSTOM1_PHONE */ { "phone-custom1", NULL },
88 /* SIPE_BUDDY_INFO_CUSTOM1_PHONE_DISPLAY */ { "phone-custom1-display", NULL },
89 /* SIPE_BUDDY_INFO_ALIAS */ { NULL, N_("Alias") },
90 /* SIPE_BUDDY_INFO_DEVICE */ { NULL, N_("Device") },
93 #define buddy_info_property(i) buddy_info_map[i].property
94 #define buddy_info_description(i) gettext(buddy_info_map[i].description)
96 sipe_backend_buddy sipe_backend_buddy_find(struct sipe_core_public *sipe_public,
97 const gchar *buddy_name,
98 const gchar *group_name)
100 struct sipe_backend_private *purple_private = sipe_public->backend_private;
101 PurpleGroup *purple_group;
103 if (group_name)
105 purple_group = purple_blist_find_group(group_name);
106 if (!purple_group)
107 return NULL;
109 return purple_blist_find_buddy_in_group(purple_private->account,
110 buddy_name,
111 purple_group);
112 } else {
113 return purple_blist_find_buddy(purple_private->account,
114 buddy_name);
118 GSList* sipe_backend_buddy_find_all(struct sipe_core_public *sipe_public,
119 const gchar *buddy_name,
120 const gchar *group_name)
122 struct sipe_backend_private *purple_private = sipe_public->backend_private;
124 if (group_name)
126 SIPE_DEBUG_ERROR_NOFORMAT("Finding all buddies in a group not supported on purple");
127 return NULL;
130 return purple_blist_find_buddies(purple_private->account, buddy_name);
133 gchar* sipe_backend_buddy_get_name(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
134 const sipe_backend_buddy who)
136 return g_strdup(purple_buddy_get_name((PurpleBuddy *) who));
139 gchar* sipe_backend_buddy_get_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
140 const sipe_backend_buddy who)
142 return g_strdup(purple_buddy_get_alias(who));
145 gchar* sipe_backend_buddy_get_server_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
146 const sipe_backend_buddy who)
148 return g_strdup(purple_buddy_get_server_alias(who));
151 gchar *sipe_backend_buddy_get_local_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
152 const sipe_backend_buddy who)
154 return g_strdup(
155 #if PURPLE_VERSION_CHECK(3,0,0)
156 purple_buddy_get_local_alias(who)
157 #else
158 purple_buddy_get_local_buddy_alias(who)
159 #endif
163 gchar* sipe_backend_buddy_get_group_name(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
164 const sipe_backend_buddy who)
166 return g_strdup(purple_group_get_name(purple_buddy_get_group((PurpleBuddy*)who)));
169 guint sipe_backend_buddy_get_status(struct sipe_core_public *sipe_public,
170 const gchar *uri)
172 struct sipe_backend_private *purple_private = sipe_public->backend_private;
173 PurpleBuddy *pbuddy = purple_blist_find_buddy(purple_private->account, uri);
174 const PurplePresence *presence = purple_buddy_get_presence(pbuddy);
175 const PurpleStatus *pstatus = purple_presence_get_active_status(presence);
176 return(sipe_purple_token_to_activity(purple_status_get_id(pstatus)));
179 void sipe_backend_buddy_set_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
180 const sipe_backend_buddy who,
181 const gchar *alias)
183 purple_buddy_set_local_alias(who, alias);
186 void sipe_backend_buddy_set_server_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
187 const sipe_backend_buddy who,
188 const gchar *alias)
190 purple_buddy_set_server_alias(who, alias);
193 gchar* sipe_backend_buddy_get_string(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
194 sipe_backend_buddy buddy,
195 const sipe_buddy_info_fields key)
197 PurpleBuddy *b = (PurpleBuddy*) buddy;
198 return g_strdup(purple_blist_node_get_string(&b->node, buddy_info_property(key)));
201 void sipe_backend_buddy_set_string(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
202 sipe_backend_buddy buddy,
203 const sipe_buddy_info_fields key,
204 const gchar *val)
206 PurpleBuddy *b = (PurpleBuddy*) buddy;
207 purple_blist_node_set_string(&b->node, buddy_info_property(key), val);
210 void sipe_backend_buddy_refresh_properties(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
211 SIPE_UNUSED_PARAMETER const gchar *uri)
213 /* nothing to do here: already taken care of by libpurple */
216 void sipe_backend_buddy_list_processing_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
220 void sipe_backend_buddy_list_processing_finish(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
224 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
225 const gchar *name,
226 const gchar *alias,
227 const gchar *groupname)
229 struct sipe_backend_private *purple_private = sipe_public->backend_private;
230 PurpleBuddy *b;
231 PurpleGroup *purple_group = purple_blist_find_group(groupname);
233 if (!purple_group)
234 return NULL;
236 b = purple_buddy_new(purple_private->account, name, alias);
237 purple_blist_add_buddy(b, NULL, purple_group, NULL);
238 return b;
241 void sipe_backend_buddy_remove(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
242 const sipe_backend_buddy who)
244 purple_blist_remove_buddy(who);
247 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
248 const gchar *who,
249 const gchar *alias,
250 gboolean on_list,
251 sipe_backend_buddy_request_authorization_cb auth_cb,
252 sipe_backend_buddy_request_authorization_cb deny_cb,
253 gpointer data)
255 struct sipe_backend_private *purple_private = sipe_public->backend_private;
257 purple_account_request_authorization(
258 purple_private->account,
259 who,
260 _("you"), /* id */
261 alias,
262 NULL, /* message */
263 on_list,
264 (PurpleAccountRequestAuthorizationCb) auth_cb,
265 (PurpleAccountRequestAuthorizationCb) deny_cb,
266 data);
270 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
271 const gchar *who,
272 const gchar *alias)
274 struct sipe_backend_private *purple_private = sipe_public->backend_private;
276 purple_account_request_add(purple_private->account,
277 who,
278 _("you"),
279 alias,
280 NULL);
284 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
285 const gchar *who)
287 struct sipe_backend_private *purple_private = sipe_public->backend_private;
289 return(!purple_account_privacy_check(purple_private->account, who));
292 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
293 const gchar *who,
294 gboolean blocked)
296 struct sipe_backend_private *purple_private = sipe_public->backend_private;
298 if (blocked) {
299 purple_account_privacy_deny_add(purple_private->account, who, TRUE);
300 } else {
301 purple_account_privacy_deny_remove(purple_private->account, who, TRUE);
304 /* stupid workaround to make pidgin re-render screen to reflect our changes */
305 SIPE_DEBUG_INFO_NOFORMAT("sipe_backend_buddy_set_blocked_status: forcefully refreshing screen.");
306 sipe_core_buddy_got_status(sipe_public,
307 who,
308 sipe_backend_buddy_get_status(sipe_public,
309 who));
312 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
313 const gchar *who,
314 guint activity)
316 struct sipe_backend_private *purple_private = sipe_public->backend_private;
317 PurpleBuddy *buddy = NULL;
318 PurpleStatus *status = NULL;
319 gchar *tmp = NULL;
321 buddy = purple_blist_find_buddy(purple_private->account, who);
322 if (buddy)
323 status = purple_presence_get_active_status(purple_buddy_get_presence(buddy));
325 if (status)
326 tmp = sipe_core_buddy_status(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
327 purple_buddy_get_name(buddy),
328 sipe_purple_token_to_activity(purple_status_get_id(status)),
329 purple_status_get_name(status));
331 if (tmp) {
332 purple_protocol_got_user_status(purple_private->account, who,
333 sipe_purple_activity_to_token(activity),
334 SIPE_PURPLE_STATUS_ATTR_ID_MESSAGE, tmp,
335 NULL);
336 g_free(tmp);
337 } else
338 purple_protocol_got_user_status(purple_private->account, who,
339 sipe_purple_activity_to_token(activity),
340 NULL);
343 gboolean sipe_backend_uses_photo(void)
345 return TRUE;
348 void sipe_backend_buddy_set_photo(struct sipe_core_public *sipe_public,
349 const gchar *who,
350 gpointer photo_data,
351 gsize data_len,
352 const gchar *photo_hash)
354 PurpleAccount *account = sipe_public->backend_private->account;
356 purple_buddy_icons_set_for_user(account, who, photo_data,
357 data_len, photo_hash);
360 const gchar *sipe_backend_buddy_get_photo_hash(struct sipe_core_public *sipe_public,
361 const gchar *who)
363 PurpleAccount *account = sipe_public->backend_private->account;
364 const gchar *result = NULL;
366 PurpleBuddyIcon *icon = purple_buddy_icons_find(account, who);
367 if (icon) {
368 result = purple_buddy_icon_get_checksum(icon);
369 purple_buddy_icon_unref(icon);
372 return result;
375 gboolean sipe_backend_buddy_group_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
376 const gchar *group_name)
378 PurpleGroup * purple_group = purple_blist_find_group(group_name);
379 if (!purple_group) {
380 purple_group = purple_group_new(group_name);
381 purple_blist_add_group(purple_group, NULL);
384 return (purple_group != NULL);
387 gboolean sipe_backend_buddy_group_rename(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
388 const gchar *old_name,
389 const gchar *new_name)
391 PurpleGroup *purple_group = purple_blist_find_group(old_name);
392 if (purple_group)
393 purple_group_set_name(purple_group, new_name);
394 return(purple_group != NULL);
397 void sipe_backend_buddy_group_remove(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
398 const gchar *group_name)
400 PurpleGroup *purple_group = purple_blist_find_group(group_name);
401 if (purple_group)
402 purple_blist_remove_group(purple_group);
405 struct sipe_backend_buddy_info *sipe_backend_buddy_info_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
407 return((struct sipe_backend_buddy_info *)purple_notify_user_info_new());
410 void sipe_backend_buddy_info_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
411 struct sipe_backend_buddy_info *info,
412 sipe_buddy_info_fields key,
413 const gchar *value)
415 if (info) {
416 purple_notify_user_info_add_pair_html((PurpleNotifyUserInfo *) info,
417 buddy_info_description(key),
418 value);
422 void sipe_backend_buddy_info_break(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
423 struct sipe_backend_buddy_info *info)
425 purple_notify_user_info_add_section_break((PurpleNotifyUserInfo *) info);
428 void sipe_backend_buddy_info_finalize(struct sipe_core_public *sipe_public,
429 struct sipe_backend_buddy_info *info,
430 const gchar *uri)
432 struct sipe_backend_private *purple_private = sipe_public->backend_private;
434 /* show a buddy's user info in a nice dialog box */
435 purple_notify_userinfo(purple_private->gc,
436 uri, /* buddy's URI */
437 (PurpleNotifyUserInfo *) info,
438 NULL, /* callback called when dialog closed */
439 NULL); /* userdata for callback */
442 void sipe_backend_buddy_tooltip_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
443 struct sipe_backend_buddy_tooltip *tooltip,
444 const gchar *description,
445 const gchar *value)
447 purple_notify_user_info_add_pair_html((PurpleNotifyUserInfo *) tooltip,
448 description,
449 value);
452 void sipe_purple_add_buddy(PurpleConnection *gc,
453 PurpleBuddy *buddy,
454 PurpleGroup *group
455 #if PURPLE_VERSION_CHECK(3,0,0)
456 , SIPE_UNUSED_PARAMETER const gchar *message
457 #endif
460 SIPE_DEBUG_INFO("sipe_purple_add_buddy[CB]: buddy:%s group:%s",
461 buddy ? purple_buddy_get_name(buddy) : "",
462 group ? purple_group_get_name(group) : "");
464 /* libpurple can call us with undefined buddy or group */
465 if (buddy && group) {
467 * Buddy name must be lower case as we use
468 * purple_normalize_nocase() to compare
470 gchar *buddy_name = g_ascii_strdown(purple_buddy_get_name(buddy), -1);
471 gchar *uri = sip_uri_if_valid(buddy_name);
472 g_free(buddy_name);
474 if (uri) {
475 purple_buddy_set_name(buddy, uri);
476 g_free(uri);
478 sipe_core_buddy_add(PURPLE_GC_TO_SIPE_CORE_PUBLIC,
479 purple_buddy_get_name(buddy),
480 purple_group_get_name(group));
481 } else {
482 SIPE_DEBUG_ERROR_NOFORMAT("sipe_purple_add_buddy[CB]: buddy name is invalid for URI");
483 purple_blist_remove_buddy(buddy);
484 purple_notify_error(gc, NULL,
485 _("User name should be a valid SIP URI\nExample: user@company.com"),
486 NULL
487 #if PURPLE_VERSION_CHECK(3,0,0)
488 , NULL
489 #endif
495 void sipe_purple_remove_buddy(PurpleConnection *gc,
496 PurpleBuddy *buddy,
497 PurpleGroup *group)
499 SIPE_DEBUG_INFO("sipe_purple_remove_buddy[CB]: buddy: '%s' group: '%s'",
500 buddy ? purple_buddy_get_name(buddy) : "",
501 group ? purple_group_get_name(group) : "");
502 if (!buddy) return;
504 sipe_core_buddy_remove(PURPLE_GC_TO_SIPE_CORE_PUBLIC,
505 purple_buddy_get_name(buddy),
506 group ? purple_group_get_name(group) : NULL);
509 void sipe_purple_group_buddy(PurpleConnection *gc,
510 const char *who,
511 const char *old_group_name,
512 const char *new_group_name)
514 sipe_core_buddy_group(PURPLE_GC_TO_SIPE_CORE_PUBLIC, who, old_group_name, new_group_name);
517 /* Buddy Menu Handling */
519 static void sipe_purple_buddy_make_chat_leader_cb(PurpleBuddy *buddy,
520 gpointer parameter)
522 SIPE_DEBUG_INFO("sipe_purple_buddy_make_chat_leader_cb: name '%s'",
523 purple_buddy_get_name(buddy));
524 sipe_core_conf_make_leader(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
525 parameter,
526 purple_buddy_get_name(buddy));
529 static void sipe_purple_buddy_remove_from_chat_cb(PurpleBuddy *buddy,
530 gpointer parameter)
532 SIPE_DEBUG_INFO("sipe_purple_buddy_remove_from_chat_cb: name '%s'",
533 purple_buddy_get_name(buddy));
534 sipe_core_conf_remove_from(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
535 parameter,
536 purple_buddy_get_name(buddy));
539 static void sipe_purple_buddy_invite_to_chat_cb(PurpleBuddy *buddy,
540 gpointer parameter)
542 SIPE_DEBUG_INFO("sipe_purple_buddy_invite_to_chat_cb: name '%s'",
543 purple_buddy_get_name(buddy));
544 sipe_core_chat_invite(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
545 parameter,
546 purple_buddy_get_name(buddy));
549 static void sipe_purple_buddy_new_chat_cb(PurpleBuddy *buddy,
550 SIPE_UNUSED_PARAMETER gpointer parameter)
552 SIPE_DEBUG_INFO("sipe_purple_buddy_new_chat_cb: name '%s'",
553 purple_buddy_get_name(buddy));
554 sipe_core_buddy_new_chat(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
555 purple_buddy_get_name(buddy));
558 static void sipe_purple_buddy_make_call_cb(PurpleBuddy *buddy,
559 gpointer parameter)
561 SIPE_DEBUG_INFO("sipe_purple_buddy_make_call_cb: name '%s'",
562 purple_buddy_get_name(buddy));
563 sipe_core_buddy_make_call(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
564 parameter);
567 static void sipe_purple_buddy_send_email_cb(PurpleBuddy *buddy,
568 SIPE_UNUSED_PARAMETER gpointer parameter)
570 SIPE_DEBUG_INFO("sipe_purple_buddy_send_email_cb: name '%s'",
571 purple_buddy_get_name(buddy));
572 sipe_core_buddy_send_email(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
573 purple_buddy_get_name(buddy));
576 static void sipe_purple_buddy_access_level_help_cb(PurpleBuddy *buddy,
577 SIPE_UNUSED_PARAMETER gpointer parameter)
580 * Translators: replace with URL to localized page
581 * If it doesn't exist copy the original URL
583 purple_notify_uri(purple_account_get_connection(purple_buddy_get_account(buddy)),
584 _("https://sourceforge.net/apps/mediawiki/sipe/index.php?title=Access_Levels"));
587 static void sipe_purple_buddy_change_access_level_cb(PurpleBuddy *buddy,
588 gpointer parameter)
590 sipe_core_change_access_level_from_container(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC,
591 parameter);
594 static void sipe_purple_ask_access_domain_cb(PurpleConnection *gc,
595 PurpleRequestFields *fields)
597 const gchar *domain = purple_request_fields_get_string(fields, "access_domain");
598 guint index =
599 #if PURPLE_VERSION_CHECK(3,0,0)
600 GPOINTER_TO_UINT(
601 #endif
602 purple_request_fields_get_choice(fields, "container_id")
603 #if PURPLE_VERSION_CHECK(3,0,0)
605 #endif
608 sipe_core_change_access_level_for_domain(PURPLE_GC_TO_SIPE_CORE_PUBLIC,
609 domain,
610 index);
613 static void sipe_purple_buddy_add_new_domain_cb(PurpleBuddy *buddy,
614 SIPE_UNUSED_PARAMETER gpointer parameter)
616 PurpleAccount *account = purple_buddy_get_account(buddy);
617 PurpleConnection *gc = purple_account_get_connection(account);
618 PurpleRequestFields *fields;
619 PurpleRequestFieldGroup *g;
620 PurpleRequestField *f;
622 fields = purple_request_fields_new();
624 g = purple_request_field_group_new(NULL);
625 f = purple_request_field_string_new("access_domain",
626 _("Domain"),
627 "partner-company.com",
628 FALSE);
629 purple_request_field_set_required(f, TRUE);
630 purple_request_field_group_add_field(g, f);
632 f = purple_request_field_choice_new("container_id",
633 _("Access level"),
635 #if PURPLE_VERSION_CHECK(3,0,0)
636 purple_request_field_choice_add(f, _("Personal"), GUINT_TO_POINTER(0));
637 purple_request_field_choice_add(f, _("Team"), GUINT_TO_POINTER(1));
638 purple_request_field_choice_add(f, _("Company"), GUINT_TO_POINTER(2));
639 purple_request_field_choice_add(f, _("Public"), GUINT_TO_POINTER(3));
640 purple_request_field_choice_add(f, _("Blocked"), GUINT_TO_POINTER(4));
641 purple_request_field_choice_set_default_value(f, GUINT_TO_POINTER(3));
642 #else
643 purple_request_field_choice_add(f, _("Personal")); /* index 0 */
644 purple_request_field_choice_add(f, _("Team"));
645 purple_request_field_choice_add(f, _("Company"));
646 purple_request_field_choice_add(f, _("Public"));
647 purple_request_field_choice_add(f, _("Blocked")); /* index 4 */
648 purple_request_field_choice_set_default_value(f, 3); /* index */
649 #endif
650 purple_request_field_set_required(f, TRUE);
651 purple_request_field_group_add_field(g, f);
653 purple_request_fields_add_group(fields, g);
655 purple_request_fields(gc, _("Add new domain"),
656 _("Add new domain"), NULL, fields,
657 _("Add"), G_CALLBACK(sipe_purple_ask_access_domain_cb),
658 _("Cancel"), NULL,
659 #if PURPLE_VERSION_CHECK(3,0,0)
660 purple_request_cpar_from_account(account),
661 #else
662 account, NULL, NULL,
663 #endif
664 gc);
667 typedef void (*buddy_menu_callback)(PurpleBuddy *buddy,
668 gpointer parameter);
669 static const buddy_menu_callback callback_map[SIPE_BUDDY_MENU_TYPES] = {
670 /* SIPE_BUDDY_MENU_MAKE_CHAT_LEADER */ sipe_purple_buddy_make_chat_leader_cb,
671 /* SIPE_BUDDY_MENU_REMOVE_FROM_CHAT */ sipe_purple_buddy_remove_from_chat_cb,
672 /* SIPE_BUDDY_MENU_INVITE_TO_CHAT */ sipe_purple_buddy_invite_to_chat_cb,
673 /* SIPE_BUDDY_MENU_NEW_CHAT */ sipe_purple_buddy_new_chat_cb,
674 /* SIPE_BUDDY_MENU_MAKE_CALL */ sipe_purple_buddy_make_call_cb,
675 /* SIPE_BUDDY_MENU_SEND_EMAIL */ sipe_purple_buddy_send_email_cb,
676 /* SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP */ sipe_purple_buddy_access_level_help_cb,
677 /* SIPE_BUDDY_MENU_CHANGE_ACCESS_LEVEL */ sipe_purple_buddy_change_access_level_cb,
678 /* SIPE_BUDDY_MENU_ADD_NEW_DOMAIN */ sipe_purple_buddy_add_new_domain_cb,
681 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_start(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public)
683 return(NULL);
686 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
687 struct sipe_backend_buddy_menu *menu,
688 const gchar *label,
689 enum sipe_buddy_menu_type type,
690 gpointer parameter)
692 return((struct sipe_backend_buddy_menu *)
693 g_list_prepend((GList *) menu,
694 purple_menu_action_new(label,
695 PURPLE_CALLBACK(callback_map[type]),
696 parameter, NULL)));
699 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
700 struct sipe_backend_buddy_menu *menu,
701 const gchar *label)
703 return((struct sipe_backend_buddy_menu *)
704 g_list_prepend((GList *) menu,
705 purple_menu_action_new(label, NULL, NULL, NULL)));
708 struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
709 struct sipe_backend_buddy_menu *menu,
710 const gchar *label,
711 struct sipe_backend_buddy_menu *sub)
713 return((struct sipe_backend_buddy_menu *)
714 g_list_prepend((GList *) menu,
715 purple_menu_action_new(label,
716 NULL,
717 NULL,
718 g_list_reverse((GList *) sub))));
721 static void sipe_purple_buddy_copy_to_cb(PurpleBlistNode *node,
722 const gchar *group_name)
724 struct sipe_core_public *sipe_public;
725 PurpleBuddy *buddy = (PurpleBuddy *)node;
726 PurpleGroup *group;
727 PurpleBuddy *clone;
729 g_return_if_fail(PURPLE_IS_BUDDY(node));
731 sipe_public = PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC;
732 group = purple_blist_find_group(group_name);
734 SIPE_DEBUG_INFO("sipe_purple_buddy_copy_to_cb: copying %s to %s",
735 purple_buddy_get_name(buddy), group_name);
737 clone = purple_blist_find_buddy_in_group(purple_buddy_get_account(buddy),
738 purple_buddy_get_name(buddy),
739 group);
740 if (!clone) {
741 clone = sipe_backend_buddy_add(sipe_public,
742 purple_buddy_get_name(buddy),
743 #if PURPLE_VERSION_CHECK(3,0,0)
744 purple_buddy_get_local_alias(buddy),
745 #else
746 buddy->alias,
747 #endif
748 purple_group_get_name(group));
749 if (clone) {
750 const gchar *tmp;
751 const gchar *key;
752 const PurpleStatus *status = purple_presence_get_active_status(purple_buddy_get_presence(buddy));
754 tmp = purple_buddy_get_server_alias(buddy);
755 if (tmp) purple_buddy_set_server_alias(clone, tmp);
757 key = buddy_info_property(SIPE_BUDDY_INFO_EMAIL);
758 tmp = purple_blist_node_get_string(&buddy->node, key);
759 if (tmp) purple_blist_node_set_string(&clone->node,
760 key,
761 tmp);
763 tmp = purple_status_get_id(status);
764 purple_presence_set_status_active(purple_buddy_get_presence(clone),
765 tmp,
766 TRUE);
768 /* update UI */
769 purple_protocol_got_user_status(purple_buddy_get_account(clone),
770 purple_buddy_get_name(clone),
771 tmp,
772 SIPE_PURPLE_STATUS_ATTR_ID_MESSAGE, tmp,
773 NULL);
777 if (clone && group)
778 sipe_core_buddy_add(sipe_public,
779 purple_buddy_get_name(clone),
780 purple_group_get_name(group));
783 static GList *sipe_purple_copy_to_menu(GList *menu,
784 PurpleBuddy *buddy)
786 GList *menu_groups = NULL;
787 PurpleGroup *gr_parent = purple_buddy_get_group(buddy);
788 PurpleBlistNode *g_node;
790 for (g_node = purple_blist_get_root(); g_node; g_node = g_node->next) {
791 PurpleGroup *group = (PurpleGroup *)g_node;
792 PurpleMenuAction *act;
794 if ((!PURPLE_IS_GROUP(g_node)) ||
795 (group == gr_parent) ||
796 purple_blist_find_buddy_in_group(purple_buddy_get_account(buddy),
797 purple_buddy_get_name(buddy),
798 group))
799 continue;
801 act = purple_menu_action_new(purple_group_get_name(group),
802 PURPLE_CALLBACK(sipe_purple_buddy_copy_to_cb),
803 (gpointer) purple_group_get_name(group),
804 NULL);
805 menu_groups = g_list_prepend(menu_groups, act);
808 if (menu_groups)
809 menu = g_list_prepend(menu,
810 purple_menu_action_new(_("Copy to"),
811 NULL,
812 NULL,
813 g_list_reverse(menu_groups)));
815 return(menu);
818 GList *sipe_purple_buddy_menu(PurpleBuddy *buddy)
820 struct sipe_core_public *sipe_public = PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC;
821 GList *menu = (GList *) sipe_core_buddy_create_menu(sipe_public,
822 purple_buddy_get_name(buddy),
823 NULL);
824 menu = sipe_purple_copy_to_menu(menu, buddy);
825 return(g_list_reverse(menu));
830 Local Variables:
831 mode: c
832 c-file-style: "bsd"
833 indent-tabs-mode: t
834 tab-width: 8
835 End: