/* * Copyright (c) 2005 by Emmanuele Bassi (see the file AUTHORS) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307 USA. */ #include "gconfperl.h" #ifdef GCONFPERL_TYPE_ENGINE GType gconfperl_gconf_engine_get_type (void) { static GType t = 0; if (! t) { t = g_boxed_type_register_static ("GConfEngine", (GBoxedCopyFunc) gconf_engine_ref, (GBoxedFreeFunc) gconf_engine_unref); } return t; } #endif /* GCONFPERL_TYPE_ENGINE */ static GPerlCallback * gconfperl_engine_notify_func_create (SV * func, SV * data) { GType param_types [] = { GCONF_TYPE_ENGINE, G_TYPE_INT, GPERL_TYPE_SV, }; return gperl_callback_new (func, data, G_N_ELEMENTS (param_types), param_types, 0); } static void gconfperl_engine_notify_func (GConfEngine *engine, guint cnxn_id, GConfEntry *entry, gpointer data) { gperl_callback_invoke ((GPerlCallback*)data, NULL, engine, cnxn_id, newSVGConfEntry (entry)); } MODULE = Gnome2::GConf::Engine PACKAGE = Gnome2::GConf::Engine PREFIX = gconf_engine_ =for object Gnome2::GConf::Engine A Configuration Engine =cut =for position SYNOPSIS =head1 SYNOPSIS =cut =for position DESCRIPTION =head1 DESCRIPTION Gnome2::GConf::Engine is the Perl binding for the C object. A GConfEngine is a configuration engine, that is a stack of config sources. Normally, there's just one of these on the system. Gnome2::GConf::Engine provides a low-level interface for accessing GConf data; you should normally use a Gnome2::GConf::Client inside your code. =for see_also =head1 SEE ALSO L(3pm), L(3pm), L(3pm). =cut ## gconf-engine.h =for apidoc Get the default Gnome2::GConf::Engine. =cut GConfEngine * gconf_engine_get_default (class) C_ARGS: /* void */ =for apidoc Create a Gnome2::GConf::Engine for the given address. =cut GConfEngine_ornull * gconf_engine_get_for_address (class, address) const gchar * address C_ARGS: address PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_get_for_address (address, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL #if GCONF_CHECK_VERSION (2, 7, 1) =for apidoc Create a Gnome2::GConf::Engine for the given addresses. =cut GConfEngine_ornull * gconf_engine_get_for_addresses (class, ...) PREINIT: GSList *addresses = NULL; int i; GError *err = NULL; CODE: for (i = 1; i < items; i++) addresses = g_slist_append (addresses, SvPV_nolen (ST (i))); RETVAL = gconf_engine_get_for_addresses (addresses, &err); g_slist_free (addresses); /* the contents are handled by Perl */ if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL #endif /* GCONF_CHECK_VERSION (2, 7, 1) */ # these should never be needed ## void gconf_engine_ref (GConfEngine *engine) ## void gconf_engine_unref (GConfEngine *engine) # these cannot hold more than an integer, so we do not need those too. ## void gconf_engine_set_user_data (GConfEngine *engine, gpointer user_data, GDestroyNotify dnotify) ## gpointer gconf_engine_get_user_data (GConfEngine *engine) ## gconf.h #/* Low-level interfaces */ =for apidoc Fetch and return the Gnome2::GConf::Value bound to the given $key. This overrides Glib::Object's C, so you'll want to use C<< $object->get_property >> to get object's properties. =cut GConfValue * gconf_engine_get (engine, key) GConfEngine * engine const gchar * key PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_get (engine, key, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL =for apidoc Fetch the Gnome2::GConf::Value bound to the given key, without returning the default value (specified inside the schema) if the key is unset. =cut GConfValue * gconf_engine_get_without_default (engine, key) GConfEngine * engine const gchar * key PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_get_without_default (engine, key, &err); if (err) gperl_croak_gerror (NULL, err); =for apidoc Fetch and return the Gnome2::GConf::Value bound to the given $key, for a specific $locale. Locale only matters if you are expecting to get a schema, or if you don't know what you are expecting and it might be a schema. Note that Gnome2::GConf::Engine::get automatically uses the current locale, which is normally what you want. =cut GConfValue * gconf_engine_get_with_locale (engine, key, locale) GConfEngine * engine const gchar * key const gchar * locale PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_get_with_locale (engine, key, locale, &err); if (err) gperl_croak_gerror (NULL, err); =for apidoc Set the Gnome2::GConf::Value bound to the given key. =cut gboolean gconf_engine_set (engine, key, value) GConfEngine * engine const gchar * key GConfValue * value PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_set (engine, key, value, &err); gconf_value_free (value); /* leaks otherwise */ if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL =for apidoc Unset the given key. =cut gboolean gconf_engine_unset (engine, key) GConfEngine * engine const gchar * key PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_unset (engine, key, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL =for apidoc Associate a schema to a key. $schema_key should have a schema (if $key stores a value) or a dir full of schemas (if $key stores a directory name) =cut gboolean gconf_engine_associate_schema (engine, key, schema_key) GConfEngine * engine const gchar * key const gchar * schema_key PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_associate_schema (engine, key, schema_key, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL =for apidoc This method returns an array containing all the entries of a given directory. =cut void gconf_engine_all_entries (engine, dir) GConfEngine * engine const gchar * dir PREINIT: GError * err = NULL; GSList * l, * tmp; PPCODE: l = gconf_engine_all_entries (engine, dir, &err); if (err) gperl_croak_gerror (NULL, err); for (tmp = l; tmp != NULL; tmp = tmp->next) XPUSHs (sv_2mortal (newSVGChar (gconf_entry_get_key(tmp->data)))); g_slist_free (l); =for apidoc This method returns an array containing all the directories in a given directory. =cut void gconf_engine_all_dirs (engine, dir) GConfEngine * engine const gchar * dir PREINIT: GError * err = NULL; GSList * l, * tmp; PPCODE: l = gconf_engine_all_dirs (engine, dir, &err); if (err) gperl_croak_gerror (NULL, err); for (tmp = l; tmp != NULL; tmp = tmp->next) XPUSHs (sv_2mortal (newSVGChar (tmp->data))); g_slist_free (l); ##void gconf_engine_suggest_sync (GConfEngine *conf, ## GError **err); void gconf_engine_suggest_sync (engine) GConfEngine * engine PREINIT: GError *err = NULL; CODE: gconf_engine_suggest_sync (engine, &err); if (err) gperl_croak_gerror (NULL, err); ##gboolean gconf_engine_dir_exists (GConfEngine *conf, ## const gchar *dir, ## GError **err); gboolean gconf_engine_dir_exists (engine, dir) GConfEngine * engine const gchar * dir PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_dir_exists (engine, dir, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL ##void gconf_engine_remove_dir (GConfEngine* conf, ## const gchar* dir, ## GError** err); ## void gconf_engine_remove_dir (engine, dir) GConfEngine * engine const gchar * dir PREINIT: GError *err = NULL; CODE: gconf_engine_remove_dir (engine, dir, &err); if (err) gperl_croak_gerror (NULL, err); ##gboolean gconf_engine_key_is_writable (GConfEngine *conf, ## const gchar *key, ## GError **err); gboolean gconf_engine_key_is_writable (engine, key) GConfEngine * engine const gchar * key PREINIT: GError *err = NULL; CODE: RETVAL = gconf_engine_key_is_writable (engine, key, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL guint gconf_engine_notify_add (engine, namespace_section, func, data=NULL) GConfEngine * engine const gchar * namespace_section SV * func SV * data PREINIT: GPerlCallback * callback; GError * err = NULL; guint cnxn_id = 0; CODE: callback = gconfperl_engine_notify_func_create (func, data); cnxn_id = gconf_engine_notify_add (engine, namespace_section, gconfperl_engine_notify_func, callback, &err); if (err) gperl_croak_gerror (NULL, err); RETVAL = cnxn_id; OUTPUT: RETVAL void gconf_engine_notify_remove (GConfEngine * engine, guint cnxn_id) ##/* ## * Higher-level stuff ## */ ## gconf-changeset.h =for apidoc =for signature boolean = $engine->commit_change_set ($cs, $remove_committed) =for signature (boolean, changeset) = $engine->commit_change_set ($cs, $remove_committed) Commit a given L. In scalar context, or if I<$remove_committed> is FALSE, return a boolean value; otherwise, return the boolean value and the L I<$cs>, pruned of the successfully committed changes. =cut void gconf_engine_commit_change_set (engine, cs, remove_committed) GConfEngine * engine GConfChangeSet * cs gboolean remove_committed PREINIT: GError * err = NULL; gboolean res; PPCODE: res = gconf_engine_commit_change_set (engine, cs, remove_committed, &err); if (err) { gperl_croak_gerror (NULL, err); } if ((GIMME_V != G_ARRAY) || (! remove_committed)) { /* push on the stack the returned boolean value if the user * wants only that, or if the user does not want to remove * the successfully committed keys. */ XPUSHs (sv_2mortal (newSViv (res))); gconf_change_set_unref (cs); } else { /* push on the stack the returned value AND the reduced set. */ XPUSHs (sv_2mortal (newSViv (res))); XPUSHs (sv_2mortal (newSVGConfChangeSet (cs))); } =for apidoc Create a change set that would revert the given change set for the given L. =cut GConfChangeSet * gconf_engine_reverse_change_set (engine, cs) GConfEngine * engine GConfChangeSet * cs PREINIT: GError * err = NULL; CODE: RETVAL = gconf_engine_reverse_change_set (engine, cs, &err); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL ### Gnome2::GConf::Engine::change_set_from_current is really ### change_set_from_currentv for implementation ease, but the calling signature ### is the same of change_set_from_current, so here it goes. =for apidoc =for arg key (__hide__) =for arg ... list of keys to add to the changeset Create a L from a list of keys inside the GConf database. =cut GConfChangeSet * gconf_engine_change_set_from_current (engine, key, ...) GConfEngine * engine PREINIT: char ** keys; int i; GError * err = NULL; CODE: keys = g_new0 (char *, items - 1); for (i = 1; i < items; i++) keys[i-1] = SvPV_nolen (ST (i)); RETVAL = gconf_engine_change_set_from_currentv (engine, (const gchar **) keys, &err); g_free(keys); if (err) gperl_croak_gerror (NULL, err); OUTPUT: RETVAL