Depurple sipe_group_buddy
[siplcs.git] / src / purple / purple-buddy.c
blob82cb10a419aea79c54e0705be9e85e41cd0f059c
1 /**
2 * @file purple-buddy.c
4 * pidgin-sipe
6 * Copyright (C) 2010 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 #include <glib.h>
25 #include "purple-private.h"
27 #include "blist.h"
28 #include "privacy.h"
30 #include "sipe-common.h"
31 #include "sipe-backend.h"
32 #include "sipe-core.h"
33 #include "sipe-nls.h"
35 static GHashTable *info_to_property_table = NULL;
37 /** Property names to store in blist.xml */
38 #define ALIAS_PROP "alias"
39 #define EMAIL_PROP "email"
40 #define PHONE_PROP "phone"
41 #define PHONE_DISPLAY_PROP "phone-display"
42 #define PHONE_MOBILE_PROP "phone-mobile"
43 #define PHONE_MOBILE_DISPLAY_PROP "phone-mobile-display"
44 #define PHONE_HOME_PROP "phone-home"
45 #define PHONE_HOME_DISPLAY_PROP "phone-home-display"
46 #define PHONE_OTHER_PROP "phone-other"
47 #define PHONE_OTHER_DISPLAY_PROP "phone-other-display"
48 #define PHONE_CUSTOM1_PROP "phone-custom1"
49 #define PHONE_CUSTOM1_DISPLAY_PROP "phone-custom1-display"
50 #define SITE_PROP "site"
51 #define COMPANY_PROP "company"
52 #define DEPARTMENT_PROP "department"
53 #define TITLE_PROP "title"
54 #define OFFICE_PROP "office"
55 /** implies work address */
56 #define ADDRESS_STREET_PROP "address-street"
57 #define ADDRESS_CITY_PROP "address-city"
58 #define ADDRESS_STATE_PROP "address-state"
59 #define ADDRESS_ZIPCODE_PROP "address-zipcode"
60 #define ADDRESS_COUNTRYCODE_PROP "address-country-code"
62 #define ADD_PROP(key,value) g_hash_table_insert(info_to_property_table, (gpointer)key, value)
64 static void
65 init_property_hash(void)
67 info_to_property_table = g_hash_table_new(NULL, NULL);
69 ADD_PROP(SIPE_BUDDY_INFO_DISPLAY_NAME , ALIAS_PROP);
70 ADD_PROP(SIPE_BUDDY_INFO_EMAIL , EMAIL_PROP);
71 ADD_PROP(SIPE_BUDDY_INFO_WORK_PHONE , PHONE_PROP);
72 ADD_PROP(SIPE_BUDDY_INFO_WORK_PHONE_DISPLAY , PHONE_DISPLAY_PROP);
73 ADD_PROP(SIPE_BUDDY_INFO_SITE , SITE_PROP);
74 ADD_PROP(SIPE_BUDDY_INFO_COMPANY , COMPANY_PROP);
75 ADD_PROP(SIPE_BUDDY_INFO_DEPARTMENT , DEPARTMENT_PROP);
76 ADD_PROP(SIPE_BUDDY_INFO_JOB_TITLE , TITLE_PROP);
77 ADD_PROP(SIPE_BUDDY_INFO_OFFICE , OFFICE_PROP);
78 ADD_PROP(SIPE_BUDDY_INFO_STREET , ADDRESS_STREET_PROP);
79 ADD_PROP(SIPE_BUDDY_INFO_CITY , ADDRESS_CITY_PROP);
80 ADD_PROP(SIPE_BUDDY_INFO_STATE , ADDRESS_STATE_PROP);
81 ADD_PROP(SIPE_BUDDY_INFO_ZIPCODE , ADDRESS_ZIPCODE_PROP);
82 ADD_PROP(SIPE_BUDDY_INFO_COUNTRY , ADDRESS_COUNTRYCODE_PROP);
83 ADD_PROP(SIPE_BUDDY_INFO_MOBILE_PHONE , PHONE_MOBILE_PROP);
84 ADD_PROP(SIPE_BUDDY_INFO_MOBILE_PHONE_DISPLAY , PHONE_MOBILE_DISPLAY_PROP);
85 ADD_PROP(SIPE_BUDDY_INFO_HOME_PHONE , PHONE_HOME_PROP);
86 ADD_PROP(SIPE_BUDDY_INFO_HOME_PHONE_DISPLAY , PHONE_HOME_DISPLAY_PROP);
87 ADD_PROP(SIPE_BUDDY_INFO_OTHER_PHONE , PHONE_OTHER_PROP);
88 ADD_PROP(SIPE_BUDDY_INFO_OTHER_PHONE_DISPLAY , PHONE_OTHER_DISPLAY_PROP);
89 ADD_PROP(SIPE_BUDDY_INFO_CUSTOM1_PHONE , PHONE_CUSTOM1_PROP);
90 ADD_PROP(SIPE_BUDDY_INFO_CUSTOM1_PHONE_DISPLAY, PHONE_CUSTOM1_DISPLAY_PROP);
93 static gchar *
94 sipe_buddy_info_to_purple_property(sipe_buddy_info_fields info)
96 if (!info_to_property_table)
97 init_property_hash();
98 return g_hash_table_lookup(info_to_property_table, (gpointer)info);
101 sipe_backend_buddy sipe_backend_buddy_find(struct sipe_core_public *sipe_public,
102 const gchar *buddy_name,
103 const gchar *group_name)
105 struct sipe_backend_private *purple_private = sipe_public->backend_private;
106 PurpleGroup *purple_group;
108 if (group_name)
110 purple_group = purple_find_group(group_name);
111 if (!purple_group)
112 return NULL;
114 return purple_find_buddy_in_group(purple_private->account,
115 buddy_name,
116 purple_group);
117 } else {
118 return purple_find_buddy(purple_private->account,
119 buddy_name);
123 GSList* sipe_backend_buddy_find_all(struct sipe_core_public *sipe_public,
124 const gchar *buddy_name,
125 const gchar *group_name)
127 struct sipe_backend_private *purple_private = sipe_public->backend_private;
129 if (group_name)
131 SIPE_DEBUG_ERROR_NOFORMAT("Finding all buddies in a group not supported on purple");
132 return NULL;
135 return purple_find_buddies(purple_private->account, buddy_name);
138 gchar* sipe_backend_buddy_get_name(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
139 const sipe_backend_buddy who)
141 return g_strdup(((PurpleBuddy*)who)->name);
144 gchar* sipe_backend_buddy_get_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
145 const sipe_backend_buddy who)
147 return g_strdup(purple_buddy_get_alias(who));
150 gchar* sipe_backend_buddy_get_server_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
151 const sipe_backend_buddy who)
153 return g_strdup(purple_buddy_get_server_alias(who));
156 gchar* sipe_backend_buddy_get_group_name(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
157 const sipe_backend_buddy who)
159 return g_strdup(purple_buddy_get_group((PurpleBuddy*)who)->name);
162 void sipe_backend_buddy_set_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
163 const sipe_backend_buddy who,
164 const gchar *alias)
166 purple_blist_alias_buddy(who, alias);
169 void sipe_backend_buddy_set_server_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
170 const sipe_backend_buddy who,
171 const gchar *alias)
173 purple_blist_server_alias_buddy(who, alias);
176 gchar* sipe_backend_buddy_get_string(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
177 sipe_backend_buddy buddy,
178 const sipe_buddy_info_fields key)
180 PurpleBuddy *b = (PurpleBuddy*) buddy;
181 return g_strdup(purple_blist_node_get_string(&b->node, sipe_buddy_info_to_purple_property(key)));
184 void sipe_backend_buddy_set_string(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
185 sipe_backend_buddy buddy,
186 const sipe_buddy_info_fields key,
187 const gchar *val)
189 PurpleBuddy *b = (PurpleBuddy*) buddy;
190 purple_blist_node_set_string(&b->node, sipe_buddy_info_to_purple_property(key), val);
193 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
194 const gchar *name,
195 const gchar *alias,
196 const gchar *groupname)
198 struct sipe_backend_private *purple_private = sipe_public->backend_private;
199 PurpleBuddy *b;
200 PurpleGroup *purple_group = purple_find_group(groupname);
202 if (!purple_group)
203 return NULL;
205 b = purple_buddy_new(purple_private->account, name, alias);
206 purple_blist_add_buddy(b, NULL, purple_group, NULL);
207 return b;
210 void sipe_backend_buddy_remove(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
211 const sipe_backend_buddy who)
213 purple_blist_remove_buddy(who);
216 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
217 const gchar *who,
218 const gchar *alias,
219 gboolean on_list,
220 sipe_backend_buddy_request_authorization_cb auth_cb,
221 sipe_backend_buddy_request_authorization_cb deny_cb,
222 gpointer data)
224 struct sipe_backend_private *purple_private = sipe_public->backend_private;
226 purple_account_request_authorization(
227 purple_private->account,
228 who,
229 _("you"), /* id */
230 alias,
231 NULL, /* message */
232 on_list,
233 auth_cb,
234 deny_cb,
235 data);
239 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
240 const gchar *who,
241 const gchar *alias)
243 struct sipe_backend_private *purple_private = sipe_public->backend_private;
245 purple_account_request_add(purple_private->account,
246 who,
247 _("you"),
248 alias,
249 NULL);
253 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
254 const gchar *who)
256 struct sipe_backend_private *purple_private = sipe_public->backend_private;
258 return !purple_privacy_check(purple_private->account, who);
261 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
262 const gchar *who,
263 gboolean blocked)
265 struct sipe_backend_private *purple_private = sipe_public->backend_private;
267 if (blocked) {
268 purple_privacy_deny_add(purple_private->account, who, TRUE);
269 } else {
270 purple_privacy_deny_remove(purple_private->account, who, TRUE);
273 /* stupid workaround to make pidgin re-render screen to reflect our changes */
275 PurpleBuddy *pbuddy = purple_find_buddy(purple_private->account, who);
276 const PurplePresence *presence = purple_buddy_get_presence(pbuddy);
277 const PurpleStatus *pstatus = purple_presence_get_active_status(presence);
279 SIPE_DEBUG_INFO_NOFORMAT("sipe_backend_buddy_set_blocked_status: forcefully refreshing screen.");
280 sipe_core_buddy_got_status(sipe_public, who, purple_status_get_id(pstatus));
285 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
286 const gchar *who,
287 const gchar *status_id)
289 struct sipe_backend_private *purple_private = sipe_public->backend_private;
291 purple_prpl_got_user_status(purple_private->account, who, status_id, NULL);
294 gboolean sipe_backend_buddy_group_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
295 const gchar *group_name)
297 PurpleGroup * purple_group = purple_find_group(group_name);
298 if (!purple_group) {
299 purple_group = purple_group_new(group_name);
300 purple_blist_add_group(purple_group, NULL);
303 return (purple_group != NULL);
306 void sipe_purple_group_buddy(PurpleConnection *gc,
307 const char *who,
308 const char *old_group_name,
309 const char *new_group_name)
311 sipe_core_buddy_group(PURPLE_GC_TO_SIPE_CORE_PUBLIC, who, old_group_name, new_group_name);
316 Local Variables:
317 mode: c
318 c-file-style: "bsd"
319 indent-tabs-mode: t
320 tab-width: 8
321 End: