summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Komarov <ivan.komarov@pidgin.im>2010-06-30 15:57:43 +0000
committerIvan Komarov <ivan.komarov@pidgin.im>2010-06-30 15:57:43 +0000
commit9deb0a1b80eb7c122251fb784399b98609bef1f9 (patch)
tree2a160eafce736b81ccc9cca909d0a0129886f18a
parent4aa1fe2c95ebcb143863a58281e72fc0265a5ec6 (diff)
downloadpidgin-9deb0a1b80eb7c122251fb784399b98609bef1f9.tar.gz
Removed callback data that was causing a segfault in Finch, because
Finch overwrites it with its own data.
-rw-r--r--libpurple/protocols/oscar/visibility.c40
1 files changed, 20 insertions, 20 deletions
diff --git a/libpurple/protocols/oscar/visibility.c b/libpurple/protocols/oscar/visibility.c
index 236f550fba..6983548d2c 100644
--- a/libpurple/protocols/oscar/visibility.c
+++ b/libpurple/protocols/oscar/visibility.c
@@ -20,26 +20,32 @@
#include "visibility.h"
-struct visibility_cb_data
+static guint16
+get_buddy_list_type(OscarData *od, const char *bname)
{
- guint16 list_type;
- gboolean add_to_list;
-};
+ PurpleAccount *account = purple_connection_get_account(od->gc);
+ return purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE) ? AIM_SSI_TYPE_PERMIT : AIM_SSI_TYPE_DENY;
+}
+
+static gboolean
+is_buddy_on_list(OscarData *od, const char *bname)
+{
+ return aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, get_buddy_list_type(od, bname)) != NULL;
+}
static void
-visibility_cb(PurpleBlistNode *node, struct visibility_cb_data *data)
+visibility_cb(PurpleBlistNode *node, gpointer whatever)
{
PurpleBuddy *buddy = PURPLE_BUDDY(node);
const char* bname = purple_buddy_get_name(buddy);
- OscarData *od = purple_account_get_connection(purple_buddy_get_account(buddy))->proto_data;
+ OscarData *od = purple_connection_get_protocol_data(purple_account_get_connection(purple_buddy_get_account(buddy)));
+ guint16 list_type = get_buddy_list_type(od, bname);
- if (data->add_to_list) {
- aim_ssi_add_to_private_list(od, bname, data->list_type);
+ if (!is_buddy_on_list(od, bname)) {
+ aim_ssi_add_to_private_list(od, bname, list_type);
} else {
- aim_ssi_del_from_private_list(od, bname, data->list_type);
+ aim_ssi_del_from_private_list(od, bname, list_type);
}
-
- g_free(data);
}
PurpleMenuAction *
@@ -47,18 +53,12 @@ create_visibility_menu_item(OscarData *od, const char *bname)
{
PurpleAccount *account = purple_connection_get_account(od->gc);
gboolean invisible = purple_account_is_status_active(account, OSCAR_STATUS_ID_INVISIBLE);
- guint16 list_type = invisible ? AIM_SSI_TYPE_PERMIT : AIM_SSI_TYPE_DENY;
- gboolean on_list = aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type) != NULL;
+ gboolean on_list = is_buddy_on_list(od, bname);
gchar *label;
- struct visibility_cb_data *data;
PurpleMenuAction *result;
- data = g_new0(struct visibility_cb_data, 1);
- data->list_type = list_type;
- data->add_to_list = !on_list;
-
- label = g_strdup_printf("%s %s", on_list ? "Don't appear" : "Appear", invisible ? "Online" : "Offline");
- result = purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), data, NULL);
+ label = g_strdup_printf("%s %s", on_list ? "Don't Appear" : "Appear", invisible ? "Online" : "Offline");
+ result = purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), NULL, NULL);
g_free(label);
return result;
}