[gtk+/wip/csoriano/cloud-providers] cloud providers



commit e6aa6c8fb4019a98640eb47a079f3bb81889be55
Author: Carlos Soriano <csoriano gnome org>
Date:   Wed Jun 17 20:30:46 2015 +0200

    cloud providers

 gtk/Makefile.am                                    |    4 +
 gtk/gtk.h                                          |    2 +
 gtk/gtkcloudprovider.c                             |  212 ++++++++++++++++++++
 gtk/gtkcloudprovider.h                             |   69 +++++++
 gtk/gtkcloudprovidermanager.c                      |  209 +++++++++++++++++++
 gtk/gtkcloudprovidermanager.h                      |   56 +++++
 tests/Makefile.am                                  |   20 ++
 tests/org.gtk.CloudProviderServerExample.ini       |    4 +
 .../org.gtk.CloudProviderServerExample.service.in  |    3 +
 tests/testcloudproviderclient.c                    |   26 +++
 tests/testcloudproviderserver.c                    |  184 +++++++++++++++++
 11 files changed, 789 insertions(+), 0 deletions(-)
---
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 50e8efb..b5f1c05 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -164,6 +164,8 @@ gtk_public_h_sources =              \
        gtkcontainer.h          \
        gtkcssprovider.h        \
        gtkcsssection.h         \
+       gtkcloudprovider.h      \
+       gtkcloudprovidermanager.h       \
        gtkdebug.h              \
        gtkdialog.h             \
        gtkdnd.h                \
@@ -663,6 +665,8 @@ gtk_base_c_sources =                \
        gtkcsstypes.c           \
        gtkcssvalue.c           \
        gtkcsswidgetnode.c      \
+       gtkcloudprovider.c      \
+       gtkcloudprovidermanager.c       \
        gtkdialog.c             \
        gtkdrawingarea.c        \
        gtkeditable.c           \
diff --git a/gtk/gtk.h b/gtk/gtk.h
index 3cbd13f..0ec9af3 100644
--- a/gtk/gtk.h
+++ b/gtk/gtk.h
@@ -71,6 +71,8 @@
 #include <gtk/gtkcheckbutton.h>
 #include <gtk/gtkcheckmenuitem.h>
 #include <gtk/gtkclipboard.h>
+#include <gtk/gtkcloudprovider.h>
+#include <gtk/gtkcloudprovidermanager.h>
 #include <gtk/gtkcolorbutton.h>
 #include <gtk/gtkcolorchooser.h>
 #include <gtk/gtkcolorchooserdialog.h>
