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.
11 static GHashTable
*dconf_mock_gvdb_tables
;
12 static GMutex dconf_mock_gvdb_lock
;
29 dconf_mock_gvdb_item_free (gpointer data
)
31 DConfMockGvdbItem
*item
= data
;
34 g_variant_unref (item
->value
);
37 gvdb_table_free (item
->table
);
39 g_slice_free (DConfMockGvdbItem
, item
);
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
);
50 dconf_mock_gvdb_table_new (void)
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
);
57 table
->is_valid
= TRUE
;
63 dconf_mock_gvdb_table_insert (GvdbTable
*table
,
68 DConfMockGvdbItem
*item
;
70 g_assert (value
== NULL
|| subtable
== NULL
);
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
);
83 dconf_mock_gvdb_install (const gchar
*filename
,
86 g_mutex_lock (&dconf_mock_gvdb_lock
);
87 dconf_mock_gvdb_init ();
91 table
->top_level
= TRUE
;
92 g_hash_table_insert (dconf_mock_gvdb_tables
, g_strdup (filename
), table
);
95 g_hash_table_remove (dconf_mock_gvdb_tables
, filename
);
97 g_mutex_unlock (&dconf_mock_gvdb_lock
);
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
);
111 dconf_mock_gvdb_table_ref (GvdbTable
*table
)
113 g_atomic_int_inc (&table
->ref_count
);
119 gvdb_table_get_table (GvdbTable
*table
,
122 DConfMockGvdbItem
*item
;
125 item
= g_hash_table_lookup (table
->table
, key
);
127 if (item
&& item
->table
)
128 subtable
= dconf_mock_gvdb_table_ref (item
->table
);
136 gvdb_table_has_value (GvdbTable
*table
,
139 DConfMockGvdbItem
*item
;
141 item
= g_hash_table_lookup (table
->table
, key
);
143 return item
&& item
->value
;
147 gvdb_table_get_value (GvdbTable
*table
,
150 DConfMockGvdbItem
*item
;
152 item
= g_hash_table_lookup (table
->table
, key
);
154 return (item
&& item
->value
) ? g_variant_ref (item
->value
) : NULL
;
158 gvdb_table_list (GvdbTable
*table
,
161 const gchar
* const result
[] = { "value", NULL
};
163 g_assert_cmpstr (key
, ==, "/");
165 if (!gvdb_table_has_value (table
, "/value"))
168 return g_strdupv ((gchar
**) result
);
172 gvdb_table_get_names (GvdbTable
*table
,
178 return g_new0 (gchar
*, 0 + 1);
182 gvdb_table_new (const gchar
*filename
,
188 g_mutex_lock (&dconf_mock_gvdb_lock
);
189 dconf_mock_gvdb_init ();
190 table
= g_hash_table_lookup (dconf_mock_gvdb_tables
, filename
);
192 dconf_mock_gvdb_table_ref (table
);
193 g_mutex_unlock (&dconf_mock_gvdb_lock
);
196 g_set_error (error
, G_FILE_ERROR
, G_FILE_ERROR_NOENT
, "this gvdb does not exist");
202 gvdb_table_is_valid (GvdbTable
*table
)
204 return table
->is_valid
;
208 dconf_mock_gvdb_table_invalidate (GvdbTable
*table
)
210 table
->is_valid
= FALSE
;