diff options
author | Ryan Lortie <desrt@desrt.ca> | 2010-06-17 14:05:40 -0400 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2010-06-17 14:05:40 -0400 |
commit | 6c3ae976e61a9c680c7e18ff89d41d0808a066c4 (patch) | |
tree | fa01166e0697e8e00008056e9da0e40495b885bb /gio/gsettingsbackend.c | |
parent | b3cc28bc34bd0b341f1786dc478cff259ce5d1da (diff) |
Bug 621266 - GSettings "context" clarification
Remove the concept of "context" in favour of dealing with
GSettingsBackend directly.
Diffstat (limited to 'gio/gsettingsbackend.c')
-rw-r--r-- | gio/gsettingsbackend.c | 192 |
1 files changed, 41 insertions, 151 deletions
diff --git a/gio/gsettingsbackend.c b/gio/gsettingsbackend.c index 044ef48be..343183e67 100644 --- a/gio/gsettingsbackend.c +++ b/gio/gsettingsbackend.c @@ -1038,136 +1038,61 @@ g_settings_backend_create_tree (void) g_free, (GDestroyNotify) g_variant_unref); } - -static gpointer -get_default_backend (const gchar *context) -{ - GIOExtension *extension = NULL; - GIOExtensionPoint *point; - GList *extensions; - const gchar *env; - GType type; - - _g_io_modules_ensure_loaded (); - - point = g_io_extension_point_lookup (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME); - - if ((env = getenv ("GSETTINGS_BACKEND"))) - { - extension = g_io_extension_point_get_extension_by_name (point, env); - - if (extension == NULL) - g_warning ("Can't find GSettings backend '%s' given in " - "GSETTINGS_BACKEND environment variable", env); - } - - if (extension == NULL) - { - extensions = g_io_extension_point_get_extensions (point); - - if (extensions == NULL) - g_error ("No GSettingsBackend implementations exist."); - - extension = extensions->data; - } - - if (context[0] != '\0') /* (context != "") */ - { - GSettingsBackendClass *backend_class; - GTypeClass *class; - - class = g_io_extension_ref_class (extension); - backend_class = G_SETTINGS_BACKEND_CLASS (class); - - if (backend_class->supports_context == NULL || - !backend_class->supports_context (context)) - { - g_type_class_unref (class); - return NULL; - } - - g_type_class_unref (class); - } - - type = g_io_extension_get_type (extension); - - return g_object_new (type, "context", context, NULL); -} - -static GHashTable *g_settings_backends; - /*< private > - * g_settings_backend_get_with_context: - * @context: a context that might be used by the backend to determine - * which storage to use, or %NULL to use the default storage + * g_settings_backend_get_default: * @returns: the default #GSettingsBackend * * Returns the default #GSettingsBackend. It is possible to override * the default by setting the <envar>GSETTINGS_BACKEND</envar> * environment variable to the name of a settings backend. * - * The @context parameter can be used to indicate that a different - * than the default storage is desired. E.g. the DConf backend lets - * you use "user", "system", "defaults" and "login" as contexts. - * - * If @context is not supported by the implementation, this function - * returns an instance of the #GSettingsMemoryBackend. - * See g_settings_backend_supports_context(), - * - * The user does not own the return value and it must not be freed. + * The user gets a reference to the backend. */ GSettingsBackend * -g_settings_backend_get_with_context (const gchar *context) +g_settings_backend_get_default (void) { - GSettingsBackend *backend; - - g_return_val_if_fail (context != NULL, NULL); + static gsize backend; - _g_io_modules_ensure_extension_points_registered (); - - if (g_settings_backends == NULL) - g_settings_backends = g_hash_table_new (g_str_hash, g_str_equal); + if (g_once_init_enter (&backend)) + { + GSettingsBackend *instance; + GIOExtensionPoint *point; + GIOExtension *extension; + GType extension_type; + GList *extensions; + const gchar *env; - backend = g_hash_table_lookup (g_settings_backends, context); + _g_io_modules_ensure_loaded (); - if (!backend) - { - backend = get_default_backend (context); + point = g_io_extension_point_lookup (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME); + extension = NULL; - if (!backend) - backend = g_null_settings_backend_new (); + if ((env = getenv ("GSETTINGS_BACKEND"))) + { + extension = g_io_extension_point_get_extension_by_name (point, env); - g_hash_table_insert (g_settings_backends, g_strdup (context), backend); - } + if (extension == NULL) + g_warning ("Can't find GSettings backend '%s' given in " + "GSETTINGS_BACKEND environment variable", env); + } - return g_object_ref (backend); -} + if (extension == NULL) + { + extensions = g_io_extension_point_get_extensions (point); -/*< private > - * g_settings_backend_supports_context: - * @context: a context string that might be passed to - * g_settings_backend_new_with_context() - * @returns: #TRUE if @context is supported - * - * Determines if the given context is supported by the default - * GSettingsBackend implementation. - */ -gboolean -g_settings_backend_supports_context (const gchar *context) -{ - GSettingsBackend *backend; + if (extensions == NULL) + g_error ("No GSettingsBackend implementations exist."); - g_return_val_if_fail (context != NULL, FALSE); + extension = extensions->data; + } - backend = get_default_backend (context); + extension_type = g_io_extension_get_type (extension); + instance = g_object_new (extension_type, NULL); - if (backend) - { - g_object_unref (backend); - return TRUE; + g_once_init_leave (&backend, (gsize) instance); } - return FALSE; + return g_object_ref ((void *) backend); } /*< private > @@ -1194,54 +1119,19 @@ g_settings_backend_get_permission (GSettingsBackend *backend, return g_simple_permission_new (TRUE); } -/** - * g_settings_backend_setup: - * @context: a context string (not %NULL or "") - * @backend: a #GSettingsBackend - * - * Sets up @backend for use with #GSettings. - * - * If you create a #GSettings with its context property set to @context - * then it will use the backend given to this function. See - * g_settings_new_with_context(). - * - * The backend must be set up before any settings objects are created - * for the named context. - * - * It is not possible to specify a backend for the default context. - * - * This function takes a reference on @backend and never releases it. - * - * Since: 2.26 - **/ -void -g_settings_backend_setup (const gchar *context, - GSettingsBackend *backend) -{ - g_return_if_fail (context[0] != '\0'); - g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); - - if (g_settings_backends == NULL) - g_settings_backends = g_hash_table_new (g_str_hash, g_str_equal); - - if (g_hash_table_lookup (g_settings_backends, context)) - g_error ("A GSettingsBackend already exists for context '%s'", context); - - g_hash_table_insert (g_settings_backends, - g_strdup (context), - g_object_ref (backend)); -} - /*< private > - * g_settings_backend_sync: - * @backend: a #GSettingsBackend + * g_settings_backend_sync_default: * - * Syncs the backend. + * Syncs the default backend. */ void -g_settings_backend_sync (GSettingsBackend *backend) +g_settings_backend_sync_default (void) { - GSettingsBackendClass *class = G_SETTINGS_BACKEND_GET_CLASS (backend); + GSettingsBackendClass *class; + GSettingsBackend *backend; + + backend = g_settings_backend_get_default (); + class = G_SETTINGS_BACKEND_GET_CLASS (backend); if (class->sync) class->sync (backend); |