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
29 #include "purple-private.h"
34 #include "sipe-common.h"
35 #include "sipe-backend.h"
36 #include "sipe-core.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)
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
);
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
;
114 purple_group
= purple_find_group(group_name
);
118 return purple_find_buddy_in_group(purple_private
->account
,
122 return purple_find_buddy(purple_private
->account
,
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
;
135 SIPE_DEBUG_ERROR_NOFORMAT("Finding all buddies in a group not supported on purple");
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
,
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
,
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
,
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
,
200 const gchar
*groupname
)
202 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
204 PurpleGroup
*purple_group
= purple_find_group(groupname
);
209 b
= purple_buddy_new(purple_private
->account
, name
, alias
);
210 purple_blist_add_buddy(b
, NULL
, purple_group
, NULL
);
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
,
224 sipe_backend_buddy_request_authorization_cb auth_cb
,
225 sipe_backend_buddy_request_authorization_cb deny_cb
,
228 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
230 purple_account_request_authorization(
231 purple_private
->account
,
243 void sipe_backend_buddy_request_add(struct sipe_core_public
*sipe_public
,
247 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
249 purple_account_request_add(purple_private
->account
,
257 gboolean
sipe_backend_buddy_is_blocked(struct sipe_core_public
*sipe_public
,
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
,
269 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
272 purple_privacy_deny_add(purple_private
->account
, who
, TRUE
);
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
,
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
);
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
,
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
);