2
* Copyright (C) 1999, 2000 Red Hat Inc.
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Library General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Library General Public License for more details.
14
* You should have received a copy of the GNU Library General Public
15
* License along with this library; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
23
#include "gconf-internals.h"
24
#include "gconf-sources.h"
25
#include "gconf-locale.h"
31
#include <sys/types.h>
35
#include <liboaf/liboaf.h>
37
/* Returns TRUE if there was an error, frees exception, sets err */
38
static gboolean gconf_handle_corba_exception(CORBA_Environment* ev, GError** err);
39
/* just returns TRUE if there's an exception indicating the server is
40
probably hosed; no side effects */
41
static gboolean gconf_server_broken(CORBA_Environment* ev);
43
/* Maximum number of times to try re-spawning the server if it's down. */
47
gconf_key_check(const gchar* key, GError** err)
51
if (!gconf_valid_key(key, &why))
54
*err = gconf_error_new(GCONF_ERROR_BAD_KEY, _("`%s': %s"),
62
typedef struct _CnxnTable CnxnTable;
67
ConfigDatabase database;
71
/* If non-NULL, this is a local engine;
72
local engines don't do notification! */
73
GConfSources* local_sources;
75
/* An address if this is not the default engine;
76
* NULL if it's the default
81
GDestroyNotify dnotify;
85
/* If TRUE, this is a local engine (and therefore
86
* has no ctable and no notifications)
91
typedef struct _GConfCnxn GConfCnxn;
94
gchar* namespace_section;
96
CORBA_unsigned_long server_id; /* id returned from server */
97
GConfEngine* conf; /* engine we're associated with */
102
static GConfEngine *default_engine = NULL;
104
static GConfCnxn* gconf_cnxn_new (GConfEngine *conf,
105
const gchar *namespace_section,
106
CORBA_unsigned_long server_id,
107
GConfNotifyFunc func,
109
static void gconf_cnxn_destroy (GConfCnxn *cnxn);
110
static void gconf_cnxn_notify (GConfCnxn *cnxn,
114
static ConfigServer gconf_get_config_server (gboolean start_if_not_found,
117
/* Forget our current server object reference, so the next call to
118
gconf_get_config_server will have to try to respawn the server */
119
static void gconf_detach_config_server (void);
120
static ConfigListener gconf_get_config_listener (void);
122
static void gconf_engine_detach (GConfEngine *conf);
123
static gboolean gconf_engine_connect (GConfEngine *conf,
124
gboolean start_if_not_found,
126
static void gconf_engine_set_database (GConfEngine *conf,
128
static ConfigDatabase gconf_engine_get_database (GConfEngine *conf,
129
gboolean start_if_not_found,
133
static void register_engine (GConfEngine *conf);
134
static void unregister_engine (GConfEngine *conf);
135
static GConfEngine *lookup_engine (const gchar *address);
136
static GConfEngine *lookup_engine_by_database (ConfigDatabase db);
139
/* We'll use client-specific connection numbers to return to library
140
users, so if gconfd dies we can transparently re-register all our
141
listener functions. */
144
/* Hash from server-returned connection ID to GConfCnxn */
145
GHashTable* server_ids;
146
/* Hash from our connection ID to GConfCnxn */
147
GHashTable* client_ids;
150
static CnxnTable* ctable_new (void);
151
static void ctable_destroy (CnxnTable *ct);
152
static void ctable_insert (CnxnTable *ct,
154
static void ctable_remove (CnxnTable *ct,
156
static GSList* ctable_remove_by_conf (CnxnTable *ct,
158
static GConfCnxn* ctable_lookup_by_client_id (CnxnTable *ct,
160
static GConfCnxn* ctable_lookup_by_server_id (CnxnTable *ct,
161
CORBA_unsigned_long server_id);
162
static void ctable_reinstall (CnxnTable *ct,
165
guint new_server_id);
169
gconf_engine_blank (gboolean remote)
173
conf = g_new0(GConfEngine, 1);
179
conf->database = CORBA_OBJECT_NIL;
180
conf->ctable = ctable_new();
181
conf->local_sources = NULL;
182
conf->is_local = FALSE;
183
conf->is_default = TRUE;
187
conf->database = CORBA_OBJECT_NIL;
189
conf->local_sources = NULL;
190
conf->is_local = TRUE;
191
conf->is_default = FALSE;
197
static GHashTable *engines_by_db = NULL;
200
lookup_engine_by_database (ConfigDatabase db)
203
return g_hash_table_lookup (engines_by_db, db);
208
/* This takes ownership of the ConfigDatabase */
210
gconf_engine_set_database (GConfEngine *conf,
213
gconf_engine_detach (conf);
217
if (engines_by_db == NULL)
218
engines_by_db = g_hash_table_new ((GHashFunc) g_CORBA_Object_hash,
219
(GCompareFunc) g_CORBA_Object_equal);
221
g_hash_table_insert (engines_by_db, conf->database, conf);
225
gconf_engine_detach (GConfEngine *conf)
227
CORBA_Environment ev;
229
CORBA_exception_init (&ev);
231
if (!CORBA_Object_is_nil (conf->database, &ev))
233
g_hash_table_remove (engines_by_db, conf->database);
235
CORBA_Object_release (conf->database, &ev);
236
conf->database = CORBA_OBJECT_NIL;
241
gconf_engine_connect (GConfEngine *conf,
242
gboolean start_if_not_found,
248
CORBA_Environment ev;
250
g_return_val_if_fail (!conf->is_local, TRUE);
252
CORBA_exception_init(&ev);
254
if (!CORBA_Object_is_nil (conf->database, &ev))
259
cs = gconf_get_config_server(start_if_not_found, err);
261
if (cs == CORBA_OBJECT_NIL)
262
return FALSE; /* Error should already be set */
264
if (conf->is_default)
265
db = ConfigServer_get_default_database (cs, &ev);
267
db = ConfigServer_get_database (cs, conf->address, &ev);
269
if (gconf_server_broken(&ev))
271
if (tries < MAX_RETRIES)
274
CORBA_exception_free(&ev);
275
gconf_detach_config_server();
280
if (gconf_handle_corba_exception(&ev, err))
283
if (CORBA_Object_is_nil (db, &ev))
286
*err = gconf_error_new(GCONF_ERROR_BAD_ADDRESS,
287
_("Server couldn't resolve the address `%s'"),
288
conf->address ? conf->address : "default");
293
gconf_engine_set_database (conf, db);
298
static ConfigDatabase
299
gconf_engine_get_database (GConfEngine *conf,
300
gboolean start_if_not_found,
303
if (!gconf_engine_connect (conf, start_if_not_found, err))
304
return CORBA_OBJECT_NIL;
306
return conf->database;
310
gconf_engine_is_local(GConfEngine* conf)
312
return conf->is_local;
315
static GHashTable *engines_by_address = NULL;
318
register_engine (GConfEngine *conf)
320
g_return_if_fail (conf->address != NULL);
322
if (engines_by_address == NULL)
323
engines_by_address = g_hash_table_new (g_str_hash, g_str_equal);
325
g_hash_table_insert (engines_by_address, conf->address, conf);
329
unregister_engine (GConfEngine *conf)
331
g_return_if_fail (conf->address != NULL);
332
g_return_if_fail (engines_by_address != NULL);
334
g_hash_table_remove (engines_by_address, conf->address);
336
if (g_hash_table_size (engines_by_address) == 0)
338
g_hash_table_destroy (engines_by_address);
340
engines_by_address = NULL;
345
lookup_engine (const gchar *address)
347
if (engines_by_address)
348
return g_hash_table_lookup (engines_by_address, address);
359
gconf_engine_get_local (const gchar* address,
365
g_return_val_if_fail(address != NULL, NULL);
366
g_return_val_if_fail(err == NULL || *err == NULL, NULL);
368
source = gconf_resolve_address(address, err);
373
conf = gconf_engine_blank(FALSE);
375
conf->local_sources = gconf_sources_new_from_source(source);
377
g_assert (gconf_engine_is_local (conf));
383
gconf_engine_get_default (void)
385
GConfEngine* conf = NULL;
388
conf = default_engine;
392
conf = gconf_engine_blank(TRUE);
394
conf->is_default = TRUE;
396
default_engine = conf;
398
/* Ignore errors, we never return a NULL
401
gconf_engine_connect (conf, TRUE, NULL);
410
gconf_engine_get_for_address (const gchar* address, GError** err)
414
g_warning("Non-default configuration sources currently do not support change-notification, and are not yet recommended for use in applications.");
416
conf = lookup_engine (address);
420
conf = gconf_engine_blank(TRUE);
422
conf->is_default = FALSE;
423
conf->address = g_strdup (address);
425
if (!gconf_engine_connect (conf, TRUE, err))
427
gconf_engine_unref (conf);
431
register_engine (conf);
440
gconf_engine_ref (GConfEngine* conf)
442
g_return_if_fail(conf != NULL);
443
g_return_if_fail(conf->refcount > 0);
449
gconf_engine_unref (GConfEngine* conf)
451
g_return_if_fail(conf != NULL);
452
g_return_if_fail(conf->refcount > 0);
456
if (conf->refcount == 0)
458
if (gconf_engine_is_local(conf))
460
if (conf->local_sources != NULL)
461
gconf_sources_free(conf->local_sources);
465
/* Remove all connections associated with this GConf */
468
CORBA_Environment ev;
470
CORBA_exception_init(&ev);
472
/* FIXME CnxnTable only has entries for this GConfEngine now,
473
* it used to be global and shared among GConfEngine objects.
475
removed = ctable_remove_by_conf (conf->ctable, conf);
480
GConfCnxn* gcnxn = tmp->data;
482
if (!CORBA_Object_is_nil (conf->database, &ev))
486
ConfigDatabase_remove_listener(conf->database,
490
if (gconf_handle_corba_exception(&ev, &err))
492
/* Don't set error because realistically this
493
doesn't matter to clients */
494
#ifdef GCONF_ENABLE_DEBUG
495
g_warning("Failure removing listener %u from the config server: %s",
496
(guint)gcnxn->server_id,
502
gconf_cnxn_destroy(gcnxn);
504
tmp = g_slist_next(tmp);
507
g_slist_free(removed);
511
(* conf->dnotify) (conf->user_data);
514
/* do this after removing the notifications,
515
to avoid funky race conditions */
517
unregister_engine (conf);
519
/* Release the ConfigDatabase */
520
gconf_engine_detach (conf);
522
ctable_destroy (conf->ctable);
525
if (conf == default_engine)
526
default_engine = NULL;
533
gconf_engine_set_user_data (GConfEngine *engine,
535
GDestroyNotify dnotify)
539
(* engine->dnotify) (engine->user_data);
542
engine->dnotify = dnotify;
543
engine->user_data = data;
547
gconf_engine_get_user_data (GConfEngine *engine)
549
return engine->user_data;
553
gconf_engine_notify_add(GConfEngine* conf,
554
const gchar* namespace_section,
555
GConfNotifyFunc func,
562
CORBA_Environment ev;
566
g_return_val_if_fail(!gconf_engine_is_local(conf), 0);
568
if (gconf_engine_is_local(conf))
571
*err = gconf_error_new(GCONF_ERROR_LOCAL_ENGINE,
572
_("Can't add notifications to a local configuration source"));
577
CORBA_exception_init(&ev);
581
db = gconf_engine_get_database (conf, TRUE, err);
583
if (db == CORBA_OBJECT_NIL)
586
cl = gconf_get_config_listener ();
588
/* Should have aborted the program in this case probably */
589
g_return_val_if_fail(cl != CORBA_OBJECT_NIL, 0);
591
id = ConfigDatabase_add_listener(db,
592
(gchar*)namespace_section,
595
if (gconf_server_broken(&ev))
597
if (tries < MAX_RETRIES)
600
CORBA_exception_free(&ev);
601
gconf_engine_detach (conf);
606
if (gconf_handle_corba_exception(&ev, err))
609
cnxn = gconf_cnxn_new(conf, namespace_section, id, func, user_data);
611
ctable_insert(conf->ctable, cnxn);
613
return cnxn->client_id;
617
gconf_engine_notify_remove(GConfEngine* conf,
621
CORBA_Environment ev;
625
if (gconf_engine_is_local(conf))
628
CORBA_exception_init(&ev);
632
db = gconf_engine_get_database (conf, TRUE, NULL);
634
if (db == CORBA_OBJECT_NIL)
637
gcnxn = ctable_lookup_by_client_id(conf->ctable, client_id);
639
g_return_if_fail(gcnxn != NULL);
641
ConfigDatabase_remove_listener(db,
645
if (gconf_server_broken(&ev))
647
if (tries < MAX_RETRIES)
650
CORBA_exception_free(&ev);
651
gconf_engine_detach (conf);
656
if (gconf_handle_corba_exception(&ev, NULL))
662
/* We want to do this even if the CORBA fails, so if we restart gconfd and
663
reinstall listeners we don't reinstall this one. */
664
ctable_remove(conf->ctable, gcnxn);
666
gconf_cnxn_destroy(gcnxn);
670
gconf_engine_get_fuller (GConfEngine *conf,
673
gboolean use_schema_default,
674
gboolean *is_default_p,
675
gboolean *is_writable_p,
676
gchar **schema_name_p,
681
CORBA_Environment ev;
684
CORBA_boolean is_default = FALSE;
685
CORBA_boolean is_writable = TRUE;
686
CORBA_char *corba_schema_name = NULL;
688
g_return_val_if_fail(conf != NULL, NULL);
689
g_return_val_if_fail(key != NULL, NULL);
690
g_return_val_if_fail(err == NULL || *err == NULL, NULL);
692
if (!gconf_key_check(key, err))
695
if (gconf_engine_is_local(conf))
698
gboolean tmp_is_default = FALSE;
699
gboolean tmp_is_writable = TRUE;
700
gchar *tmp_schema_name = NULL;
702
locale_list = gconf_split_locale(locale);
704
val = gconf_sources_query_value(conf->local_sources,
706
(const gchar**)locale_list,
710
schema_name_p ? &tmp_schema_name : NULL,
713
if (locale_list != NULL)
714
g_strfreev(locale_list);
717
*is_default_p = tmp_is_default;
720
*is_writable_p = tmp_is_writable;
723
*schema_name_p = tmp_schema_name;
725
g_free (tmp_schema_name);
730
g_assert(!gconf_engine_is_local(conf));
732
CORBA_exception_init(&ev);
736
db = gconf_engine_get_database (conf, TRUE, err);
738
if (db == CORBA_OBJECT_NIL)
740
g_return_val_if_fail(err == NULL || *err != NULL, NULL);
746
*schema_name_p = NULL;
749
corba_schema_name = NULL;
750
cv = ConfigDatabase2_lookup_with_schema_name (db,
751
(gchar*)key, (gchar*)
752
(locale ? locale : gconf_current_locale()),
759
if (ev._major == CORBA_SYSTEM_EXCEPTION &&
760
CORBA_exception_id (&ev) &&
761
strcmp (CORBA_exception_id (&ev), "IDL:CORBA/BAD_OPERATION:1.0") == 0)
763
CORBA_exception_free (&ev);
764
CORBA_exception_init (&ev);
766
cv = ConfigDatabase_lookup_with_locale(db,
767
(gchar*)key, (gchar*)
768
(locale ? locale : gconf_current_locale()),
775
if (gconf_server_broken(&ev))
777
if (tries < MAX_RETRIES)
780
CORBA_exception_free(&ev);
781
gconf_engine_detach (conf);
786
if (gconf_handle_corba_exception(&ev, err))
788
/* NOTE: don't free cv since we got an exception! */
793
val = gconf_value_from_corba_value(cv);
797
*is_default_p = !!is_default;
799
*is_writable_p = !!is_writable;
801
/* we can't get a null pointer through corba
802
* so the server sent us an empty string
804
if (corba_schema_name && corba_schema_name[0] != '/')
806
CORBA_free (corba_schema_name);
807
corba_schema_name = NULL;
811
*schema_name_p = g_strdup (corba_schema_name);
813
if (corba_schema_name)
814
CORBA_free (corba_schema_name);
822
gconf_engine_get_full (GConfEngine *conf,
825
gboolean use_schema_default,
826
gboolean *is_default_p,
827
gboolean *is_writable_p,
830
return gconf_engine_get_fuller (conf, key, locale, use_schema_default,
831
is_default_p, is_writable_p,
836
gconf_engine_get_entry(GConfEngine* conf,
839
gboolean use_schema_default,
842
gboolean is_writable = TRUE;
843
gboolean is_default = FALSE;
851
val = gconf_engine_get_fuller (conf, key, locale, use_schema_default,
852
&is_default, &is_writable,
853
&schema_name, &error);
856
g_propagate_error (err, error);
860
entry = gconf_entry_new_nocopy (g_strdup (key),
863
entry->is_default = is_default;
864
entry->is_writable = is_writable;
865
entry->schema_name = schema_name; /* transfer memory ownership */
871
gconf_engine_get (GConfEngine* conf, const gchar* key, GError** err)
873
return gconf_engine_get_with_locale(conf, key, NULL, err);
877
gconf_engine_get_with_locale(GConfEngine* conf, const gchar* key,
881
return gconf_engine_get_full(conf, key, locale, TRUE,
886
gconf_engine_get_without_default(GConfEngine* conf, const gchar* key,
889
return gconf_engine_get_full(conf, key, NULL, FALSE, NULL, NULL, err);
893
gconf_engine_get_default_from_schema (GConfEngine* conf,
899
CORBA_Environment ev;
903
g_return_val_if_fail(conf != NULL, NULL);
904
g_return_val_if_fail(key != NULL, NULL);
905
g_return_val_if_fail(err == NULL || *err == NULL, NULL);
907
if (!gconf_key_check(key, err))
910
if (gconf_engine_is_local(conf))
914
locale_list = gconf_split_locale(gconf_current_locale());
916
val = gconf_sources_query_default_value(conf->local_sources,
918
(const gchar**)locale_list,
922
if (locale_list != NULL)
923
g_strfreev(locale_list);
928
g_assert(!gconf_engine_is_local(conf));
930
CORBA_exception_init(&ev);
934
db = gconf_engine_get_database (conf, TRUE, err);
936
if (db == CORBA_OBJECT_NIL)
938
g_return_val_if_fail(err == NULL || *err != NULL, NULL);
943
cv = ConfigDatabase_lookup_default_value(db,
945
(gchar*)gconf_current_locale(),
948
if (gconf_server_broken(&ev))
950
if (tries < MAX_RETRIES)
953
CORBA_exception_free(&ev);
954
gconf_engine_detach (conf);
959
if (gconf_handle_corba_exception(&ev, err))
961
/* NOTE: don't free cv since we got an exception! */
966
val = gconf_value_from_corba_value(cv);
974
gconf_engine_set (GConfEngine* conf, const gchar* key,
975
GConfValue* value, GError** err)
978
CORBA_Environment ev;
982
g_return_val_if_fail(conf != NULL, FALSE);
983
g_return_val_if_fail(key != NULL, FALSE);
984
g_return_val_if_fail(value != NULL, FALSE);
985
g_return_val_if_fail(value->type != GCONF_VALUE_INVALID, FALSE);
986
g_return_val_if_fail( (value->type != GCONF_VALUE_STRING) ||
987
(gconf_value_get_string(value) != NULL) , FALSE );
988
g_return_val_if_fail( (value->type != GCONF_VALUE_LIST) ||
989
(gconf_value_get_list_type(value) != GCONF_VALUE_INVALID), FALSE);
990
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
992
if (!gconf_key_check(key, err))
995
if (!gconf_value_validate (value, err))
998
if (gconf_engine_is_local(conf))
1000
GError* error = NULL;
1002
gconf_sources_set_value(conf->local_sources, key, value, &error);
1010
g_error_free(error);
1018
g_assert(!gconf_engine_is_local(conf));
1020
CORBA_exception_init(&ev);
1024
db = gconf_engine_get_database (conf, TRUE, err);
1026
if (db == CORBA_OBJECT_NIL)
1028
g_return_val_if_fail(err == NULL || *err != NULL, FALSE);
1033
cv = corba_value_from_gconf_value(value);
1035
ConfigDatabase_set(db,
1041
if (gconf_server_broken(&ev))
1043
if (tries < MAX_RETRIES)
1046
CORBA_exception_free(&ev);
1047
gconf_engine_detach (conf);
1052
if (gconf_handle_corba_exception(&ev, err))
1055
g_return_val_if_fail(*err == NULL, FALSE);
1061
gconf_engine_unset(GConfEngine* conf, const gchar* key, GError** err)
1063
CORBA_Environment ev;
1067
g_return_val_if_fail(conf != NULL, FALSE);
1068
g_return_val_if_fail(key != NULL, FALSE);
1069
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
1071
if (!gconf_key_check(key, err))
1074
if (gconf_engine_is_local(conf))
1076
GError* error = NULL;
1078
gconf_sources_unset_value(conf->local_sources, key, NULL, &error);
1086
g_error_free(error);
1094
g_assert(!gconf_engine_is_local(conf));
1096
CORBA_exception_init(&ev);
1100
db = gconf_engine_get_database (conf, TRUE, err);
1102
if (db == CORBA_OBJECT_NIL)
1104
g_return_val_if_fail(err == NULL || *err != NULL, FALSE);
1109
ConfigDatabase_unset(db,
1113
if (gconf_server_broken(&ev))
1115
if (tries < MAX_RETRIES)
1118
CORBA_exception_free(&ev);
1119
gconf_engine_detach(conf);
1124
if (gconf_handle_corba_exception(&ev, err))
1127
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
1133
gconf_engine_associate_schema (GConfEngine* conf, const gchar* key,
1134
const gchar* schema_key, GError** err)
1136
CORBA_Environment ev;
1140
g_return_val_if_fail(conf != NULL, FALSE);
1141
g_return_val_if_fail(key != NULL, FALSE);
1142
g_return_val_if_fail(schema_key != NULL, FALSE);
1143
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
1145
if (!gconf_key_check(key, err))
1148
if (!gconf_key_check(schema_key, err))
1151
if (gconf_engine_is_local(conf))
1153
GError* error = NULL;
1155
gconf_sources_set_schema(conf->local_sources, key, schema_key, &error);
1163
g_error_free(error);
1171
g_assert(!gconf_engine_is_local(conf));
1173
CORBA_exception_init(&ev);
1177
db = gconf_engine_get_database(conf, TRUE, err);
1179
if (db == CORBA_OBJECT_NIL)
1181
g_return_val_if_fail(err == NULL || *err != NULL, FALSE);
1186
ConfigDatabase_set_schema(db,
1191
if (gconf_server_broken(&ev))
1193
if (tries < MAX_RETRIES)
1196
CORBA_exception_free(&ev);
1197
gconf_engine_detach (conf);
1202
if (gconf_handle_corba_exception(&ev, err))
1205
g_return_val_if_fail(*err == NULL, FALSE);
1212
qualify_entries (GSList *entries, const char *dir)
1214
GSList *tmp = entries;
1217
GConfEntry *entry = tmp->data;
1220
full = gconf_concat_dir_and_key (dir, entry->key);
1222
g_free (entry->key);
1225
tmp = g_slist_next (tmp);
1230
gconf_engine_all_entries(GConfEngine* conf, const gchar* dir, GError** err)
1232
GSList* pairs = NULL;
1233
ConfigDatabase_ValueList* values;
1234
ConfigDatabase_KeyList* keys;
1235
ConfigDatabase_IsDefaultList* is_defaults;
1236
ConfigDatabase_IsWritableList* is_writables;
1237
ConfigDatabase2_SchemaNameList *schema_names;
1238
CORBA_Environment ev;
1243
g_return_val_if_fail(conf != NULL, NULL);
1244
g_return_val_if_fail(dir != NULL, NULL);
1245
g_return_val_if_fail(err == NULL || *err == NULL, NULL);
1247
if (!gconf_key_check(dir, err))
1251
if (gconf_engine_is_local(conf))
1253
GError* error = NULL;
1254
gchar** locale_list;
1257
locale_list = gconf_split_locale(gconf_current_locale());
1259
retval = gconf_sources_all_entries(conf->local_sources,
1261
(const gchar**)locale_list,
1265
g_strfreev(locale_list);
1273
g_error_free(error);
1276
g_assert(retval == NULL);
1281
qualify_entries (retval, dir);
1286
g_assert(!gconf_engine_is_local(conf));
1288
CORBA_exception_init(&ev);
1292
db = gconf_engine_get_database (conf, TRUE, err);
1294
if (db == CORBA_OBJECT_NIL)
1296
g_return_val_if_fail(err == NULL || *err != NULL, NULL);
1301
schema_names = NULL;
1303
ConfigDatabase2_all_entries_with_schema_name (db,
1305
(gchar*)gconf_current_locale(),
1306
&keys, &values, &schema_names,
1307
&is_defaults, &is_writables,
1310
if (ev._major == CORBA_SYSTEM_EXCEPTION &&
1311
CORBA_exception_id (&ev) &&
1312
strcmp (CORBA_exception_id (&ev), "IDL:CORBA/BAD_OPERATION:1.0") == 0)
1314
CORBA_exception_free (&ev);
1315
CORBA_exception_init (&ev);
1317
ConfigDatabase_all_entries(db,
1319
(gchar*)gconf_current_locale(),
1320
&keys, &values, &is_defaults, &is_writables,
1324
if (gconf_server_broken(&ev))
1326
if (tries < MAX_RETRIES)
1329
CORBA_exception_free(&ev);
1330
gconf_engine_detach (conf);
1335
if (gconf_handle_corba_exception(&ev, err))
1338
if (keys->_length != values->_length)
1340
g_warning("Received unmatched key/value sequences in %s",
1346
while (i < keys->_length)
1351
gconf_entry_new_nocopy(gconf_concat_dir_and_key (dir, keys->_buffer[i]),
1352
gconf_value_from_corba_value(&(values->_buffer[i])));
1354
/* note, there's an accesor function for setting this that we are
1355
cheating and not using */
1356
pair->is_default = is_defaults->_buffer[i];
1357
pair->is_writable = is_writables->_buffer[i];
1360
/* empty string means no schema name */
1361
if (*(schema_names->_buffer[i]) != '\0')
1362
pair->schema_name = g_strdup (schema_names->_buffer[i]);
1365
pairs = g_slist_prepend(pairs, pair);
1372
CORBA_free(is_defaults);
1373
CORBA_free(is_writables);
1375
CORBA_free (schema_names);
1381
gconf_engine_all_dirs(GConfEngine* conf, const gchar* dir, GError** err)
1383
GSList* subdirs = NULL;
1384
ConfigDatabase_KeyList* keys;
1385
CORBA_Environment ev;
1390
g_return_val_if_fail(conf != NULL, NULL);
1391
g_return_val_if_fail(dir != NULL, NULL);
1392
g_return_val_if_fail(err == NULL || *err == NULL, NULL);
1394
if (!gconf_key_check(dir, err))
1397
if (gconf_engine_is_local(conf))
1399
GError* error = NULL;
1402
retval = gconf_sources_all_dirs(conf->local_sources,
1412
g_error_free(error);
1415
g_assert(retval == NULL);
1420
qualify_entries (retval, dir);
1425
g_assert(!gconf_engine_is_local(conf));
1427
CORBA_exception_init(&ev);
1431
db = gconf_engine_get_database (conf, TRUE, err);
1433
if (db == CORBA_OBJECT_NIL)
1435
g_return_val_if_fail(((err == NULL) || (*err && ((*err)->code == GCONF_ERROR_NO_SERVER))), NULL);
1440
ConfigDatabase_all_dirs(db,
1445
if (gconf_server_broken(&ev))
1447
if (tries < MAX_RETRIES)
1450
CORBA_exception_free(&ev);
1451
gconf_engine_detach (conf);
1456
if (gconf_handle_corba_exception(&ev, err))
1460
while (i < keys->_length)
1464
s = gconf_concat_dir_and_key (dir, keys->_buffer[i]);
1466
subdirs = g_slist_prepend(subdirs, s);
1476
/* annoyingly, this is REQUIRED for local sources */
1478
gconf_engine_suggest_sync(GConfEngine* conf, GError** err)
1480
CORBA_Environment ev;
1484
g_return_if_fail(conf != NULL);
1485
g_return_if_fail(err == NULL || *err == NULL);
1487
if (gconf_engine_is_local(conf))
1489
GError* error = NULL;
1491
gconf_sources_sync_all(conf->local_sources,
1500
g_error_free(error);
1508
g_assert(!gconf_engine_is_local(conf));
1510
CORBA_exception_init(&ev);
1514
db = gconf_engine_get_database (conf, TRUE, err);
1516
if (db == CORBA_OBJECT_NIL)
1518
g_return_if_fail(err == NULL || *err != NULL);
1523
ConfigDatabase_sync(db, &ev);
1525
if (gconf_server_broken(&ev))
1527
if (tries < MAX_RETRIES)
1530
CORBA_exception_free(&ev);
1531
gconf_engine_detach (conf);
1536
if (gconf_handle_corba_exception(&ev, err))
1537
; /* nothing additional */
1541
gconf_clear_cache(GConfEngine* conf, GError** err)
1543
CORBA_Environment ev;
1547
g_return_if_fail(conf != NULL);
1548
g_return_if_fail(err == NULL || *err == NULL);
1550
if (gconf_engine_is_local(conf))
1552
GError* error = NULL;
1554
gconf_sources_clear_cache(conf->local_sources);
1562
g_error_free(error);
1570
g_assert(!gconf_engine_is_local(conf));
1572
CORBA_exception_init(&ev);
1576
db = gconf_engine_get_database (conf, TRUE, err);
1578
if (db == CORBA_OBJECT_NIL)
1580
g_return_if_fail(err == NULL || *err != NULL);
1585
ConfigDatabase_clear_cache(db, &ev);
1587
if (gconf_server_broken(&ev))
1589
if (tries < MAX_RETRIES)
1592
CORBA_exception_free(&ev);
1593
gconf_engine_detach (conf);
1598
if (gconf_handle_corba_exception(&ev, err))
1599
; /* nothing additional */
1603
gconf_synchronous_sync(GConfEngine* conf, GError** err)
1605
CORBA_Environment ev;
1609
g_return_if_fail(conf != NULL);
1610
g_return_if_fail(err == NULL || *err == NULL);
1612
if (gconf_engine_is_local(conf))
1614
GError* error = NULL;
1616
gconf_sources_sync_all(conf->local_sources, &error);
1624
g_error_free(error);
1632
g_assert(!gconf_engine_is_local(conf));
1634
CORBA_exception_init(&ev);
1638
db = gconf_engine_get_database (conf, TRUE, err);
1640
if (db == CORBA_OBJECT_NIL)
1642
g_return_if_fail(err == NULL || *err != NULL);
1647
ConfigDatabase_synchronous_sync(db, &ev);
1649
if (gconf_server_broken(&ev))
1651
if (tries < MAX_RETRIES)
1654
CORBA_exception_free(&ev);
1655
gconf_engine_detach (conf);
1660
if (gconf_handle_corba_exception(&ev, err))
1661
; /* nothing additional */
1665
gconf_engine_dir_exists(GConfEngine *conf, const gchar *dir, GError** err)
1667
CORBA_Environment ev;
1669
CORBA_boolean server_ret;
1672
g_return_val_if_fail(conf != NULL, FALSE);
1673
g_return_val_if_fail(dir != NULL, FALSE);
1674
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
1676
if (!gconf_key_check(dir, err))
1679
if (gconf_engine_is_local(conf))
1681
return gconf_sources_dir_exists(conf->local_sources,
1686
g_assert(!gconf_engine_is_local(conf));
1688
CORBA_exception_init(&ev);
1692
db = gconf_engine_get_database(conf, TRUE, err);
1694
if (db == CORBA_OBJECT_NIL)
1696
g_return_val_if_fail(err == NULL || *err != NULL, FALSE);
1701
server_ret = ConfigDatabase_dir_exists(db,
1705
if (gconf_server_broken(&ev))
1707
if (tries < MAX_RETRIES)
1710
CORBA_exception_free(&ev);
1711
gconf_engine_detach (conf);
1716
if (gconf_handle_corba_exception(&ev, err))
1719
return (server_ret == CORBA_TRUE);
1723
gconf_engine_remove_dir (GConfEngine* conf,
1727
CORBA_Environment ev;
1731
g_return_if_fail(conf != NULL);
1732
g_return_if_fail(dir != NULL);
1733
g_return_if_fail(err == NULL || *err == NULL);
1735
if (!gconf_key_check(dir, err))
1738
if (gconf_engine_is_local(conf))
1740
gconf_sources_remove_dir(conf->local_sources, dir, err);
1744
CORBA_exception_init(&ev);
1748
db = gconf_engine_get_database (conf, TRUE, err);
1750
if (db == CORBA_OBJECT_NIL)
1752
g_return_if_fail(err == NULL || *err != NULL);
1756
ConfigDatabase_remove_dir(db, (gchar*)dir, &ev);
1758
if (gconf_server_broken(&ev))
1760
if (tries < MAX_RETRIES)
1763
CORBA_exception_free(&ev);
1764
gconf_engine_detach (conf);
1768
gconf_handle_corba_exception(&ev, err);
1774
gconf_engine_key_is_writable (GConfEngine *conf,
1778
gboolean is_writable = TRUE;
1781
/* FIXME implement IDL to allow getting only writability
1782
* (not that urgent since GConfClient caches this crap
1786
val = gconf_engine_get_full(conf, key, NULL, TRUE,
1787
NULL, &is_writable, err);
1789
gconf_value_free (val);
1795
* Connection maintenance
1799
gconf_cnxn_new(GConfEngine* conf,
1800
const gchar* namespace_section,
1801
CORBA_unsigned_long server_id,
1802
GConfNotifyFunc func,
1806
static guint next_id = 1;
1808
cnxn = g_new0(GConfCnxn, 1);
1810
cnxn->namespace_section = g_strdup(namespace_section);
1812
cnxn->server_id = server_id;
1813
cnxn->client_id = next_id;
1815
cnxn->user_data = user_data;
1823
gconf_cnxn_destroy(GConfCnxn* cnxn)
1825
g_free(cnxn->namespace_section);
1830
gconf_cnxn_notify(GConfCnxn* cnxn,
1833
(*cnxn->func)(cnxn->conf, cnxn->client_id,
1842
static ConfigServer server = CORBA_OBJECT_NIL;
1844
/* errors in here should be GCONF_ERROR_NO_SERVER */
1846
try_to_contact_server (gboolean start_if_not_found, GError** err)
1848
CORBA_Environment ev;
1850
/* Try to launch server */
1851
server = gconf_activate_server (start_if_not_found,
1854
/* Try to ping server, by adding ourselves as a client */
1855
CORBA_exception_init (&ev);
1857
if (!CORBA_Object_is_nil (server, &ev))
1859
ConfigServer_add_client (server,
1860
gconf_get_config_listener (),
1863
if (ev._major != CORBA_NO_EXCEPTION)
1865
server = CORBA_OBJECT_NIL;
1867
*err = gconf_error_new(GCONF_ERROR_NO_SERVER,
1868
_("Adding client to server's list failed, CORBA error: %s"),
1869
CORBA_exception_id(&ev));
1871
CORBA_exception_free(&ev);
1875
#ifdef GCONF_ENABLE_DEBUG
1876
if (server == CORBA_OBJECT_NIL && start_if_not_found)
1878
g_return_val_if_fail(err == NULL || *err != NULL, server);
1885
/* All errors set in here should be GCONF_ERROR_NO_SERVER; should
1886
only set errors if start_if_not_found is TRUE */
1888
gconf_get_config_server(gboolean start_if_not_found, GError** err)
1890
g_return_val_if_fail(err == NULL || *err == NULL, server);
1892
if (server != CORBA_OBJECT_NIL)
1895
server = try_to_contact_server(start_if_not_found, err);
1897
return server; /* return what we have, NIL or not */
1901
gconf_detach_config_server(void)
1903
if (server != CORBA_OBJECT_NIL)
1905
CORBA_Environment ev;
1907
CORBA_exception_init(&ev);
1909
CORBA_Object_release(server, &ev);
1911
if (ev._major != CORBA_NO_EXCEPTION)
1913
g_warning("Exception releasing gconfd server object: %s",
1914
CORBA_exception_id(&ev));
1915
CORBA_exception_free(&ev);
1918
server = CORBA_OBJECT_NIL;
1922
ConfigListener listener = CORBA_OBJECT_NIL;
1923
static void notify (PortableServer_Servant servant,
1925
CORBA_unsigned_long cnxn,
1926
const CORBA_char *key,
1927
const ConfigValue *value,
1928
CORBA_boolean is_default,
1929
CORBA_boolean is_writable,
1930
CORBA_Environment *ev);
1931
static void ping (PortableServer_Servant _servant,
1932
CORBA_Environment *ev);
1933
static void update_listener (PortableServer_Servant _servant,
1935
const CORBA_char *address,
1936
const CORBA_unsigned_long old_cnxn,
1937
const CORBA_char *key,
1938
const CORBA_unsigned_long new_cnxn,
1939
CORBA_Environment *ev);
1940
static void invalidate_cached_values(PortableServer_Servant _servant,
1941
ConfigDatabase database,
1942
const ConfigListener_KeyList *keys,
1943
CORBA_Environment *ev);
1944
static void drop_all_caches (PortableServer_Servant _servant,
1945
CORBA_Environment *ev);
1949
static PortableServer_ServantBase__epv base_epv = {
1955
static POA_ConfigListener__epv listener_epv = {
1960
invalidate_cached_values,
1964
static POA_ConfigListener__vepv poa_listener_vepv = { &base_epv, &listener_epv };
1965
static POA_ConfigListener poa_listener_servant = { NULL, &poa_listener_vepv };
1968
notify(PortableServer_Servant servant,
1970
CORBA_unsigned_long server_id,
1971
const CORBA_char* key,
1972
const ConfigValue* value,
1973
CORBA_boolean is_default,
1974
CORBA_boolean is_writable,
1975
CORBA_Environment *ev)
1982
conf = lookup_engine_by_database (db);
1986
#ifdef GCONF_ENABLE_DEBUG
1987
g_warning ("Client received notify for unknown database object");
1992
cnxn = ctable_lookup_by_server_id(conf->ctable, server_id);
1996
#ifdef GCONF_ENABLE_DEBUG
1997
g_warning("Client received notify for unknown connection ID %u",
2003
gvalue = gconf_value_from_corba_value(value);
2005
entry = gconf_entry_new_nocopy (g_strdup (key),
2007
entry->is_default = is_default;
2008
entry->is_writable = is_writable;
2010
gconf_cnxn_notify(cnxn, entry);
2012
gconf_entry_free (entry);
2016
ping (PortableServer_Servant _servant, CORBA_Environment * ev)
2018
/* This one is easy :-) */
2024
update_listener (PortableServer_Servant _servant,
2026
const CORBA_char *address,
2027
const CORBA_unsigned_long old_cnxn_id,
2028
const CORBA_char *key,
2029
const CORBA_unsigned_long new_cnxn_id,
2030
CORBA_Environment *ev_ignored)
2034
CORBA_Environment ev;
2036
conf = lookup_engine_by_database (db);
2038
/* See if we have an old engine with a now-invalid object
2039
reference, and update its reference. */
2042
CORBA_exception_init (&ev);
2044
if (strcmp (address, "def") == 0)
2045
conf = default_engine;
2047
conf = lookup_engine (address);
2050
gconf_engine_set_database (conf,
2051
CORBA_Object_duplicate (db, &ev));
2056
#ifdef GCONF_ENABLE_DEBUG
2057
g_warning("Client received listener update for unknown database "
2058
"(this is not a big deal, this warning only appears if GConf is compiled with debugging)");
2063
cnxn = ctable_lookup_by_server_id (conf->ctable, old_cnxn_id);
2067
#ifdef GCONF_ENABLE_DEBUG
2068
g_warning("Client received listener update for unknown listener ID %u "
2069
"(this is not a big deal, this warning only appears if GConf is compiled with debugging)",
2070
(guint)old_cnxn_id);
2075
ctable_reinstall (conf->ctable, cnxn, old_cnxn_id, new_cnxn_id);
2079
invalidate_cached_values (PortableServer_Servant _servant,
2080
ConfigDatabase database,
2081
const ConfigListener_KeyList *keys,
2082
CORBA_Environment *ev)
2085
g_warning ("FIXME process %d received request to invalidate some cached GConf values from the server, but right now we don't know how to do that (not implemented).", (int) getpid());
2090
drop_all_caches (PortableServer_Servant _servant,
2091
CORBA_Environment *ev)
2094
g_warning ("FIXME process %d received request to invalidate all cached GConf values from the server, but right now we don't know how to do that (not implemented).", (int) getpid());
2098
static ConfigListener
2099
gconf_get_config_listener(void)
2101
g_return_val_if_fail (listener != CORBA_OBJECT_NIL, CORBA_OBJECT_NIL);
2105
static gboolean have_initted = FALSE;
2108
gconf_preinit(gpointer app, gpointer mod_info)
2113
gconf_postinit(gpointer app, gpointer mod_info)
2115
if (listener == CORBA_OBJECT_NIL)
2117
CORBA_Environment ev;
2118
PortableServer_ObjectId* objid;
2119
PortableServer_POA poa;
2121
CORBA_exception_init(&ev);
2122
POA_ConfigListener__init(&poa_listener_servant, &ev);
2124
g_assert (ev._major == CORBA_NO_EXCEPTION);
2126
poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(gconf_orb_get(), "RootPOA", &ev);
2128
g_assert (ev._major == CORBA_NO_EXCEPTION);
2130
PortableServer_POAManager_activate(PortableServer_POA__get_the_POAManager(poa, &ev), &ev);
2132
g_assert (ev._major == CORBA_NO_EXCEPTION);
2134
objid = PortableServer_POA_activate_object(poa, &poa_listener_servant, &ev);
2136
g_assert (ev._major == CORBA_NO_EXCEPTION);
2138
listener = PortableServer_POA_servant_to_reference(poa,
2139
&poa_listener_servant,
2142
g_assert (listener != CORBA_OBJECT_NIL);
2143
g_assert (ev._major == CORBA_NO_EXCEPTION);
2146
have_initted = TRUE;
2149
const char gconf_version[] = VERSION;
2151
struct poptOption gconf_options[] = {
2156
gconf_init (int argc, char **argv, GError** err)
2158
CORBA_ORB orb = CORBA_OBJECT_NIL;
2162
g_warning("Attempt to init GConf a second time");
2166
gconf_preinit(NULL, NULL);
2168
if (!oaf_is_initialized())
2170
orb = oaf_init(argc, argv);
2174
orb = gconf_orb_get();
2177
gconf_postinit(NULL, NULL);
2183
fprintf(stderr, _("Failed to init GConf, exiting\n"));
2193
gconf_is_initialized (void)
2195
return have_initted;
2199
* Ampersand and <> are not allowed due to the XML backend; shell
2200
* special characters aren't allowed; others are just in case we need
2201
* some magic characters someday. hyphen, underscore, period, colon
2202
* are allowed as separators. % disallowed to avoid printf confusion.
2205
/* Key/dir validity is exactly the same, except that '/' must be a dir,
2206
but we are sort of ignoring that for now. */
2208
static const gchar invalid_chars[] = " \t\r\n\"$&<>,+=#!()'|{}[]?~`;%\\";
2211
gconf_valid_key (const gchar* key, gchar** why_invalid)
2213
const gchar* s = key;
2214
gboolean just_saw_slash = FALSE;
2216
/* Key must start with the root */
2219
if (why_invalid != NULL)
2220
*why_invalid = g_strdup(_("Must begin with a slash (/)"));
2224
/* Root key is a valid dir */
2225
if (*key == '/' && key[1] == '\0')
2232
/* Can't have two slashes in a row, since it would mean
2234
* Can't have a period right after a slash,
2235
* because it would be a pain for filesystem-based backends.
2237
if (*s == '/' || *s == '.')
2239
if (why_invalid != NULL)
2242
*why_invalid = g_strdup(_("Can't have two slashes (/) in a row"));
2244
*why_invalid = g_strdup(_("Can't have a period (.) right after a slash (/)"));
2252
just_saw_slash = TRUE;
2256
const gchar* inv = invalid_chars;
2258
just_saw_slash = FALSE;
2264
if (why_invalid != NULL)
2265
*why_invalid = g_strdup_printf(_("`%c' is an invalid character in key/directory names"), *s);
2275
/* Can't end with slash */
2278
if (why_invalid != NULL)
2279
*why_invalid = g_strdup(_("Key/directory may not end with a slash (/)"));
2287
gconf_key_is_below (const gchar* above, const gchar* below)
2289
int len = strlen(above);
2290
if (strncmp(below, above, len) == 0)
2292
/* only if this is a complete key component,
2293
* so that /foo is not above /foofoo/bar */
2294
if (below[len] == '\0' || below[len] == '/')
2304
gconf_unique_key (void)
2306
/* This function is hardly cryptographically random but should be
2309
static guint serial = 0;
2311
guint t, ut, p, u, r;
2314
gettimeofday(&tv, NULL);
2323
/* don't bother to seed; if it's based on the time or any other
2324
changing info we can get, we may as well just use that changing
2325
info. since we don't seed we'll at least get a different number
2326
on every call to this function in the same executable. */
2329
/* The letters may increase uniqueness by preventing "melds"
2330
i.e. 01t01k01 and 0101t0k1 are not the same */
2331
key = g_strdup_printf("%ut%uut%uu%up%ur%uk%u",
2332
/* Duplicate keys must be generated
2333
by two different program instances */
2335
/* Duplicate keys must be generated
2336
in the same microsecond */
2339
/* Duplicate keys must be generated by
2342
/* Duplicate keys must be generated by
2343
two programs that got the same PID */
2345
/* Duplicate keys must be generated with the
2346
same random seed and the same index into
2347
the series of pseudorandom values */
2349
/* Duplicate keys must result from running
2350
this function at the same stack location */
2351
GPOINTER_TO_UINT(&key));
2359
* Table of connections
2363
corba_unsigned_long_equal (gconstpointer v1,
2366
return *((const CORBA_unsigned_long*) v1) == *((const CORBA_unsigned_long*) v2);
2370
corba_unsigned_long_hash (gconstpointer v)
2372
/* for our purposes we can just assume 32 bits are significant */
2373
return (guint)(*(const CORBA_unsigned_long*) v);
2381
ct = g_new(CnxnTable, 1);
2383
ct->server_ids = g_hash_table_new (corba_unsigned_long_hash,
2384
corba_unsigned_long_equal);
2385
ct->client_ids = g_hash_table_new (g_int_hash, g_int_equal);
2391
ctable_destroy(CnxnTable* ct)
2393
g_hash_table_destroy (ct->server_ids);
2394
g_hash_table_destroy (ct->client_ids);
2399
ctable_insert(CnxnTable* ct, GConfCnxn* cnxn)
2401
g_hash_table_insert (ct->server_ids, &cnxn->server_id, cnxn);
2402
g_hash_table_insert (ct->client_ids, &cnxn->client_id, cnxn);
2406
ctable_remove(CnxnTable* ct, GConfCnxn* cnxn)
2408
g_hash_table_remove (ct->server_ids, &cnxn->server_id);
2409
g_hash_table_remove (ct->client_ids, &cnxn->client_id);
2415
gboolean save_removed;
2419
remove_by_conf(gpointer key, gpointer value, gpointer user_data)
2421
struct RemoveData* rd = user_data;
2422
GConfCnxn* cnxn = value;
2424
if (cnxn->conf == rd->conf)
2426
if (rd->save_removed)
2427
rd->removed = g_slist_prepend(rd->removed, cnxn);
2429
return TRUE; /* remove this one */
2432
return FALSE; /* or not */
2435
/* FIXME this no longer makes any sense, because a CnxnTable
2436
belongs to a GConfEngine and all entries have the same
2440
/* We return a list of the removed GConfCnxn */
2442
ctable_remove_by_conf(CnxnTable* ct, GConfEngine* conf)
2444
guint client_ids_removed;
2445
guint server_ids_removed;
2446
struct RemoveData rd;
2450
rd.save_removed = TRUE;
2452
client_ids_removed = g_hash_table_foreach_remove (ct->server_ids,
2456
rd.save_removed = FALSE;
2458
server_ids_removed = g_hash_table_foreach_remove(ct->client_ids,
2462
g_assert(client_ids_removed == server_ids_removed);
2463
g_assert(client_ids_removed == g_slist_length(rd.removed));
2469
ctable_lookup_by_client_id(CnxnTable* ct, guint client_id)
2471
return g_hash_table_lookup(ct->client_ids, &client_id);
2475
ctable_lookup_by_server_id(CnxnTable* ct, CORBA_unsigned_long server_id)
2477
return g_hash_table_lookup (ct->server_ids, &server_id);
2481
ctable_reinstall (CnxnTable* ct,
2483
guint old_server_id,
2484
guint new_server_id)
2486
g_return_if_fail (cnxn->server_id == old_server_id);
2488
g_hash_table_remove (ct->server_ids, &old_server_id);
2490
cnxn->server_id = new_server_id;
2492
g_hash_table_insert (ct->server_ids, &cnxn->server_id, cnxn);
2500
gconf_shutdown_daemon(GError** err)
2502
CORBA_Environment ev;
2505
cs = gconf_get_config_server(FALSE, err); /* Don't want to spawn it if it's already down */
2507
if (cs == CORBA_OBJECT_NIL)
2513
CORBA_exception_init(&ev);
2515
ConfigServer_shutdown(cs, &ev);
2517
if (ev._major != CORBA_NO_EXCEPTION)
2520
*err = gconf_error_new(GCONF_ERROR_FAILED, _("Failure shutting down config server: %s"),
2521
CORBA_exception_id(&ev));
2523
CORBA_exception_free(&ev);
2528
gconf_ping_daemon(void)
2532
cs = gconf_get_config_server(FALSE, NULL); /* ignore error, since whole point is to see if server is reachable */
2534
if (cs == CORBA_OBJECT_NIL)
2541
gconf_spawn_daemon(GError** err)
2545
cs = gconf_get_config_server(TRUE, err);
2547
if (cs == CORBA_OBJECT_NIL)
2549
g_return_val_if_fail(err == NULL || *err != NULL, FALSE);
2550
return FALSE; /* Failed to spawn, error should be set */
2561
gconf_engine_get_float (GConfEngine* conf, const gchar* key,
2565
static const gdouble deflt = 0.0;
2567
g_return_val_if_fail(conf != NULL, 0.0);
2568
g_return_val_if_fail(key != NULL, 0.0);
2570
val = gconf_engine_get (conf, key, err);
2578
if (val->type != GCONF_VALUE_FLOAT)
2581
*err = gconf_error_new(GCONF_ERROR_TYPE_MISMATCH, _("Expected float, got %s"),
2582
gconf_value_type_to_string(val->type));
2583
gconf_value_free(val);
2587
retval = gconf_value_get_float(val);
2589
gconf_value_free(val);
2596
gconf_engine_get_int (GConfEngine* conf, const gchar* key,
2600
static const gint deflt = 0;
2602
g_return_val_if_fail(conf != NULL, 0);
2603
g_return_val_if_fail(key != NULL, 0);
2605
val = gconf_engine_get (conf, key, err);
2613
if (val->type != GCONF_VALUE_INT)
2616
*err = gconf_error_new(GCONF_ERROR_TYPE_MISMATCH, _("Expected int, got %s"),
2617
gconf_value_type_to_string(val->type));
2618
gconf_value_free(val);
2622
retval = gconf_value_get_int(val);
2624
gconf_value_free(val);
2631
gconf_engine_get_string(GConfEngine* conf, const gchar* key,
2635
static const gchar* deflt = NULL;
2637
g_return_val_if_fail(conf != NULL, NULL);
2638
g_return_val_if_fail(key != NULL, NULL);
2640
val = gconf_engine_get (conf, key, err);
2643
return deflt ? g_strdup(deflt) : NULL;
2648
if (val->type != GCONF_VALUE_STRING)
2651
*err = gconf_error_new(GCONF_ERROR_TYPE_MISMATCH, _("Expected string, got %s"),
2652
gconf_value_type_to_string(val->type));
2653
gconf_value_free(val);
2654
return deflt ? g_strdup(deflt) : NULL;
2657
retval = val->d.string_data;
2658
/* This is a cheat; don't copy */
2659
val->d.string_data = NULL; /* don't delete the string */
2661
gconf_value_free(val);
2668
gconf_engine_get_bool (GConfEngine* conf, const gchar* key,
2672
static const gboolean deflt = FALSE;
2674
g_return_val_if_fail(conf != NULL, FALSE);
2675
g_return_val_if_fail(key != NULL, FALSE);
2677
val = gconf_engine_get (conf, key, err);
2685
if (val->type != GCONF_VALUE_BOOL)
2688
*err = gconf_error_new(GCONF_ERROR_TYPE_MISMATCH, _("Expected bool, got %s"),
2689
gconf_value_type_to_string(val->type));
2690
gconf_value_free(val);
2694
retval = gconf_value_get_bool(val);
2696
gconf_value_free(val);
2703
gconf_engine_get_schema (GConfEngine* conf, const gchar* key, GError** err)
2707
g_return_val_if_fail(conf != NULL, NULL);
2708
g_return_val_if_fail(key != NULL, NULL);
2710
val = gconf_engine_get_with_locale(conf, key, gconf_current_locale(), err);
2716
GConfSchema* retval;
2718
if (val->type != GCONF_VALUE_SCHEMA)
2721
*err = gconf_error_new(GCONF_ERROR_TYPE_MISMATCH, _("Expected schema, got %s"),
2722
gconf_value_type_to_string(val->type));
2723
gconf_value_free(val);
2727
retval = gconf_value_get_schema(val);
2729
/* This is a cheat; don't copy */
2730
val->d.schema_data = NULL; /* don't delete the schema */
2732
gconf_value_free(val);
2739
gconf_engine_get_list (GConfEngine* conf, const gchar* key,
2740
GConfValueType list_type, GError** err)
2744
g_return_val_if_fail(conf != NULL, NULL);
2745
g_return_val_if_fail(key != NULL, NULL);
2746
g_return_val_if_fail(list_type != GCONF_VALUE_INVALID, NULL);
2747
g_return_val_if_fail(list_type != GCONF_VALUE_LIST, NULL);
2748
g_return_val_if_fail(list_type != GCONF_VALUE_PAIR, NULL);
2749
g_return_val_if_fail(err == NULL || *err == NULL, NULL);
2751
val = gconf_engine_get_with_locale(conf, key, gconf_current_locale(), err);
2757
/* This type-checks the value */
2758
return gconf_value_list_to_primitive_list_destructive(val, list_type, err);
2763
gconf_engine_get_pair (GConfEngine* conf, const gchar* key,
2764
GConfValueType car_type, GConfValueType cdr_type,
2765
gpointer car_retloc, gpointer cdr_retloc,
2769
GError* error = NULL;
2771
g_return_val_if_fail(conf != NULL, FALSE);
2772
g_return_val_if_fail(key != NULL, FALSE);
2773
g_return_val_if_fail(car_type != GCONF_VALUE_INVALID, FALSE);
2774
g_return_val_if_fail(car_type != GCONF_VALUE_LIST, FALSE);
2775
g_return_val_if_fail(car_type != GCONF_VALUE_PAIR, FALSE);
2776
g_return_val_if_fail(cdr_type != GCONF_VALUE_INVALID, FALSE);
2777
g_return_val_if_fail(cdr_type != GCONF_VALUE_LIST, FALSE);
2778
g_return_val_if_fail(cdr_type != GCONF_VALUE_PAIR, FALSE);
2779
g_return_val_if_fail(car_retloc != NULL, FALSE);
2780
g_return_val_if_fail(cdr_retloc != NULL, FALSE);
2781
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2783
val = gconf_engine_get_with_locale(conf, key, gconf_current_locale(), &error);
2787
g_assert(val == NULL);
2792
g_error_free(error);
2804
return gconf_value_pair_to_primitive_pair_destructive(val,
2806
car_retloc, cdr_retloc,
2816
error_checked_set(GConfEngine* conf, const gchar* key,
2817
GConfValue* gval, GError** err)
2819
GError* my_err = NULL;
2821
gconf_engine_set (conf, key, gval, &my_err);
2823
gconf_value_free(gval);
2830
g_error_free(my_err);
2838
gconf_engine_set_float (GConfEngine* conf, const gchar* key,
2839
gdouble val, GError** err)
2843
g_return_val_if_fail(conf != NULL, FALSE);
2844
g_return_val_if_fail(key != NULL, FALSE);
2845
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2847
gval = gconf_value_new(GCONF_VALUE_FLOAT);
2849
gconf_value_set_float(gval, val);
2851
return error_checked_set(conf, key, gval, err);
2855
gconf_engine_set_int (GConfEngine* conf, const gchar* key,
2856
gint val, GError** err)
2860
g_return_val_if_fail(conf != NULL, FALSE);
2861
g_return_val_if_fail(key != NULL, FALSE);
2862
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2864
gval = gconf_value_new(GCONF_VALUE_INT);
2866
gconf_value_set_int(gval, val);
2868
return error_checked_set(conf, key, gval, err);
2872
gconf_engine_set_string (GConfEngine* conf, const gchar* key,
2873
const gchar* val, GError** err)
2877
g_return_val_if_fail (val != NULL, FALSE);
2878
g_return_val_if_fail (conf != NULL, FALSE);
2879
g_return_val_if_fail (key != NULL, FALSE);
2880
g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
2882
g_return_val_if_fail (g_utf8_validate (val, -1, NULL), FALSE);
2884
gval = gconf_value_new(GCONF_VALUE_STRING);
2886
gconf_value_set_string(gval, val);
2888
return error_checked_set(conf, key, gval, err);
2892
gconf_engine_set_bool (GConfEngine* conf, const gchar* key,
2893
gboolean val, GError** err)
2897
g_return_val_if_fail(conf != NULL, FALSE);
2898
g_return_val_if_fail(key != NULL, FALSE);
2899
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2901
gval = gconf_value_new(GCONF_VALUE_BOOL);
2903
gconf_value_set_bool(gval, !!val); /* canonicalize the bool */
2905
return error_checked_set(conf, key, gval, err);
2909
gconf_engine_set_schema (GConfEngine* conf, const gchar* key,
2910
GConfSchema* val, GError** err)
2914
g_return_val_if_fail(conf != NULL, FALSE);
2915
g_return_val_if_fail(key != NULL, FALSE);
2916
g_return_val_if_fail(val != NULL, FALSE);
2917
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2919
gval = gconf_value_new(GCONF_VALUE_SCHEMA);
2921
gconf_value_set_schema(gval, val);
2923
return error_checked_set(conf, key, gval, err);
2927
gconf_engine_set_list (GConfEngine* conf, const gchar* key,
2928
GConfValueType list_type,
2932
GConfValue* value_list;
2933
GError *tmp_err = NULL;
2935
g_return_val_if_fail(conf != NULL, FALSE);
2936
g_return_val_if_fail(key != NULL, FALSE);
2937
g_return_val_if_fail(list_type != GCONF_VALUE_INVALID, FALSE);
2938
g_return_val_if_fail(list_type != GCONF_VALUE_LIST, FALSE);
2939
g_return_val_if_fail(list_type != GCONF_VALUE_PAIR, FALSE);
2940
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2942
value_list = gconf_value_list_from_primitive_list(list_type, list, &tmp_err);
2946
g_propagate_error (err, tmp_err);
2950
/* destroys the value_list */
2952
return error_checked_set(conf, key, value_list, err);
2956
gconf_engine_set_pair (GConfEngine* conf, const gchar* key,
2957
GConfValueType car_type, GConfValueType cdr_type,
2958
gconstpointer address_of_car,
2959
gconstpointer address_of_cdr,
2963
GError *tmp_err = NULL;
2965
g_return_val_if_fail(conf != NULL, FALSE);
2966
g_return_val_if_fail(key != NULL, FALSE);
2967
g_return_val_if_fail(car_type != GCONF_VALUE_INVALID, FALSE);
2968
g_return_val_if_fail(car_type != GCONF_VALUE_LIST, FALSE);
2969
g_return_val_if_fail(car_type != GCONF_VALUE_PAIR, FALSE);
2970
g_return_val_if_fail(cdr_type != GCONF_VALUE_INVALID, FALSE);
2971
g_return_val_if_fail(cdr_type != GCONF_VALUE_LIST, FALSE);
2972
g_return_val_if_fail(cdr_type != GCONF_VALUE_PAIR, FALSE);
2973
g_return_val_if_fail(address_of_car != NULL, FALSE);
2974
g_return_val_if_fail(address_of_cdr != NULL, FALSE);
2975
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
2978
pair = gconf_value_pair_from_primitive_pair(car_type, cdr_type,
2979
address_of_car, address_of_cdr,
2984
g_propagate_error (err, tmp_err);
2988
return error_checked_set(conf, key, pair, err);
2993
/* Set GConfError from an exception, free exception, etc. */
2996
corba_errno_to_gconf_errno(ConfigErrorType corba_err)
3001
return GCONF_ERROR_FAILED;
3003
case ConfigNoPermission:
3004
return GCONF_ERROR_NO_PERMISSION;
3006
case ConfigBadAddress:
3007
return GCONF_ERROR_BAD_ADDRESS;
3010
return GCONF_ERROR_BAD_KEY;
3012
case ConfigParseError:
3013
return GCONF_ERROR_PARSE_ERROR;
3016
return GCONF_ERROR_CORRUPT;
3018
case ConfigTypeMismatch:
3019
return GCONF_ERROR_TYPE_MISMATCH;
3022
return GCONF_ERROR_IS_DIR;
3025
return GCONF_ERROR_IS_KEY;
3027
case ConfigOverridden:
3028
return GCONF_ERROR_OVERRIDDEN;
3030
case ConfigLockFailed:
3031
return GCONF_ERROR_LOCK_FAILED;
3033
case ConfigNoWritableDatabase:
3034
return GCONF_ERROR_NO_WRITABLE_DATABASE;
3036
case ConfigInShutdown:
3037
return GCONF_ERROR_IN_SHUTDOWN;
3040
g_assert_not_reached();
3041
return GCONF_ERROR_SUCCESS; /* warnings */
3047
gconf_server_broken(CORBA_Environment* ev)
3051
case CORBA_SYSTEM_EXCEPTION:
3055
case CORBA_USER_EXCEPTION:
3057
ConfigException* ce;
3059
ce = CORBA_exception_value(ev);
3061
return ce->err_no == ConfigInShutdown;
3072
gconf_handle_corba_exception(CORBA_Environment* ev, GError** err)
3076
case CORBA_NO_EXCEPTION:
3077
CORBA_exception_free(ev);
3080
case CORBA_SYSTEM_EXCEPTION:
3082
*err = gconf_error_new(GCONF_ERROR_NO_SERVER, _("CORBA error: %s"),
3083
CORBA_exception_id(ev));
3084
CORBA_exception_free(ev);
3087
case CORBA_USER_EXCEPTION:
3089
ConfigException* ce;
3091
ce = CORBA_exception_value(ev);
3094
*err = gconf_error_new(corba_errno_to_gconf_errno(ce->err_no),
3096
CORBA_exception_free(ev);
3101
g_assert_not_reached();
3108
* Enumeration conversions
3112
gconf_string_to_enum (GConfEnumStringPair lookup_table[],
3114
gint* enum_value_retloc)
3118
while (lookup_table[i].str != NULL)
3120
if (g_strcasecmp(lookup_table[i].str, str) == 0)
3122
*enum_value_retloc = lookup_table[i].enum_value;
3133
gconf_enum_to_string (GConfEnumStringPair lookup_table[],
3138
while (lookup_table[i].str != NULL)
3140
if (lookup_table[i].enum_value == enum_value)
3141
return lookup_table[i].str;