2 * Thrasher Bird - XMPP transport via libpurple
3 * Copyright (C) 2008 Barracuda Networks, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with Thrasher Bird; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
29 void thrasher_buddy_status_changed (PurpleBuddy
*buddy
, PurpleStatus
*old
,
31 void thrasher_buddy_signed_on (PurpleBuddy
*buddy
);
32 void thrasher_buddy_signed_off (PurpleBuddy
*buddy
);
33 void thrasher_buddy_added (PurpleBuddy
*buddy
);
34 void thrasher_buddy_add_request (PurpleAccount
*account
, const char *remote_user
,
35 const char *id
, const char *alias
,
37 static void * thrasher_buddy_request_authorize
38 (PurpleAccount
*account
,
39 const char *remote_user
,
44 PurpleAccountRequestAuthorizationCb authorize_cb
,
45 PurpleAccountRequestAuthorizationCb deny_cb
,
47 void thrasher_buddy_removed (PurpleBuddy
*buddy
);
48 static gpointer
thrasher_blist_get_handle (void);
50 static PurpleAccountUiOps thrasher_account_uiops
=
53 thrasher_buddy_add_request
,
59 thrasher_buddy_add_request
,
62 thrasher_buddy_request_authorize
,
64 // close_account_request
74 struct _PurpleStatusType
76 PurpleStatusPrimitive primitive
;
80 char *primary_attr_id
;
83 gboolean user_settable
;
92 struct _PurpleStatusType
*type
;
93 PurplePresence
*presence
;
99 GHashTable
*attr_values
;
103 * @brief This is the callback for the buddy-status-changed signal
104 * @param buddy PurpleBuddy struct
105 * @param old (unused)
106 * @param new @buddy new PurpleStatus
108 void thrasher_buddy_status_changed (PurpleBuddy
*buddy
,
113 const char *group_name
= NULL
;
114 const char *message
= NULL
;
115 const char *alias
= NULL
;
117 g_return_if_fail(buddy
!= NULL
);
118 g_return_if_fail(new != NULL
);
120 group
= purple_buddy_get_group(buddy
);
123 group_name
= purple_group_get_name(group
);
125 alias
= purple_buddy_get_alias_only(buddy
);
127 message
= purple_status_get_attr_string(new, "message");
129 thrasher_wrapper_presence_in(thrasher_account_get_jid(buddy
->account
),
130 purple_buddy_get_name(buddy
),
133 purple_status_type_get_primitive(new->type
),
137 void thrasher_buddy_authorize (const char *jid
,
138 const char *legacy_username
) {
139 g_return_if_fail(jid
);
140 g_return_if_fail(legacy_username
);
142 PurpleAccount
*account
= thrasher_get_account_by_jid(jid
);
143 g_return_if_fail(account
);
145 PurpleConnection
*gc
=
146 thrasher_get_connection_by_account(account
);
147 g_return_if_fail(gc
);
149 purple_debug_info("thrasher", "Authorizing %s for jid %s\n",
150 legacy_username
, jid
);
152 // defensive; probably only add_permit is necesary
153 serv_rem_deny(gc
, legacy_username
);
155 serv_add_permit(gc
, legacy_username
);
158 void thrasher_buddy_deauthorize (const char *jid
,
159 const char *legacy_username
) {
160 g_return_if_fail(jid
);
161 g_return_if_fail(legacy_username
);
163 PurpleAccount
*account
= thrasher_get_account_by_jid(jid
);
164 g_return_if_fail(account
);
166 PurpleConnection
*gc
=
167 thrasher_get_connection_by_account(account
);
168 g_return_if_fail(gc
);
170 purple_debug_info("thrasher", "Deauthorizing %s for jid %s\n",
171 legacy_username
, jid
);
173 // no corresponding deny, we don't have a reperesentation for that
174 serv_rem_permit(gc
, legacy_username
);
177 void thrasher_buddy_signed_on (PurpleBuddy
*buddy
)
179 PurplePresence
*presence
;
181 presence
= purple_buddy_get_presence(buddy
);
186 // libpurple uses this to populate some stuff about the
187 // buddy, particularly useful for XMPP file transfers but
188 // probably the cause of random other errors if we don't fill this
190 PurpleAccount
* account
= buddy
->account
;
191 g_return_if_fail(account
);
192 PurpleConnection
* connection
= thrasher_connection_for_account(account
);
193 g_return_if_fail(connection
);
195 purple_debug_info("thblist",
196 "getting server info for %s\n\n---------\n\n",
198 serv_get_info(connection
, buddy
->name
);
200 thrasher_buddy_status_changed(buddy
,
202 purple_presence_get_status(presence
, "available"));
205 void thrasher_buddy_signed_off (PurpleBuddy
*buddy
)
207 PurplePresence
*presence
;
209 presence
= purple_buddy_get_presence(buddy
);
214 thrasher_buddy_status_changed(buddy
,
216 purple_presence_get_status(presence
, "offline"));
219 static void * thrasher_buddy_request_authorize
220 (PurpleAccount
*account
,
221 const char *remote_user
,
226 PurpleAccountRequestAuthorizationCb authorize_cb
,
227 PurpleAccountRequestAuthorizationCb deny_cb
,
229 // authorize_cb sometimes NULL?!?
230 purple_debug_info("thrasher", "request authorize, empty cb: %s\n",
231 authorize_cb
? "FALSE" : "TRUE");
232 thrasher_buddy_add_request(account
, remote_user
, "", alias
, message
);
235 authorize_cb(user_data
);
238 void *uihandle
= NULL
;
242 /* thrasher_buddy_add_request
244 * Triggered on a buddy-added signal, this allows us to push new subscriptions.
247 void thrasher_buddy_added (PurpleBuddy
*buddy
) {
248 PurplePresence
*presence
= purple_buddy_get_presence(buddy
);
249 PurpleStatus
*status
= purple_presence_get_active_status(presence
);
250 PurpleStatusType
*type
= purple_status_get_type(status
);
252 const char *jid
= thrasher_account_get_jid(buddy
->account
);
253 const char *sender
= purple_buddy_get_name(buddy
);
254 const guint status_int
= purple_status_type_get_primitive(type
);
256 purple_debug_info("thrasher",
257 "buddy added to %s: %s\n",
260 thrasher_wrapper_subscription_add(jid
, sender
, status_int
);
264 void thrasher_buddy_add_request (PurpleAccount
*account
, const char *remote_user
,
265 const char *id
, const char *alias
,
268 purple_debug_info("thrasher",
269 "legacy user %s adding %s to roster\n",
271 const char *jid
= thrasher_account_get_jid(account
);
272 thrasher_wrapper_legacy_user_add_user(jid
, remote_user
);
276 void thrasher_buddy_removed (PurpleBuddy
*buddy
)
278 /* printf("Removed buddy:\t[%s]\t[%s]\n", purple_buddy_get_name(buddy),
279 * purple_status_get_name( purple_presence_get_active_status( purple_buddy_get_presence(buddy) ) )
282 PurplePresence *presence = purple_buddy_get_presence(buddy);
283 PurpleStatus *status = purple_presence_get_active_status(presence);
284 PurpleStatusType *type = purple_status_get_type(status);
285 PurpleGroup *group = purple_buddy_get_group(buddy);
287 * Need to fire jid, sender, group_name, alias, and status back to perl */
289 // jid = thrasher_account_get_jid(buddy->account)
290 // sender = purple_buddy_get_name(buddy)
291 // group_name = purple_group_get_name(group)
292 // alias = purple_buddy_get_alias_only(buddy)
293 // status = purple_status_type_get_primitive(type)
298 thrasher_blist_get_handle ()
305 void thrasher_blist_init()
307 purple_accounts_set_ui_ops(&thrasher_account_uiops
);
309 purple_signal_connect(purple_blist_get_handle(),
310 "buddy-status-changed",
311 thrasher_blist_get_handle(),
312 PURPLE_CALLBACK(thrasher_buddy_status_changed
),
315 purple_signal_connect(purple_blist_get_handle(),
317 thrasher_blist_get_handle(),
318 PURPLE_CALLBACK(thrasher_buddy_signed_on
),
321 purple_signal_connect(purple_blist_get_handle(),
323 thrasher_blist_get_handle(),
324 PURPLE_CALLBACK(thrasher_buddy_signed_off
),
327 // It looks like this only comes in for things already on our roster.
328 purple_signal_connect(purple_blist_get_handle(),
330 thrasher_blist_get_handle(),
331 PURPLE_CALLBACK(thrasher_buddy_added
),
335 purple_signal_connect(purple_blist_get_handle(),
337 thrasher_blist_get_handle(),
338 PURPLE_CALLBACK(thrasher_buddy_removed),