[gnome-control-center] info: read version info from gnome-version.xml



commit f3a2a0888fbaed114ab820f645bd17e7d8935340
Author: William Jon McCann <jmccann redhat com>
Date:   Mon Jan 10 17:34:13 2011 -0500

    info: read version info from gnome-version.xml

 panels/info/Makefile.am     |    1 +
 panels/info/cc-info-panel.c |  146 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 140 insertions(+), 7 deletions(-)
---
diff --git a/panels/info/Makefile.am b/panels/info/Makefile.am
index 18f297f..7877d0e 100644
--- a/panels/info/Makefile.am
+++ b/panels/info/Makefile.am
@@ -4,6 +4,7 @@ INCLUDES = 						\
 	-DGNOMECC_UI_DIR="\"$(uidir)\""			\
 	-DGNOMELOCALEDIR="\"$(datadir)/locale\""	\
 	-DGNOMECC_DATA_DIR="\"$(pkgdatadir)\""		\
+	-DDATADIR="\"$(datadir)\""			\
 	$(NULL)
 
 ccpanelsdir = $(PANELS_DIR)
diff --git a/panels/info/cc-info-panel.c b/panels/info/cc-info-panel.c
index ac9af76..aba746a 100644
--- a/panels/info/cc-info-panel.c
+++ b/panels/info/cc-info-panel.c
@@ -31,14 +31,130 @@ G_DEFINE_DYNAMIC_TYPE (CcInfoPanel, cc_info_panel, CC_TYPE_PANEL)
 struct _CcInfoPanelPrivate
 {
   GtkBuilder    *builder;
+  char          *gnome_version;
+  char          *gnome_distributor;
+  char          *gnome_date;
 };
 
+typedef struct
+{
+  char *major;
+  char *minor;
+  char *micro;
+  char *distributor;
+  char *date;
+  char **current;
+} VersionData;
+
+static void
+version_start_element_handler (GMarkupParseContext      *ctx,
+                               const char               *element_name,
+                               const char              **attr_names,
+                               const char              **attr_values,
+                               gpointer                  user_data,
+                               GError                  **error)
+{
+  VersionData *data = user_data;
+  if (g_str_equal (element_name, "platform"))
+    data->current = &data->major;
+  else if (g_str_equal (element_name, "minor"))
+    data->current = &data->minor;
+  else if (g_str_equal (element_name, "micro"))
+    data->current = &data->micro;
+  else if (g_str_equal (element_name, "distributor"))
+    data->current = &data->distributor;
+  else if (g_str_equal (element_name, "date"))
+    data->current = &data->date;
+  else
+    data->current = NULL;
+}
+
+static void
+version_end_element_handler (GMarkupParseContext      *ctx,
+                             const char               *element_name,
+                             gpointer                  user_data,
+                             GError                  **error)
+{
+  VersionData *data = user_data;
+  data->current = NULL;
+}
+
+static void
+version_text_handler (GMarkupParseContext *ctx,
+                      const char          *text,
+                      gsize                text_len,
+                      gpointer             user_data,
+                      GError             **error)
+{
+  VersionData *data = user_data;
+  if (data->current != NULL)
+    *data->current = g_strstrip (g_strdup (text));
+}
+
+static gboolean
+load_gnome_version (char **version,
+                    char **distributor,
+                    char **date)
+{
+  GMarkupParser version_parser = {
+    version_start_element_handler,
+    version_end_element_handler,
+    version_text_handler,
+    NULL,
+    NULL,
+  };
+  GError              *error;
+  GMarkupParseContext *ctx;
+  char                *contents;
+  gsize                length;
+  VersionData         *data;
+  gboolean             ret;
+
+  ret = FALSE;
+
+  error = NULL;
+  if (!g_file_get_contents (DATADIR "/gnome/gnome-version.xml",
+                            &contents,
+                            &length,
+                            &error))
+    return FALSE;
+
+  data = g_new0 (VersionData, 1);
+  ctx = g_markup_parse_context_new (&version_parser, 0, data, NULL);
+
+  if (!g_markup_parse_context_parse (ctx, contents, length, &error))
+    {
+      g_warning ("Invalid version file: '%s'", error->message);
+    }
+  else
+    {
+      if (version != NULL)
+        *version = g_strdup_printf ("%s.%s.%s", data->major, data->minor, data->micro);
+      if (distributor != NULL)
+        *distributor = g_strdup (data->distributor);
+      if (date != NULL)
+        *date = g_strdup (data->date);
+
+      ret = TRUE;
+    }
+
+  g_markup_parse_context_free (ctx);
+  g_free (data->major);
+  g_free (data->minor);
+  g_free (data->micro);
+  g_free (data->distributor);
+  g_free (data->date);
+  g_free (data);
+  g_free (contents);
+
+  return ret;
+};
 
 static void
 cc_info_panel_get_property (GObject    *object,
-                              guint       property_id,
-                              GValue     *value,
-                              GParamSpec *pspec)
+                            guint       property_id,
+                            GValue     *value,
+                            GParamSpec *pspec)
 {
   switch (property_id)
     {
@@ -49,9 +165,9 @@ cc_info_panel_get_property (GObject    *object,
 
 static void
 cc_info_panel_set_property (GObject      *object,
-                              guint         property_id,
-                              const GValue *value,
-                              GParamSpec   *pspec)
+                            guint         property_id,
+                            const GValue *value,
+                            GParamSpec   *pspec)
 {
   switch (property_id)
     {
@@ -77,6 +193,11 @@ cc_info_panel_dispose (GObject *object)
 static void
 cc_info_panel_finalize (GObject *object)
 {
+  CcInfoPanelPrivate *priv = CC_INFO_PANEL (object)->priv;
+
+  g_free (priv->gnome_version);
+  g_free (priv->gnome_date);
+  g_free (priv->gnome_distributor);
 
   G_OBJECT_CLASS (cc_info_panel_parent_class)->finalize (object);
 }
@@ -104,6 +225,7 @@ cc_info_panel_init (CcInfoPanel *self)
 {
   GError     *error;
   GtkWidget  *widget;
+  gboolean    res;
 
   self->priv = INFO_PANEL_PRIVATE (self);
 
@@ -121,7 +243,17 @@ cc_info_panel_init (CcInfoPanel *self)
       return;
     }
 
-
+  res = load_gnome_version (&self->priv->gnome_version,
+                            &self->priv->gnome_distributor,
+                            &self->priv->gnome_date);
+  if (res)
+    {
+      char *text;
+      widget = WID (self->priv->builder, "version_label");
+      text = g_strdup_printf ("Version %s", self->priv->gnome_version);
+      gtk_label_set_text (GTK_LABEL (widget), text);
+      g_free (text);
+    }
 
   widget = WID (self->priv->builder, "info_vbox");
   gtk_widget_reparent (widget, (GtkWidget *) self);



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