[liboobs] Make OobsService a real OobsObject



commit e4b5b217d1cd9a0c0aedb4c15ace35c74b67bd87
Author: Milan Bouchet-Valat <nalimilan club fr>
Date:   Tue Jan 26 16:35:15 2010 +0100

    Make OobsService a real OobsObject
    
    We need to commit OobsService separately just as OobsUser and OobsGroup to avoid terrible effect such as messing with all system services.
    
    This requires the System Tools Backends 2.9.2.

 configure.in                       |    2 +-
 oobs/Makefile.am                   |    2 +
 oobs/oobs-service-private.h        |   42 +++++++
 oobs/oobs-service.c                |  209 +++++++++++++++++++++++++++++++++++-
 oobs/oobs-service.h                |    4 +-
 oobs/oobs-servicesconfig-private.h |   33 ++++++
 oobs/oobs-servicesconfig.c         |  142 ++----------------------
 7 files changed, 299 insertions(+), 135 deletions(-)
---
diff --git a/configure.in b/configure.in
index 7ad7d3d..1905bf6 100644
--- a/configure.in
+++ b/configure.in
@@ -33,7 +33,7 @@ AC_SUBST(LT_AGE)
 
 GLIB_REQUIRED=2.14.0
 DBUS_REQUIRED=0.70
-STB_REQUIRED=2.9.1
+STB_REQUIRED=2.9.2
 HAL_REQUIRED=0.5.9
 
 dnl set gettext stuff
diff --git a/oobs/Makefile.am b/oobs/Makefile.am
index 2158089..f849766 100644
--- a/oobs/Makefile.am
+++ b/oobs/Makefile.am
@@ -56,6 +56,8 @@ oobs_private_headers = 	\
 	oobs-session-private.h	\
 	oobs-user-private.h	\
 	oobs-group-private.h	\
+	oobs-service-private.h	\
+	oobs-servicesconfig-private.h	\
 	utils.h
 
 oobs_built_sources = \
diff --git a/oobs/oobs-service-private.h b/oobs/oobs-service-private.h
new file mode 100644
index 0000000..7d4c821
--- /dev/null
+++ b/oobs/oobs-service-private.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */
+/* Copyright (C) 2010 Milan Bouchet-Valat
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Authors: Milan Bouchet-Valat <nalimilan club fr>.
+ */
+
+#ifndef __OOBS_SERVICE_PRIVATE_H
+#define __OOBS_SERVICE_PRIVATE_H
+
+G_BEGIN_DECLS
+
+#include <dbus/dbus.h>
+
+#include "oobs-service.h"
+
+OobsService* _oobs_service_create_from_dbus_reply      (OobsService        *service,
+                                                        DBusMessage        *reply,
+                                                        DBusMessageIter     struct_iter);
+
+gboolean     _oobs_create_dbus_struct_from_service     (OobsService     *service,
+                                                        GList           *runlevels,
+                                                        DBusMessage     *message,
+                                                        DBusMessageIter *array_iter);
+
+G_END_DECLS
+
+#endif /* __OOBS_SERVICE_PRIVATE_H */
+
diff --git a/oobs/oobs-service.c b/oobs/oobs-service.c
index 6a4d02e..4b61150 100644
--- a/oobs/oobs-service.c
+++ b/oobs/oobs-service.c
@@ -19,7 +19,12 @@
  */
 
 #include <glib-object.h>
+
 #include "oobs-service.h"
+#include "oobs-object-private.h"
+#include "oobs-service-private.h"
+#include "oobs-servicesconfig-private.h"
+#include "utils.h"
 
 /**
  * SECTION:oobs-service
@@ -28,6 +33,7 @@
  * @see_also: #OobsServicesConfig
  **/
 
+#define SERVICE_REMOTE_OBJECT "ServiceConfig2"
 #define OOBS_SERVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), OOBS_TYPE_SERVICE, OobsServicePrivate))
 
 typedef struct _OobsServicePrivate  OobsServicePrivate;
@@ -39,6 +45,7 @@ struct _OobsServiceRunlevel {
 };
 	
 struct _OobsServicePrivate {
+  OobsServicesConfig *config;
   gchar *name;
   GHashTable *runlevels_config;
 };
