changeset 26696:3c35dcebefe7

merge of '6bcd7cfc161122f058f5093da0fab2dceeec0cfa' and 'c4834891814ba35fcff3ba313f7afa8eebd4f050'
author Paul Aurich <paul@darkrain42.org>
date Sun, 26 Apr 2009 17:01:05 +0000
parents 83e6e710cbf3 (diff) 275f43e080fd (current diff)
children bbf174c5d331 09e9b7e50df9 02624b4a7552 5987aeb4b0a3 4548c114e953
files
diffstat 18 files changed, 136 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Apr 26 10:13:27 2009 +0000
+++ b/ChangeLog	Sun Apr 26 17:01:05 2009 +0000
@@ -26,6 +26,8 @@
 	* Fix crash on connection with recent gstreamer0.10-plugins-bad.
 	* Don't create a new conversation window for incoming messages of
 	  type 'headline'.
+	* The Ad-Hoc commands associated with our server are now always shown at
+	  login.
 
 	IRC:
 	* Correctly handle WHOIS for users who are joined to a large number of
--- a/ChangeLog.API	Sun Apr 26 10:13:27 2009 +0000
+++ b/ChangeLog.API	Sun Apr 26 17:01:05 2009 +0000
@@ -9,6 +9,7 @@
 		* PURPLE_CONTACT
 		* PURPLE_BUDDY
 		* PURPLE_CHAT
+		* account-actions-changed (see account-signals.dox)
 		* purple_buddy_destroy
 		* purple_buddy_get_protocol_data
 		* purple_buddy_set_protocol_data
@@ -32,6 +33,7 @@
 		* purple_network_get_stun_ip
 		* purple_network_get_turn_ip
 		* purple_prpl_get_media_caps
+		* purple_prpl_got_account_actions
 		* purple_prpl_initiate_media
 		* purple_request_field_get_group
 		* purple_request_field_get_ui_data
--- a/doc/account-signals.dox	Sun Apr 26 10:13:27 2009 +0000
+++ b/doc/account-signals.dox	Sun Apr 26 17:01:05 2009 +0000
@@ -9,6 +9,7 @@
   @signal account-setting-info
   @signal account-set-info
   @signal account-status-changed
+  @signal account-actions-changed
   @signal account-alias-changed
   @signal account-authorization-requested
   @signal account-authorization-denied
@@ -97,6 +98,15 @@
   @param new     The status after change.
  @endsignaldef
 
+ @signaldef account-actions-changed
+  @signalproto
+void (*account_actions_changed)(PurpleAccount *account);
+  @endsignalproto
+  @signaldesc
+   Emitted when the account actions are changed after initial connection.
+  @param account The account whose actions changed.
+ @endsignaldef
+
  @signaldef account-alias-changed
   @signalproto
 void (*account_alias_changed)(PurpleAccount *account, const char *old);
--- a/finch/gntblist.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/finch/gntblist.c	Sun Apr 26 17:01:05 2009 +0000
@@ -3123,6 +3123,8 @@
 				PURPLE_CALLBACK(reconstruct_accounts_menu), NULL);
 	purple_signal_connect(purple_connections_get_handle(), "signed-off", finch_blist_get_handle(),
 				PURPLE_CALLBACK(reconstruct_accounts_menu), NULL);
+	purple_signal_connect(purple_accounts_get_handle(), "account-actions-changed", finch_blist_get_handle(),
+				PURPLE_CALLBACK(reconstruct_accounts_menu), NULL);
 	purple_signal_connect(purple_blist_get_handle(), "buddy-status-changed", finch_blist_get_handle(),
 				PURPLE_CALLBACK(buddy_status_changed), ggblist);
 	purple_signal_connect(purple_blist_get_handle(), "buddy-idle-changed", finch_blist_get_handle(),
--- a/libpurple/account.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/account.c	Sun Apr 26 17:01:05 2009 +0000
@@ -2742,6 +2742,10 @@
 						 purple_value_new(PURPLE_TYPE_SUBTYPE,
 										PURPLE_SUBTYPE_STATUS));
 