diff --git a/gtk/gtkcloudprovider.c b/gtk/gtkcloudprovider.c
new file mode 100644
index 0000000..002e0c9
--- /dev/null
+++ b/gtk/gtkcloudprovider.c
@@ -0,0 +1,212 @@
+/* gtkcloudprovider.c
+ *
+ * Copyright (C) 2015 Carlos Soriano <csoriano gnome org>
+ *
+ * This file 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 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gtkcloudprovider.h"
+#include <gio/gio.h>
+
+static const gchar introspection_xml[] =
+  "<node>"
+  "  <interface name='org.gtk.CloudProvider'>"
+  "    <method name='GetName'>"
+  "      <arg type='s' name='name' direction='out'/>"
+  "    </method>"
+  "    <method name='GetStatus'>"
+  "      <arg type='i' name='name' direction='out'/>"
+  "    </method>"
+  "  </interface>"
+  "</node>";
+
+
+struct _GtkCloudProviderPrivate
+{
+  gchar *name;
+  GtkCloudProviderStatus status;
+  GIcon *icon;
+  GMenuModel *menu;
+
+  GDBusProxy *proxy;
+  gchar *bus_name;
+  gchar *object_path;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkCloudProvider, gtk_cloud_provider, G_TYPE_OBJECT)
+
+enum {
+  PROP_0,
+  LAST_PROP
+};
+
+enum {
+  CHANGED,
+  LAST_SIGNAL
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+static guint gSignals [LAST_SIGNAL];
+
+static void
+on_proxy_created (GObject      *source_object,
+                  GAsyncResult *res,
+                  gpointer      user_data)
+{
+  GError *error;
+  GtkCloudProvider *self = GTK_CLOUD_PROVIDER (source_object);
+
+  g_print ("creating proxy\n");
+  self->priv->proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+  if (error)
+    g_warning ("Error creating proxy for cloud provider");
+  else
+    g_signal_emit_by_name (self, "changed");
+
+}
+
+GtkCloudProvider*
+gtk_cloud_provider_new (const gchar *bus_name,
+                        const gchar *object_path)
+{
+  GtkCloudProvider *self;
+  GtkCloudProviderPrivate *priv;
+  GDBusNodeInfo *proxy_info;
+  GDBusInterfaceInfo *interface_info;
+  GError *error = NULL;
+
+  self = g_object_new (GTK_TYPE_CLOUD_PROVIDER, NULL);
+  priv = gtk_cloud_provider_get_instance_private (self);
+
+  proxy_info = g_dbus_node_info_new_for_xml (introspection_xml, &error);
+  interface_info = g_dbus_node_info_lookup_interface (proxy_info, "org.gtk.CloudProvider");
+  priv->bus_name = g_strdup (bus_name);
+  priv->object_path = g_strdup (object_path);
+  g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+                            G_DBUS_PROXY_FLAGS_NONE,
+                            interface_info,
+                            bus_name,
+                            object_path,
+                            "org.gtk.CloudProvider",
+                            NULL,
+                            on_proxy_created,
+                            NULL);
+
+  return self;
+}
+
+static void
+gtk_cloud_provider_finalize (GObject *object)
+{
+  GtkCloudProvider *self = (GtkCloudProvider *)object;
+  GtkCloudProviderPrivate *priv = gtk_cloud_provider_get_instance_private (self);
+
+  g_free (priv->name);
+  g_clear_object (&priv->icon);
+  g_clear_object (&priv->menu);
+  g_clear_object (&priv->proxy);
+  g_free (priv->bus_name);
+  g_free (priv->object_path);
+
+  G_OBJECT_CLASS (gtk_cloud_provider_parent_class)->finalize (object);
+}
+
+static void
+gtk_cloud_provider_get_property (GObject    *object,
+                                 guint       prop_id,
+                                 GValue     *value,
+                                 GParamSpec *pspec)
+{
+  GtkCloudProvider *self = GTK_CLOUD_PROVIDER (object);
+
+  switch (prop_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gtk_cloud_provider_set_property (GObject      *object,
+                                 guint         prop_id,
+                                 const GValue *value,
+                                 GParamSpec   *pspec)
+{
+  GtkCloudProvider *self = GTK_CLOUD_PROVIDER (object);
+
+  switch (prop_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gtk_cloud_provider_class_init (GtkCloudProviderClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gtk_cloud_provider_finalize;
+  object_class->get_property = gtk_cloud_provider_get_property;
+  object_class->set_property = gtk_cloud_provider_set_property;
+
+  gSignals [CHANGED] =
+    g_signal_new ("changed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL,
+                  NULL,
+                  g_cclosure_marshal_generic,
+                  G_TYPE_NONE,
+                  0);
+}
+
+static void
+gtk_cloud_provider_init (GtkCloudProvider *self)
+{
+}
+
+const gchar*
+gtk_cloud_provider_get_name (GtkCloudProvider *self)
+{
+  GtkCloudProviderPrivate *priv = gtk_cloud_provider_get_instance_private (self);
+
+  return priv->name;
+}
+
+GtkCloudProviderStatus
+gtk_cloud_provider_get_status (GtkCloudProvider *self)
+{
+  GtkCloudProviderPrivate *priv = gtk_cloud_provider_get_instance_private (self);
+
+  return priv->status;
+}
+
+GIcon*
+gtk_cloud_provider_get_icon (GtkCloudProvider *self)
+{
+  GtkCloudProviderPrivate *priv = gtk_cloud_provider_get_instance_private (self);
+
+  return priv->icon;
+}
+
+GMenuModel*
+gtk_cloud_provider_get_menu (GtkCloudProvider *self)
+{
+  GtkCloudProviderPrivate *priv = gtk_cloud_provider_get_instance_private (self);
+
+  return priv->menu;
+}
+
diff --git a/gtk/gtkcloudprovider.h b/gtk/gtkcloudprovider.h
new file mode 100644
index 0000000..cc1fc79
--- /dev/null
+++ b/gtk/gtkcloudprovider.h
@@ -0,0 +1,69 @@
+/* gtkcloudprovider.h
+ *
+ * Copyright (C) 2015 Carlos Soriano <csoriano gnome org>
+ *
+ * This file 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 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTK_CLOUD_PROVIDER_H
+#define GTK_CLOUD_PROVIDER_H
+
+#include <gio/gio.h>
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+  GTK_CLOUD_PROVIDER_STATUS_IDLE,
+  GTK_CLOUD_PROVIDER_STATUS_SYNCING,
+  GTK_CLOUD_PROVIDER_STATUS_ERROR
+} GtkCloudProviderStatus;
+
+#define GTK_TYPE_CLOUD_PROVIDER             (gtk_cloud_provider_get_type())
+#define GTK_CLOUD_PROVIDER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CLOUD_PROVIDER, 
GtkCloudProvider))
+#define GTK_CLOUD_PROVIDER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CLOUD_PROVIDER, 
GtkCloudProviderClass))
+#define GTK_IS_CLOUD_PROVIDER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CLOUD_PROVIDER))
+#define GTK_IS_CLOUD_PROVIDER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CLOUD_PROVIDER))
+#define GTK_CLOUD_PROVIDER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CLOUD_PROVIDER, 
GtkCloudProviderClass))
+
+typedef struct _GtkCloudProvider GtkCloudProvider;
+typedef struct _GtkCloudProviderClass GtkCloudProviderClass;
+typedef struct _GtkCloudProviderPrivate GtkCloudProviderPrivate;
+
+
+struct _GtkCloudProviderClass
+{
+  GObjectClass parent;
+};
+
+struct _GtkCloudProvider
+{
+  GtkCloudProviderPrivate *priv;
+};
+
+GDK_AVAILABLE_IN_3_18
+GtkCloudProvider *gtk_cloud_provider_new (const gchar *bus_name,
+                                          const gchar *object_path);
+GDK_AVAILABLE_IN_3_18
+const gchar* gtk_cloud_provider_get_name (GtkCloudProvider *self);
+GDK_AVAILABLE_IN_3_18
+GtkCloudProviderStatus gtk_cloud_provider_get_status (GtkCloudProvider *self);
+GDK_AVAILABLE_IN_3_18
+GIcon *gtk_cloud_provider_get_icon (GtkCloudProvider *self);
+GDK_AVAILABLE_IN_3_18
+GMenuModel *gtk_cloud_provider_get_menu (GtkCloudProvider *self);
+
+G_END_DECLS
+
+#endif /* GTK_CLOUD_PROVIDER_H */
diff --git a/gtk/gtkcloudprovidermanager.c b/gtk/gtkcloudprovidermanager.c
new file mode 100644
index 0000000..650cf99
--- /dev/null
+++ b/gtk/gtkcloudprovidermanager.c
@@ -0,0 +1,209 @@
+/* gtkcloudprovidermanager.c
+ *
+ * Copyright (C) 2015 Carlos Soriano <csoriano gnome org>
+ *
+ * This file 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 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "gtkcloudprovidermanager.h"
+#include "gtkcloudprovider.h"
+#include <glib.h>
+#include <glib/gprintf.h>
+
+#define KEY_FILE_GROUP "Gtk Cloud Provider"
+
+struct _GtkCloudProviderManagerPrivate
+{
+  GList *providers;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkCloudProviderManager, gtk_cloud_provider_manager, G_TYPE_OBJECT)
+
+enum {
+  PROP_0,
+  LAST_PROP
+};
+
+enum
+{
+  CHANGED,
+  LAST_SIGNAL
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+static guint gSignals [LAST_SIGNAL];
+
+GtkCloudProviderManager *
+gtk_cloud_provider_manager_dup_singleton (void)
+{
+  static GObject *self = NULL;
+
+  if (self == NULL)
+    {
+      self = g_object_new (GTK_TYPE_CLOUD_PROVIDER_MANAGER, NULL);
+      return GTK_CLOUD_PROVIDER_MANAGER (self);
+    }
+  else
+    {
+      return g_object_ref (self);
+    }
+}
+
+static void
+gtk_cloud_provider_manager_finalize (GObject *object)
+{
+  GtkCloudProviderManager *self = (GtkCloudProviderManager *)object;
+
+  G_OBJECT_CLASS (gtk_cloud_provider_manager_parent_class)->finalize (object);
+}
+
+static void
+gtk_cloud_provider_manager_get_property (GObject    *object,
+                                         guint       prop_id,
+                                         GValue     *value,
+                                         GParamSpec *pspec)
+{
+  GtkCloudProviderManager *self = GTK_CLOUD_PROVIDER_MANAGER (object);
+
+  switch (prop_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gtk_cloud_provider_manager_set_property (GObject      *object,
+                                         guint         prop_id,
+                                         const GValue *value,
+                                         GParamSpec   *pspec)
+{
+  GtkCloudProviderManager *self = GTK_CLOUD_PROVIDER_MANAGER (object);
+
+  switch (prop_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gtk_cloud_provider_manager_class_init (GtkCloudProviderManagerClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gtk_cloud_provider_manager_finalize;
+  object_class->get_property = gtk_cloud_provider_manager_get_property;
+  object_class->set_property = gtk_cloud_provider_manager_set_property;
+
+  gSignals [CHANGED] =
+    g_signal_new ("changed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL,
+                  NULL,
+                  g_cclosure_marshal_generic,
+                  G_TYPE_NONE,
+                  0);
+}
+
+static void
+gtk_cloud_provider_manager_init (GtkCloudProviderManager *self)
+{
+}
+
+GList*
+gtk_cloud_provider_manager_get_providers (GtkCloudProviderManager *self)
+{
+  GtkCloudProviderManagerPrivate *priv = gtk_cloud_provider_manager_get_instance_private (self);
+
+  return priv->providers;
+}
+
+static void
+load_cloud_provider (GtkCloudProviderManager *self,
+                     GFile                   *file)
+{
+  GtkCloudProviderManagerPrivate *priv = gtk_cloud_provider_manager_get_instance_private (self);
+  GKeyFile *key_file;
+  gchar *path;
+  GError *error;
+  gchar *bus_name;
+  gchar *object_path;
+  gboolean success = FALSE;
+  GtkCloudProvider *cloud_provider;
+
+  key_file = g_key_file_new ();
+  path = g_file_get_path (file);
+  g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
+
+  if (!g_key_file_has_group (key_file, KEY_FILE_GROUP))
+    goto out;
+
+  bus_name = g_key_file_get_string (key_file, KEY_FILE_GROUP, "BusName", &error);
+  if (error != NULL)
+    goto out;
+  object_path = g_key_file_get_string (key_file, KEY_FILE_GROUP, "ObjectPath", &error);
+  if (error != NULL)
+    goto out;
+
+  cloud_provider = gtk_cloud_provider_new (bus_name, object_path);
+  priv->providers = g_list_append (priv->providers, cloud_provider);
+
+  success = TRUE;
+out:
+  if (!success)
+    g_warning ("Error while loading cloud provider key file at %s", path);
+  g_object_unref (key_file);
+}
+
+void
+gtk_cloud_manager_update (GtkCloudProviderManager *self)
+{
+  GtkCloudProviderManagerPrivate *priv = gtk_cloud_provider_manager_get_instance_private (self);
+  const gchar* const *data_dirs;
+  gint i;
+  gint len;
+  gchar *key_files_directory_path;
+  GFile *key_files_directory_file;
+  GError *error;
+  GFileEnumerator *file_enumerator;
+
+  g_list_free_full (priv->providers, g_object_unref);
+
+  data_dirs = g_get_system_data_dirs ();
+  len = g_strv_length ((gchar **)data_dirs);
+
+  for (i = 0; i < len; i++)
+    {
+      GFileInfo *info;
+
+      key_files_directory_path = g_build_filename (data_dirs[i], "gtk", "cloud-providers", NULL);
+      key_files_directory_file = g_file_new_for_path (key_files_directory_path);
+      file_enumerator = g_file_enumerate_children (key_files_directory_file,
+                                                   "standard::name,standard::type",
+                                                   G_FILE_QUERY_INFO_NONE,
+                                                   NULL,
+                                                   &error);
+      if (error)
+        continue;
+
+      info = g_file_enumerator_next_file (file_enumerator, NULL, &error);
+      while (info != NULL && error != NULL)
+        {
+           load_cloud_provider (self, g_file_enumerator_get_child (file_enumerator, info));
+           info = g_file_enumerator_next_file (file_enumerator, NULL, &error);
+        }
+    }
+}
diff --git a/gtk/gtkcloudprovidermanager.h b/gtk/gtkcloudprovidermanager.h
new file mode 100644
index 0000000..1b6f2b0
--- /dev/null
+++ b/gtk/gtkcloudprovidermanager.h
@@ -0,0 +1,56 @@
+/* gtkcloudprovidermanager.h
+ *
+ * Copyright (C) 2015 Carlos Soriano <csoriano gnome org>
+ *
+ * This file 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 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef GTK_CLOUD_PROVIDER_MANAGER_H
+#define GTK_CLOUD_PROVIDER_MANAGER_H
+
+#include <gio/gio.h>
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_CLOUD_PROVIDER_MANAGER             (gtk_cloud_provider_manager_get_type())
+#define GTK_CLOUD_PROVIDER_MANAGER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GTK_TYPE_CLOUD_PROVIDER_MANAGER, GtkCloudProviderManager))
+#define GTK_CLOUD_PROVIDER_MANAGER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), 
GTK_TYPE_CLOUD_PROVIDER_MANAGER, GtkCloudProviderManagerClass))
+#define GTK_IS_CLOUD_PROVIDER_MANAGER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GTK_TYPE_CLOUD_PROVIDER_MANAGER))
+#define GTK_IS_CLOUD_PROVIDER_MANAGER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GTK_TYPE_CLOUD_PROVIDER_MANAGER))
+#define GTK_CLOUD_PROVIDER_MANAGER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GTK_TYPE_CLOUD_PROVIDER_MANAGER, GtkCloudProviderManagerClass))
+
+typedef struct _GtkCloudProviderManager GtkCloudProviderManager;
+typedef struct _GtkCloudProviderManagerClass GtkCloudProviderManagerClass;
+typedef struct _GtkCloudProviderManagerPrivate GtkCloudProviderManagerPrivate;
+
+struct _GtkCloudProviderManagerClass
+{
+  GObjectClass parent;
+};
+
+struct _GtkCloudProviderManager
+{
+  GtkCloudProviderManagerPrivate *priv;
+};
+
+GDK_AVAILABLE_IN_3_18
+GtkCloudProviderManager *gtk_cloud_provider_manager_dup_singleton (void);
+GDK_AVAILABLE_IN_3_18
+void gtk_cloud_provider_manager_update (GtkCloudProviderManager *self);
+GDK_AVAILABLE_IN_3_18
+GList *gtk_cloud_provider_manager_get_providers (GtkCloudProviderManager *self);
+
+G_END_DECLS
+
+#endif /* GTK_CLOUD_PROVIDER_MANAGER_H */
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 95ac80f..61ec3c6 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -30,6 +30,18 @@ if OS_LINUX
 fontconfig_programs = testfontchooserdialog
 endif
 
