Mercurial > pidgin
comparison libpurple/protocols/oscar/visibility.c @ 30374:48fe4720d795
Removed callback data that was causing a segfault in Finch, because
Finch overwrites it with its own data.
author | ivan.komarov@soc.pidgin.im |
---|---|
date | Wed, 30 Jun 2010 15:57:43 +0000 |
parents | 4e804413b12b |
children | ab7e28b1b478 |
comparison
equal
deleted
inserted
replaced
30373:4e804413b12b | 30374:48fe4720d795 |
---|---|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA | 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
19 */ | 19 */ |
20 | 20 |
21 #include "visibility.h" | 21 #include "visibility.h" |
22 | 22 |
23 struct visibility_cb_data | 23 static guint16 |
24 get_buddy_list_type(OscarData *od, const char *bname) | |
24 { | 25 { |
25 guint16 list_type; | 26 PurpleAccount *account = purple_connection_get_account(od->gc); |
26 gboolean add_to_list; | 27 return purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE) ? AIM_SSI_TYPE_PERMIT : AIM_SSI_TYPE_DENY; |
27 }; | 28 } |
29 | |
30 static gboolean | |
31 is_buddy_on_list(OscarData *od, const char *bname) | |
32 { | |
33 return aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, get_buddy_list_type(od, bname)) != NULL; | |
34 } | |
28 | 35 |
29 static void | 36 static void |
30 visibility_cb(PurpleBlistNode *node, struct visibility_cb_data *data) | 37 visibility_cb(PurpleBlistNode *node, gpointer whatever) |
31 { | 38 { |
32 PurpleBuddy *buddy = PURPLE_BUDDY(node); | 39 PurpleBuddy *buddy = PURPLE_BUDDY(node); |
33 const char* bname = purple_buddy_get_name(buddy); | 40 const char* bname = purple_buddy_get_name(buddy); |
34 OscarData *od = purple_account_get_connection(purple_buddy_get_account(buddy))->proto_data; | 41 OscarData *od = purple_connection_get_protocol_data(purple_account_get_connection(purple_buddy_get_account(buddy))); |
42 guint16 list_type = get_buddy_list_type(od, bname); | |
35 | 43 |
36 if (data->add_to_list) { | 44 if (!is_buddy_on_list(od, bname)) { |
37 aim_ssi_add_to_private_list(od, bname, data->list_type); | 45 aim_ssi_add_to_private_list(od, bname, list_type); |
38 } else { | 46 } else { |
39 aim_ssi_del_from_private_list(od, bname, data->list_type); | 47 aim_ssi_del_from_private_list(od, bname, list_type); |
40 } | 48 } |
41 | |
42 g_free(data); | |
43 } | 49 } |
44 | 50 |
45 PurpleMenuAction * | 51 PurpleMenuAction * |
46 create_visibility_menu_item(OscarData *od, const char *bname) | 52 create_visibility_menu_item(OscarData *od, const char *bname) |
47 { | 53 { |
48 PurpleAccount *account = purple_connection_get_account(od->gc); | 54 PurpleAccount *account = purple_connection_get_account(od->gc); |
49 gboolean invisible = purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE); | 55 gboolean invisible = purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE); |
50 guint16 list_type = invisible ? AIM_SSI_TYPE_PERMIT : AIM_SSI_TYPE_DENY; | 56 gboolean on_list = is_buddy_on_list(od, bname); |
51 gboolean on_list = aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type) != NULL; | |
52 gchar *label; | 57 gchar *label; |
53 struct visibility_cb_data *data; | |
54 PurpleMenuAction *result; | 58 PurpleMenuAction *result; |
55 | 59 |
56 data = g_new0(struct visibility_cb_data, 1); | 60 label = g_strdup_printf("%s %s", on_list ? "Don't Appear" : "Appear", invisible ? "Online" : "Offline"); |
57 data->list_type = list_type; | 61 result = purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), NULL, NULL); |
58 data->add_to_list = !on_list; | |
59 | |
60 label = g_strdup_printf("%s %s", on_list ? "Don't appear" : "Appear", invisible ? "Online" : "Offline"); | |
61 result = purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), data, NULL); | |
62 g_free(label); | 62 g_free(label); |
63 return result; | 63 return result; |
64 } | 64 } |
65 | 65 |
66 static void | 66 static void |