tests: fix a small lie
[dconf.git] / tests / dconf-mock-gvdb.c
bloba922a49bd19ee8f3a69cfda83186ba38dea284b4
1 #include "../gvdb/gvdb-reader.h"
2 #include "dconf-mock.h"
4 /* The global dconf_mock_gvdb_tables hashtable is modified all the time
5 * so we need to hold the lock while we access it.
7 * The hashtables contained within it are never modified, however. They
8 * can be safely accessed without a lock.
9 */
11 static GHashTable *dconf_mock_gvdb_tables;
12 static GMutex dconf_mock_gvdb_lock;
14 typedef struct
16 GVariant *value;
17 GvdbTable *table;
18 } DConfMockGvdbItem;
20 struct _GvdbTable
22 GHashTable *table;
23 gboolean is_valid;
24 gboolean top_level;
25 gint ref_count;
28 static void
29 dconf_mock_gvdb_item_free (gpointer data)
31 DConfMockGvdbItem *item = data;
33 if (item->value)
34 g_variant_unref (item->value);
36 if (item->table)
37 gvdb_table_free (item->table);
39 g_slice_free (DConfMockGvdbItem, item);
42 static void
43 dconf_mock_gvdb_init (void)
45 if (dconf_mock_gvdb_tables == NULL)
46 dconf_mock_gvdb_tables = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gvdb_table_free);
49 GvdbTable *
50 dconf_mock_gvdb_table_new (void)
52 GvdbTable *table;
54 table = g_slice_new (GvdbTable);
55 table->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, dconf_mock_gvdb_item_free);
56 table->ref_count = 1;
57 table->is_valid = TRUE;
59 return table;
62 void
63 dconf_mock_gvdb_table_insert (GvdbTable *table,
64 const gchar *name,
65 GVariant *value,
66 GvdbTable *subtable)
68 DConfMockGvdbItem *item;
70 g_assert (value == NULL || subtable == NULL);
72 if (subtable)
73 subtable->top_level = FALSE;
75 item = g_slice_new (DConfMockGvdbItem);
76 item->value = value ? g_variant_ref_sink (value) : NULL;
77 item->table = subtable;
79 g_hash_table_insert (table->table, g_strdup (name), item);
82 void
83 dconf_mock_gvdb_install (const gchar *filename,
84 GvdbTable *table)
86 g_mutex_lock (&dconf_mock_gvdb_lock);
87 dconf_mock_gvdb_init ();
89 if (table)
91 table->top_level = TRUE;
92 g_hash_table_insert (dconf_mock_gvdb_tables, g_strdup (filename), table);
94 else
95 g_hash_table_remove (dconf_mock_gvdb_tables, filename);
97 g_mutex_unlock (&dconf_mock_gvdb_lock);
100 void
101 gvdb_table_free (GvdbTable *table)
103 if (g_atomic_int_dec_and_test (&table->ref_count))
105 g_hash_table_unref (table->table);
106 g_slice_free (GvdbTable, table);
110 GvdbTable *
111 dconf_mock_gvdb_table_ref (GvdbTable *table)
113 g_atomic_int_inc (&table->ref_count);
115 return table;
118 GvdbTable *
119 gvdb_table_get_table (GvdbTable *table,
120 const gchar *key)
122 DConfMockGvdbItem *item;
123 GvdbTable *subtable;
125 item = g_hash_table_lookup (table->table, key);
127 if (item && item->table)
128 subtable = dconf_mock_gvdb_table_ref (item->table);
129 else
130 subtable = NULL;
132 return subtable;
135 gboolean
136 gvdb_table_has_value (GvdbTable *table,
137 const gchar *key)
139 DConfMockGvdbItem *item;
141 item = g_hash_table_lookup (table->table, key);
143 return item && item->value;
146 GVariant *
147 gvdb_table_get_value (GvdbTable *table,
148 const gchar *key)
150 DConfMockGvdbItem *item;
152 item = g_hash_table_lookup (table->table, key);
154 return (item && item->value) ? g_variant_ref (item->value) : NULL;
157 gchar **
158 gvdb_table_list (GvdbTable *table,
159 const gchar *key)
161 const gchar * const result[] = { "value", NULL };
163 g_assert_cmpstr (key, ==, "/");
165 if (!gvdb_table_has_value (table, "/value"))
166 return NULL;
168 return g_strdupv ((gchar **) result);
171 GvdbTable *
172 gvdb_table_new (const gchar *filename,
173 gboolean trusted,
174 GError **error)
176 GvdbTable *table;
178 g_mutex_lock (&dconf_mock_gvdb_lock);
179 dconf_mock_gvdb_init ();
180 table = g_hash_table_lookup (dconf_mock_gvdb_tables, filename);
181 if (table)
182 dconf_mock_gvdb_table_ref (table);
183 g_mutex_unlock (&dconf_mock_gvdb_lock);
185 if (table == NULL)
186 g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT, "this gvdb does not exist");
188 return table;
191 gboolean
192 gvdb_table_is_valid (GvdbTable *table)
194 return table->is_valid;
197 void
198 dconf_mock_gvdb_table_invalidate (GvdbTable *table)
200 table->is_valid = FALSE;