diff options
Diffstat (limited to 'sync/src/sync_item.c')
-rw-r--r-- | sync/src/sync_item.c | 324 |
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); +} |