Replace "gio-desktop-app-info-lookup" extension point

With a native version, that looks for desktop items supporting
x-scheme-handler/foo, when looking for a handler for the "foo"
URI scheme handler.

https://bugzilla.gnome.org/show_bug.cgi?id=631410
This commit is contained in:
Bastien Nocera 2010-10-05 15:02:37 +01:00
parent 1612a4d506
commit 9b262f1c5f
4 changed files with 8 additions and 127 deletions

View File

@ -1838,57 +1838,18 @@ g_app_info_get_default_for_type (const char *content_type,
GAppInfo * GAppInfo *
g_app_info_get_default_for_uri_scheme (const char *uri_scheme) g_app_info_get_default_for_uri_scheme (const char *uri_scheme)
{ {
static gsize lookup = 0; GAppInfo *app_info;
char *content_type, *scheme_down;
if (g_once_init_enter (&lookup)) scheme_down = g_ascii_strdown (uri_scheme, -1);
{ content_type = g_strdup_printf ("x-scheme-handler/%s", scheme_down);
gsize setup_value = 1; g_free (scheme_down);
GDesktopAppInfoLookup *lookup_instance; app_info = g_app_info_get_default_for_type (content_type, FALSE);
const char *use_this; g_free (content_type);
GIOExtensionPoint *ep;
GIOExtension *extension;
GList *l;
use_this = g_getenv ("GIO_USE_URI_ASSOCIATION"); return app_info;
/* Ensure vfs in modules loaded */
_g_io_modules_ensure_loaded ();
ep = g_io_extension_point_lookup (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME);
lookup_instance = NULL;
if (use_this)
{
extension = g_io_extension_point_get_extension_by_name (ep, use_this);
if (extension)
lookup_instance = g_object_new (g_io_extension_get_type (extension), NULL);
}
if (lookup_instance == NULL)
{
for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next)
{
extension = l->data;
lookup_instance = g_object_new (g_io_extension_get_type (extension), NULL);
if (lookup_instance != NULL)
break;
}
}
if (lookup_instance != NULL)
setup_value = (gsize)lookup_instance;
g_once_init_leave (&lookup, setup_value);
}
if (lookup == 1)
return NULL;
return g_desktop_app_info_lookup_get_default_for_uri_scheme (G_DESKTOP_APP_INFO_LOOKUP (lookup),
uri_scheme);
} }
static void static void
get_apps_from_dir (GHashTable *apps, get_apps_from_dir (GHashTable *apps,
const char *dirname, const char *dirname,
@ -2677,41 +2638,3 @@ get_all_desktop_entries_for_mime_type (const char *base_mime_type,
return desktop_entries; return desktop_entries;
} }
/* GDesktopAppInfoLookup interface: */
typedef GDesktopAppInfoLookupIface GDesktopAppInfoLookupInterface;
G_DEFINE_INTERFACE (GDesktopAppInfoLookup, g_desktop_app_info_lookup, G_TYPE_OBJECT)
static void
g_desktop_app_info_lookup_default_init (GDesktopAppInfoLookupInterface *iface)
{
}
/**
* g_desktop_app_info_lookup_get_default_for_uri_scheme:
* @lookup: a #GDesktopAppInfoLookup
* @uri_scheme: a string containing a URI scheme.
*
* Gets the default application for launching applications
* using this URI scheme for a particular GDesktopAppInfoLookup
* implementation.
*
* The GDesktopAppInfoLookup interface and this function is used
* to implement g_app_info_get_default_for_uri_scheme() backends
* in a GIO module. There is no reason for applications to use it
* directly. Applications should use g_app_info_get_default_for_uri_scheme().
*
* Returns: (transfer full): #GAppInfo for given @uri_scheme or %NULL on error.
*/
GAppInfo *
g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup,
const char *uri_scheme)
{
GDesktopAppInfoLookupIface *iface;
g_return_val_if_fail (G_IS_DESKTOP_APP_INFO_LOOKUP (lookup), NULL);
iface = G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE (lookup);
return (* iface->get_default_for_uri_scheme) (lookup, uri_scheme);
}

View File

@ -55,42 +55,6 @@ gboolean g_desktop_app_info_get_is_hidden (GDesktopAppInfo *info);
void g_desktop_app_info_set_desktop_env (const char *desktop_env); void g_desktop_app_info_set_desktop_env (const char *desktop_env);
#define G_TYPE_DESKTOP_APP_INFO_LOOKUP (g_desktop_app_info_lookup_get_type ())
#define G_DESKTOP_APP_INFO_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP, GDesktopAppInfoLookup))
#define G_IS_DESKTOP_APP_INFO_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP))
#define G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP, GDesktopAppInfoLookupIface))
/**
* G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME:
*
* Extension point for default handler to URI association. See
* <link linkend="extending-gio">Extending GIO</link>.
*/
#define G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME "gio-desktop-app-info-lookup"
/**
* GDesktopAppInfoLookup:
*
* Interface that is used by backends to associate default
* handlers with URI schemes.
*/
typedef struct _GDesktopAppInfoLookup GDesktopAppInfoLookup;
typedef struct _GDesktopAppInfoLookupIface GDesktopAppInfoLookupIface;
struct _GDesktopAppInfoLookupIface
{
GTypeInterface g_iface;
GAppInfo * (* get_default_for_uri_scheme) (GDesktopAppInfoLookup *lookup,
const char *uri_scheme);
};
GType g_desktop_app_info_lookup_get_type (void) G_GNUC_CONST;
GAppInfo *g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup,
const char *uri_scheme);
G_END_DECLS G_END_DECLS
#endif /* __G_DESKTOP_APP_INFO_H__ */ #endif /* __G_DESKTOP_APP_INFO_H__ */

View File

@ -114,7 +114,6 @@ g_desktop_app_info_get_type G_GNUC_CONST
g_desktop_app_info_get_is_hidden g_desktop_app_info_get_is_hidden
g_desktop_app_info_set_desktop_env g_desktop_app_info_set_desktop_env
g_desktop_app_info_lookup_get_type G_GNUC_CONST g_desktop_app_info_lookup_get_type G_GNUC_CONST
g_desktop_app_info_lookup_get_default_for_uri_scheme
#endif #endif
#endif #endif
#endif #endif

View File

@ -523,11 +523,6 @@ _g_io_modules_ensure_extension_points_registered (void)
{ {
registered_extensions = TRUE; registered_extensions = TRUE;
#ifdef G_OS_UNIX
ep = g_io_extension_point_register (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME);
g_io_extension_point_set_required_type (ep, G_TYPE_DESKTOP_APP_INFO_LOOKUP);
#endif
ep = g_io_extension_point_register (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME); ep = g_io_extension_point_register (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME);
g_io_extension_point_set_required_type (ep, G_TYPE_LOCAL_DIRECTORY_MONITOR); g_io_extension_point_set_required_type (ep, G_TYPE_LOCAL_DIRECTORY_MONITOR);