[tracker] TrackerWriteback: Add logging infrastructure.



commit 8b48dfdbf268b7ff38fb96bfd4158bcf5c3f4db1
Author: Carlos Garnacho <carlos lanedo com>
Date:   Fri Nov 27 12:38:30 2009 +0100

    TrackerWriteback: Add logging infrastructure.
    
    There is now a separate config file for tracker-writeback, at the moment it
    just contains the Verbosity parameter. tracker-writeback now also takes
    command line parameters for it.

 src/tracker-writeback/Makefile.am      |    2 +
 src/tracker-writeback/tracker-config.c |  365 ++++++++++++++++++++++++++++++++
 src/tracker-writeback/tracker-config.h |   61 ++++++
 src/tracker-writeback/tracker-main.c   |   80 +++++++
 4 files changed, 508 insertions(+), 0 deletions(-)
---
diff --git a/src/tracker-writeback/Makefile.am b/src/tracker-writeback/Makefile.am
index ae99e11..ce219dd 100644
--- a/src/tracker-writeback/Makefile.am
+++ b/src/tracker-writeback/Makefile.am
@@ -45,6 +45,8 @@ libexec_PROGRAMS = tracker-writeback
 tracker_writeback_SOURCES = 						\
 	$(marshal_sources)						\
 	$(dbus_sources)							\
+	tracker-config.c						\
+	tracker-config.h						\
 	tracker-writeback-consumer.c					\
 	tracker-writeback-consumer.h					\
 	tracker-writeback-dispatcher.c					\
