21
21
* along with this program; if not, write to the Free Software
22
22
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
32
static void free_user_endpoint(MsnUserEndpoint *data)
28
39
/*new a user object*/
30
41
msn_user_new(MsnUserList *userlist, const char *passport,
39
50
msn_user_set_passport(user, passport);
40
51
msn_user_set_friendly_name(user, friendly_name);
53
return msn_user_ref(user);
45
56
/*destroy a user object*/
47
58
msn_user_destroy(MsnUser *user)
49
60
g_return_if_fail(user != NULL);
62
if (user->refcount > 1) {
67
while (user->endpoints != NULL) {
68
free_user_endpoint(user->endpoints->data);
69
user->endpoints = g_slist_delete_link(user->endpoints, user->endpoints);
51
72
if (user->clientcaps != NULL)
52
73
g_hash_table_destroy(user->clientcaps);
107
msn_user_ref(MsnUser *user)
109
g_return_val_if_fail(user != NULL, NULL);
117
msn_user_unref(MsnUser *user)
119
g_return_if_fail(user != NULL);
123
if(user->refcount == 0)
124
msn_user_destroy(user);
86
128
msn_user_update(MsnUser *user)
187
229
g_return_val_if_fail(user != NULL, FALSE);
231
if (user == user->userlist->session->user)
189
234
if (user->friendly_name && name && (!strcmp(user->friendly_name, name) ||
190
235
!strcmp(user->passport, name)))
265
msn_user_set_endpoint_data(MsnUser *user, const char *input, MsnUserEndpoint *newep)
271
g_return_if_fail(user != NULL);
272
g_return_if_fail(input != NULL);
274
endpoint = g_ascii_strdown(input, -1);
276
for (l = user->endpoints; l; l = l->next) {
278
if (g_str_equal(ep->id, endpoint)) {
279
/* We have info about this endpoint! */
284
/* Delete it and exit */
285
user->endpoints = g_slist_delete_link(user->endpoints, l);
286
free_user_endpoint(ep);
290
/* Break out of our loop and update it */
295
/* Need to add a new endpoint */
296
ep = g_new0(MsnUserEndpoint, 1);
298
user->endpoints = g_slist_prepend(user->endpoints, ep);
301
ep->clientid = newep->clientid;
302
ep->extcaps = newep->extcaps;
220
306
msn_user_set_op(MsnUser *user, MsnListOp list_op)
222
308
g_return_if_fail(user != NULL);
495
msn_user_set_extcaps(MsnUser *user, guint extcaps)
497
g_return_if_fail(user != NULL);
499
user->extcaps = extcaps;
409
503
msn_user_set_network(MsnUser *user, MsnNetwork network)
411
505
g_return_if_fail(user != NULL);
413
507
user->networkid = network;
511
buddy_icon_cached(PurpleConnection *gc, MsnObject *obj)
513
PurpleAccount *account;
518
g_return_val_if_fail(obj != NULL, FALSE);
520
account = purple_connection_get_account(gc);
522
buddy = purple_find_buddy(account, msn_object_get_creator(obj));
526
old = purple_buddy_icons_get_checksum_for_user(buddy);
527
new = msn_object_get_sha1(obj);
532
/* If the old and new checksums are the same, and the file actually exists,
533
* then return TRUE */
534
if (old != NULL && !strcmp(old, new))
541
queue_buddy_icon_request(MsnUser *user)
543
PurpleAccount *account;
547
g_return_if_fail(user != NULL);
549
account = user->userlist->session->account;
551
obj = msn_user_get_object(user);
554
purple_buddy_icons_set_for_user(account, user->passport, NULL, 0, NULL);
558
if (!buddy_icon_cached(account->gc, obj)) {
559
MsnUserList *userlist;
561
userlist = user->userlist;
562
queue = userlist->buddy_icon_requests;
564
if (purple_debug_is_verbose())
565
purple_debug_info("msn", "Queueing buddy icon request for %s (buddy_icon_window = %i)\n",
566
user->passport, userlist->buddy_icon_window);
568
g_queue_push_tail(queue, user);
570
if (userlist->buddy_icon_window > 0)
571
msn_release_buddy_icon_request(userlist);
417
576
msn_user_set_object(MsnUser *user, MsnObject *obj)
419
578
g_return_if_fail(user != NULL);
421
if (user->msnobj != NULL)
580
if (user->msnobj != NULL && !msn_object_find_local(msn_object_get_sha1(obj)))
422
581
msn_object_destroy(user->msnobj);
424
583
user->msnobj = obj;
426
if (user->list_op & MSN_LIST_FL_OP)
427
msn_queue_buddy_icon_request(user);
585
if (user != user->userlist->session->user && user->list_op & MSN_LIST_FL_OP)
586
queue_buddy_icon_request(user);
496
655
return user->clientid;
659
msn_user_get_extcaps(const MsnUser *user)
661
g_return_val_if_fail(user != NULL, 0);
663
return user->extcaps;
667
msn_user_get_endpoint_data(MsnUser *user, const char *input)
673
g_return_val_if_fail(user != NULL, NULL);
674
g_return_val_if_fail(input != NULL, NULL);
676
endpoint = g_ascii_strdown(input, -1);
678
for (l = user->endpoints; l; l = l->next) {
680
if (g_str_equal(ep->id, endpoint)) {
500
692
msn_user_get_object(const MsnUser *user)
520
712
return user->invite_message;
716
msn_user_is_capable(MsnUser *user, char *endpoint, guint capability, guint extcap)
718
g_return_val_if_fail(user != NULL, FALSE);
720
if (endpoint != NULL) {
721
MsnUserEndpoint *ep = msn_user_get_endpoint_data(user, endpoint);
723
return (ep->clientid & capability) && (ep->extcaps & extcap);
728
return (user->clientid & capability) && (user->extcaps & extcap);
731
/**************************************************************************
733
**************************************************************************/
736
msn_user_passport_cmp(MsnUser *user, const char *passport)
742
str = purple_normalize_nocase(NULL, msn_user_get_passport(user));
743
pass = g_strdup(str);
745
#if GLIB_CHECK_VERSION(2,16,0)
746
result = g_strcmp0(pass, purple_normalize_nocase(NULL, passport));
748
str = purple_normalize_nocase(NULL, passport);
750
result = -(pass != str);
752
result = pass != str;
754
result = strcmp(pass, str);
755
#endif /* GLIB < 2.16.0 */
763
msn_user_is_in_group(MsnUser *user, const char * group_id)
768
if (group_id == NULL)
771
return (g_list_find_custom(user->group_ids, group_id, (GCompareFunc)strcmp)) != NULL;
775
msn_user_is_in_list(MsnUser *user, MsnListId list_id)
780
return (user->list_op & (1 << list_id));