@@ -55,23 +62,36 @@ static void oobs_service_get_property (GObject      *object,
 				       guint         prop_id,
 				       GValue       *value,
 				       GParamSpec   *pspec);
+
+static void oobs_service_commit             (OobsObject *object);
+static void oobs_service_update             (OobsObject *object);
+static void oobs_service_get_update_message (OobsObject *object);
+
 enum
 {
   PROP_0,
   PROP_NAME
 };
 
-G_DEFINE_TYPE (OobsService, oobs_service, G_TYPE_OBJECT);
+G_DEFINE_TYPE (OobsService, oobs_service, OOBS_TYPE_OBJECT);
 
 static void
 oobs_service_class_init (OobsServiceClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
+  OobsObjectClass *oobs_object_class = OOBS_OBJECT_CLASS (class);
 
   object_class->set_property = oobs_service_set_property;
   object_class->get_property = oobs_service_get_property;
   object_class->finalize     = oobs_service_finalize;
 
+  oobs_object_class->commit              = oobs_service_commit;
+  oobs_object_class->update              = oobs_service_update;
+  oobs_object_class->get_update_message  = oobs_service_get_update_message;
+
+  /* override the singleton check */
+  oobs_object_class->singleton = FALSE;
+
   g_object_class_install_property (object_class,
 				   PROP_NAME,
 				   g_param_spec_string ("name",
@@ -92,6 +112,7 @@ oobs_service_init (OobsService *service)
 
   priv = OOBS_SERVICE_GET_PRIVATE (service);
 
+  priv->config = OOBS_SERVICES_CONFIG (oobs_services_config_get ());
   priv->name = NULL;
   priv->runlevels_config = g_hash_table_new_full (NULL, NULL, NULL,
 						  (GDestroyNotify) g_free);
@@ -152,6 +173,192 @@ oobs_service_finalize (GObject *object)
     (* G_OBJECT_CLASS (oobs_service_parent_class)->finalize) (object);
 }
 
+static void
+oobs_service_commit (OobsObject *object)
+{
+  OobsServicePrivate *priv;
+  DBusMessage *message;
+  DBusMessageIter iter;
+  gboolean correct;
+  GList *runlevels;
+
+  correct = TRUE;
+  priv = OOBS_SERVICE (object)->_priv;
+  message = _oobs_object_get_dbus_message (object);
+  dbus_message_iter_init_append (message, &iter);
+
+  runlevels = oobs_services_config_get_runlevels (priv->config);
+  correct = _oobs_create_dbus_struct_from_service (OOBS_SERVICE (object),
+                                                   runlevels,
+                                                   message, &iter);
+  g_list_free (runlevels);
+
+  if (!correct)
+    {
+      /* malformed data, unset the message */
+      _oobs_object_set_dbus_message (object, NULL);
+    }
+}
+
+/*
+ * We need a custom update message containing the service name.
+ */
+static void
+oobs_service_get_update_message (OobsObject *object)
+{
+  OobsServicePrivate *priv;
+  DBusMessageIter iter;
+  DBusMessage *message;
+
+  priv = OOBS_SERVICE (object)->_priv;
+
+  message = _oobs_object_get_dbus_message (object);
+  dbus_message_iter_init_append (message, &iter);
+
+  utils_append_string (&iter, priv->name);
+}
+
+static void
+oobs_service_update (OobsObject *object)
+{
+  OobsServicePrivate *priv;
+  DBusMessage     *reply;
+  DBusMessageIter  iter, elem_iter;
+
+  priv  = OOBS_SERVICE (object)->_priv;
+  reply = _oobs_object_get_dbus_message (object);
+
+  dbus_message_iter_init (reply, &iter);
+
+  _oobs_service_create_from_dbus_reply (OOBS_SERVICE (object),
+                                        reply, elem_iter);
+}
+
+static void
+create_service_runlevels_from_dbus_reply (OobsService        *service,
+                                          DBusMessage        *reply,
+                                          DBusMessageIter     struct_iter)
+{
+  OobsServicePrivate *priv;
+  DBusMessageIter runlevel_iter;
+  OobsServicesRunlevel *rl;
+  OobsServiceStatus status;
+  const gchar *runlevel;
+  gint priority;
+
+  priv = service->_priv;
+
+  while (dbus_message_iter_get_arg_type (&struct_iter) == DBUS_TYPE_STRUCT)
+    {
+      dbus_message_iter_recurse (&struct_iter, &runlevel_iter);
+
+      runlevel = utils_get_string (&runlevel_iter);
+      status = utils_get_int (&runlevel_iter);
+      priority = utils_get_int (&runlevel_iter);
+
+      rl = _oobs_services_config_get_runlevel (priv->config, runlevel);
+
+      if (rl)
+	oobs_service_set_runlevel_configuration (service, rl, status, priority);
+
+      dbus_message_iter_next (&struct_iter);
+    }
+}
+
+OobsService*
+_oobs_service_create_from_dbus_reply (OobsService        *service,
+                                      DBusMessage        *reply,
+                                      DBusMessageIter     struct_iter)
+{
+  DBusMessageIter iter, runlevels_iter;
+  const gchar *name;
+
+  dbus_message_iter_recurse (&struct_iter, &iter);
+
+  name = utils_get_string (&iter);
+
+  if (!service)
+    service = g_object_new (OOBS_TYPE_SERVICE,
+                            "remote-object", SERVICE_REMOTE_OBJECT,
+                            "name", name,
+                            NULL);
+
+  dbus_message_iter_recurse (&iter, &runlevels_iter);
+  create_service_runlevels_from_dbus_reply (OOBS_SERVICE (service),
+					    reply, runlevels_iter);
+  return service;
+}
+
+
+static void
+create_dbus_struct_from_service_runlevels (OobsService     *service,
+					   GList           *runlevels,
+					   DBusMessage     *message,
+					   DBusMessageIter *iter)
+{
+  DBusMessageIter runlevels_iter, struct_iter;
+  OobsServicesRunlevel *runlevel;
+  OobsServiceStatus status;
+  gint priority;
+
+  dbus_message_iter_open_container (iter,
+				    DBUS_TYPE_ARRAY,
+				    DBUS_STRUCT_BEGIN_CHAR_AS_STRING
+				    DBUS_TYPE_STRING_AS_STRING
+				    DBUS_TYPE_INT32_AS_STRING
+				    DBUS_TYPE_INT32_AS_STRING
+				    DBUS_STRUCT_END_CHAR_AS_STRING,
+				    &runlevels_iter);
+
+  while (runlevels)
+    {
+      runlevel = runlevels->data;
+      runlevels = runlevels->next;
+
+      oobs_service_get_runlevel_configuration (service, runlevel, &status, &priority);
+
+      if (status == OOBS_SERVICE_IGNORE)
+	continue;
+
+      dbus_message_iter_open_container (&runlevels_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter);
+
+      utils_append_string (&struct_iter, runlevel->name);
+      utils_append_int (&struct_iter, status);
+      utils_append_int (&struct_iter, priority);
+
+      dbus_message_iter_close_container (&runlevels_iter, &struct_iter);
+    }
+
+  dbus_message_iter_close_container (iter, &runlevels_iter);
+}
+
+gboolean
+_oobs_create_dbus_struct_from_service (OobsService     *service,
+                                       GList           *runlevels,
+                                       DBusMessage     *message,
+                                       DBusMessageIter *array_iter)
+{
+  DBusMessageIter struct_iter;
+  gchar *name;
+
+  g_object_get (G_OBJECT (service),
+		"name", &name,
+		NULL);
+
+  g_return_val_if_fail (name, FALSE);
+
+  dbus_message_iter_open_container (array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter);
+
+  utils_append_string (&struct_iter, name);
+  create_dbus_struct_from_service_runlevels (service, runlevels, message, &struct_iter);
+
+  dbus_message_iter_close_container (array_iter, &struct_iter);
+
+  g_free (name);
+
+  return TRUE;
+}
+
 /**
  * oobs_service_get_name:
  * @service: An #OobsService.
diff --git a/oobs/oobs-service.h b/oobs/oobs-service.h
index fc1728d..bae0590 100644
--- a/oobs/oobs-service.h
+++ b/oobs/oobs-service.h
@@ -45,14 +45,14 @@ typedef enum
 } OobsServiceStatus;
 
 struct _OobsService {
-  GObject parent;
+  OobsObject parent;
 
   /*<private>*/
   gpointer _priv;
 };
 
 struct _OobsServiceClass {
-  GObjectClass parent_class;
+  OobsObjectClass parent_class;
 
   void (*_oobs_padding1) (void);
   void (*_oobs_padding2) (void);
diff --git a/oobs/oobs-servicesconfig-private.h b/oobs/oobs-servicesconfig-private.h
new file mode 100644
index 0000000..d61815d
--- /dev/null
+++ b/oobs/oobs-servicesconfig-private.h
@@ -0,0 +1,33 @@
+/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */
+/* Copyright (C) 2010 Milan Bouchet-Valat
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Authors: Milan Bouchet-Valat <nalimilan club fr>.
+ */
+
+#ifndef __OOBS_SERVICES_CONFIG_PRIVATE_H
+#define __OOBS_SERVICES_CONFIG_PRIVATE_H
+
+G_BEGIN_DECLS
+
+#include "oobs-servicesconfig.h"
+
+OobsServicesRunlevel* _oobs_services_config_get_runlevel (OobsServicesConfig *config,
+                                                          const gchar        *runlevel);
+
+G_END_DECLS
+
+#endif /* __OOBS_SERVICES_CONFIG_PRIVATE_H */
diff --git a/oobs/oobs-servicesconfig.c b/oobs/oobs-servicesconfig.c
index c24e204..ced5e1c 100644
--- a/oobs/oobs-servicesconfig.c
+++ b/oobs/oobs-servicesconfig.c
@@ -27,7 +27,9 @@
 #include "oobs-list.h"
 #include "oobs-list-private.h"
 #include "oobs-servicesconfig.h"
+#include "oobs-servicesconfig-private.h"
 #include "oobs-service.h"
+#include "oobs-service-private.h"
 #include "utils.h"
 
 /**
@@ -159,9 +161,9 @@ create_runlevels_list_from_dbus_reply (OobsObject      *object,
   priv->runlevels = g_list_reverse (priv->runlevels);
 }
 
-static OobsServicesRunlevel*
-get_runlevel (OobsServicesConfig *config,
-	      const gchar        *runlevel)
+OobsServicesRunlevel*
+_oobs_services_config_get_runlevel (OobsServicesConfig *config,
+                                    const gchar        *runlevel)
 {
   OobsServicesConfigPrivate *priv;
   OobsServicesRunlevel *rl;
@@ -187,59 +189,6 @@ get_runlevel (OobsServicesConfig *config,
 }
 
 static void
-create_service_runlevels_from_dbus_reply (OobsServicesConfig *config,
-					  OobsService        *service,
-					  DBusMessage        *reply,
-					  DBusMessageIter     struct_iter)
-{
-  DBusMessageIter runlevel_iter;
-  OobsServicesRunlevel *rl;
-  OobsServiceStatus status;
-  const gchar *runlevel;
-  gint priority;
-
-  while (dbus_message_iter_get_arg_type (&struct_iter) == DBUS_TYPE_STRUCT)
-    {
-      dbus_message_iter_recurse (&struct_iter, &runlevel_iter);
-
-      runlevel = utils_get_string (&runlevel_iter);
-      status = utils_get_int (&runlevel_iter);
-      priority = utils_get_int (&runlevel_iter);
-
-      rl = get_runlevel (config, runlevel);
-
-      if (rl)
-	oobs_service_set_runlevel_configuration (service, rl, status, priority);
-
-      dbus_message_iter_next (&struct_iter);
-    }
-}
-
-static OobsService*
-create_service_from_dbus_reply (OobsServicesConfig *config,
-				DBusMessage        *reply,
-				DBusMessageIter     struct_iter)
-{
-  GObject *service;
-  DBusMessageIter iter, runlevels_iter;
-  const gchar *name;
-
-  dbus_message_iter_recurse (&struct_iter, &iter);
-
-  name = utils_get_string (&iter);
-
-  service = g_object_new (OOBS_TYPE_SERVICE,
-			  "name", name,
-			  NULL);
-
-  dbus_message_iter_recurse (&iter, &runlevels_iter);
-  create_service_runlevels_from_dbus_reply (config,
-					    OOBS_SERVICE (service),
-					    reply, runlevels_iter);
-  return OOBS_SERVICE (service);
-}
-
-static void
 oobs_services_config_update (OobsObject *object)
 {
   OobsServicesConfigPrivate *priv;
@@ -264,14 +213,14 @@ oobs_services_config_update (OobsObject *object)
   dbus_message_iter_next (&iter);
 
   default_runlevel = utils_get_string (&iter);
-  priv->default_runlevel = get_runlevel (OOBS_SERVICES_CONFIG (object), default_runlevel);
+  priv->default_runlevel = _oobs_services_config_get_runlevel (OOBS_SERVICES_CONFIG (object),
+                                                               default_runlevel);
 
   dbus_message_iter_recurse (&iter, &elem_iter);
 
   while (dbus_message_iter_get_arg_type (&elem_iter) == DBUS_TYPE_STRUCT)
     {
-      service = create_service_from_dbus_reply (OOBS_SERVICES_CONFIG (object),
-						reply, elem_iter);
+      service = _oobs_service_create_from_dbus_reply (NULL, reply, elem_iter);
 
       oobs_list_append (priv->services_list, &list_iter);
       oobs_list_set    (priv->services_list, &list_iter, G_OBJECT (service));
@@ -284,75 +233,6 @@ oobs_services_config_update (OobsObject *object)
 }
 
 static void
-create_dbus_struct_from_service_runlevels (OobsService     *service,
-					   GList           *runlevels,
-					   DBusMessage     *message,
-					   DBusMessageIter *iter)
-{
-  DBusMessageIter runlevels_iter, struct_iter;
-  OobsServicesRunlevel *runlevel;
-  OobsServiceStatus status;
-  gint priority;
-
-  dbus_message_iter_open_container (iter,
-				    DBUS_TYPE_ARRAY,
-				    DBUS_STRUCT_BEGIN_CHAR_AS_STRING
-				    DBUS_TYPE_STRING_AS_STRING
-				    DBUS_TYPE_INT32_AS_STRING
-				    DBUS_TYPE_INT32_AS_STRING
-				    DBUS_STRUCT_END_CHAR_AS_STRING,
-				    &runlevels_iter);
-
-  while (runlevels)
-    {
-      runlevel = runlevels->data;
-      runlevels = runlevels->next;
-
-      oobs_service_get_runlevel_configuration (service, runlevel, &status, &priority);
-
-      if (status == OOBS_SERVICE_IGNORE)
-	continue;
-
-      dbus_message_iter_open_container (&runlevels_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter);
-
-      utils_append_string (&struct_iter, runlevel->name);
-      utils_append_int (&struct_iter, status);
-      utils_append_int (&struct_iter, priority);
-
-      dbus_message_iter_close_container (&runlevels_iter, &struct_iter);
-    }
-
-  dbus_message_iter_close_container (iter, &runlevels_iter);
-}
-
-static gboolean
-create_dbus_struct_from_service (OobsService     *service,
-				 GList           *runlevels,
-				 DBusMessage     *message,
-				 DBusMessageIter *array_iter)
-{
-  DBusMessageIter struct_iter;
-  gchar *name;
-
-  g_object_get (G_OBJECT (service),
-		"name", &name,
-		NULL);
-
-  g_return_val_if_fail (name, FALSE);
-
-  dbus_message_iter_open_container (array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter);
-
-  utils_append_string (&struct_iter, name);
-  create_dbus_struct_from_service_runlevels (service, runlevels, message, &struct_iter);
-
-  dbus_message_iter_close_container (array_iter, &struct_iter);
-
-  g_free (name);
-
-  return TRUE;
-}
-
-static void
 oobs_services_config_commit (OobsObject *object)
 {
   OobsServicesConfigPrivate *priv;
@@ -391,9 +271,9 @@ oobs_services_config_commit (OobsObject *object)
   while (correct && valid)
     {
       service = oobs_list_get (priv->services_list, &list_iter);
-      correct = create_dbus_struct_from_service (OOBS_SERVICE (service),
-						 priv->runlevels,
-						 message, &array_iter);
+      correct = _oobs_create_dbus_struct_from_service (OOBS_SERVICE (service),
+                                                       priv->runlevels,
+                                                       message, &array_iter);
       g_object_unref (service);
       valid = oobs_list_iter_next (priv->services_list, &list_iter);
     }



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