+cloudproviderdir = $(datadir)/gtk+/cloud-providers
+dist_cloudprovider_DATA = org.gtk.CloudProviderServerExample.ini
+
+servicedir = $(datadir)/dbus-1/services
+service_in_files = org.gtk.CloudProviderServerExample.service.in
+service_DATA = $(service_in_files:.service.in=.service)
+
+org.gtk.CloudProviderServerExample.service: org.gtk.CloudProviderServerExample.service.in
+       $(AM_V_GEN)     \
+               [ -d $(@D) ] || $(mkdir_p) $(@D) ; \
+               sed -e "s|\ bindir\@|$(bindir)|" $< > $  tmp && mv $  tmp $@
+
 noinst_PROGRAMS =  $(TEST_PROGS)       \
        overlayscroll                   \
        syncscroll                      \
@@ -165,6 +177,8 @@ noinst_PROGRAMS =  $(TEST_PROGS)    \
        testactionbar                   \
        testwindowsize                  \
        testpopover                     \
+       testcloudproviderserver         \
+       testcloudproviderclient         \
        gdkgears                        \
        $(NULL)
 
@@ -304,6 +318,8 @@ teststack_DEPENDENCIES = $(TEST_DEPS)
 testrevealer_DEPENDENCIES = $(TEST_DEPS)
 testtitlebar_DEPENDENCIES = $(TEST_DEPS)
 testwindowsize_DEPENDENCIES = $(TEST_DEPS)
