62
64
* - the implementation of gmconf.h's api.
67
#define check_entry_type_return(entry,_type,val) G_STMT_START{ \
68
if (G_LIKELY(entry != NULL && entry->type == _type)) \
72
msg = g_strdup_printf ("gmconf key %s is of type " #_type, entry->key); \
73
g_return_if_fail_warning (G_LOG_DOMAIN, __PRETTY_FUNCTION__, msg); \
79
#define check_entry_for_key_return(entry,key,val) G_STMT_START{ \
80
if (G_LIKELY(entry != NULL)) \
84
msg = g_strdup_printf ("key %s has no corresponding entry! ", key); \
85
g_return_if_fail_warning (G_LOG_DOMAIN, __PRETTY_FUNCTION__, msg); \
66
92
/* the data types used in this file */
159
185
/* notifier functions */
160
186
static Notifier *notifier_new (const GmConfNotifier, const gpointer);
161
static void notifier_destroy (Notifier *);
187
static void notifier_destroy (Notifier *);
162
188
static void notifier_destroy_in_list (gpointer elt, gpointer unused);
163
189
static void notifier_call_on_entry (Notifier *, GmConfEntry *);
169
195
static const gchar *entry_get_key (const GmConfEntry *);
170
196
static void entry_set_key (GmConfEntry *, const gchar *);
172
static const GmConfEntryType entry_get_type (const GmConfEntry *);
198
static GmConfEntryType entry_get_type (const GmConfEntry *);
173
199
static void entry_set_type (GmConfEntry *, const GmConfEntryType);
175
201
static gboolean entry_get_bool (const GmConfEntry *);
232
258
gpointer user_data);
233
259
static void database_remove_namespace (DataBase *, const gchar *);
234
260
static GmConfEntry *database_get_entry_for_key (DataBase *, const gchar *);
235
static GmConfEntry *database_get_entry_for_key_create (DataBase *,
261
static GmConfEntry *database_get_entry_for_key_create (DataBase *,
238
264
static void database_set_watched (DataBase *, const gboolean);
445
471
/* implementation of notifier functions */
446
472
static Notifier *
447
notifier_new (const GmConfNotifier func, const gpointer data)
473
notifier_new (const GmConfNotifier func,
449
476
Notifier *notifier = NULL;
451
478
g_return_val_if_fail (func != NULL, NULL);
453
480
notifier = g_new (Notifier, 1);
466
notifier_destroy_in_list (gpointer elt, gpointer unused)
493
notifier_destroy_in_list (gpointer elt,
494
G_GNUC_UNUSED gpointer unused)
468
496
notifier_destroy ((Notifier *)elt);
472
notifier_call_on_entry (Notifier *notifier, GmConfEntry *entry)
500
notifier_call_on_entry (Notifier *notifier,
474
503
g_return_if_fail (notifier != NULL);
475
504
g_return_if_fail (entry != NULL);
530
561
entry_get_key (const GmConfEntry *entry)
532
563
g_return_val_if_fail (entry != NULL, NULL);
534
565
return entry->key;
538
entry_set_key (GmConfEntry *entry, const gchar *key)
569
entry_set_key (GmConfEntry *entry,
540
572
g_return_if_fail (entry != NULL);
541
573
g_return_if_fail (key != NULL);
543
577
entry->key = g_strdup (key);
546
static const GmConfEntryType
580
static GmConfEntryType
547
581
entry_get_type (const GmConfEntry *entry)
549
583
g_return_val_if_fail (entry != NULL, GM_CONF_OTHER);
555
entry_set_type (GmConfEntry *entry, const GmConfEntryType type)
589
entry_set_type (GmConfEntry *entry,
590
const GmConfEntryType type)
557
592
g_return_if_fail (entry != NULL);
563
598
entry_get_bool (const GmConfEntry *entry)
565
g_return_val_if_fail (entry != NULL, FALSE);
566
g_return_val_if_fail (entry->type == GM_CONF_BOOL, FALSE);
600
check_entry_type_return (entry, GM_CONF_BOOL, FALSE);
568
602
return entry->value.boolean;
572
entry_set_bool (GmConfEntry *entry, const gboolean val)
606
entry_set_bool (GmConfEntry *entry,
574
609
g_return_if_fail (entry != NULL);
581
616
entry_get_int (const GmConfEntry *entry)
583
g_return_val_if_fail (entry != NULL, 0);
584
g_return_val_if_fail (entry->type == GM_CONF_INT, 0);
618
check_entry_type_return (entry, GM_CONF_INT, 0);
586
620
return entry->value.integer;
589
static void entry_set_int (GmConfEntry *entry, const gint val)
624
entry_set_int (GmConfEntry *entry,
591
627
g_return_if_fail (entry != NULL);
598
634
entry_get_float (const GmConfEntry *entry)
600
g_return_val_if_fail (entry != NULL, 0);
601
g_return_val_if_fail (entry->type == GM_CONF_FLOAT, 0);
636
check_entry_type_return (entry, GM_CONF_FLOAT, 0);
603
638
return entry->value.floa;
607
entry_set_float (GmConfEntry *entry, const gfloat val)
642
entry_set_float (GmConfEntry *entry,
609
645
g_return_if_fail (entry != NULL);
615
651
static const gchar *
616
652
entry_get_string (const GmConfEntry *entry)
618
g_return_val_if_fail (entry != NULL, 0);
619
g_return_val_if_fail (entry->type == GM_CONF_STRING, 0);
654
check_entry_type_return (entry, GM_CONF_STRING, NULL);
621
656
return entry->value.string;
634
669
entry_get_list (const GmConfEntry *entry)
636
g_return_val_if_fail (entry != NULL, 0);
637
g_return_val_if_fail (entry->type == GM_CONF_LIST, 0);
671
check_entry_type_return (entry, GM_CONF_LIST, NULL);
639
673
return entry->value.list;
643
entry_set_list (GmConfEntry *entry, GSList *val)
677
entry_set_list (GmConfEntry *entry,
645
680
g_return_if_fail (entry != NULL);
648
683
entry->value.list = string_list_deep_copy (val);
652
entry_set_redirect (GmConfEntry *entry, GmConfEntry *redirect)
687
entry_set_redirect (GmConfEntry *entry,
688
GmConfEntry *redirect)
654
690
g_return_if_fail (entry != NULL);
669
705
entry = (GmConfEntry *)data;
670
706
for (ptr = entry->notifiers; ptr != NULL; ptr = ptr->next) {
671
707
notif = (Notifier *)ptr->data;
672
if (entry->type == GM_CONF_OTHER)
708
if (entry->type == GM_CONF_OTHER && entry->value.redirect != NULL)
673
709
notifier_call_on_entry (notif, entry->value.redirect);
675
711
notifier_call_on_entry (notif, entry);
704
entry_remove_notifier (GmConfEntry *entry, gpointer identifier)
742
entry_remove_notifier (GmConfEntry *entry,
706
/* no check, since the only function calling here is
745
/* no check, since the only function calling here is
707
746
entry_remove_notifier_in_list */
709
748
entry->notifiers = g_slist_remove (entry->notifiers, identifier);
713
entry_remove_notifier_in_list (GQuark unused,
752
entry_remove_notifier_in_list (G_GNUC_UNUSED GQuark unused,
715
754
gpointer identifier)
746
sch_parser_start_element (GMarkupParseContext *context,
792
sch_parser_start_element (G_GNUC_UNUSED GMarkupParseContext *context,
747
793
const gchar *element_name,
748
const gchar **attribute_names,
749
const gchar **attribute_values,
794
G_GNUC_UNUSED const gchar **attribute_names,
795
G_GNUC_UNUSED const gchar **attribute_values,
797
G_GNUC_UNUSED GError **error)
753
799
SchParser *parser = NULL;
766
812
parser->state = VALUE;
770
sch_parser_end_element (GMarkupParseContext *context,
816
sch_parser_end_element (G_GNUC_UNUSED GMarkupParseContext *context,
771
817
const gchar *element_name,
819
G_GNUC_UNUSED GError **error)
775
821
SchParser *parser = NULL;
787
833
parser->state = START;
791
sch_parser_characters (GMarkupParseContext *context,
837
sch_parser_characters (G_GNUC_UNUSED GMarkupParseContext *context,
792
838
const gchar *text,
839
G_GNUC_UNUSED gsize text_len,
841
G_GNUC_UNUSED GError **error)
797
843
SchParser *parser = NULL;
817
864
else if (strcmp (text, "string") == 0)
818
865
entry_set_type (parser->entry, GM_CONF_STRING);
819
866
else if (strcmp (text, "list") == 0)
820
entry_set_type (parser->entry, GM_CONF_LIST);
867
entry_set_type (parser->entry, GM_CONF_LIST);
822
869
entry_set_type (parser->entry, GM_CONF_OTHER);
838
885
case GM_CONF_LIST:
839
886
entry_set_list (parser->entry, list_from_string (text));
888
case GM_CONF_OTHER: /* shouldn't happen */
848
database_load_file (DataBase *db, const gchar *filename)
900
database_load_file (DataBase *db,
901
const gchar *filename)
850
903
SchParser *parser = NULL;
851
904
GMarkupParseContext *context = NULL;
858
911
g_return_val_if_fail (filename != NULL, FALSE);
860
913
io = g_io_channel_new_file (filename, "r", NULL);
863
916
parser = g_new (SchParser, 1);
864
917
parser->state = START;
898
database_save_entry (GQuark quark, gpointer data,
952
database_save_entry (G_GNUC_UNUSED GQuark quark,
899
954
gpointer user_data)
901
956
GmConfEntry *entry = NULL;
903
957
GIOChannel *io = NULL;
904
958
gchar *value = NULL;
959
const gchar *txt = NULL;
906
961
g_return_if_fail (data != NULL);
907
962
g_return_if_fail (user_data != NULL);
955
1010
value = string_from_float (entry_get_float (entry));
957
1012
case GM_CONF_STRING:
958
value = g_strdup (entry_get_string (entry));
1013
txt = entry_get_string (entry);
1015
value = g_markup_escape_text (txt, -1);
1017
value = g_strdup ("");
960
1019
case GM_CONF_LIST:
961
1020
value = string_from_list (entry_get_list (entry));
972
1031
g_io_channel_write_chars (io, "</schema>\n", -1, NULL, NULL);
976
database_save_file (DataBase *db, const gchar *filename)
1035
database_save_file (DataBase *db,
1036
const gchar *filename)
978
1038
GIOChannel *io = NULL;
979
1039
gchar *dirname = NULL;
981
g_return_if_fail (db != NULL);
982
g_return_if_fail (filename != NULL);
1041
g_return_val_if_fail (db != NULL, FALSE);
1042
g_return_val_if_fail (filename != NULL, FALSE);
984
1044
dirname = g_path_get_dirname (filename);
985
1045
if (!g_file_test (dirname, G_FILE_TEST_IS_DIR)) {
986
if (!gm_mkdir_with_parents (dirname, S_IRWXU))
1046
if (!g_mkdir_with_parents (dirname, S_IRWXU))
987
1047
g_warning ("Unable to create directory %s\n", dirname);
989
1049
g_free (dirname);
1005
database_add_entry (DataBase *db, GmConfEntry *entry)
1065
database_add_entry (DataBase *db,
1007
1068
g_return_if_fail (db != NULL);
1008
1069
g_return_if_fail (entry != NULL);
1011
1072
entry, entry_destroy);
1015
database_remove_namespace_in_datalist (GQuark key_id,
1076
database_remove_namespace_in_datalist (G_GNUC_UNUSED GQuark key_id,
1017
1078
gpointer user_data)
1019
1080
GmConfEntry *entry = NULL;
1020
1081
NamespcWrapper *wrapper = NULL;
1021
1082
const gchar *key = NULL;
1023
1084
g_return_if_fail (data != NULL);
1024
1085
g_return_if_fail (user_data != NULL);
1036
database_remove_namespace (DataBase *db, const gchar *namespc)
1097
database_remove_namespace (DataBase *db,
1098
const gchar *namespc)
1038
1100
NamespcWrapper *wrapper = NULL;
1040
1102
g_return_if_fail (db != NULL);
1041
1103
g_return_if_fail (namespc != NULL);
1043
1105
wrapper = g_new (NamespcWrapper, 1);
1044
1106
wrapper->datalist = &db->entries;
1045
1107
wrapper->namespc = namespc;
1046
g_datalist_foreach (&db->entries,
1108
g_datalist_foreach (&db->entries,
1047
1109
database_remove_namespace_in_datalist, wrapper);
1048
1110
g_free (wrapper);
1051
1113
static GmConfEntry *
1052
database_get_entry_for_key (DataBase *db, const gchar *key)
1114
database_get_entry_for_key (DataBase *db,
1054
1117
GmConfEntry *entry = NULL;
1057
1120
g_return_val_if_fail (key != NULL, NULL);
1059
1122
entry = g_datalist_get_data (&db->entries, key);
1063
1127
static GmConfEntry *
1064
database_get_entry_for_key_create (DataBase *db, const gchar *key)
1128
database_get_entry_for_key_create (DataBase *db,
1066
1131
GmConfEntry *entry = NULL;
1081
database_set_watched (DataBase *db, const gboolean bool)
1146
database_set_watched (DataBase *db,
1147
const gboolean bool)
1083
1149
g_return_if_fail (db != NULL);
1085
1151
db->is_watched = bool;
1089
database_notify_on_namespace (DataBase *db, const gchar *namespac)
1155
database_notify_on_namespace (DataBase *db,
1156
const gchar *namespac)
1091
1158
GmConfEntry *parent_entry = NULL, *entry = NULL;
1092
1159
gchar *key = NULL;
1095
1162
g_return_if_fail (db != NULL);
1096
1163
g_return_if_fail (namespac != NULL);
1097
1164
g_return_if_fail (namespac[0] == '/'); /* that makes the loop work! */
1099
1166
entry = database_get_entry_for_key (db, namespac);
1101
g_return_if_fail (entry != NULL);
1168
g_return_if_fail (entry != NULL);
1103
1170
if (db->is_watched == FALSE)
1106
1173
for (key = g_strdup (namespac);
1108
1175
g_strrstr (key, "/")[0] = 0) {
1109
1176
parent_entry = database_get_entry_for_key (db, key);
1110
1177
if (parent_entry != NULL) {
1111
1178
if (entry_get_type (parent_entry) == GM_CONF_OTHER)
1112
1179
entry_set_redirect (parent_entry, entry);
1113
entry_call_notifiers (parent_entry);
1180
entry_call_notifiers (parent_entry);
1114
1181
if (entry_get_type (entry) == GM_CONF_OTHER)
1115
1182
entry_set_redirect (parent_entry, NULL);
1139
1206
filename = gm_conf_get_user_conf_filename ();
1140
1207
result = database_load_file (db, filename);
1209
if (G_LIKELY (result))
1212
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
1213
"couldn't read the user configuration in %s", filename);
1142
1215
g_free (filename);
1156
1229
filename = g_build_filename (SYSCONFDIR, "ekiga",
1157
1230
"ekiga.schemas", NULL);
1158
1231
result = database_load_file (db, filename);
1233
if (G_LIKELY (result))
1236
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
1237
"couldn't read the system configuration in %s", filename);
1159
1238
g_free (filename);
1165
1244
/* last but not least, the implementation of the gmconf.h api */
1166
1245
static gboolean
1167
saveconf_timer_callback (gpointer unused)
1246
saveconf_timer_callback (G_GNUC_UNUSED gpointer unused)
1169
1248
DataBase *db = database_get_default ();
1170
1249
gchar *user_conf = NULL;
1173
1252
database_save_file (db, user_conf);
1175
1254
g_free (user_conf);
1181
gm_conf_init (int argc, char **argv)
1183
1262
gboolean result = FALSE;
1184
1263
DataBase *db = database_get_default ();
1186
1265
result = gm_conf_load_sys_conf (db);
1187
1266
result = (gm_conf_load_user_conf (db) || result);
1225
1314
database_set_watched (db, FALSE);
1229
gm_conf_notifier_add (const gchar *namespac,
1318
gm_conf_notifier_add (const gchar *namespac,
1230
1319
GmConfNotifier func,
1231
1320
gpointer user_data)
1233
1322
DataBase *db = database_get_default ();
1234
1323
GmConfEntry *entry = NULL;
1236
1325
g_return_val_if_fail (namespac != NULL, NULL);
1237
1326
g_return_val_if_fail (func != NULL, NULL);
1239
1328
entry = database_get_entry_for_key_create (db, namespac);
1241
1330
return entry_add_notifier (entry, func, user_data);
1245
1334
gm_conf_notifier_remove (gpointer identifier)
1247
1336
DataBase *db = database_get_default ();
1303
1392
return entry_get_string (entry);
1307
1396
gm_conf_entry_get_list (GmConfEntry *entry)
1309
1398
g_return_val_if_fail (entry != NULL, NULL);
1311
return entry_get_list (entry);
1400
return string_list_deep_copy (entry_get_list (entry));
1315
gm_conf_set_bool (const gchar *key, const gboolean val)
1404
gm_conf_set_bool (const gchar *key,
1317
1407
DataBase *db = database_get_default ();
1318
1408
GmConfEntry *entry = NULL;
1327
1417
database_notify_on_namespace (db, entry_get_key (entry));
1331
1421
gm_conf_get_bool (const gchar *key)
1333
1423
DataBase *db = database_get_default ();
1334
1424
GmConfEntry *entry = NULL;
1336
g_return_if_fail (key != NULL);
1426
g_return_val_if_fail (key != NULL, FALSE);
1338
1428
entry = database_get_entry_for_key (db, key);
1430
check_entry_for_key_return (entry, key, FALSE);
1341
1432
return entry_get_bool (entry);
1345
gm_conf_set_int (const gchar *key, const int val)
1436
gm_conf_set_int (const gchar *key,
1347
1439
DataBase *db = database_get_default ();
1348
1440
GmConfEntry *entry = NULL;
1357
1449
database_notify_on_namespace (db, entry_get_key (entry));
1361
1453
gm_conf_get_int (const gchar *key)
1363
1455
DataBase *db = database_get_default ();
1364
1456
GmConfEntry *entry = NULL;
1366
g_return_if_fail (key != NULL);
1458
g_return_val_if_fail (key != NULL, 0);
1368
1460
entry = database_get_entry_for_key (db, key);
1462
check_entry_for_key_return (entry, key, 0);
1371
1464
return entry_get_int (entry);
1375
gm_conf_set_float (const gchar *key, const float val)
1468
gm_conf_set_float (const gchar *key,
1377
1471
DataBase *db = database_get_default ();
1378
1472
GmConfEntry *entry = NULL;
1387
1481
database_notify_on_namespace (db, entry_get_key (entry));
1391
1485
gm_conf_get_float (const gchar *key)
1393
1487
DataBase *db = database_get_default ();
1394
1488
GmConfEntry *entry = NULL;
1396
g_return_if_fail (key != NULL);
1490
g_return_val_if_fail (key != NULL, 0);
1398
1492
entry = database_get_entry_for_key (db, key);
1494
check_entry_for_key_return (entry, key, 0);
1402
1496
return entry_get_float (entry);
1406
gm_conf_set_string (const gchar *key, const gchar *val)
1500
gm_conf_set_string (const gchar *key,
1408
1503
DataBase *db = database_get_default ();
1409
1504
GmConfEntry *entry = NULL;
1424
1519
DataBase *db = database_get_default ();
1425
1520
GmConfEntry *entry = NULL;
1427
g_return_if_fail (key != NULL);
1522
g_return_val_if_fail (key != NULL, NULL);
1429
1524
entry = database_get_entry_for_key (db, key);
1526
check_entry_for_key_return (entry, key, NULL);
1432
1528
return g_strdup (entry_get_string (entry));
1436
gm_conf_set_string_list (const gchar *key, GSList *val)
1532
gm_conf_set_string_list (const gchar *key,
1438
1535
DataBase *db = database_get_default ();
1439
1536
GmConfEntry *entry = NULL;
1454
1551
DataBase *db = database_get_default ();
1455
1552
GmConfEntry *entry = NULL;
1457
g_return_if_fail (key != NULL);
1554
g_return_val_if_fail (key != NULL, NULL);
1459
1556
entry = database_get_entry_for_key (db, key);
1558
check_entry_for_key_return (entry, key, NULL);
1462
1560
return string_list_deep_copy (entry_get_list (entry));
1466
1564
gm_conf_destroy (const gchar *namespac)
1468
1566
DataBase *db = database_get_default ();
1484
gm_conf_escape_key (const gchar *key, gint len)
1582
gm_conf_escape_key (const gchar *key,
1583
G_GNUC_UNUSED gint len)
1486
1585
return g_strescape (key, NULL); /* we don't honor len */
1490
gm_conf_unescape_key (const gchar *key, gint len)
1589
gm_conf_unescape_key (const gchar *key,
1590
G_GNUC_UNUSED gint len)
1492
1592
return g_strcompress (key); /* we don't honor len */