summaryrefslogtreecommitdiff
path: root/source4/lib/registry/reg_backend_gconf.c
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2004-12-10 20:07:04 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:06:29 -0500
commit444a86792471c0bef33dde15c7a4a33e16a951b4 (patch)
tree075b0cdd27acb80470a4e90e99598cbcea3b082c /source4/lib/registry/reg_backend_gconf.c
parent60c69445f6fa86b27bd697cc8af52b582f620725 (diff)
downloadsamba-444a86792471c0bef33dde15c7a4a33e16a951b4.tar.gz
samba-444a86792471c0bef33dde15c7a4a33e16a951b4.tar.bz2
samba-444a86792471c0bef33dde15c7a4a33e16a951b4.zip
r4132: - Bunch of rather large fixes in the registry
- Added some README files Not everything works yet, e.g. the EnumValue test appears to be broken. (This used to be commit c169e86c1f52763b83e77e509f89cb91f9b69071)
Diffstat (limited to 'source4/lib/registry/reg_backend_gconf.c')
-rw-r--r--source4/lib/registry/reg_backend_gconf.c193
1 files changed, 193 insertions, 0 deletions
diff --git a/source4/lib/registry/reg_backend_gconf.c b/source4/lib/registry/reg_backend_gconf.c
new file mode 100644
index 0000000000..2fed2417b7
--- /dev/null
+++ b/source4/lib/registry/reg_backend_gconf.c
@@ -0,0 +1,193 @@
+/*
+ Unix SMB/CIFS implementation.
+ Registry interface
+ Copyright (C) Jelmer Vernooij 2004.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "registry.h"
+#include <gconf/gconf-client.h>
+
+static WERROR gerror_to_werror(GError *error)
+{
+ if(error == NULL) return WERR_OK;
+ /* FIXME */
+ return WERR_FOOBAR;
+}
+
+static WERROR reg_open_gconf_hive(struct registry_hive *h, struct registry_key **k)
+{
+ g_type_init();
+ h->backend_data = (void *)gconf_client_get_default();
+ if(!h->backend_data) return WERR_FOOBAR;
+
+ *k = talloc_p(h, struct registry_key);
+ (*k)->name = talloc_strdup(*k, "");
+ (*k)->path = talloc_strdup(*k, "");
+ (*k)->backend_data = talloc_strdup(*k, "/");
+ return WERR_OK;
+}
+
+static WERROR gconf_open_key (TALLOC_CTX *mem_ctx, struct registry_hive *h, const char *name, struct registry_key **key)
+{
+ struct registry_key *ret;
+ char *fullpath;
+
+ fullpath = talloc_asprintf(mem_ctx, "/%s", reg_path_win2unix(talloc_strdup(mem_ctx, name)));
+
+ /* Check if key exists */
+ if(!gconf_client_dir_exists((GConfClient *)h->backend_data, fullpath, NULL)) {
+ return WERR_DEST_NOT_FOUND;
+ }
+
+ ret = talloc_p(mem_ctx, struct registry_key);
+ ret->backend_data = fullpath;
+
+ *key = ret;
+ return WERR_OK;
+}
+
+static WERROR gconf_get_value_by_id(TALLOC_CTX *mem_ctx, struct registry_key *p, int idx, struct registry_value **val)
+{
+ GSList *entries;
+ GSList *cur;
+ GConfEntry *entry;
+ GConfValue *value;
+ struct registry_value *newval;
+ char *fullpath = p->backend_data;
+ int i;
+ cur = entries = gconf_client_all_entries((GConfClient*)p->hive->backend_data, fullpath, NULL);
+
+ for(i = 0; i < idx && cur; i++) cur = cur->next;
+
+ if(!cur) return WERR_NO_MORE_ITEMS;
+
+ entry = cur->data;
+ value = gconf_entry_get_value(entry);
+
+ newval = talloc_p(mem_ctx, struct registry_value);
+ newval->name = talloc_strdup(mem_ctx, strrchr(gconf_entry_get_key(entry), '/')+1);
+ if(value) {
+ switch(value->type) {
+ case GCONF_VALUE_INVALID:
+ newval->data_type = REG_NONE;
+ break;
+
+ case GCONF_VALUE_STRING:
+ newval->data_type = REG_SZ;
+ newval->data_blk = talloc_strdup(mem_ctx, gconf_value_get_string(value));
+ newval->data_len = strlen(newval->data_blk);
+ break;
+
+ case GCONF_VALUE_INT:
+ newval->data_type = REG_DWORD;
+ newval->data_blk = talloc_p(mem_ctx, long);
+ *((long *)newval->data_blk) = gconf_value_get_int(value);
+ newval->data_len = sizeof(long);
+ break;
+
+ case GCONF_VALUE_FLOAT:
+ newval->data_blk = talloc_p(mem_ctx, double);
+ newval->data_type = REG_BINARY;
+ *((double *)newval->data_blk) = gconf_value_get_float(value);
+ newval->data_len = sizeof(double);
+ break;
+
+ case GCONF_VALUE_BOOL:
+ newval->data_blk = talloc_p(mem_ctx, BOOL);
+ newval->data_type = REG_BINARY;
+ *((BOOL *)newval->data_blk) = gconf_value_get_bool(value);
+ newval->data_len = sizeof(BOOL);
+ break;
+
+ default:
+ newval->data_type = REG_NONE;
+ DEBUG(0, ("Not implemented..\n"));
+ break;
+ }
+ } else newval->data_type = REG_NONE;
+
+ g_slist_free(entries);
+ *val = newval;
+ return WERR_OK;
+}
+
+static WERROR gconf_get_subkey_by_id(TALLOC_CTX *mem_ctx, struct registry_key *p, int idx, struct registry_key **sub)
+{
+ GSList *dirs;
+ GSList *cur;
+ int i;
+ char *fullpath = p->backend_data;
+ cur = dirs = gconf_client_all_dirs((GConfClient*)p->hive->backend_data, fullpath,NULL);
+
+ for(i = 0; i < idx && cur; i++) cur = cur->next;
+
+ if(!cur) return WERR_NO_MORE_ITEMS;
+
+ *sub = talloc_p(mem_ctx, struct registry_key);
+ (*sub)->name = talloc_strdup(mem_ctx, strrchr((char *)cur->data, '/')+1);
+ (*sub)->backend_data = talloc_strdup(mem_ctx, cur->data);
+
+ g_slist_free(dirs);
+ return WERR_OK;
+}
+
+static WERROR gconf_set_value(struct registry_key *key, const char *valname, int type, void *data, int len)
+{
+ GError *error = NULL;
+ char *valpath;
+ asprintf(&valpath, "%s/%s", key->path, valname);
+
+ switch(type) {
+ case REG_SZ:
+ case REG_EXPAND_SZ:
+ gconf_client_set_string((GConfClient *)key->hive->backend_data, valpath, data, &error);
+ SAFE_FREE(valpath);
+ return gerror_to_werror(error);
+
+ case REG_DWORD:
+ gconf_client_set_int((GConfClient *)key->hive->backend_data, valpath,
+ *((int *)data), &error);
+ SAFE_FREE(valpath);
+ return gerror_to_werror(error);
+ default:
+ DEBUG(0, ("Unsupported type: %d\n", type));
+ SAFE_FREE(valpath);
+ return WERR_NOT_SUPPORTED;
+ }
+
+ return WERR_NOT_SUPPORTED;
+}
+
+static struct hive_operations reg_backend_gconf = {
+ .name = "gconf",
+ .open_hive = reg_open_gconf_hive,
+ .open_key = gconf_open_key,
+ .get_subkey_by_index = gconf_get_subkey_by_id,
+ .get_value_by_index = gconf_get_value_by_id,
+ .set_value = gconf_set_value,
+
+ /* Note:
+ * since GConf uses schemas for what keys and values are allowed, there
+ * is no way of 'emulating' add_key and del_key here.
+ */
+};
+
+NTSTATUS registry_gconf_init(void)
+{
+ return registry_register(&reg_backend_gconf);
+}