changeset 14520:82b59abcaee4

[gaim-migrate @ 17240] SF Patch #1492561 from Lars T. Mikkelsen "This patch adds gaim-url-handler, a URL handler for most protocols in Gaim. The gaim-url-handler is similar to (and based on) gaim-remote, however, it uses the native URL format of each protocol. Furthermore, the patch includes a GConf schema, which allows Gnome applications to use the URL handler." With this and gaim-send/gaim-send-async, we should be able to drop gaim-remote. Please let me know if you object, or I'll remove gaim-remote shortly. For the record, I know this doesn't support 100% of the ChatZilla IRC URL spec, and I haven't investigated the XMPP URL spec beyond a casual first look. We can tweak these things later -- I figured it was important to get the bulk of the code in place. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Mon, 11 Sep 2006 02:30:59 +0000
parents e548832f0e82
children a679de8b43a0
files COPYRIGHT ChangeLog.API acinclude.m4 configure.ac gtk/gtkconv.c libgaim/Makefile.am libgaim/conversation.c libgaim/conversation.h libgaim/gaim-url-handler libgaim/gconf/Makefile.am libgaim/gconf/gaim.schemas
diffstat 11 files changed, 681 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Mon Sep 11 02:02:18 2006 +0000
+++ b/COPYRIGHT	Mon Sep 11 02:30:59 2006 +0000
@@ -189,6 +189,7 @@
 Torrey McMahon
 Robert McQueen
 Robert Mibus
+Lars T. Mikkelsen
 Benjamin Miller
 Kevin Miller
 Paul Miller
--- a/ChangeLog.API	Mon Sep 11 02:02:18 2006 +0000
+++ b/ChangeLog.API	Mon Sep 11 02:30:59 2006 +0000
@@ -321,6 +321,8 @@
 	  call to gaim_util_fetch_url() or gaim_util_fetch_url_request().
 	* GaimGtkWindow: dialogs.search (previously in GaimGtkConversation)
 	* gaim_buddy_get_server_alias()
+	* gaim_conv_send_confirm()
+	* GaimConversationUiOps.send_confirm
 
 	Signals - Changed:  (See the Doxygen docs for details on all signals.)
 	* Signal propagation now stops after a handler returns a non-NULL value.
--- a/acinclude.m4	Mon Sep 11 02:02:18 2006 +0000
+++ b/acinclude.m4	Mon Sep 11 02:30:59 2006 +0000
@@ -836,3 +836,42 @@
 	AC_SUBST(BINRELOC_CFLAGS)
 	AC_SUBST(BINRELOC_LIBS)
 ])
+dnl AM_GCONF_SOURCE_2
+dnl Defines GCONF_SCHEMA_CONFIG_SOURCE which is where you should install schemas
+dnl  (i.e. pass to gconftool-2
+dnl Defines GCONF_SCHEMA_FILE_DIR which is a filesystem directory where
+dnl  you should install foo.schemas files
+dnl
+
+AC_DEFUN([AM_GCONF_SOURCE_2],
+[
+  if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then
+    GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+  else
+    GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE
+  fi
+
+  AC_ARG_WITH(gconf-source, 
+  [  --with-gconf-source=sourceaddress      Config database for installing schema files.],GCONF_SCHEMA_CONFIG_SOURCE="$withval",)
+
+  AC_SUBST(GCONF_SCHEMA_CONFIG_SOURCE)
+  AC_MSG_RESULT([Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation])
+
+  if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then
+    GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas'
+  fi
+
+  AC_ARG_WITH(gconf-schema-file-dir, 
+  [  --with-gconf-schema-file-dir=dir        Directory for installing schema files.],GCONF_SCHEMA_FILE_DIR="$withval",)
+
+  AC_SUBST(GCONF_SCHEMA_FILE_DIR)
+  AC_MSG_RESULT([Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files])
+
+  AC_ARG_ENABLE(schemas-install,
+     [  --disable-schemas-install	Disable the schemas installation],
+     [case ${enableval} in
+       yes|no) ;;
+       *) AC_MSG_ERROR(bad value ${enableval} for --enable-schemas-install) ;;
+      esac])
+  AM_CONDITIONAL([GCONF_SCHEMAS_INSTALL], [test "$enable_schemas_install" != no])
+])
--- a/configure.ac	Mon Sep 11 02:02:18 2006 +0000
+++ b/configure.ac	Mon Sep 11 02:30:59 2006 +0000
@@ -423,6 +423,13 @@
 AC_SUBST(LIBXML_LIBS)
 
 dnl #######################################################################
+dnl # GConf schemas
+dnl #######################################################################
+AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
+AM_CONDITIONAL(USE_GCONFTOOL, test "x$GCONFTOOL" != "xno")
+AM_GCONF_SOURCE_2
+
+dnl #######################################################################
 dnl # Check for GStreamer
 dnl #######################################################################
 AC_ARG_ENABLE(gstreamer,
@@ -577,7 +584,7 @@
 	gadu_manual_check="no"
 fi
 if test "x$gadu_manual_check" = "xno"; then
-	PKG_CHECK_MODULES(GADU, libgadu, [
+	PKG_CHECK_MODULES(LIBGADU, libgadu, [
 		gadu_includes="yes"
 		gadu_libs="yes"
 	], [
@@ -1870,6 +1877,7 @@
 		   gtk/plugins/perl/common/Makefile.PL
 		   gtk/plugins/ticker/Makefile
 		   gtk/sounds/Makefile
+		   libgaim/gconf/Makefile
 		   libgaim/plugins/Makefile
 		   libgaim/plugins/mono/Makefile
 		   libgaim/plugins/mono/api/Makefile
--- a/gtk/gtkconv.c	Mon Sep 11 02:02:18 2006 +0000
+++ b/gtk/gtkconv.c	Mon Sep 11 02:30:59 2006 +0000
@@ -5396,6 +5396,14 @@
 
 }
 
+static void
+gaim_gtkconv_send_confirm(GaimConversation *conv, const char *message)
+{
+	GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv);
+
+	gtk_imhtml_append_text(GTK_IMHTML(gtkconv->entry), message, 0);
+}
+
 /*
  * Makes sure all the menu items and all the buttons are hidden/shown and
  * sensitive/insensitive.  This is called after changing tabs and when an
@@ -5780,7 +5788,8 @@
 	gaim_gtkconv_has_focus,            /* has_focus            */
 	gaim_gtkconv_custom_smiley_add,    /* custom_smiley_add    */
 	gaim_gtkconv_custom_smiley_write,  /* custom_smiley_write  */
-	gaim_gtkconv_custom_smiley_close   /* custom_smiley_close  */
+	gaim_gtkconv_custom_smiley_close,  /* custom_smiley_close  */
+	gaim_gtkconv_send_confirm,         /* send_confirm         */
 };
 
 GaimConversationUiOps *
--- a/libgaim/Makefile.am	Mon Sep 11 02:02:18 2006 +0000
+++ b/libgaim/Makefile.am	Mon Sep 11 02:30:59 2006 +0000
@@ -5,6 +5,7 @@
 		gaim-remote \
 		gaim-send \
 		gaim-send-async \
+		gaim-url-handler \
 		Makefile.mingw \
 		win32/global.mak \
 		win32/libc_interface.c \
@@ -17,7 +18,11 @@
 		win32/win32dep.c \
 		win32/win32dep.h
 
-SUBDIRS = plugins protocols
+if USE_GCONFTOOL
+GCONF_DIR=gconf
+endif
+
+SUBDIRS = $(GCONF_DIR) plugins protocols
 
 gaim_coresources = \
 	account.c \
@@ -187,7 +192,7 @@
 
 # scripts
 
-bin_SCRIPTS = gaim-notifications-example gaim-remote gaim-send gaim-send-async
+bin_SCRIPTS = gaim-notifications-example gaim-remote gaim-send gaim-send-async gaim-url-handler
 
 endif
 
--- a/libgaim/conversation.c	Mon Sep 11 02:02:18 2006 +0000
+++ b/libgaim/conversation.c	Mon Sep 11 02:30:59 2006 +0000
@@ -28,6 +28,7 @@
 #include "notify.h"
 #include "prefs.h"
 #include "prpl.h"
+#include "request.h"
 #include "signals.h"
 #include "util.h"
 
@@ -338,6 +339,8 @@
 
 	g_return_if_fail(conv != NULL);
 
+	gaim_request_close_with_handle(conv);
+
 	ops  = gaim_conversation_get_ui_ops(conv);
 	gc   = gaim_conversation_get_gc(conv);
 	name = gaim_conversation_get_name(conv);
@@ -1126,6 +1129,41 @@
 	gaim_conv_im_send_with_flags(im, message, 0);
 }
 
+static void
+gaim_conv_send_confirm_cb(gpointer *data)
+{
+	GaimConversation *conv = data[0];
+	char *message = data[1];
+
+	g_free(data);
+	common_send(conv, message, 0);
+}
+
+void
+gaim_conv_send_confirm(GaimConversation *conv, const char *message)
+{
+	char *text;
+	gpointer *data;
+
+	g_return_if_fail(conv != NULL);
+	g_return_if_fail(message != NULL);
+
+	if (conv->ui_ops != NULL && conv->ui_ops->send_confirm != NULL)
+	{
+		conv->ui_ops->send_confirm(conv, message);
+		return;
+	}
+
+	text = g_strdup_printf("You are about to send the following message:\n%s", message);
+	data = g_new0(gpointer, 2);
+	data[0] = conv;
+	data[1] = (gpointer)message;
+
+	gaim_request_action(conv, NULL, _("Send Message"), text, 0, data, 2,
+	                    _("_Send Message"), G_CALLBACK(gaim_conv_send_confirm_cb),
+	                    _("Cancel"), NULL);
+}
+
 void
 gaim_conv_im_send_with_flags(GaimConvIm *im, const char *message, GaimMessageFlags flags)
 {
--- a/libgaim/conversation.h	Mon Sep 11 02:02:18 2006 +0000
+++ b/libgaim/conversation.h	Mon Sep 11 02:30:59 2006 +0000
@@ -174,6 +174,8 @@
 	void (*custom_smiley_write)(GaimConversation *conv, const char *smile,
 	                            const guchar *data, gsize size);
 	void (*custom_smiley_close)(GaimConversation *conv, const char *smile);
+
+	void (*send_confirm)(GaimConversation *conv, const char *message);
 };
 
 /**
@@ -758,6 +760,20 @@
 void gaim_conv_im_send(GaimConvIm *im, const char *message);
 
 /**
+ * Sends a message to a conversation after confirming with
+ * the user.
+ *
+ * This function is intended for use in cases where the user
+ * hasn't explicitly and knowingly caused a message to be sent.
+ * The confirmation ensures that the user isn't sending a
+ * message by mistake.
+ *
+ * @param conv    The conversation.
+ * @param message The message to send.
+ */
+void gaim_conv_send_confirm(GaimConversation *conv, const char *message);
+
+/**
  * Sends a message to this IM conversation with specified flags.
  *
  * @param im      The IM.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgaim/gaim-url-handler	Mon Sep 11 02:30:59 2006 +0000
@@ -0,0 +1,274 @@
+#!/usr/bin/python
+
+import dbus
+import re
+import sys
+import time
+import urllib
+
+obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject")
+gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface")
+
+class CheckedObject:
+    def __init__(self, obj):
+        self.obj = obj
+
+    def __getattr__(self, attr):
+        return CheckedAttribute(self, attr)
+
+class CheckedAttribute:
+    def __init__(self, cobj, attr):
+        self.cobj = cobj
+        self.attr = attr
+
+    def __call__(self, *args):
+        result = self.cobj.obj.__getattr__(self.attr)(*args)
+        if result == 0:
+            raise "Error: " + self.attr + " " + str(args) + " returned " + str(result)
+        return result
+
+cgaim = CheckedObject(gaim)
+
+def extendlist(list, length, fill):
+    if len(list) < length:
+        return list + [fill] * (length - len(list))
+    else:
+        return list
+
+def convert(value):
+    try:
+        return int(value)
+    except:
+        return value
+
+def findaccount(protocolname, accountname=""):
+    try:
+        # prefer connected accounts
+        account = cgaim.GaimAccountsFindConnected(accountname, protocolname)
+        return account
+    except:
+        # try to get any account and connect it
+        account = cgaim.GaimAccountsFindAny(accountname, protocolname)
+        gaim.GaimAccountSetStatusVargs(account, "online", 1)
+        gaim.GaimAccountConnect(account)
+        return account
+
+def goim(account, screenname, message=None):
+    # XXX: 1 == GAIM_CONV_TYPE_IM
+    conversation = cgaim.GaimConversationNew(1, account, screenname)
+    if message:
+        gaim.GaimConvSendConfirm(conversation, message)
+
+def gochat(account, params, message=None):
+    connection = cgaim.GaimAccountGetConnection(account)
+    gaim.ServJoinChat(connection, params)
+
+    if message != None:
+    	for i in range(20):
+            # XXX: 2 == GAIM_CONV_TYPE_CHAT
+            conversation = gaim.GaimFindConversationWithAccount(2, params.get("channel", params.get("room")), account)
+            if conversation:
+                gaim.GaimConvSendConfirm(conversation, message)
+                break
+            else:
+                time.sleep(0.5)
+
+def addbuddy(account, screenname, group="", alias=""):
+    cgaim.GaimBlistRequestAddBuddy(account, screenname, group, alias)
+
+
+def aim(uri):
+    protocol = "prpl-oscar"
+    match = re.match(r"^(aim|icq):([^?]*)(\?(.*))", uri)
+    if not match:
+        print "Invalid aim URI: %s" % uri
+        return
+
+    command = urllib.unquote(match.group(2))
+    paramstring = match.group(4)
+    params = {}
+    if paramstring:
+        for param in paramstring.split("&"):
+            key, value = extendlist(param.split("=", 1), 2, "")
+            params[key] = urllib.unquote(value)
+    accountname = params.get("account", "")
+    screenname = params.get("screenname", "")
+
+    account = findaccount(protocol, accountname)
+
+    if command == "goim":
+        goim(account, screenname, params.get("message"))
+    elif command == "gochat":
+        gochat(account, params)
+    elif command == "addbuddy":
+        addbuddy(account, screenname, params.get("group", ""))
+
+def gg(uri):
+    protocol = "prpl-gg"
+    match = re.match(r"^gg:(.*)", uri)
+    if not match:
+        print "Invalid gg URI: %s" % uri
+        return
+
+    screenname = urllib.unquote(match.group(1))
+    account = findaccount(protocol)
+    goim(account, screenname)
+
+def icq(uri):
+    aim(uri)
+
+def irc(uri):
+    protocol = "prpl-irc"
+    match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri)
+    if not match:
+        print "Invalid irc URI: %s" % uri
+        return
+
+    server = urllib.unquote(match.group(2)) or ""
+    target = match.group(3) or ""
+    query = match.group(5) or ""
+
+    modifiers = {}
+    if target:
+        for modifier in target.split(",")[1:]:
+            modifiers[modifier] = True
+
+    isnick = modifiers.has_key("isnick")
+
+    paramstring = match.group(5)
+    params = {}
+    if paramstring:
+        for param in paramstring.split("&"):
+            key, value = extendlist(param.split("=", 1), 2, "")
+            params[key] = urllib.unquote(value)
+
+    account = findaccount(protocol)
+
+    if (target != ""):
+        if (isnick):
+            goim(account, urllib.unquote(target.split(",")[0]), params.get("msg"))
+	else:
+            channel = urllib.unquote(target.split(",")[0])
+            if channel[0] != "#":
+                channel = "#" + channel
+            gochat(account, {"server": server, "channel": channel, "password": params.get("key", "")}, params.get("msg"))
+
+def msnim(uri):
+    protocol = "prpl-msn"
+    match = re.match(r"^msnim:([^?]*)(\?(.*))", uri)
+    if not match:
+        print "Invalid msnim URI: %s" % uri
+        return
+
+    command = urllib.unquote(match.group(1))
+    paramstring = match.group(3)
+    params = {}
+    if paramstring:
+        for param in paramstring.split("&"):
+            key, value = extendlist(param.split("=", 1), 2, "")
+            params[key] = urllib.unquote(value)
+    screenname = params.get("contact", "")
+
+    account = findaccount(protocol)
+
+    if command == "chat":
+        goim(account, screenname)
+    elif command == "add":
+        addbuddy(account, screenname)
+
+def sip(uri):
+    protocol = "prpl-simple"
+    match = re.match(r"^sip:(.*)", uri)
+    if not match:
+        print "Invalid sip URI: %s" % uri
+        return
+
+    screenname = urllib.unquote(match.group(1))
+    account = findaccount(protocol)
+    goim(account, screenname)
+
+def xmpp(uri):
+    protocol = "prpl-jabber"
+    match = re.match(r"^xmpp:(//([^/?#]*))?(/?([^?#]*))(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri)
+    if not match:
+        print "Invalid xmpp URI: %s" % uri
+        return
+
+    accountname = urllib.unquote(match.group(2)) or ""
+    screenname = urllib.unquote(match.group(4))
+    command = urllib.unquote(match.group(6))
+    paramstring = match.group(8)
+    params = {}
+    if paramstring:
+        for param in paramstring.split(";"):
+            key, value = extendlist(param.split("=", 1), 2, "")
+            params[key] = urllib.unquote(value)
+
+    account = findaccount(protocol, accountname)
+
+    if command == "message":
+        goim(account, screenname, params.get("body"))
+    elif command == "join":
+        room, server = screenname.split("@")
+        gochat(account, {"room": room, "server": server})
+    elif command == "roster":
+        addbuddy(account, screenname, params.get("group", ""), params.get("name", ""))
+    else:
+        goim(account, screenname)
+
+def ymsgr(uri):
+    protocol = "prpl-yahoo"
+    match = re.match(r"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)", uri)
+    if not match:
+        print "Invalid ymsgr URI: %s" % uri
+        return
+
+    command = urllib.unquote(match.group(1))
+    screenname = urllib.unquote(match.group(3))
+    paramstring = match.group(5)
+    params = {}
+    if paramstring:
+        for param in paramstring.split("&"):
+            key, value = extendlist(param.split("=", 1), 2, "")
+            params[key] = urllib.unquote(value)
+
+    account = findaccount(protocol)
+
+    if command == "sendIM":
+        goim(account, screenname, params.get("m"))
+    elif command == "chat":
+        gochat(account, {"room": screenname})
+    elif command == "addfriend":
+        addbuddy(account, screenname)
+
+
+def main(argv=sys.argv):
+    if len(argv) != 2:
+        print "Usage: %s URI" % argv[0]
+        print "Example: %s \"xmpp:romeo@montague.net?message\"" % argv[0]
+        return
+
+    uri = argv[1]
+    type = uri.split(":")[0]
+
+    if type == "aim":
+        aim(uri)
+    elif type == "gg":
+        gg(uri)
+    elif type == "icq":
+        icq(uri)
+    elif type == "irc":
+        irc(uri)
+    elif type == "msnim":
+        msnim(uri)
+    elif type == "sip":
+        sip(uri)
+    elif type == "xmpp":
+        xmpp(uri)
+    elif type == "ymsgr":
+        ymsgr(uri)
+    else:
+        print "Unkown protocol: %s" % type
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgaim/gconf/Makefile.am	Mon Sep 11 02:30:59 2006 +0000
@@ -0,0 +1,9 @@
+schemadir = @GCONF_SCHEMA_FILE_DIR@
+schema_DATA = gaim.schemas
+
+if GCONF_SCHEMAS_INSTALL
+install-data-local:
+	GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
+else
+install-data-local:
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgaim/gconf/gaim.schemas	Mon Sep 11 02:30:59 2006 +0000
@@ -0,0 +1,276 @@
+<?xml version="1.0"?>
+<gconfschemafile>
+  <schemalist>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/aim/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/aim/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "aim" URLs</short>
+        <long>True if the command specified in the "command" key should handle "aim" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/aim/command</key>
+im      <applyto>/desktop/gnome/url-handlers/aim/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "aim" URLs</short>
+        <long>The command used to handle "aim" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/aim/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/aim/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/gg/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/gg/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "gg" URLs</short>
+        <long>True if the command specified in the "command" key should handle "gg" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/gg/command</key>
+      <applyto>/desktop/gnome/url-handlers/gg/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "gg" URLs</short>
+        <long>The command used to handle "gg" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/gg/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/gg/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/icq/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/icq/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "icq" URLs</short>
+        <long>True if the command specified in the "command" key should handle "icq" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/icq/command</key>
+      <applyto>/desktop/gnome/url-handlers/icq/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "icq" URLs</short>
+        <long>The command used to handle "icq" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/icq/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/icq/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/irc/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/irc/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "irc" URLs</short>
+        <long>True if the command specified in the "command" key should handle "irc" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/irc/command</key>
+      <applyto>/desktop/gnome/url-handlers/irc/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "irc" URLs</short>
+        <long>The command used to handle "irc" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/irc/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/irc/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/msnim/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/msnim/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "msnim" URLs</short>
+        <long>True if the command specified in the "command" key should handle "msnim" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/msnim/command</key>
+      <applyto>/desktop/gnome/url-handlers/msnim/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "msnim" URLs</short>
+        <long>The command used to handle "msnim" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/msnim/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/msnim/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/sip/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/sip/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "sip" URLs</short>
+        <long>True if the command specified in the "command" key should handle "sip" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/sip/command</key>
+      <applyto>/desktop/gnome/url-handlers/sip/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "sip" URLs</short>
+        <long>The command used to handle "sip" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/sip/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/sip/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/xmpp/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/xmpp/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "xmpp" URLs</short>
+        <long>True if the command specified in the "command" key should handle "xmpp" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/xmpp/command</key>
+      <applyto>/desktop/gnome/url-handlers/xmpp/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "xmpp" URLs</short>
+        <long>The command used to handle "xmpp" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/xmpp/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/xmpp/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/ymsgr/enabled</key>
+      <applyto>/desktop/gnome/url-handlers/ymsgr/enabled</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Whether the specified command should handle "ymsgr" URLs</short>
+        <long>True if the command specified in the "command" key should handle "ymsgr" URLs.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/ymsgr/command</key>
+      <applyto>/desktop/gnome/url-handlers/ymsgr/command</applyto>
+      <owner>gaim</owner>
+      <type>string</type>
+      <default>gaim-url-handler "%s"</default>
+      <locale name="C">
+        <short>The handler for "ymsgr" URLs</short>
+        <long>The command used to handle "ymsgr" URLs, if enabled.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/desktop/gnome/url-handlers/ymsgr/needs_terminal</key>
+      <applyto>/desktop/gnome/url-handlers/ymsgr/needs_terminal</applyto>
+      <owner>gaim</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Run the command in a terminal</short>
+        <long>True if the command used to handle this type of URL should be run in a terminal.</long>
+      </locale>
+    </schema>
+  </schemalist>
+</gconfschemafile>