Rename gsettings-tool to gsettings
[platform/upstream/glib.git] / gio / gsettings-tool.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 2010 Red Hat, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser 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.
8  *
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  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser 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.
18  *
19  * Author: Matthias Clasen
20  */
21
22 #include "config.h"
23
24 #include <locale.h>
25 #include <gi18n.h>
26 #include <gio.h>
27
28 static gint
29 usage (gint      *argc,
30        gchar    **argv[],
31        gboolean   use_stdout)
32 {
33   GOptionContext *context;
34   gchar *s;
35
36   g_set_prgname (g_path_get_basename ((*argv)[0]));
37
38   context = g_option_context_new (_("COMMAND"));
39   g_option_context_set_help_enabled (context, FALSE);
40   s = g_strdup_printf (
41     _("Commands:\n"
42       "  help        Show this information\n"
43       "  get         Get the value of a key\n"
44       "  set         Set the value of a key\n"
45       "  monitor     Monitor a key for changes\n"
46       "  writable    Check if a key is writable\n"
47       "\n"
48       "Use '%s COMMAND --help' to get help for individual commands.\n"),
49       g_get_prgname ());
50   g_option_context_set_description (context, s);
51   g_free (s);
52   s = g_option_context_get_help (context, FALSE, NULL);
53   if (use_stdout)
54     g_print ("%s", s);
55   else
56     g_printerr ("%s", s);
57   g_free (s);
58   g_option_context_free (context);
59
60   return use_stdout ? 0 : 1;
61 }
62
63 static void
64 remove_arg (gint num, gint *argc, gchar **argv[])
65 {
66   gint n;
67
68   g_assert (num <= (*argc));
69
70   for (n = num; (*argv)[n] != NULL; n++)
71     (*argv)[n] = (*argv)[n+1];
72   (*argv)[n] = NULL;
73   (*argc) = (*argc) - 1;
74 }
75
76 static void
77 modify_argv0_for_command (gint         *argc,
78                           gchar       **argv[],
79                           const gchar  *command)
80 {
81   gchar *s;
82
83   g_assert (g_strcmp0 ((*argv)[1], command) == 0);
84   remove_arg (1, argc, argv);
85
86   s = g_strdup_printf ("%s %s", (*argv)[0], command);
87   (*argv)[0] = s;
88 }
89
90
91 static gint
92 handle_get (gint   *argc,
93             gchar **argv[])
94 {
95   gchar *schema;
96   gchar *path;
97   gchar *key;
98   GSettings *settings;
99   GVariant *v;
100   GOptionContext *context;
101   GOptionEntry entries[] = {
102     { "path", 'p', 0, G_OPTION_ARG_STRING, &path, N_("Specify the path for the schema"), N_("PATH") },
103     { NULL }
104   };
105   GError *error;
106   gint ret = 1;
107
108   modify_argv0_for_command (argc, argv, "get");
109
110   context = g_option_context_new (_("SCHEMA KEY"));
111   g_option_context_set_help_enabled (context, FALSE);
112   g_option_context_set_summary (context, _("Get the value of KEY"));
113   g_option_context_set_description (context,
114     _("Arguments:\n"
115       "  SCHEMA      The id of the schema\n"
116       "  KEY         The name of the key\n"));
117   g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
118
119   path = NULL;
120
121   error = NULL;
122   if (!g_option_context_parse (context, argc, argv, NULL) || *argc != 3)
123     {
124       gchar *s;
125       s = g_option_context_get_help (context, FALSE, NULL);
126       g_printerr ("%s", s);
127       g_free (s);
128
129       goto out;
130     }
131
132   schema = (*argv)[1];
133   key = (*argv)[2];
134
135   settings = g_settings_new_with_path (schema, path);
136
137   v = g_settings_get_value (settings, key);
138   g_print ("%s\n", g_variant_print (v, FALSE));
139   g_variant_unref (v);
140   ret = 0;
141
142  out:
143   g_option_context_free (context);
144
145   return ret;
146 }
147
148 static gint
149 handle_set (gint   *argc,
150             gchar **argv[])
151 {
152   gchar *schema;
153   gchar *path;
154   gchar *key;
155   gchar *value;
156   GSettings *settings;
157   GVariant *v;
158   const GVariantType *type;
159   GOptionContext *context;
160   GOptionEntry entries[] = {
161     { "path", 'p', 0, G_OPTION_ARG_STRING, &path, N_("Specify the path for the schema"), N_("PATH") },
162     { NULL }
163   };
164   GError *error;
165   gint ret = 1;
166
167   modify_argv0_for_command (argc, argv, "set");
168
169   context = g_option_context_new (_("SCHEMA KEY VALUE"));
170   g_option_context_set_help_enabled (context, FALSE);
171   g_option_context_set_summary (context, _("Set the value of KEY"));
172   g_option_context_set_description (context,
173     _("Arguments:\n"
174       "  SCHEMA      The id of the schema\n"
175       "  KEY         The name of the key\n"
176       "  VALUE       The value to set key to, as a serialized GVariant\n"));
177   g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
178
179   path = NULL;
180
181   error = NULL;
182   if (!g_option_context_parse (context, argc, argv, NULL) || *argc != 4)
183     {
184       gchar *s;
185       s = g_option_context_get_help (context, FALSE, NULL);
186       g_printerr ("%s", s);
187       g_free (s);
188
189       goto out;
190     }
191
192   schema = (*argv)[1];
193   key = (*argv)[2];
194   value = (*argv)[3];
195
196   settings = g_settings_new_with_path (schema, path);
197
198   v = g_settings_get_value (settings, key);
199   type = g_variant_get_type (v);
200   g_variant_unref (v);
201
202   error = NULL;
203   v = g_variant_parse (type, value, NULL, NULL, &error);
204   if (v == NULL)
205     {
206       g_printerr ("%s\n", error->message);
207       goto out;
208     }
209
210   if (!g_settings_set_value (settings, key, v))
211     {
212       g_printerr (_("Key %s is not writable\n"), key);
213       goto out;
214     }
215
216   ret = 0;
217
218  out:
219   g_option_context_free (context);
220
221   return ret;
222 }
223
224 static gint
225 handle_writable (gint   *argc,
226                  gchar **argv[])
227 {
228   gchar *schema;
229   gchar *path;
230   gchar *key;
231   GSettings *settings;
232   GOptionContext *context;
233   GOptionEntry entries[] = {
234     { "path", 'p', 0, G_OPTION_ARG_STRING, &path, N_("Specify the path for the schema"), N_("PATH") },
235     { NULL }
236   };
237   GError *error;
238   gint ret = 1;
239
240   modify_argv0_for_command (argc, argv, "writable");
241
242   context = g_option_context_new (_("SCHEMA KEY"));
243   g_option_context_set_help_enabled (context, FALSE);
244   g_option_context_set_summary (context, _("Find out whether KEY is writable"));
245   g_option_context_set_description (context,
246     _("Arguments:\n"
247       "  SCHEMA      The id of the schema\n"
248       "  KEY         The name of the key\n"));
249   g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
250
251   path = NULL;
252
253   error = NULL;
254   if (!g_option_context_parse (context, argc, argv, NULL) || *argc != 3)
255     {
256       gchar *s;
257       s = g_option_context_get_help (context, FALSE, NULL);
258       g_printerr ("%s", s);
259       g_free (s);
260
261       goto out;
262     }
263
264   schema = (*argv)[1];
265   key = (*argv)[2];
266
267   settings = g_settings_new_with_path (schema, path);
268
269   if (g_settings_is_writable (settings, key))
270     g_print ("true\n");
271   else
272     g_print ("false\n");
273   ret = 0;
274
275  out:
276   g_option_context_free (context);
277
278   return ret;
279 }
280
281 static void
282 key_changed (GSettings   *settings,
283              const gchar *key)
284 {
285   GVariant *v;
286   gchar *value;
287
288   v = g_settings_get_value (settings, key);
289   value = g_variant_print (v, FALSE);
290   g_print ("%s\n", value);
291   g_free (value);
292   g_variant_unref (v);
293 }
294
295 static gint
296 handle_monitor (gint   *argc,
297                 gchar **argv[])
298 {
299   gchar *schema;
300   gchar *path;
301   gchar *key;
302   GSettings *settings;
303   gchar *detailed_signal;
304   GMainLoop *loop;
305   GOptionContext *context;
306   GOptionEntry entries[] = {
307     { "path", 'p', 0, G_OPTION_ARG_STRING, &path, N_("Specify the path for the schema"), N_("PATH") },
308     { NULL }
309   };
310   GError *error;
311   gint ret = 1;
312
313   modify_argv0_for_command (argc, argv, "monitor");
314
315   context = g_option_context_new (_("SCHEMA KEY"));
316   g_option_context_set_help_enabled (context, FALSE);
317   g_option_context_set_summary (context,
318     _("Monitor KEY for changes and print the changed values.\n"
319       "Monitoring will continue until the process is terminated."));
320
321   g_option_context_set_description (context,
322     _("Arguments:\n"
323       "  SCHEMA      The id of the schema\n"
324       "  KEY         The name of the key\n"));
325   g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
326
327   path = NULL;
328
329   error = NULL;
330   if (!g_option_context_parse (context, argc, argv, NULL) || *argc != 3)
331     {
332       gchar *s;
333       s = g_option_context_get_help (context, FALSE, NULL);
334       g_printerr ("%s", s);
335       g_free (s);
336
337       goto out;
338     }
339
340   schema = (*argv)[1];
341   key = (*argv)[2];
342
343   settings = g_settings_new_with_path (schema, path);
344
345   detailed_signal = g_strdup_printf ("changed::%s", key);
346   g_signal_connect (settings, detailed_signal,
347                     G_CALLBACK (key_changed), NULL);
348
349   loop = g_main_loop_new (NULL, FALSE);
350   g_main_loop_run (loop);
351   g_main_loop_unref (loop);
352
353  out:
354   g_option_context_free (context);
355
356   return ret;
357 }
358 int
359 main (int argc, char *argv[])
360 {
361   gboolean ret = 1;
362
363   setlocale (LC_ALL, "");
364
365   g_type_init ();
366
367   if (argc < 2)
368     ret = usage (&argc, &argv, FALSE);
369   else if (g_strcmp0 (argv[1], "help") == 0)
370     ret = usage (&argc, &argv, TRUE);
371   else if (g_strcmp0 (argv[1], "get") == 0)
372     ret = handle_get (&argc, &argv);
373   else if (g_strcmp0 (argv[1], "set") == 0)
374     ret = handle_set (&argc, &argv);
375   else if (g_strcmp0 (argv[1], "monitor") == 0)
376     ret = handle_monitor (&argc, &argv);
377   else if (g_strcmp0 (argv[1], "writable") == 0)
378     ret = handle_writable (&argc, &argv);
379   else
380     {
381       g_printerr (_("Unknown command '%s'\n"), argv[1]);
382       ret = usage (&argc, &argv, FALSE);
383     }
384
385   return ret;
386 }