+	purple_signal_register(handle, "account-actions-changed",
+						 purple_marshal_VOID__POINTER, NULL, 1,
+						 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_ACCOUNT));
+
 	purple_signal_register(handle, "account-alias-changed",
 						 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
 						 purple_value_new(PURPLE_TYPE_SUBTYPE,
--- a/libpurple/protocols/jabber/adhoccommands.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/protocols/jabber/adhoccommands.c	Sun Apr 26 17:01:05 2009 +0000
@@ -39,30 +39,18 @@
 	GList *actionslist;
 } JabberAdHocActionInfo;
 
-void jabber_adhoc_disco_result_cb(JabberStream *js, const char *from,
-                                  JabberIqType type, const char *id,
-                                  xmlnode *packet, gpointer data)
+static void
+jabber_adhoc_got_buddy_list(JabberStream *js, const char *from, xmlnode *query)
 {
-	const char *node;
-	xmlnode *query, *item;
-	JabberID *jabberid;
+	JabberID *jid;
 	JabberBuddy *jb;
 	JabberBuddyResource *jbr = NULL;
-
-	if (type == JABBER_IQ_ERROR)
-		return;
+	xmlnode *item;
 
-	query = xmlnode_get_child_with_namespace(packet,"query","http://jabber.org/protocol/disco#items");
-	if(!query)
-		return;
-	node = xmlnode_get_attrib(query,"node");
-	if(!node || strcmp(node, "http://jabber.org/protocol/commands"))
-		return;
-
-	if((jabberid = jabber_id_new(from))) {
-		if(jabberid->resource && (jb = jabber_buddy_find(js, from, TRUE)))
-			jbr = jabber_buddy_find_resource(jb, jabberid->resource);
-		jabber_id_free(jabberid);
+	if ((jid = jabber_id_new(from))) {
+		if (jid->resource && (jb = jabber_buddy_find(js, from, TRUE)))
+			jbr = jabber_buddy_find_resource(jb, jid->resource);
+		jabber_id_free(jid);
 	}
 
 	if(!jbr)
@@ -96,11 +84,31 @@
 	}
 }
 
+void
+jabber_adhoc_disco_result_cb(JabberStream *js, const char *from,
+                             JabberIqType type, const char *id,
+                             xmlnode *packet, gpointer data)
+{
+	xmlnode *query;
+	const char *node;
+
+	if (type == JABBER_IQ_ERROR)
+		return;
+
+	query = xmlnode_get_child_with_namespace(packet, "query", "http://jabber.org/protocol/disco#items");
+	if (!query)
+		return;
+	node = xmlnode_get_attrib(query, "node");
+	if (!purple_strequal(node, "http://jabber.org/protocol/commands"))
+		return;
+
+	jabber_adhoc_got_buddy_list(js, from, query);
+}
+
 static void jabber_adhoc_parse(JabberStream *js, const char *from,
                                JabberIqType type, const char *id,
                                xmlnode *packet, gpointer data);
 
-
 static void do_adhoc_action_cb(JabberStream *js, xmlnode *result, const char *actionhandle, gpointer user_data) {
 	xmlnode *command;
 	GList *action;
@@ -224,11 +232,8 @@
 }
 
 static void
-jabber_adhoc_server_got_list_cb(JabberStream *js, const char *from,
-                                JabberIqType type, const char *id,
-                                xmlnode *packet, gpointer data)
+jabber_adhoc_got_server_list(JabberStream *js, const char *from, xmlnode *query)
 {
-	xmlnode *query = xmlnode_get_child_with_namespace(packet, "query", "http://jabber.org/protocol/disco#items");
 	xmlnode *item;
 
 	if(!query)
@@ -258,6 +263,29 @@
 
 		js->commands = g_list_append(js->commands,cmd);
 	}
+
+	if (js->state == JABBER_STREAM_CONNECTED)
+		purple_prpl_got_account_actions(purple_connection_get_account(js->gc));
+}
+
+static void
+jabber_adhoc_server_got_list_cb(JabberStream *js, const char *from,
+                                JabberIqType type, const char *id,
+                                xmlnode *packet, gpointer data)
+{
+	xmlnode *query = xmlnode_get_child_with_namespace(packet, "query", "http://jabber.org/protocol/disco#items");
+
+	jabber_adhoc_got_server_list(js, from, query);
+
+}
+
+void jabber_adhoc_got_list(JabberStream *js, const char *from, xmlnode *query)
+{
+	if (purple_strequal(from, js->user->domain)) {
+		jabber_adhoc_got_server_list(js, from, query);
+	} else {
+		jabber_adhoc_got_buddy_list(js, from, query);
+	}
 }
 
 void jabber_adhoc_server_get_list(JabberStream *js) {
--- a/libpurple/protocols/jabber/adhoccommands.h	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/protocols/jabber/adhoccommands.h	Sun Apr 26 17:01:05 2009 +0000
@@ -34,6 +34,8 @@
 
 void jabber_adhoc_execute_action(PurpleBlistNode *node, gpointer data);
 
+void jabber_adhoc_got_list(JabberStream *js, const char *from, xmlnode *query);
+
 void jabber_adhoc_server_get_list(JabberStream *js);
 
 void jabber_adhoc_init_server_commands(JabberStream *js, GList **m);
--- a/libpurple/protocols/jabber/buddy.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Sun Apr 26 17:01:05 2009 +0000
@@ -202,21 +202,6 @@
 	jabber_buddy_resource_free(jbr);
 }
 