diff --git a/src/tracker-writeback/tracker-config.c b/src/tracker-writeback/tracker-config.c
new file mode 100644
index 0000000..0c31855
--- /dev/null
+++ b/src/tracker-writeback/tracker-config.c
@@ -0,0 +1,365 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <libtracker-common/tracker-keyfile-object.h>
+#include <libtracker-common/tracker-file-utils.h>
+#include <libtracker-common/tracker-type-utils.h>
+
+#include "tracker-config.h"
+
+#define TRACKER_CONFIG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_CONFIG, TrackerConfigPrivate))
+
+/* GKeyFile defines */
+#define GROUP_GENERAL				 "General"
+
+/* Default values */
+#define DEFAULT_VERBOSITY			 0
+
+typedef struct {
+	/* General */
+	gint	  verbosity;
+} TrackerConfigPrivate;
+
+typedef struct {
+	GType  type;
+	const gchar *property;
+	const gchar *group;
+	const gchar *key;
+} ObjectToKeyFile;
+
+static void     config_set_property         (GObject           *object,
+					     guint              param_id,
+					     const GValue      *value,
+					     GParamSpec        *pspec);
+static void     config_get_property         (GObject           *object,
+					     guint              param_id,
+					     GValue            *value,
+					     GParamSpec        *pspec);
+static void     config_finalize             (GObject           *object);
+static void     config_constructed          (GObject           *object);
+static void     config_changed              (TrackerConfigFile *file);
+static void     config_load                 (TrackerConfig     *config);
+static gboolean config_save                 (TrackerConfig     *config);
+static void     config_create_with_defaults (TrackerConfig     *config,
+					     GKeyFile          *key_file,
+					     gboolean           overwrite);
+
+enum {
+	PROP_0,
+
+	/* General */
+	PROP_VERBOSITY,
+};
+
+static ObjectToKeyFile conversions[] = {
+	/* General */
+	{ G_TYPE_INT,     "verbosity",                        GROUP_GENERAL,  "Verbosity"                 }
+};
+
+G_DEFINE_TYPE (TrackerConfig, tracker_config, TRACKER_TYPE_CONFIG_FILE);
+
+static void
+tracker_config_class_init (TrackerConfigClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	TrackerConfigFileClass *config_file_class = TRACKER_CONFIG_FILE_CLASS (klass);
+
+	object_class->set_property = config_set_property;
+	object_class->get_property = config_get_property;
+	object_class->finalize	   = config_finalize;
+	object_class->constructed  = config_constructed;
+
+	config_file_class->changed = config_changed;
+
+	/* General */
+	g_object_class_install_property (object_class,
+					 PROP_VERBOSITY,
+					 g_param_spec_int ("verbosity",
+							   "Log verbosity",
+							   " Log verbosity (0=errors, 1=minimal, 2=detailed, 3=debug)",
+							   0,
+							   3,
+							   DEFAULT_VERBOSITY,
+							   G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+	g_type_class_add_private (object_class, sizeof (TrackerConfigPrivate));
+}
+
+static void
+tracker_config_init (TrackerConfig *object)
+{
+}
+
+static void
+config_set_property (GObject	  *object,
+		     guint	   param_id,
+		     const GValue *value,
+		     GParamSpec	  *pspec)
+{
+	switch (param_id) {
+		/* General */
+	case PROP_VERBOSITY:
+		tracker_config_set_verbosity (TRACKER_CONFIG (object),
+					      g_value_get_int (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+static void
+config_get_property (GObject	*object,
+		     guint	 param_id,
+		     GValue	*value,
+		     GParamSpec *pspec)
+{
+	TrackerConfigPrivate *priv;
+
+	priv = TRACKER_CONFIG_GET_PRIVATE (object);
+
+	switch (param_id) {
+		/* General */
+	case PROP_VERBOSITY:
+		g_value_set_int (value, priv->verbosity);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+static void
+config_finalize (GObject *object)
+{
+	TrackerConfigPrivate *priv;
+
+	priv = TRACKER_CONFIG_GET_PRIVATE (object);
+
+	(G_OBJECT_CLASS (tracker_config_parent_class)->finalize) (object);
+}
+
+static void
+config_constructed (GObject *object)
+{
+	(G_OBJECT_CLASS (tracker_config_parent_class)->constructed) (object);
+
+	config_load (TRACKER_CONFIG (object));
+}
+
+static void
+config_changed (TrackerConfigFile *file)
+{
+	/* Reload config */
+	config_load (TRACKER_CONFIG (file));
+}
+
+static void
+config_create_with_defaults (TrackerConfig *config,
+			     GKeyFile      *key_file,
+			     gboolean       overwrite)
+{
+	gint i;
+
+	g_message ("Loading defaults into GKeyFile...");
+
+	for (i = 0; i < G_N_ELEMENTS (conversions); i++) {
+		gboolean has_key;
+
+		has_key = g_key_file_has_key (key_file,
+					      conversions[i].group,
+					      conversions[i].key,
+					      NULL);
+		if (!overwrite && has_key) {
+			continue;
+		}
+
+		switch (conversions[i].type) {
+		case G_TYPE_INT:
+			g_key_file_set_integer (key_file,
+						conversions[i].group,
+						conversions[i].key,
+						tracker_keyfile_object_default_int (config,
+										    conversions[i].property));
+			break;
+
+		case G_TYPE_BOOLEAN:
+			g_key_file_set_boolean (key_file,
+						conversions[i].group,
+						conversions[i].key,
+						tracker_keyfile_object_default_boolean (config,
+											conversions[i].property));
+			break;
+
+		default:
+			g_assert_not_reached ();
+		}
+
+		g_key_file_set_comment (key_file,
+					conversions[i].group,
+					conversions[i].key,
+					tracker_keyfile_object_blurb (config,
+								      conversions[i].property),
+					NULL);
+	}
+}
+
+static void
+config_load (TrackerConfig *config)
+{
+	TrackerConfigFile *file;
+	gint i;
+
+	file = TRACKER_CONFIG_FILE (config);
+	config_create_with_defaults (config, file->key_file, FALSE);
+
+	if (!file->file_exists) {
+		tracker_config_file_save (file);
+	}
+
+	for (i = 0; i < G_N_ELEMENTS (conversions); i++) {
+		gboolean has_key;
+
+		has_key = g_key_file_has_key (file->key_file,
+					      conversions[i].group,
+					      conversions[i].key,
+					      NULL);
+
+		switch (conversions[i].type) {
+		case G_TYPE_INT:
+			tracker_keyfile_object_load_int (G_OBJECT (file),
+							 conversions[i].property,
+							 file->key_file,
+							 conversions[i].group,
+							 conversions[i].key);
+			break;
+
+		case G_TYPE_BOOLEAN:
+			tracker_keyfile_object_load_boolean (G_OBJECT (file),
+							     conversions[i].property,
+							     file->key_file,
+							     conversions[i].group,
+							     conversions[i].key);
+			break;
+		}
+	}
+}
+
+static gboolean
+config_save (TrackerConfig *config)
+{
+	TrackerConfigFile *file;
+	gint i;
+
+	file = TRACKER_CONFIG_FILE (config);
+
+	if (!file->key_file) {
+		g_critical ("Could not save config, GKeyFile was NULL, has the config been loaded?");
+
+		return FALSE;
+	}
+
+	g_message ("Setting details to GKeyFile object...");
+
+	for (i = 0; i < G_N_ELEMENTS (conversions); i++) {
+		switch (conversions[i].type) {
+		case G_TYPE_INT:
+			tracker_keyfile_object_save_int (file,
+							 conversions[i].property,
+							 file->key_file,
+							 conversions[i].group,
+							 conversions[i].key);
+			break;
+
+		case G_TYPE_BOOLEAN:
+			tracker_keyfile_object_save_boolean (file,
+							     conversions[i].property,
+							     file->key_file,
+							     conversions[i].group,
+							     conversions[i].key);
+			break;
+
+		default:
+			g_assert_not_reached ();
+			break;
+		}
+	}
+
+	return tracker_config_file_save (file);
+}
+
+TrackerConfig *
+tracker_config_new (void)
+{
+	return g_object_new (TRACKER_TYPE_CONFIG, NULL);
+}
+
+
+TrackerConfig *
+tracker_config_new_with_domain (const gchar *domain)
+{
+	return g_object_new (TRACKER_TYPE_CONFIG,  "domain", domain, NULL);
+}
+
+gboolean
+tracker_config_save (TrackerConfig *config)
+{
+	g_return_val_if_fail (TRACKER_IS_CONFIG (config), FALSE);
+
+	return config_save (config);
+}
+
+gint
+tracker_config_get_verbosity (TrackerConfig *config)
+{
+	TrackerConfigPrivate *priv;
+
+	g_return_val_if_fail (TRACKER_IS_CONFIG (config), DEFAULT_VERBOSITY);
+
+	priv = TRACKER_CONFIG_GET_PRIVATE (config);
+
+	return priv->verbosity;
+}
+
+void
+tracker_config_set_verbosity (TrackerConfig *config,
+			      gint	     value)
+{
+	TrackerConfigPrivate *priv;
+
+	g_return_if_fail (TRACKER_IS_CONFIG (config));
+
+	if (!tracker_keyfile_object_validate_int (config, "verbosity", value)) {
+		return;
+	}
+
+	priv = TRACKER_CONFIG_GET_PRIVATE (config);
+
+	priv->verbosity = value;
+	g_object_notify (G_OBJECT (config), "verbosity");
+}
diff --git a/src/tracker-writeback/tracker-config.h b/src/tracker-writeback/tracker-config.h
new file mode 100644
index 0000000..89a53e8
--- /dev/null
+++ b/src/tracker-writeback/tracker-config.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009%, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __TRACKER_WRITEBACK_CONFIG_H__
+#define __TRACKER_WRITEBACK_CONFIG_H__
+
+#include <glib-object.h>
+
+#include <libtracker-common/tracker-config-file.h>
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_CONFIG	    (tracker_config_get_type ())
+#define TRACKER_CONFIG(o)	    (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_CONFIG, TrackerConfig))
+#define TRACKER_CONFIG_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), TRACKER_TYPE_CONFIG, TrackerConfigClass))
+#define TRACKER_IS_CONFIG(o)	    (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_CONFIG))
+#define TRACKER_IS_CONFIG_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), TRACKER_TYPE_CONFIG))
+#define TRACKER_CONFIG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_CONFIG, TrackerConfigClass))
+
+typedef struct TrackerConfig	  TrackerConfig;
+typedef struct TrackerConfigClass TrackerConfigClass;
+
+struct TrackerConfig {
+	TrackerConfigFile parent;
+};
+
+struct TrackerConfigClass {
+	TrackerConfigFileClass parent_class;
+};
+
+GType	       tracker_config_get_type				   (void) G_GNUC_CONST;
+
+TrackerConfig *tracker_config_new                                  (void);
+TrackerConfig *tracker_config_new_with_domain                      (const gchar *domain);
+
+gboolean       tracker_config_save                                 (TrackerConfig *config);
+
+gint           tracker_config_get_verbosity                        (TrackerConfig *config);
+void           tracker_config_set_verbosity                        (TrackerConfig *config,
+								    gint           value);
+
+G_END_DECLS
+
+#endif /* __TRACKER_WRITEBACK_CONFIG_H__ */
diff --git a/src/tracker-writeback/tracker-main.c b/src/tracker-writeback/tracker-main.c
index e22737e..0c1eec2 100644
--- a/src/tracker-writeback/tracker-main.c
+++ b/src/tracker-writeback/tracker-main.c
@@ -21,9 +21,38 @@
 #include "config.h"
 
 #include <stdlib.h>
+#include <libtracker-common/tracker-log.h>
+#include <glib/gi18n.h>
 
 #include "tracker-writeback-dispatcher.h"
 #include "tracker-writeback-consumer.h"
+#include "tracker-config.h"
+
+#define ABOUT								  \
+	"Tracker " PACKAGE_VERSION "\n"
+
+#define LICENSE								  \
+	"This program is free software and comes without any warranty.\n" \
+	"It is licensed under version 2 or later of the General Public "  \
+	"License which can be viewed at:\n"				  \
+	"\n"								  \
+	"  http://www.gnu.org/licenses/gpl.txt\n";
+
+static gboolean      version;
+static gint	     verbosity = -1;
+
+static GOptionEntry  entries[] = {
+	{ "version", 'V', 0,
+	  G_OPTION_ARG_NONE, &version,
+	  N_("Displays version information"),
+	  NULL },
+	{ "verbosity", 'v', 0,
+	  G_OPTION_ARG_INT, &verbosity,
+	  N_("Logging, 0 = errors only, "
+	     "1 = minimal, 2 = detailed and 3 = debug (default=0)"),
+	  NULL },
+	{ NULL }
+};
 
 typedef struct {
 	gchar *subject;
@@ -107,18 +136,65 @@ dispatcher_thread_func (gpointer data)
 	return NULL;
 }
 
+static void
+sanity_check_option_values (TrackerConfig *config)
+{
+	g_message ("General options:");
+	g_message ("  Verbosity  ............................  %d",
+		   tracker_config_get_verbosity (config));
+}
+
 int
 main (int   argc,
       char *argv[])
 {
+	TrackerConfig *config;
+	GOptionContext *context;
 	GMainLoop *loop;
 	GError *error = NULL;
+	gchar *log_filename;
 
 	g_thread_init (NULL);
 	dbus_g_thread_init ();
 
 	g_type_init ();
 
+	/* Set up locale */
+	setlocale (LC_ALL, "");
+
+	bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+	textdomain (GETTEXT_PACKAGE);
+
+	/* Translators: this messagge will apper immediately after the
+	 * usage string - Usage: COMMAND <THIS_MESSAGE>
+	 */
+	context = g_option_context_new (_("- start the tracker writeback service"));
+
+	g_option_context_add_main_entries (context, entries, NULL);
+	g_option_context_parse (context, &argc, &argv, &error);
+	g_option_context_free (context);
+
+        if (version) {
+                g_print ("\n" ABOUT "\n" LICENSE "\n");
+                return EXIT_SUCCESS;
+        }
+
+	/* Initialize logging */
+	config = tracker_config_new ();
+
+	if (verbosity > -1) {
+		tracker_config_set_verbosity (config, verbosity);
+	}
+
+	tracker_log_init (tracker_config_get_verbosity (config),
+                          &log_filename);
+	g_print ("Starting log:\n  File:'%s'\n", log_filename);
+	g_free (log_filename);
+
+	sanity_check_option_values (config);
+
+
 	consumer = tracker_writeback_consumer_new ();
 
 	/* Create dispatcher thread data here, GType
@@ -143,8 +219,12 @@ main (int   argc,
 	loop = g_main_loop_new (NULL, FALSE);
 	g_main_loop_run (loop);
 
+	tracker_log_shutdown ();
+
 	g_object_unref (consumer);
 	g_main_loop_unref (loop);
 
+	g_object_unref (config);
+
 	return EXIT_SUCCESS;
 }



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