summaryrefslogtreecommitdiffstats
path: root/sync/src/sync_item.c
diff options
context:
space:
mode:
Diffstat (limited to 'sync/src/sync_item.c')
-rw-r--r--sync/src/sync_item.c324
1 files changed, 324 insertions, 0 deletions
diff --git a/sync/src/sync_item.c b/sync/src/sync_item.c
new file mode 100644
index 0000000..324972c
--- /dev/null
+++ b/sync/src/sync_item.c
@@ -0,0 +1,324 @@
+
+#include <glib.h>
+#include <opensync/opensync.h>
+#include "sync_item.h"
+#include "sync_group.h"
+
+G_DEFINE_TYPE (SyncItem, sync_item, G_TYPE_INITIALLY_UNOWNED);
+
+#define ITEM_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNC_TYPE_ITEM, SyncItemPrivate))
+
+typedef struct _SyncItemPrivate SyncItemPrivate;
+
+enum {
+ PROP_NAME = 1,
+ PROP_ADR,
+ PROP_DATA,
+ PROP_DATA_FREE_FUNC,
+ PROP_MEMBER_FUNC,
+ PROP_GROUP,
+};
+
+struct _SyncItemPrivate
+{
+ gchar *name;
+ gchar *adr;
+ gpointer data;
+ SyncItemMemberFunc get_member;
+ SyncItemDataFreeFunc free_data;
+ SyncGroup *group;
+ OSyncMember *member;
+};
+
+static void
+sync_item_finalize (GObject *object)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (object);
+
+ g_free (priv->name);
+ g_free (priv->adr);
+ if (priv->free_data && priv->data)
+ priv->free_data (priv->data);
+
+ G_OBJECT_CLASS (sync_item_parent_class)->finalize (object);
+}
+
+static void
+sync_item_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ SyncItem *item = SYNC_ITEM (object);
+
+ switch (prop_id) {
+ case PROP_NAME :
+ sync_item_set_name (item, g_value_get_string (value));
+ break;
+ case PROP_ADR :
+ sync_item_set_adr (item, g_value_get_string (value));
+ break;
+ case PROP_DATA :
+ sync_item_set_data (item, g_value_get_pointer (value));
+ break;
+ case PROP_DATA_FREE_FUNC :
+ sync_item_set_data_free_func (
+ item, g_value_get_pointer (value));
+ break;
+ case PROP_MEMBER_FUNC :
+ sync_item_set_member_func (
+ item, g_value_get_pointer (value));
+ break;
+ case PROP_GROUP :
+ sync_item_set_group (item,
+ SYNC_GROUP (g_value_get_object (value)));
+ break;
+ default :
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (
+ object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+sync_item_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ SyncItem *item = SYNC_ITEM (object);
+
+ switch (prop_id) {
+ case PROP_NAME :
+ g_value_set_string (value, sync_item_get_name (item));
+ break;
+ case PROP_ADR :
+ g_value_set_string (value, sync_item_get_adr (item));
+ break;
+ case PROP_DATA :
+ g_value_set_pointer (value, sync_item_get_data (item));
+ break;
+ case PROP_DATA_FREE_FUNC :
+ g_value_set_pointer (
+ value, sync_item_get_data_free_func (item));
+ break;
+ case PROP_MEMBER_FUNC :
+ g_value_set_pointer (
+ value, sync_item_get_member_func (item));
+ break;
+ case PROP_GROUP :
+ g_value_set_object (
+ value, sync_item_get_group (item));
+ break;
+ default :
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (
+ object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+sync_item_class_init (SyncItemClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->set_property = sync_item_set_property;
+ object_class->get_property = sync_item_get_property;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_NAME,
+ g_param_spec_string (
+ "name",
+ ("Name"),
+ ("Name of the synchronisation item."),
+ ("Name"),
+ G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class,
+ PROP_ADR,
+ g_param_spec_string (
+ "adr",
+ ("Address"),
+ ("Location of the synchronisation item."),
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class,
+ PROP_DATA,
+ g_param_spec_pointer (
+ "data",
+ ("Data"),
+ ("Custom data"),
+ G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class,
+ PROP_DATA_FREE_FUNC,
+ g_param_spec_pointer (
+ "data_free_func",
+ ("Data Freeing Function"),
+ ("Function pointer to free set custom data."),
+ G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class,
+ PROP_MEMBER_FUNC,
+ g_param_spec_pointer (
+ "member_func",
+ ("Member Function"),
+ ("Function pointer to retrieve OSyncMember."),
+ G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class,
+ PROP_GROUP,
+ g_param_spec_object (
+ "group",
+ ("SyncGroup"),
+ ("SyncGroup this item belongs to."),
+ SYNC_TYPE_GROUP,
+ G_PARAM_READWRITE));
+
+ g_type_class_add_private (klass, sizeof (SyncItemPrivate));
+
+ object_class->finalize = sync_item_finalize;
+}
+
+static void
+sync_item_init (SyncItem *self)
+{
+ /* Make sure this object is floating? */
+ if (g_object_is_floating (G_OBJECT (self)))
+ g_object_force_floating (G_OBJECT (self));
+}
+
+SyncItem*
+sync_item_new (const gchar *name,
+ const gchar *adr,
+ SyncItemMemberFunc member_func)
+{
+ return g_object_new (SYNC_TYPE_ITEM, "name", name, "adr", adr,
+ "member_func", member_func, NULL);
+}
+
+const gchar *
+sync_item_get_name (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ return priv->name;
+}
+
+const gchar *
+sync_item_get_adr (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ return priv->adr;
+}
+
+gpointer
+sync_item_get_data (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ return priv->data;
+}
+
+SyncItemDataFreeFunc
+sync_item_get_data_free_func (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ return priv->free_data;
+}
+
+SyncItemMemberFunc
+sync_item_get_member_func (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ return priv->get_member;
+}
+
+OSyncMember *
+sync_item_get_member (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+
+ if (!priv->group) {
+ g_warning ("%s called on SyncItem with no group", G_STRFUNC);
+ return NULL;
+ }
+
+ if (!priv->member)
+ priv->member = priv->get_member (item);
+
+ return priv->member;
+}
+
+SyncGroup *
+sync_item_get_group (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ return priv->group;
+}
+
+void
+sync_item_set_name (SyncItem *item, const gchar *name)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ priv->name = g_strdup (name);
+}
+
+void
+sync_item_set_adr (SyncItem *item, const gchar *adr)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ priv->adr = g_strdup (adr);
+}
+
+void
+sync_item_set_data (SyncItem *item, gpointer data)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ if (priv->free_data && priv->data)
+ priv->free_data (priv->data);
+ priv->data = data;
+}
+
+void
+sync_item_set_data_free_func (SyncItem *item,
+ SyncItemDataFreeFunc data_free_func)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ priv->free_data = data_free_func;
+}
+
+void
+sync_item_set_member_func (SyncItem *item,
+ SyncItemMemberFunc member_func)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ priv->get_member = member_func;
+}
+
+void
+sync_item_set_group (SyncItem *item, SyncGroup *group)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ if (priv->group) {
+ g_warning ("SyncItem already contained in a group");
+ return;
+ }
+ priv->group = group;
+}
+
+void
+sync_item_ungroup (SyncItem *item)
+{
+ SyncItemPrivate *priv = ITEM_PRIVATE (item);
+ if (priv->group) {
+ /* Removing the item from the group frees the group, which in
+ * turn frees the member.
+ */
+ sync_group_remove_item (priv->group, item);
+ priv->group = NULL;
+ priv->member = NULL;
+ } else
+ g_warning ("%s called on SyncItem with no group", G_STRFUNC);
+}