mozilla-gio.patch
changeset 289 3c0dff7ca9c4
parent 288 d51f3999a1c2
child 290 8e4307c73cbd
--- a/mozilla-gio.patch	Thu Jul 07 08:00:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,284 +0,0 @@
-# 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 */