-const char *jabber_buddy_get_status_msg(JabberBuddy *jb)
-{
-	JabberBuddyResource *jbr;
-
-	if(!jb)
-		return NULL;
-
-	jbr = jabber_buddy_find_resource(jb, NULL);
-
-	if(!jbr)
-		return NULL;
-
-	return jbr->status;
-}
-
 /*******
  * This is the old vCard stuff taken from the old prpl.  vCards, by definition
  * are a temporary thing until jabber can get its act together and come up
--- a/libpurple/protocols/jabber/buddy.h	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.h	Sun Apr 26 17:01:05 2009 +0000
@@ -96,7 +96,6 @@
 		int priority, JabberBuddyState state, const char *status);
 void jabber_buddy_resource_free(JabberBuddyResource *jbr);
 void jabber_buddy_remove_resource(JabberBuddy *jb, const char *resource);
-const char *jabber_buddy_get_status_msg(JabberBuddy *jb);
 void jabber_buddy_get_info(PurpleConnection *gc, const char *who);
 
 GList *jabber_blist_node_menu(PurpleBlistNode *node);
--- a/libpurple/protocols/jabber/jabber.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Sun Apr 26 17:01:05 2009 +0000
@@ -1701,10 +1701,11 @@
 	} else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) {
 		ret = g_strdup(jb->error_msg);
 	} else {
+		PurplePresence *presence = purple_buddy_get_presence(b);
+		PurpleStatus *status =purple_presence_get_active_status(presence);
 		char *stripped;
 
-		if(!(stripped = purple_markup_strip_html(jabber_buddy_get_status_msg(jb)))) {
-			PurplePresence *presence = purple_buddy_get_presence(b);
+		if(!(stripped = purple_markup_strip_html(purple_status_get_attr_string(status, "message")))) {
 			if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
 				PurpleStatus *status = purple_presence_get_status(presence, "tune");
 				stripped = g_strdup(purple_status_get_attr_string(status, PURPLE_TUNE_TITLE));
--- a/libpurple/protocols/jabber/message.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/protocols/jabber/message.c	Sun Apr 26 17:01:05 2009 +0000
@@ -24,6 +24,7 @@
 #include "notify.h"
 #include "server.h"
 #include "util.h"
+#include "adhoccommands.h"
 #include "buddy.h"
 #include "chat.h"
 #include "data.h"
@@ -780,6 +781,12 @@
 			} else {
 				jm->etc = g_list_append(jm->etc, child);
 			}
+		} else if (g_str_equal(child->name, "query")) {
+			const char *node = xmlnode_get_attrib(child, "node");
+			if (purple_strequal(xmlns, "http://jabber.org/protocol/disco#items")
+					&& purple_strequal(node, "http://jabber.org/protocol/commands")) {
+				jabber_adhoc_got_list(js, jm->from, child);
+			}
 		}
 	}
 
--- a/libpurple/prpl.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/prpl.c	Sun Apr 26 17:01:05 2009 +0000
@@ -182,6 +182,17 @@
 }
 
 void
+purple_prpl_got_account_actions(PurpleAccount *account)
+{
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(purple_account_is_connected(account));
+
+	purple_signal_emit(purple_accounts_get_handle(), "account-actions-changed",
+	                   account);
+}
+
+void
 purple_prpl_got_user_idle(PurpleAccount *account, const char *name,
 		gboolean idle, time_t idle_time)
 {
--- a/libpurple/prpl.h	Sun Apr 26 10:13:27 2009 +0000
+++ b/libpurple/prpl.h	Sun Apr 26 17:01:05 2009 +0000
@@ -661,6 +661,20 @@
 								  const char *status_id, ...) G_GNUC_NULL_TERMINATED;
 
 /**
+ * Notifies Purple that our account's actions have changed. This is only
+ * called after the initial connection. Emits the account-actions-changed
+ * signal.
+ *
+ * This is meant to be called from protocol plugins.
+ *
+ * @param account   The account.
+ *
+ * @see account-actions-changed
+ * @since 2.6.0
+ */
+void purple_prpl_got_account_actions(PurpleAccount *account);
+
+/**
  * Notifies Purple that a buddy's idle state and time have changed.
  *
  * This is meant to be called from protocol plugins.
--- a/pidgin/gtkblist-theme-loader.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/pidgin/gtkblist-theme-loader.c	Sun Apr 26 17:01:05 2009 +0000
@@ -81,6 +81,17 @@
 		{NULL, NULL}
 	};
 
+	expanded          = NULL;
+	collapsed         = NULL;
+	contact           = NULL;
+	online            = NULL;
+	away              = NULL;
+	offline           = NULL;
+	idle              = NULL;
+	message           = NULL;
+	message_nick_said = NULL;
+	status            = NULL;
+
 	/* Find the theme file */
 	g_return_val_if_fail(dir != NULL, NULL);
 	filename_full = g_build_filename(dir, "theme.xml", NULL);
