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
25 #include "purple-private.h"
30 #include "sipe-common.h"
31 #include "sipe-backend.h"
32 #include "sipe-core.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)
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
);
94 sipe_buddy_info_to_purple_property(sipe_buddy_info_fields info
)
96 if (!info_to_property_table
)
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
;
110 purple_group
= purple_find_group(group_name
);
114 return purple_find_buddy_in_group(purple_private
->account
,
118 return purple_find_buddy(purple_private
->account
,
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
;
131 SIPE_DEBUG_ERROR_NOFORMAT("Finding all buddies in a group not supported on purple");
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
,
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
,
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
,
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
,
196 const gchar
*groupname
)
198 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
200 PurpleGroup
*purple_group
= purple_find_group(groupname
);
205 b
= purple_buddy_new(purple_private
->account
, name
, alias
);
206 purple_blist_add_buddy(b
, NULL
, purple_group
, NULL
);
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
,
220 sipe_backend_buddy_request_authorization_cb auth_cb
,
221 sipe_backend_buddy_request_authorization_cb deny_cb
,
224 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
226 purple_account_request_authorization(
227 purple_private
->account
,
239 void sipe_backend_buddy_request_add(struct sipe_core_public
*sipe_public
,
243 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
245 purple_account_request_add(purple_private
->account
,
253 gboolean
sipe_backend_buddy_is_blocked(struct sipe_core_public
*sipe_public
,
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
,
265 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
268 purple_privacy_deny_add(purple_private
->account
, who
, TRUE
);
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
,
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
);
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
,
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
);