+testcloudproviderserver_DEPENDENCIES = $(TEST_DEPS)
+testcloudproviderclient_DEPENDENCIES = $(TEST_DEPS)
 
 animated_resizing_SOURCES =    \
        animated-resizing.c     \
@@ -523,6 +539,10 @@ testtitlebar_SOURCES = testtitlebar.c
 
 testwindowsize_SOURCES = testwindowsize.c
 
+testcloudproviderserver_SOURCES = testcloudproviderserver.c
+
+testcloudproviderclient_SOURCES = testcloudproviderclient.c
+
 gdkgears_SOURCES =     \
        gdkgears.c      \
        gtkgears.c      \
diff --git a/tests/org.gtk.CloudProviderServerExample.ini b/tests/org.gtk.CloudProviderServerExample.ini
new file mode 100644
index 0000000..c7d7c8a
--- /dev/null
+++ b/tests/org.gtk.CloudProviderServerExample.ini
@@ -0,0 +1,4 @@
+[Gtk Cloud Provider]
+BusName=org.gtk.CloudProviderServerExample
+ObjectPath=/org/gtk/CloudProvider
+Version=1
diff --git a/tests/org.gtk.CloudProviderServerExample.service.in 
b/tests/org.gtk.CloudProviderServerExample.service.in
new file mode 100644
index 0000000..2a8b5e6
--- /dev/null
+++ b/tests/org.gtk.CloudProviderServerExample.service.in
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.gtk.CloudProviderServerExample
+Exec= bindir@/testcloudprovider 
diff --git a/tests/testcloudproviderclient.c b/tests/testcloudproviderclient.c
new file mode 100644
index 0000000..add0f85
--- /dev/null
+++ b/tests/testcloudproviderclient.c
@@ -0,0 +1,26 @@
+#include "config.h"
+#include <glib.h>
+#include <gtk/gtk.h>
+
+static void
+on_manager_changed (GtkCloudProviderManager *manager)
+{
+
+  g_print ("Manager changed\n");
+}
+
+gint
+main (gint   argc,
+      gchar *argv[])
+{
+  GtkCloudProviderManager *manager;
+  g_set_prgname ("my-program");
+  g_set_application_name ("My-program");
+
+
+  manager = gtk_cloud_provider_manager_dup_singleton ();
+  g_signal_connect (manager, "changed", G_CALLBACK (on_manager_changed), NULL);
+  gtk_cloud_provider_manager_update (manager);
+
+  return 0;
+}
diff --git a/tests/testcloudproviderserver.c b/tests/testcloudproviderserver.c
new file mode 100644
index 0000000..91c350f
--- /dev/null
+++ b/tests/testcloudproviderserver.c
@@ -0,0 +1,184 @@
+#include <gio/gio.h>
+#include <stdlib.h>
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+enum {
+  IDDLE,
+  SYNCING,
+  ERROR
+};
+
+/* The object we want to export */
+typedef struct _CloudProviderClass CloudProviderClass;
+typedef struct _CloudProvider CloudProvider;
+
+struct _CloudProviderClass
+{
+  GObjectClass parent_class;
+};
+
+struct _CloudProvider
+{
+  GObject parent_instance;
+
+  gchar *name;
+  gint status;
+};
+
+
+static GType cloud_provider_get_type (void);
+G_DEFINE_TYPE (CloudProvider, cloud_provider, G_TYPE_OBJECT);
+
+static void
+cloud_provider_finalize (GObject *object)
+{
+  CloudProvider *self = (CloudProvider*)object;
+
+  g_free (self->name);
+
+  G_OBJECT_CLASS (cloud_provider_parent_class)->finalize (object);
+}
+
+static void
+cloud_provider_init (CloudProvider *self)
+{
+  self->name = "cloud provider";
+  self->status = IDDLE;
+}
+
+static void
+cloud_provider_class_init (CloudProviderClass *class)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+  gobject_class->finalize = cloud_provider_finalize;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static GDBusNodeInfo *introspection_data = NULL;
+
+/* Introspection data for the service we are exporting */
+static const gchar introspection_xml[] =
+  "<node>"
+  "  <interface name='org.gtk.CloudProvider'>"
+  "    <method name='GetName'>"
+  "      <arg type='s' name='name' direction='out'/>"
+  "    </method>"
+  "    <method name='GetStatus'>"
+  "      <arg type='i' name='name' direction='out'/>"
+  "    </method>"
+  "  </interface>"
+  "</node>";
+
+
+static void
+handle_method_call (GDBusConnection       *connection,
+                    const gchar           *sender,
+                    const gchar           *object_path,
+                    const gchar           *interface_name,
+                    const gchar           *method_name,
+                    GVariant              *parameters,
+                    GDBusMethodInvocation *invocation,
+                    gpointer               user_data)
+{
+  CloudProvider *cloud_provider = user_data;
+
+  g_print ("handling method call\n");
+#if 0
+  if (g_strcmp0 (method_name, "ChangeCount") == 0)
+    {
+      gint change;
+      g_variant_get (parameters, "(i)", &change);
+
+      my_object_change_count (myobj, change);
+
+      g_dbus_method_invocation_return_value (invocation, NULL);
+    }
+#endif
+  if (g_strcmp0 (method_name, "GetName") == 0)
+    {
+      g_dbus_method_invocation_return_value (invocation,
+                                             g_variant_new ("(s)", cloud_provider->name));
+    }
+  else if (g_strcmp0 (method_name, "GetStatus") == 0)
+    {
+      g_dbus_method_invocation_return_value (invocation,
+                                             g_variant_new ("(s)", cloud_provider->status));
+    }
+}
+
+static const GDBusInterfaceVTable interface_vtable =
+{
+  handle_method_call,
+};
+
+static void
+on_bus_acquired (GDBusConnection *connection,
+                 const gchar     *name,
+                 gpointer         user_data)
+{
+  CloudProvider *cloud_provider = user_data;
+  guint registration_id;
+
+  g_print ("registring\n");
+  registration_id = g_dbus_connection_register_object (connection,
+                                                       "/org/gtk/CloudProviderServerExample",
+                                                       introspection_data->interfaces[0],
+                                                       &interface_vtable,
+                                                       cloud_provider,
+                                                       NULL,  /* user_data_free_func */
+                                                       NULL); /* GError** */
+  g_assert (registration_id > 0);
+}
+
+static void
+on_name_acquired (GDBusConnection *connection,
+                  const gchar     *name,
+                  gpointer         user_data)
+{
+}
+
+static void
+on_name_lost (GDBusConnection *connection,
+              const gchar     *name,
+              gpointer         user_data)
+{
+  exit (1);
+}
+
+int
+main (int argc, char *argv[])
+{
+  GMainLoop *loop;
+  CloudProvider *cloud_provider;
+  guint owner_id;
+
+  introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+  g_assert (introspection_data != NULL);
+
+  cloud_provider = g_object_new (cloud_provider_get_type (), NULL);
+
+  owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                             "org.gtk.CloudProviderServerExample",
+                             G_BUS_NAME_OWNER_FLAGS_NONE,
+                             on_bus_acquired,
+                             on_name_acquired,
+                             on_name_lost,
+                             cloud_provider,
+                             NULL);
+
+
+  loop = g_main_loop_new (NULL, FALSE);
+  g_main_loop_run (loop);
+
+  g_bus_unown_name (owner_id);
+
+  g_dbus_node_info_unref (introspection_data);
+
+  g_object_unref (cloud_provider);
+
+  return 0;
+}
+


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