coverity: fix various warnings
[siplcs.git] / src / purple / purple-buddy.c
blobcd3b7871ab7518a8bf6615b3243c2531e04423c1
1 /**
2 * @file purple-buddy.c
4 * pidgin-sipe
6 * Copyright (C) 2010-11 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 "purple-private.h"
31 #include "blist.h"
32 #include "privacy.h"
34 #include "sipe-common.h"
35 #include "sipe-backend.h"
36 #include "sipe-core.h"
37 #include "sipe-nls.h"
39 static GHashTable *info_to_property_table = NULL;
41 /** Property names to store in blist.xml */
42 #define ALIAS_PROP "alias"
43 #define EMAIL_PROP "email"
44 #define PHONE_PROP "phone"
45 #define PHONE_DISPLAY_PROP "phone-display"
46 #define PHONE_MOBILE_PROP "phone-mobile"
47 #define PHONE_MOBILE_DISPLAY_PROP "phone-mobile-display"
48 #define PHONE_HOME_PROP "phone-home"
49 #define PHONE_HOME_DISPLAY_PROP "phone-home-display"
50 #define PHONE_OTHER_PROP "phone-other"
51 #define PHONE_OTHER_DISPLAY_PROP "phone-other-display"
52 #define PHONE_CUSTOM1_PROP "phone-custom1"
53 #define PHONE_CUSTOM1_DISPLAY_PROP "phone-custom1-display"
54 #define SITE_PROP "site"
55 #define COMPANY_PROP "company"
56 #define DEPARTMENT_PROP "department"
57 #define TITLE_PROP "title"
58 #define OFFICE_PROP "office"
59 /** implies work address */
60 #define ADDRESS_STREET_PROP "address-street"
61 #define ADDRESS_CITY_PROP "address-city"
62 #define ADDRESS_STATE_PROP "address-state"
63 #define ADDRESS_ZIPCODE_PROP "address-zipcode"
64 #define ADDRESS_COUNTRYCODE_PROP "address-country-code"
66 #define ADD_PROP(key,value) g_hash_table_insert(info_to_property_table, (gpointer)key, value)
68 static void
69 init_property_hash(void)
71 info_to_property_table = g_hash_table_new(NULL, NULL);
73 ADD_PROP(SIPE_BUDDY_INFO_DISPLAY_NAME , ALIAS_PROP);
74 ADD_PROP(SIPE_BUDDY_INFO_EMAIL , EMAIL_PROP);
75 ADD_PROP(SIPE_BUDDY_INFO_WORK_PHONE , PHONE_PROP);
76 ADD_PROP(SIPE_BUDDY_INFO_WORK_PHONE_DISPLAY , PHONE_DISPLAY_PROP);
77 ADD_PROP(SIPE_BUDDY_INFO_SITE , SITE_PROP);
78 ADD_PROP(SIPE_BUDDY_INFO_COMPANY , COMPANY_PROP);
79 ADD_PROP(SIPE_BUDDY_INFO_DEPARTMENT , DEPARTMENT_PROP);
80 ADD_PROP(SIPE_BUDDY_INFO_JOB_TITLE , TITLE_PROP);
81 ADD_PROP(SIPE_BUDDY_INFO_OFFICE , OFFICE_PROP);
82 ADD_PROP(SIPE_BUDDY_INFO_STREET , ADDRESS_STREET_PROP);
83 ADD_PROP(SIPE_BUDDY_INFO_CITY , ADDRESS_CITY_PROP);
84 ADD_PROP(SIPE_BUDDY_INFO_STATE , ADDRESS_STATE_PROP);
85 ADD_PROP(SIPE_BUDDY_INFO_ZIPCODE , ADDRESS_ZIPCODE_PROP);
86 ADD_PROP(SIPE_BUDDY_INFO_COUNTRY , ADDRESS_COUNTRYCODE_PROP);
87 ADD_PROP(SIPE_BUDDY_INFO_MOBILE_PHONE , PHONE_MOBILE_PROP);
88 ADD_PROP(SIPE_BUDDY_INFO_MOBILE_PHONE_DISPLAY , PHONE_MOBILE_DISPLAY_PROP);
89 ADD_PROP(SIPE_BUDDY_INFO_HOME_PHONE , PHONE_HOME_PROP);
90 ADD_PROP(SIPE_BUDDY_INFO_HOME_PHONE_DISPLAY , PHONE_HOME_DISPLAY_PROP);
91 ADD_PROP(SIPE_BUDDY_INFO_OTHER_PHONE , PHONE_OTHER_PROP);
92 ADD_PROP(SIPE_BUDDY_INFO_OTHER_PHONE_DISPLAY , PHONE_OTHER_DISPLAY_PROP);
93 ADD_PROP(SIPE_BUDDY_INFO_CUSTOM1_PHONE , PHONE_CUSTOM1_PROP);
94 ADD_PROP(SIPE_BUDDY_INFO_CUSTOM1_PHONE_DISPLAY, PHONE_CUSTOM1_DISPLAY_PROP);
97 static gchar *
98 sipe_buddy_info_to_purple_property(sipe_buddy_info_fields info)
100 if (!info_to_property_table)
101 init_property_hash();
102 return g_hash_table_lookup(info_to_property_table, (gpointer)info);
105 sipe_backend_buddy sipe_backend_buddy_find(struct sipe_core_public *sipe_public,
106 const gchar *buddy_name,
107 const gchar *group_name)
109 struct sipe_backend_private *purple_private = sipe_public->backend_private;
110 PurpleGroup *purple_group;
112 if (group_name)
114 purple_group = purple_find_group(group_name);
115 if (!purple_group)
116 return NULL;
118 return purple_find_buddy_in_group(purple_private->account,
119 buddy_name,
120 purple_group);
121 } else {
122 return purple_find_buddy(purple_private->account,
123 buddy_name);
127 GSList* sipe_backend_buddy_find_all(struct sipe_core_public *sipe_public,
128 const gchar *buddy_name,
129 const gchar *group_name)
131 struct sipe_backend_private *purple_private = sipe_public->backend_private;
133 if (group_name)
135 SIPE_DEBUG_ERROR_NOFORMAT("Finding all buddies in a group not supported on purple");
136 return NULL;
139 return purple_find_buddies(purple_private->account, buddy_name);
142 gchar* sipe_backend_buddy_get_name(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
143 const sipe_backend_buddy who)
145 return g_strdup(((PurpleBuddy*)who)->name);
148 gchar* sipe_backend_buddy_get_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
149 const sipe_backend_buddy who)
151 return g_strdup(purple_buddy_get_alias(who));
154 gchar* sipe_backend_buddy_get_server_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
155 const sipe_backend_buddy who)
157 return g_strdup(purple_buddy_get_server_alias(who));
160 gchar* sipe_backend_buddy_get_group_name(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
161 const sipe_backend_buddy who)
163 return g_strdup(purple_buddy_get_group((PurpleBuddy*)who)->name);
166 void sipe_backend_buddy_set_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
167 const sipe_backend_buddy who,
168 const gchar *alias)
170 purple_blist_alias_buddy(who, alias);
173 void sipe_backend_buddy_set_server_alias(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
174 const sipe_backend_buddy who,
175 const gchar *alias)
177 purple_blist_server_alias_buddy(who, alias);
180 gchar* sipe_backend_buddy_get_string(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
181 sipe_backend_buddy buddy,
182 const sipe_buddy_info_fields key)
184 PurpleBuddy *b = (PurpleBuddy*) buddy;
185 return g_strdup(purple_blist_node_get_string(&b->node, sipe_buddy_info_to_purple_property(key)));
188 void sipe_backend_buddy_set_string(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
189 sipe_backend_buddy buddy,
190 const sipe_buddy_info_fields key,
191 const gchar *val)
193 PurpleBuddy *b = (PurpleBuddy*) buddy;
194 purple_blist_node_set_string(&b->node, sipe_buddy_info_to_purple_property(key), val);
197 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
198 const gchar *name,
199 const gchar *alias,
200 const gchar *groupname)
202 struct sipe_backend_private *purple_private = sipe_public->backend_private;
203 PurpleBuddy *b;
204 PurpleGroup *purple_group = purple_find_group(groupname);
206 if (!purple_group)
207 return NULL;
209 b = purple_buddy_new(purple_private->account, name, alias);
210 purple_blist_add_buddy(b, NULL, purple_group, NULL);
211 return b;
214 void sipe_backend_buddy_remove(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
215 const sipe_backend_buddy who)
217 purple_blist_remove_buddy(who);
220 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
221 const gchar *who,
222 const gchar *alias,
223 gboolean on_list,
224 sipe_backend_buddy_request_authorization_cb auth_cb,
225 sipe_backend_buddy_request_authorization_cb deny_cb,
226 gpointer data)
228 struct sipe_backend_private *purple_private = sipe_public->backend_private;
230 purple_account_request_authorization(
231 purple_private->account,
232 who,
233 _("you"), /* id */
234 alias,
235 NULL, /* message */
236 on_list,
237 auth_cb,
238 deny_cb,
239 data);
243 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
244 const gchar *who,
245 const gchar *alias)
247 struct sipe_backend_private *purple_private = sipe_public->backend_private;
249 purple_account_request_add(purple_private->account,
250 who,
251 _("you"),
252 alias,
253 NULL);
257 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
258 const gchar *who)
260 struct sipe_backend_private *purple_private = sipe_public->backend_private;
262 return !purple_privacy_check(purple_private->account, who);
265 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
266 const gchar *who,
267 gboolean blocked)
269 struct sipe_backend_private *purple_private = sipe_public->backend_private;
271 if (blocked) {
272 purple_privacy_deny_add(purple_private->account, who, TRUE);
273 } else {
274 purple_privacy_deny_remove(purple_private->account, who, TRUE);
277 /* stupid workaround to make pidgin re-render screen to reflect our changes */
279 PurpleBuddy *pbuddy = purple_find_buddy(purple_private->account, who);
280 const PurplePresence *presence = purple_buddy_get_presence(pbuddy);
281 const PurpleStatus *pstatus = purple_presence_get_active_status(presence);
283 SIPE_DEBUG_INFO_NOFORMAT("sipe_backend_buddy_set_blocked_status: forcefully refreshing screen.");
284 sipe_core_buddy_got_status(sipe_public, who, purple_status_get_id(pstatus));
289 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
290 const gchar *who,
291 const gchar *status_id)
293 struct sipe_backend_private *purple_private = sipe_public->backend_private;
295 purple_prpl_got_user_status(purple_private->account, who, status_id, NULL);
298 gboolean sipe_backend_buddy_group_add(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
299 const gchar *group_name)
301 PurpleGroup * purple_group = purple_find_group(group_name);
302 if (!purple_group) {
303 purple_group = purple_group_new(group_name);
304 purple_blist_add_group(purple_group, NULL);
307 return (purple_group != NULL);
310 void sipe_purple_group_buddy(PurpleConnection *gc,
311 const char *who,
312 const char *old_group_name,
313 const char *new_group_name)
315 sipe_core_buddy_group(PURPLE_GC_TO_SIPE_CORE_PUBLIC, who, old_group_name, new_group_name);
320 Local Variables:
321 mode: c
322 c-file-style: "bsd"
323 indent-tabs-mode: t
324 tab-width: 8
325 End: