--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-gio.patch Wed Jan 12 22:45:15 2011 +0100
@@ -0,0 +1,284 @@
+# HG changeset patch
+# User Chris Coulson
+# Parent 0ebe30f9eacfe67fa0b699457e524d5a9c96359e
+Bug 611953 - GNOME 3.0 readiness (patch 2 + 3)
+
+diff --git a/toolkit/system/gnome/nsGIOService.cpp b/toolkit/system/gnome/nsGIOService.cpp
+--- a/toolkit/system/gnome/nsGIOService.cpp
++++ b/toolkit/system/gnome/nsGIOService.cpp
+@@ -101,25 +101,25 @@ nsGIOMimeApp::GetName(nsACString& aName)
+ return NS_OK;
+ }
+
+ NS_IMETHODIMP
+ nsGIOMimeApp::GetCommand(nsACString& aCommand)
+ {
+ get_commandline_t g_app_info_get_commandline_ptr;
+
+- void *libHandle = dlopen("libgio-2.0.so", RTLD_LAZY);
++ void *libHandle = dlopen("libgio-2.0.so.0", RTLD_LAZY);
+ if (!libHandle) {
+ return NS_ERROR_FAILURE;
+ }
+ dlerror(); /* clear any existing error */
+ g_app_info_get_commandline_ptr =
+ (get_commandline_t) dlsym(libHandle, "g_app_info_get_commandline");
+- if (dlerror() != NULL) {
+- const char cmd = *g_app_info_get_commandline_ptr(mApp);
++ if (dlerror() == NULL) {
++ const char *cmd = g_app_info_get_commandline_ptr(mApp);
+ if (!cmd) {
+ dlclose(libHandle);
+ return NS_ERROR_FAILURE;
+ }
+ aCommand.Assign(cmd);
+ }
+ dlclose(libHandle);
+ return NS_OK;
+@@ -277,16 +277,43 @@ nsGIOMimeApp::SetAsDefaultForFileExtensi
+ } else {
+ *ext_pos = '\0';
+ }
+ }
+ g_free(extensions);
+ return NS_OK;
+ }
+
++/**
++ * Set default application for URI's of a particular scheme
++ * @param aURIScheme string containing the URI scheme
++ * @return NS_OK when application was set as default for URI scheme,
++ * NS_ERROR_FAILURE otherwise
++ */
++NS_IMETHODIMP
++nsGIOMimeApp::SetAsDefaultForURIScheme(nsACString const& aURIScheme)
++{
++ GError *error = NULL;
++ nsCAutoString contentType("x-scheme-handler/");
++ contentType.Append(aURIScheme);
++
++ g_app_info_set_as_default_for_type(mApp,
++ contentType.get(),
++ &error);
++ if (error) {
++ g_warning("Cannot set application as default for URI scheme (%s): %s",
++ PromiseFlatCString(aURIScheme).get(),
++ error->message);
++ g_error_free(error);
++ return NS_ERROR_FAILURE;
++ }
++
++ return NS_OK;
++}
++
+ nsresult
+ nsGIOService::Init()
+ {
+ // do nothing, gvfs/gio does not init.
+ return NS_OK;
+ }
+
+ NS_IMPL_ISUPPORTS1(nsGIOService, nsIGIOService)
+@@ -317,29 +344,45 @@ nsGIOService::GetMimeTypeFromExtension(c
+ g_free(mime_type);
+ g_free(content_type);
+
+ return NS_OK;
+ }
+ // used in nsGNOMERegistry
+ // -----------------------------------------------------------------------------
+ NS_IMETHODIMP
++nsGIOService::GetAppForURIScheme(const nsACString& aURIScheme,
++ nsIGIOMimeApp** aApp)
++{
++ *aApp = nsnull;
++
++ GAppInfo *app_info = g_app_info_get_default_for_uri_scheme(
++ PromiseFlatCString(aURIScheme).get());
++ if (app_info) {
++ nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info);
++ NS_ADDREF(*aApp = mozApp);
++ } else {
++ return NS_ERROR_FAILURE;
++ }
++ return NS_OK;
++}
++
++NS_IMETHODIMP
+ nsGIOService::GetAppForMimeType(const nsACString& aMimeType,
+ nsIGIOMimeApp** aApp)
+ {
+ *aApp = nsnull;
+ char *content_type =
+ get_content_type_from_mime_type(PromiseFlatCString(aMimeType).get());
+ if (!content_type)
+ return NS_ERROR_FAILURE;
+
+ GAppInfo *app_info = g_app_info_get_default_for_type(content_type, false);
+ if (app_info) {
+ nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info);
+- NS_ENSURE_TRUE(mozApp, NS_ERROR_OUT_OF_MEMORY);
+ NS_ADDREF(*aApp = mozApp);
+ } else {
+ g_free(content_type);
+ return NS_ERROR_FAILURE;
+ }
+ g_free(content_type);
+ return NS_OK;
+ }
+@@ -414,75 +457,46 @@ nsGIOService::CreateAppFromCommand(nsACS
+ nsIGIOMimeApp** appInfo)
+ {
+ GError *error = NULL;
+ *appInfo = nsnull;
+
+ GAppInfo *app_info = NULL, *app_info_from_list = NULL;
+ GList *apps = g_app_info_get_all();
+ GList *apps_p = apps;
+- get_commandline_t g_app_info_get_commandline_ptr;
+-
+- void *libHandle = dlopen("libgio-2.0.so", RTLD_LAZY);
+- if (!libHandle) {
+- return NS_ERROR_FAILURE;
+- }
+- dlerror(); /* clear any existing error */
+- g_app_info_get_commandline_ptr =
+- (get_commandline_t) dlsym(libHandle, "g_app_info_get_commandline");
+- if (dlerror() != NULL) {
+- g_app_info_get_commandline_ptr = NULL;
+- }
+
+ // Try to find relevant and existing GAppInfo in all installed application
++ // We do this by comparing each GAppInfo's executable with out own
+ while (apps_p) {
+ app_info_from_list = (GAppInfo*) apps_p->data;
+- /* This is a silly test. It just compares app names but not
+- * commands. This is due to old version of Glib/Gio. The required
+- * function which allows to do a regular check of existence of desktop file
+- * is possible by using function g_app_info_get_commandline. This function
+- * has been introduced in Glib 2.20. */
+- if (app_info_from_list && strcmp(g_app_info_get_name(app_info_from_list),
+- PromiseFlatCString(appName).get()) == 0 )
+- {
+- if (g_app_info_get_commandline_ptr)
+- {
+- /* Following test is only possible with Glib >= 2.20.
+- * Compare path only by using strncmp */
+- if (strncmp(g_app_info_get_commandline_ptr(app_info_from_list),
+- PromiseFlatCString(cmd).get(),
+- strlen(PromiseFlatCString(cmd).get())) == 0)
+- {
+- app_info = app_info_from_list;
+- break;
+- } else {
+- g_object_unref(app_info_from_list);
+- }
+- } else {
++ if (!app_info) {
++ // If the executable is not absolute, get it's full path
++ char *executable = g_find_program_in_path(g_app_info_get_executable(app_info_from_list));
++
++ if (executable && strcmp(executable, PromiseFlatCString(cmd).get()) == 0) {
++ g_object_ref (app_info_from_list);
+ app_info = app_info_from_list;
+- break;
+ }
+- } else {
+- g_object_unref(app_info_from_list);
++ g_free(executable);
+ }
++
++ g_object_unref(app_info_from_list);
+ apps_p = apps_p->next;
+ }
+ g_list_free(apps);
+
+ if (!app_info) {
+ app_info = g_app_info_create_from_commandline(PromiseFlatCString(cmd).get(),
+ PromiseFlatCString(appName).get(),
+ G_APP_INFO_CREATE_SUPPORTS_URIS,
+ &error);
+ }
+
+ if (!app_info) {
+ g_warning("Cannot create application info from command: %s", error->message);
+ g_error_free(error);
+- dlclose(libHandle);
+ return NS_ERROR_FAILURE;
+ }
+ nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info);
+ NS_ENSURE_TRUE(mozApp, NS_ERROR_OUT_OF_MEMORY);
+ NS_ADDREF(*appInfo = mozApp);
+- dlclose(libHandle);
+ return NS_OK;
+ }
+diff --git a/xpcom/system/nsIGIOService.idl b/xpcom/system/nsIGIOService.idl
+--- a/xpcom/system/nsIGIOService.idl
++++ b/xpcom/system/nsIGIOService.idl
+@@ -39,17 +39,17 @@
+
+ #include "nsISupports.idl"
+
+ interface nsIUTF8StringEnumerator;
+ interface nsIURI;
+
+ /* nsIGIOMimeApp holds information about an application that is looked up
+ with nsIGIOService::GetAppForMimeType. */
+-// 66009894-9877-405b-9321-bf30420e34e6 prev uuid
++// e77021b4-4012-407d-b686-7a1f18050109 prev uuid
+
+ [scriptable, uuid(e77021b4-4012-407d-b686-7a1f18050109)]
+ interface nsIGIOMimeApp : nsISupports
+ {
+ const long EXPECTS_URIS = 0;
+ const long EXPECTS_PATHS = 1;
+ const long EXPECTS_URIS_FOR_NON_FILES = 2;
+
+@@ -57,41 +57,45 @@ interface nsIGIOMimeApp : nsISupports
+ readonly attribute AUTF8String name;
+ readonly attribute AUTF8String command;
+ readonly attribute long expectsURIs; // see constants above
+ readonly attribute nsIUTF8StringEnumerator supportedURISchemes;
+
+ void launch(in AUTF8String uri);
+ void setAsDefaultForMimeType(in AUTF8String mimeType);
+ void setAsDefaultForFileExtensions(in AUTF8String extensions);
++ void setAsDefaultForURIScheme(in AUTF8String uriScheme);
+ };
+
+ /*
+ * The VFS service makes use of two distinct registries.
+ *
+ * The application registry holds information about applications (uniquely
+ * identified by id), such as which MIME types and URI schemes they are
+ * capable of handling, whether they run in a terminal, etc.
+ *
+ * The MIME registry holds information about MIME types, such as which
+ * extensions map to a given MIME type. The MIME registry also stores the
+ * id of the application selected to handle each MIME type.
+ */
+
+-// prev id dea20bf0-4e4d-48c5-b932-dc3e116dc64b
+-[scriptable, uuid(47e372c2-78bb-4899-8114-56aa7d9cdac5)]
++// prev id 47e372c2-78bb-4899-8114-56aa7d9cdac5
++[scriptable, uuid(74ca8791-330d-4786-9569-2a2a19f0b486)]
+ interface nsIGIOService : nsISupports
+ {
+
+ /*** MIME registry methods ***/
+
+ /* Obtain the MIME type registered for an extension. The extension
+ should not include a leading dot. */
+ AUTF8String getMimeTypeFromExtension(in AUTF8String extension);
+
++ /* Obtain the preferred application for opening a given URI scheme */
++ nsIGIOMimeApp getAppForURIScheme(in AUTF8String aURIScheme);
++
+ /* Obtain the preferred application for opening a given MIME type */
+ nsIGIOMimeApp getAppForMimeType(in AUTF8String mimeType);
+
+ /* Obtain the preferred application for opening a given MIME type */
+ nsIGIOMimeApp createAppFromCommand(in AUTF8String cmd,
+ in AUTF8String appName);
+
+ /* Obtain a description for the given MIME type */