Branch data Line data Source code
1 : : /*
2 : : * Copyright © 2010 Codethink Limited
3 : : *
4 : : * SPDX-License-Identifier: LGPL-2.1-or-later
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License as published by the Free Software Foundation; either
9 : : * version 2.1 of the License, or (at your option) any later version.
10 : : *
11 : : * This library is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : * Lesser General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU Lesser General Public
17 : : * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 : : *
19 : : * Author: Ryan Lortie <desrt@desrt.ca>
20 : : */
21 : :
22 : : #include "config.h"
23 : :
24 : : #include "gsimplepermission.h"
25 : : #include "gsettingsbackendinternal.h"
26 : : #include "giomodule-priv.h"
27 : :
28 : :
29 : : #define G_TYPE_MEMORY_SETTINGS_BACKEND (g_memory_settings_backend_get_type())
30 : : #define G_MEMORY_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
31 : : G_TYPE_MEMORY_SETTINGS_BACKEND, \
32 : : GMemorySettingsBackend))
33 : :
34 : : typedef GSettingsBackendClass GMemorySettingsBackendClass;
35 : : typedef struct
36 : : {
37 : : GSettingsBackend parent_instance;
38 : : GHashTable *table;
39 : : } GMemorySettingsBackend;
40 : :
41 : 540 : G_DEFINE_TYPE_WITH_CODE (GMemorySettingsBackend,
42 : : g_memory_settings_backend,
43 : : G_TYPE_SETTINGS_BACKEND,
44 : : _g_io_modules_ensure_extension_points_registered ();
45 : : g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
46 : : g_define_type_id, "memory", 10))
47 : :
48 : : static GVariant *
49 : 185 : g_memory_settings_backend_read (GSettingsBackend *backend,
50 : : const gchar *key,
51 : : const GVariantType *expected_type,
52 : : gboolean default_value)
53 : : {
54 : 185 : GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (backend);
55 : : GVariant *value;
56 : :
57 : 185 : if (default_value)
58 : 2 : return NULL;
59 : :
60 : 183 : value = g_hash_table_lookup (memory->table, key);
61 : :
62 : 183 : if (value != NULL)
63 : 126 : g_variant_ref (value);
64 : :
65 : 183 : return value;
66 : : }
67 : :
68 : : static gboolean
69 : 103 : g_memory_settings_backend_write (GSettingsBackend *backend,
70 : : const gchar *key,
71 : : GVariant *value,
72 : : gpointer origin_tag)
73 : : {
74 : 103 : GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (backend);
75 : : GVariant *old_value;
76 : :
77 : 103 : old_value = g_hash_table_lookup (memory->table, key);
78 : 103 : g_variant_ref_sink (value);
79 : :
80 : 103 : if (old_value == NULL || !g_variant_equal (value, old_value))
81 : : {
82 : 97 : g_hash_table_insert (memory->table, g_strdup (key), value);
83 : 97 : g_settings_backend_changed (backend, key, origin_tag);
84 : : }
85 : : else
86 : 6 : g_variant_unref (value);
87 : :
88 : 103 : return TRUE;
89 : : }
90 : :
91 : : static gboolean
92 : 6 : g_memory_settings_backend_write_one (gpointer key,
93 : : gpointer value,
94 : : gpointer data)
95 : : {
96 : 6 : GMemorySettingsBackend *memory = data;
97 : :
98 : 6 : if (value != NULL)
99 : 8 : g_hash_table_insert (memory->table, g_strdup (key), g_variant_ref (value));
100 : : else
101 : 2 : g_hash_table_remove (memory->table, key);
102 : :
103 : 6 : return FALSE;
104 : : }
105 : :
106 : : static gboolean
107 : 5 : g_memory_settings_backend_write_tree (GSettingsBackend *backend,
108 : : GTree *tree,
109 : : gpointer origin_tag)
110 : : {
111 : 5 : g_tree_foreach (tree, g_memory_settings_backend_write_one, backend);
112 : 5 : g_settings_backend_changed_tree (backend, tree, origin_tag);
113 : :
114 : 5 : return TRUE;
115 : : }
116 : :
117 : : static void
118 : 2 : g_memory_settings_backend_reset (GSettingsBackend *backend,
119 : : const gchar *key,
120 : : gpointer origin_tag)
121 : : {
122 : 2 : GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (backend);
123 : :
124 : 2 : if (g_hash_table_lookup (memory->table, key))
125 : : {
126 : 2 : g_hash_table_remove (memory->table, key);
127 : 2 : g_settings_backend_changed (backend, key, origin_tag);
128 : : }
129 : 2 : }
130 : :
131 : : static gboolean
132 : 4 : g_memory_settings_backend_get_writable (GSettingsBackend *backend,
133 : : const gchar *name)
134 : : {
135 : 4 : return TRUE;
136 : : }
137 : :
138 : : static GPermission *
139 : 0 : g_memory_settings_backend_get_permission (GSettingsBackend *backend,
140 : : const gchar *path)
141 : : {
142 : 0 : return g_simple_permission_new (TRUE);
143 : : }
144 : :
145 : : static void
146 : 4 : g_memory_settings_backend_finalize (GObject *object)
147 : : {
148 : 4 : GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (object);
149 : :
150 : 4 : g_hash_table_unref (memory->table);
151 : :
152 : 4 : G_OBJECT_CLASS (g_memory_settings_backend_parent_class)
153 : 4 : ->finalize (object);
154 : 4 : }
155 : :
156 : : static void
157 : 6 : g_memory_settings_backend_init (GMemorySettingsBackend *memory)
158 : : {
159 : 6 : memory->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
160 : : (GDestroyNotify) g_variant_unref);
161 : 6 : }
162 : :
163 : : static void
164 : 5 : g_memory_settings_backend_class_init (GMemorySettingsBackendClass *class)
165 : : {
166 : 5 : GSettingsBackendClass *backend_class = G_SETTINGS_BACKEND_CLASS (class);
167 : 5 : GObjectClass *object_class = G_OBJECT_CLASS (class);
168 : :
169 : 5 : backend_class->read = g_memory_settings_backend_read;
170 : 5 : backend_class->write = g_memory_settings_backend_write;
171 : 5 : backend_class->write_tree = g_memory_settings_backend_write_tree;
172 : 5 : backend_class->reset = g_memory_settings_backend_reset;
173 : 5 : backend_class->get_writable = g_memory_settings_backend_get_writable;
174 : 5 : backend_class->get_permission = g_memory_settings_backend_get_permission;
175 : 5 : object_class->finalize = g_memory_settings_backend_finalize;
176 : 5 : }
177 : :
178 : : /**
179 : : * g_memory_settings_backend_new:
180 : : *
181 : : * Creates a memory-backed #GSettingsBackend.
182 : : *
183 : : * This backend allows changes to settings, but does not write them
184 : : * to any backing storage, so the next time you run your application,
185 : : * the memory backend will start out with the default values again.
186 : : *
187 : : * Returns: (transfer full): a newly created #GSettingsBackend
188 : : *
189 : : * Since: 2.28
190 : : */
191 : : GSettingsBackend *
192 : 2 : g_memory_settings_backend_new (void)
193 : : {
194 : 2 : return g_object_new (G_TYPE_MEMORY_SETTINGS_BACKEND, NULL);
195 : : }
|