[gnome-talos] Attempt to write JSON by default



commit 01df539a75be2c49602144c02ad9787e25d3cff0
Author: Colin Walters <walters verbum org>
Date:   Sat Sep 24 15:41:26 2011 -0400

    Attempt to write JSON by default

 Makefile-src.am   |    4 +-
 configure.ac      |    2 +
 src/gnome-talos.c |   54 +++++++++++++++++++++++++++++++++++++++++++---------
 3 files changed, 48 insertions(+), 12 deletions(-)
---
diff --git a/Makefile-src.am b/Makefile-src.am
index 7215a65..0477e82 100644
--- a/Makefile-src.am
+++ b/Makefile-src.am
@@ -14,6 +14,6 @@ gnome_talos_SOURCES = src/gnome-talos.c \
 	src/gnome-talos-procinfo.h \
 	src/gnome-talos-meta.c \
 	src/gnome-talos-meta.h
-gnome_talos_CPPFLAGS = $(GIO_UNIX_CFLAGS)
-gnome_talos_LDADD = $(GIO_UNIX_LIBS)
+gnome_talos_CPPFLAGS = $(GNOME_TALOS_CFLAGS)
+gnome_talos_LDADD = $(GNOME_TALOS_LIBS)
 
diff --git a/configure.ac b/configure.ac
index 58f80b3..8fb8ccd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -36,6 +36,8 @@ PKG_PROG_PKG_CONFIG([0.22])
 PKG_CHECK_MODULES(GLIB, [glib-2.0])
 PKG_CHECK_MODULES(GIO_UNIX, [gio-unix-2.0])
 
+PKG_CHECK_MODULES(GNOME_TALOS, [gio-unix-2.0 json-glib-1.0])
+
 AM_PATH_PYTHON([2.5])
 AC_SUBST(PYTHON)
 
diff --git a/src/gnome-talos.c b/src/gnome-talos.c
index 6cd083a..c08168e 100644
--- a/src/gnome-talos.c
+++ b/src/gnome-talos.c
@@ -22,6 +22,7 @@
 #include "config.h"
 
 #include <gio/gio.h>
+#include <json-glib/json-glib.h>
 
 #include <string.h>
 
@@ -29,6 +30,7 @@
 #include "gnome-talos-meta.h"
 
 static gint timeout = 5;
+static char *log_file = NULL;
 
 GVariant *
 gather_snapshot (void)
@@ -68,16 +70,32 @@ gather_snapshot (void)
   return data;
 }
 
-static void
-print_variant (GVariant *variant)
+static gboolean
+write_variant (GVariant       *variant,
+	       GCancellable   *cancellable,
+	       GOutputStream  *out,
+	       GError        **error)
 {
-  char *str;
-  str = g_variant_print (variant, TRUE);
-  g_print ("%s\n", str);
-  g_free (str);
+  JsonNode *node;
+  JsonGenerator *generator;
+  gboolean ret;
+
+  generator = json_generator_new ();
+  json_generator_set_pretty (generator, TRUE);
+
+  node = json_gvariant_serialize (variant);
+  json_generator_set_root (generator, node);
+  ret = json_generator_to_stream (generator, out, cancellable, error);
+ 
+  g_object_unref (generator);
+  json_node_free (node);
+
+  return ret;
 }
 
 typedef struct {
+  GFile *out_path;
+  GFileOutputStream *out;
   GMainLoop *loop;
 } GnomeTalosApp;
 
@@ -88,11 +106,11 @@ timeout_gather_data (gpointer user_data)
   GVariant *snapshot;
 
   snapshot = gather_snapshot ();
-  print_variant (snapshot);
+  write_variant (snapshot, NULL, (GOutputStream*)app->out, NULL);
   g_variant_unref (snapshot);
 
   if (timeout > 0)
-    g_timeout_add_seconds (timeout, timeout_gather_data, NULL);
+    g_timeout_add_seconds (timeout, timeout_gather_data, app);
   else
     g_main_loop_quit (app->loop);
 
@@ -109,6 +127,7 @@ main (int    argc,
   GOptionContext *context;
   static const GOptionEntry options[] = {
     { "timeout", 0, 0, G_OPTION_ARG_INT, &timeout, "Time between data snapshots, in seconds (default=5)", "seconds" },
+    { "log-file", 0, 0, G_OPTION_ARG_FILENAME, &log_file, "Log file path", "path" },
     { NULL }
   };
 
@@ -120,12 +139,27 @@ main (int    argc,
   
   if (!g_option_context_parse (context, &argc, &argv, &error))
     {
-      g_printerr ("%s", error->message);
+      g_printerr ("%s\n", error->message);
+      return 1;
+    }
+  if (log_file == NULL)
+    {
+      g_printerr ("--log-file is required\n");
+      return 1;
+    }
+
+  app.out_path = g_file_new_for_path (log_file);
+  app.out = g_file_replace (app.out_path, NULL, FALSE,
+			    G_FILE_CREATE_REPLACE_DESTINATION,
+			    NULL, &error);
+  if (app.out == NULL)
+    {
+      g_printerr ("%s\n", error->message);
       return 1;
     }
 
   sysinfo = gnome_talos_acquire_meta ();
-  print_variant (sysinfo);
+  write_variant (sysinfo, NULL, (GOutputStream*)app.out, NULL);
   g_variant_unref (sysinfo);
 
   app.loop = g_main_loop_new (NULL, TRUE);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]