@@ -184,6 +195,10 @@
 			pidgin_theme_font_free(*lookups[i].font);
 		}
 	}
+
+	pidgin_theme_font_free(expanded);
+	pidgin_theme_font_free(collapsed);
+
 	xmlnode_free(root_node);
 	g_free(data);
 
--- a/pidgin/gtkblist.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/pidgin/gtkblist.c	Sun Apr 26 17:01:05 2009 +0000
@@ -4652,6 +4652,12 @@
 }
 
 static void
+account_actions_changed(PurpleAccount *account, gpointer data)
+{
+	pidgin_blist_update_accounts_menu();
+}
+
+static void
 account_status_changed(PurpleAccount *account, PurpleStatus *old,
 					   PurpleStatus *new, PidginBuddyList *gtkblist)
 {
@@ -5837,6 +5843,8 @@
 	purple_signal_connect(handle, "account-error-changed", gtkblist,
 	                      PURPLE_CALLBACK(update_account_error_state),
 	                      gtkblist);
+	purple_signal_connect(handle, "account-actions-changed", gtkblist,
+	                      PURPLE_CALLBACK(account_actions_changed), NULL);
 
 	handle = pidgin_account_get_handle();
 	purple_signal_connect(handle, "account-modified", gtkblist,
--- a/pidgin/plugins/themeedit-icon.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/pidgin/plugins/themeedit-icon.c	Sun Apr 26 17:01:05 2009 +0000
@@ -242,7 +242,7 @@
 	return TRUE;
 }
 
-void pidgin_icon_theme_edit(void)
+void pidgin_icon_theme_edit(PurplePluginAction *unused)
 {
 	GtkWidget *dialog;
 	GtkWidget *box, *vbox;
--- a/pidgin/plugins/themeedit-icon.h	Sun Apr 26 10:13:27 2009 +0000
+++ b/pidgin/plugins/themeedit-icon.h	Sun Apr 26 17:01:05 2009 +0000
@@ -1,2 +1,2 @@
-void pidgin_icon_theme_edit(void);
+void pidgin_icon_theme_edit(PurplePluginAction *);
 
--- a/pidgin/plugins/themeedit.c	Sun Apr 26 10:13:27 2009 +0000
+++ b/pidgin/plugins/themeedit.c	Sun Apr 26 17:01:05 2009 +0000
@@ -213,7 +213,7 @@
 }
 
 static void
-pidgin_blist_theme_edit(void)
+pidgin_blist_theme_edit(PurplePluginAction *unused)
 {
 	GtkWidget *dialog;
 	GtkWidget *box;