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