# HG changeset patch
# User ivan.komarov@soc.pidgin.im
# Date 1277846222 0
# Node ID 4e804413b12b985767537b1b7184bcefc1fe15f3
# Parent 5bfef33383833ba1b90cc1b189b8eea5c83b4df7
Added a way to view the Visible/Invisible lists.
The UI is kind of crippled, but that seems to be the best we can do
with the notify API.
diff -r 5bfef3338383 -r 4e804413b12b libpurple/protocols/oscar/oscar.c
--- a/libpurple/protocols/oscar/oscar.c Mon Jun 28 20:02:12 2010 +0000
+++ b/libpurple/protocols/oscar/oscar.c Tue Jun 29 21:17:02 2010 +0000
@@ -5774,41 +5774,29 @@
{
PurpleConnection *gc = (PurpleConnection *) action->context;
OscarData *od = purple_connection_get_protocol_data(gc);
- gchar *text, *tmp;
- GSList *buddies;
- PurpleAccount *account;
- int num=0;
-
- text = g_strdup("");
- account = purple_connection_get_account(gc);
+ PurpleAccount *account = purple_connection_get_account(gc);
+ GSList *buddies, *filtered_buddies, *cur;
+ gchar *text;
buddies = purple_find_buddies(account, NULL);
- while (buddies) {
+ filtered_buddies = NULL;
+ for (cur = buddies; cur != NULL; cur = cur->next) {
PurpleBuddy *buddy;
const gchar *bname, *gname;
- buddy = buddies->data;
+ buddy = cur->data;
bname = purple_buddy_get_name(buddy);
gname = purple_group_get_name(purple_buddy_get_group(buddy));
if (aim_ssi_waitingforauth(od->ssi.local, gname, bname)) {
- const gchar *alias = purple_buddy_get_alias_only(buddy);
- if (alias)
- tmp = g_strdup_printf("%s %s (%s)
", text, bname, alias);
- else
- tmp = g_strdup_printf("%s %s
", text, bname);
- g_free(text);
- text = tmp;
-
- num++;
+ filtered_buddies = g_slist_prepend(filtered_buddies, buddy);
}
-
- buddies = g_slist_delete_link(buddies, buddies);
- }
-
- if (!num) {
- g_free(text);
- text = g_strdup(_("you are not waiting for authorization"));
- }
+ }
+
+ g_slist_free(buddies);
+
+ filtered_buddies = g_slist_reverse(filtered_buddies);
+ text = oscar_format_buddies(filtered_buddies, _("you are not waiting for authorization"));
+ g_slist_free(filtered_buddies);
purple_notify_formatted(gc, NULL, _("You are awaiting authorization from "
"the following buddies"), _("You can re-request "
@@ -6023,6 +6011,12 @@
act = purple_plugin_action_new(_("Set Privacy Options..."),
oscar_show_icq_privacy_opts);
menu = g_list_prepend(menu, act);
+
+ act = purple_plugin_action_new("Show Visible List", oscar_show_visible_list);
+ menu = g_list_prepend(menu, act);
+
+ act = purple_plugin_action_new("Show Invisible List", oscar_show_invisible_list);
+ menu = g_list_prepend(menu, act);
}
else
{
diff -r 5bfef3338383 -r 4e804413b12b libpurple/protocols/oscar/oscar.h
--- a/libpurple/protocols/oscar/oscar.h Mon Jun 28 20:02:12 2010 +0000
+++ b/libpurple/protocols/oscar/oscar.h Tue Jun 29 21:17:02 2010 +0000
@@ -1572,8 +1572,7 @@
gboolean oscar_util_valid_name_sms(const char *bn);
int oscar_util_name_compare(const char *bn1, const char *bn2);
gchar *oscar_util_format_string(const char *str, const char *name);
-
-
+gchar *oscar_format_buddies(GSList *buddies, const gchar *no_buddies_message);
typedef struct {
guint16 family;
diff -r 5bfef3338383 -r 4e804413b12b libpurple/protocols/oscar/util.c
--- a/libpurple/protocols/oscar/util.c Mon Jun 28 20:02:12 2010 +0000
+++ b/libpurple/protocols/oscar/util.c Tue Jun 29 21:17:02 2010 +0000
@@ -387,3 +387,27 @@
return g_string_free(cpy, FALSE);
}
+
+gchar *
+oscar_format_buddies(GSList *buddies, const gchar *no_buddies_message)
+{
+ GSList *cur;
+ gchar *result, *tmp;
+ if (!buddies) {
+ return g_strdup_printf("%s", no_buddies_message);
+ }
+ result = g_strdup("");
+ for (cur = buddies; cur != NULL; cur = cur->next) {
+ PurpleBuddy *buddy = cur->data;
+ const gchar *bname = purple_buddy_get_name(buddy);
+ const gchar *alias = purple_buddy_get_alias_only(buddy);
+ if (alias) {
+ tmp = g_strdup_printf("%s%s (%s)
", result, bname, alias);
+ } else {
+ tmp = g_strdup_printf("%s%s
", result, bname);
+ }
+ g_free(result);
+ result = tmp;
+ }
+ return result;
+}
\ No newline at end of file
diff -r 5bfef3338383 -r 4e804413b12b libpurple/protocols/oscar/visibility.c
--- a/libpurple/protocols/oscar/visibility.c Mon Jun 28 20:02:12 2010 +0000
+++ b/libpurple/protocols/oscar/visibility.c Tue Jun 29 21:17:02 2010 +0000
@@ -57,8 +57,58 @@
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");
+ 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);
g_free(label);
return result;
}
+
+static void
+show_private_list(PurplePluginAction *action, guint16 list_type, const gchar *list_description, const gchar *menu_action_name)
+{
+ PurpleConnection *gc = (PurpleConnection *) action->context;
+ OscarData *od = purple_connection_get_protocol_data(gc);
+ PurpleAccount *account = purple_connection_get_account(gc);
+ GSList *buddies, *filtered_buddies, *cur;
+ gchar *text, *secondary;
+
+ buddies = purple_find_buddies(account, NULL);
+ filtered_buddies = NULL;
+ for (cur = buddies; cur != NULL; cur = cur->next) {
+ PurpleBuddy *buddy;
+ const gchar *bname;
+
+ buddy = cur->data;
+ bname = purple_buddy_get_name(buddy);
+ if (aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type)) {
+ filtered_buddies = g_slist_prepend(filtered_buddies, buddy);
+ }
+ }
+
+ g_slist_free(buddies);
+
+ filtered_buddies = g_slist_reverse(filtered_buddies);
+ text = oscar_format_buddies(filtered_buddies, "you have no buddies on this list");
+ g_slist_free(filtered_buddies);
+
+ secondary = g_strdup_printf("You can add a buddy to this list "
+ "by right-clicking on them and "
+ "selecting \"%s\"", menu_action_name);
+ purple_notify_formatted(gc, NULL, list_description, secondary, text, NULL, NULL);
+ g_free(secondary);
+ g_free(text);
+}
+
+void
+oscar_show_visible_list(PurplePluginAction *action)
+{
+ show_private_list(action, AIM_SSI_TYPE_PERMIT, "These buddies will always see "
+ "your status, even when you switch "
+ "to \"Invisible\"", "Appear Online");
+}
+
+void
+oscar_show_invisible_list(PurplePluginAction *action)
+{
+ show_private_list(action, AIM_SSI_TYPE_DENY, "These buddies will always see you as offline", "Appear Offline");
+}
\ No newline at end of file
diff -r 5bfef3338383 -r 4e804413b12b libpurple/protocols/oscar/visibility.h
--- a/libpurple/protocols/oscar/visibility.h Mon Jun 28 20:02:12 2010 +0000
+++ b/libpurple/protocols/oscar/visibility.h Tue Jun 29 21:17:02 2010 +0000
@@ -22,8 +22,11 @@
#define _VISIBILITY_H_
#include "oscar.h"
+#include "plugin.h"
#include "util.h"
PurpleMenuAction * create_visibility_menu_item(OscarData *od, const char *bname);
+void oscar_show_visible_list(PurplePluginAction *action);
+void oscar_show_invisible_list(PurplePluginAction *action);
#endif
\ No newline at end of file