From: <svn...@op...> - 2009-06-22 16:13:26
|
Author: bellmich Date: Mon Jun 22 18:13:17 2009 New Revision: 1111 URL: http://libsyncml.opensync.org/changeset/1111 Log: migrated SmlDevInfDataStore to GObject style There are actually two warnings during compilation. I fix them when I migrate SmlDevInf. Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h Modified: trunk/libsyncml/CMakeLists.txt trunk/libsyncml/data_sync_api/data_sync_devinf.c trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c trunk/libsyncml/parser/sml_xml_assm.c trunk/libsyncml/parser/sml_xml_parse.c trunk/libsyncml/sml_defines.h trunk/libsyncml/sml_devinf.c trunk/libsyncml/sml_devinf.h trunk/libsyncml/sml_devinf_internals.h trunk/libsyncml/syncml.h trunk/tests/check_devinf.c trunk/tests/check_sync.c trunk/tests/support.h trunk/tools/syncml-ds-tool.c Modified: trunk/libsyncml/CMakeLists.txt ============================================================================== --- trunk/libsyncml/CMakeLists.txt Mon Jun 22 14:45:37 2009 (r1110) +++ trunk/libsyncml/CMakeLists.txt Mon Jun 22 18:13:17 2009 (r1111) @@ -37,6 +37,7 @@ dev_inf_api/sml_dev_inf_prop_param.c dev_inf_api/sml_dev_inf_property.c dev_inf_api/sml_dev_inf_ctcap.c + dev_inf_api/sml_dev_inf_data_store.c ) IF ( ENABLE_OBEX ) @@ -101,6 +102,7 @@ dev_inf_api/sml_dev_inf_prop_param.h dev_inf_api/sml_dev_inf_property.h dev_inf_api/sml_dev_inf_ctcap.h + dev_inf_api/sml_dev_inf_data_store.h DESTINATION ${LIBSYNCML_INCLUDE_DIR}/libsyncml/dev_inf_api ) Modified: trunk/libsyncml/data_sync_api/data_sync_devinf.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_devinf.c Mon Jun 22 14:45:37 2009 (r1110) +++ trunk/libsyncml/data_sync_api/data_sync_devinf.c Mon Jun 22 18:13:17 2009 (r1111) @@ -489,6 +489,40 @@ /* here start the internal API functions */ +#define _ADD_DATASTORE_RX(cttype,verct) \ + ctype = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ + if (!ctype) \ + goto error; \ + if (!sml_dev_inf_data_store_add_rx(ds, ctype, &gerror)) \ + goto error; \ + g_object_unref(ctype); \ + ctype = NULL; + +#define _ADD_DATASTORE_TX(cttype,verct) \ + ctype = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ + if (!ctype) \ + goto error; \ + if (!sml_dev_inf_data_store_add_tx(ds, ctype, &gerror)) \ + goto error; \ + g_object_unref(ctype); \ + ctype = NULL; + +#define _SET_DATASTORE_RX_PREF(cttype,verct) \ + ctype = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ + if (!ctype) \ + goto error; \ + sml_dev_inf_data_store_set_rx_pref(ds, ctype); \ + g_object_unref(ctype); \ + ctype = NULL; + +#define _SET_DATASTORE_TX_PREF(cttype,verct) \ + ctype = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ + if (!ctype) \ + goto error; \ + sml_dev_inf_data_store_set_tx_pref(ds, ctype); \ + g_object_unref(ctype); \ + ctype = NULL; + SmlBool smlDataSyncDevInfAddDatastore( SmlDevInf *devinf, SmlDataSyncDatastore *datastore, @@ -499,35 +533,25 @@ smlAssert(datastore); smlAssert(datastore->contentType); smlAssert(datastore->sourceUri); + GError *gerror = NULL; - SmlDevInfDataStore *ds = smlDevInfDataStoreNew(datastore->sourceUri, error); + SmlDevInfDataStore *ds = sml_dev_inf_data_store_new(datastore->sourceUri, &gerror); if (!ds) goto error; const char *ct = datastore->contentType; - SmlDevInfContentType *ctype; - GError *gerror = NULL; + SmlDevInfContentType *ctype = NULL; if (!strcmp(ct, SML_ELEMENT_TEXT_VCARD)) { // we prefer actually vCard 2.1 // because the most cellphones support it - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_VCARD_30, "3.0", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddRx(ds, ctype); - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_VCARD_30, "3.0", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddTx(ds, ctype); - smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_VCARD, "2.1"); - smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_VCARD, "2.1"); + + _ADD_DATASTORE_RX(SML_ELEMENT_TEXT_VCARD_30, "3.0") + _ADD_DATASTORE_TX(SML_ELEMENT_TEXT_VCARD_30, "3.0") + _SET_DATASTORE_RX_PREF(SML_ELEMENT_TEXT_VCARD, "2.1") + _SET_DATASTORE_TX_PREF(SML_ELEMENT_TEXT_VCARD, "2.1") + if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD, "2.1", error)) goto error; if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD_30, "3.0", error)) @@ -535,22 +559,11 @@ } else if (!strcmp(ct, SML_ELEMENT_TEXT_VCARD_30)) { - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_VCARD_30, "2.1", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddRx(ds, ctype); - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_VCARD_30, "2.1", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddTx(ds, ctype); - smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_VCARD_30, "3.0"); - smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_VCARD_30, "3.0"); + _ADD_DATASTORE_RX(SML_ELEMENT_TEXT_VCARD, "2.1") + _ADD_DATASTORE_TX(SML_ELEMENT_TEXT_VCARD, "2.1") + _SET_DATASTORE_RX_PREF(SML_ELEMENT_TEXT_VCARD_30, "3.0") + _SET_DATASTORE_TX_PREF(SML_ELEMENT_TEXT_VCARD_30, "3.0") + if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD, "2.1", error)) goto error; if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD_30, "3.0", error)) @@ -558,22 +571,12 @@ } else if (!strcmp(ct, SML_ELEMENT_TEXT_VCAL)) { - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_ICAL, "2.0", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddRx(ds, ctype); - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_ICAL, "2.0", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddTx(ds, ctype); - smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_VCAL, "1.0"); - smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_VCAL, "1.0"); + + _ADD_DATASTORE_RX(SML_ELEMENT_TEXT_ICAL, "2.0") + _ADD_DATASTORE_TX(SML_ELEMENT_TEXT_ICAL, "2.0") + _SET_DATASTORE_RX_PREF(SML_ELEMENT_TEXT_VCAL, "1.0") + _SET_DATASTORE_TX_PREF(SML_ELEMENT_TEXT_VCAL, "1.0") + if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCAL, "1.0", error)) goto error; if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_ICAL, "2.0", error)) @@ -581,22 +584,12 @@ } else if (!strcmp(ct, SML_ELEMENT_TEXT_ICAL)) { - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_VCAL, "1.0", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddRx(ds, ctype); - ctype = sml_dev_inf_content_type_new(SML_ELEMENT_TEXT_VCAL, "1.0", &gerror); - if (!ctype) { - smlErrorSet(error, gerror->code, "%s", gerror->message); - g_error_free(gerror); - goto error; - } - smlDevInfDataStoreAddTx(ds, ctype); - smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_ICAL, "2.0"); - smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_ICAL, "2.0"); + + _ADD_DATASTORE_RX(SML_ELEMENT_TEXT_VCAL, "1.0") + _ADD_DATASTORE_TX(SML_ELEMENT_TEXT_VCAL, "1.0") + _SET_DATASTORE_RX_PREF(SML_ELEMENT_TEXT_ICAL, "2.0") + _SET_DATASTORE_TX_PREF(SML_ELEMENT_TEXT_ICAL, "2.0") + if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCAL, "1.0", error)) goto error; if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_ICAL, "2.0", error)) @@ -604,8 +597,8 @@ } else if (!strcmp(ct, SML_ELEMENT_TEXT_PLAIN)) { - smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_PLAIN, "1.0"); - smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_PLAIN, "1.0"); + _SET_DATASTORE_RX_PREF(SML_ELEMENT_TEXT_PLAIN, "1.0") + _SET_DATASTORE_TX_PREF(SML_ELEMENT_TEXT_PLAIN, "1.0") if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_PLAIN, "1.0", error)) goto error; } @@ -613,27 +606,31 @@ { smlTrace(TRACE_INTERNAL, "%s - unknown content type detected (%s)", __func__, VA_STRING(ct)); - smlDevInfDataStoreSetRxPref(ds, ct, "1.0"); - smlDevInfDataStoreSetTxPref(ds, ct, "1.0"); + _SET_DATASTORE_RX_PREF(ct, "1.0") + _SET_DATASTORE_TX_PREF(ct, "1.0") if (!add_devinf_ctcap(devinf, ct, "1.0", error)) goto error; } // configure supported sync modes - smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); - smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); + sml_dev_inf_data_store_set_sync_cap(ds, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); + sml_dev_inf_data_store_set_sync_cap(ds, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); // server alerted sync means that the client has to interpret alerts !!! // FIXME: we receive alerts but we do nothing with it if (smlDsServerGetServerType(datastore->server) == SML_DS_CLIENT) // smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT, TRUE); smlTrace(TRACE_INTERNAL, "%s: SyncML clients only support SLOW and TWO WAY SYNC", __func__); else - smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); + sml_dev_inf_data_store_set_sync_cap(ds, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); smlDevInfAddDataStore(devinf, ds); smlTrace(TRACE_EXIT, "%s - content type newly added to devinf", __func__); return TRUE; error: + if (!gerror) { + smlErrorSet(error, gerror->code, "%s", gerror->message); + g_error_free(gerror); + } smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); return FALSE; } Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Mon Jun 22 18:13:17 2009 (r1111) @@ -0,0 +1,829 @@ +/* sml_dev_inf_data_store.c + * + * Copyright (C) 2009 Michael Bell <mic...@op...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#include "sml_dev_inf_data_store.h" +#include <libsyncml/syncml.h> +#include "../sml_error_internals.h" + +G_DEFINE_TYPE (SmlDevInfDataStore, sml_dev_inf_data_store, G_TYPE_OBJECT) + +enum +{ + PROP_0, + PROP_SOURCE_REF, + PROP_DISPLAY_NAME, + PROP_MAX_GUID_SIZE, + PROP_RX_PREF, + PROP_RX, + PROP_TX_PREF, + PROP_TX, + PROP_MAX_ID, + PROP_MAX_MEM, + PROP_SHARED_MEM, + PROP_SYNC_CAP, + PROP_SUPPORTS_HIERARCHICAL_SYNC +}; + +struct _SmlDevInfDataStorePrivate +{ + gchar* source_ref; + gchar* display_name; + gsize max_guid_size; + GList* rx; + SmlDevInfContentType* rx_pref; + GList* tx; + SmlDevInfContentType* tx_pref; + gsize max_id; + gsize max_mem; + gboolean shared_mem; + guint32 sync_cap; + gboolean supports_hierarchical_sync; +}; + +static void +sml_dev_inf_data_store_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_SOURCE_REF: + g_value_set_string (value, SML_DEV_INF_DATA_STORE (object)->priv->source_ref); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, SML_DEV_INF_DATA_STORE (object)->priv->display_name); + break; + case PROP_MAX_GUID_SIZE: + g_value_set_uint64 (value, SML_DEV_INF_DATA_STORE (object)->priv->max_guid_size); + break; + case PROP_RX_PREF: + g_value_set_object (value, SML_DEV_INF_DATA_STORE (object)->priv->rx_pref); + break; + case PROP_RX: + g_value_set_pointer (value, SML_DEV_INF_DATA_STORE (object)->priv->rx); + break; + case PROP_TX_PREF: + g_value_set_object (value, SML_DEV_INF_DATA_STORE (object)->priv->tx_pref); + break; + case PROP_TX: + g_value_set_pointer (value, SML_DEV_INF_DATA_STORE (object)->priv->tx); + break; + case PROP_MAX_ID: + g_value_set_uint64 (value, SML_DEV_INF_DATA_STORE (object)->priv->max_id); + break; + case PROP_MAX_MEM: + g_value_set_uint64 (value, SML_DEV_INF_DATA_STORE (object)->priv->max_mem); + break; + case PROP_SHARED_MEM: + g_value_set_boolean (value, SML_DEV_INF_DATA_STORE (object)->priv->shared_mem); + break; + case PROP_SYNC_CAP: + g_value_set_uint (value, SML_DEV_INF_DATA_STORE (object)->priv->sync_cap); + break; + case PROP_SUPPORTS_HIERARCHICAL_SYNC: + g_value_set_boolean (value, SML_DEV_INF_DATA_STORE (object)->priv->supports_hierarchical_sync); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +sml_dev_inf_data_store_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_SOURCE_REF: + g_free (SML_DEV_INF_DATA_STORE (object)->priv->source_ref); + SML_DEV_INF_DATA_STORE (object)->priv->source_ref = g_strdup (g_value_get_string (value)); + break; + case PROP_DISPLAY_NAME: + g_free (SML_DEV_INF_DATA_STORE (object)->priv->display_name); + SML_DEV_INF_DATA_STORE (object)->priv->display_name = g_strdup (g_value_get_string (value)); + break; + case PROP_MAX_GUID_SIZE: + SML_DEV_INF_DATA_STORE (object)->priv->max_guid_size = g_value_get_uint64 (value); + break; + case PROP_RX_PREF: + if (SML_DEV_INF_DATA_STORE (object)->priv->rx_pref) + g_object_unref (SML_DEV_INF_DATA_STORE (object)->priv->rx_pref); + SML_DEV_INF_DATA_STORE (object)->priv->rx_pref = g_value_dup_object (value); + break; + case PROP_RX: + SML_DEV_INF_DATA_STORE (object)->priv->rx = (GList *) g_value_get_pointer(value); + break; + case PROP_TX_PREF: + if (SML_DEV_INF_DATA_STORE (object)->priv->tx_pref) + g_object_unref (SML_DEV_INF_DATA_STORE (object)->priv->tx_pref); + SML_DEV_INF_DATA_STORE (object)->priv->tx_pref = g_value_dup_object (value); + break; + case PROP_TX: + SML_DEV_INF_DATA_STORE (object)->priv->tx = (GList *) g_value_get_pointer(value); + break; + case PROP_MAX_ID: + SML_DEV_INF_DATA_STORE (object)->priv->max_id = g_value_get_uint64 (value); + break; + case PROP_MAX_MEM: + SML_DEV_INF_DATA_STORE (object)->priv->max_mem = g_value_get_uint64 (value); + break; + case PROP_SHARED_MEM: + SML_DEV_INF_DATA_STORE (object)->priv->shared_mem = g_value_get_boolean (value); + break; + case PROP_SYNC_CAP: + SML_DEV_INF_DATA_STORE (object)->priv->sync_cap = g_value_get_uint (value); + break; + case PROP_SUPPORTS_HIERARCHICAL_SYNC: + SML_DEV_INF_DATA_STORE (object)->priv->supports_hierarchical_sync = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +sml_dev_inf_data_store_finalize (GObject *object) +{ + G_OBJECT_CLASS (sml_dev_inf_data_store_parent_class)->finalize (object); +} + +static void +sml_dev_inf_data_store_class_init (SmlDevInfDataStoreClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (SmlDevInfDataStorePrivate)); + + object_class->get_property = sml_dev_inf_data_store_get_property; + object_class->set_property = sml_dev_inf_data_store_set_property; + object_class->finalize = sml_dev_inf_data_store_finalize; + + /** + * SmlDevInfDataStore:SourceRef: + * + * The This is the name of the local ressource. property. + */ + g_object_class_install_property (object_class, + PROP_SOURCE_REF, + g_param_spec_string ("SourceRef", + "", + "This is the name of the local ressource.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:DisplayName: + * + * The The name in the GUI. property. + */ + g_object_class_install_property (object_class, + PROP_DISPLAY_NAME, + g_param_spec_string ("DisplayName", + "", + "The name in the GUI.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:MaxGUIDSize: + * + * The The maximum size which can be used for GUIDs of synchronized item. property. + */ + g_object_class_install_property (object_class, + PROP_MAX_GUID_SIZE, + g_param_spec_uint64 ("MaxGUIDSize", + "", + "The maximum size which can be used for GUIDs of synchronized item.", + 0, + G_MAXUINT64, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:RxPref: + * + * The The preferred content type of the local ressource. property. + */ + g_object_class_install_property (object_class, + PROP_RX_PREF, + g_param_spec_object ("RxPref", + "", + "The preferred content type of the local ressource.", + G_TYPE_OBJECT, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:Rx: + * + * The The supported content types of the local ressource. property. + */ + g_object_class_install_property (object_class, + PROP_RX, + g_param_spec_pointer ("Rx", + "Rx", + "The supported content types of the local ressource.", + G_PARAM_PRIVATE)); + /** + * SmlDevInfDataStore:TxPref: + * + * The The preferred content type of the remote target. property. + */ + g_object_class_install_property (object_class, + PROP_TX_PREF, + g_param_spec_object ("TxPref", + "", + "The preferred content type of the remote target.", + G_TYPE_OBJECT, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:Tx: + * + * The The supported content types of the remote target. property. + */ + g_object_class_install_property (object_class, + PROP_TX, + g_param_spec_pointer ("Tx", + "Tx", + "The supported content types of the remote target.", + G_PARAM_PRIVATE)); + /** + * SmlDevInfDataStore:MaxID: + * + * The The maximum supported GUID for synchronized items. property. + */ + g_object_class_install_property (object_class, + PROP_MAX_ID, + g_param_spec_uint64 ("MaxID", + "", + "The maximum supported GUID for synchronized items.", + 0, + G_MAXUINT64, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:MaxMem: + * + * The The maximum available memory of the datastore. property. + */ + g_object_class_install_property (object_class, + PROP_MAX_MEM, + g_param_spec_uint64 ("MaxMem", + "", + "The maximum available memory of the datastore.", + 0, + G_MAXUINT64, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:SharedMem: + * + * The If this property is set true then the MaxMem is for the whole device. property. + */ + g_object_class_install_property (object_class, + PROP_SHARED_MEM, + g_param_spec_boolean ("SharedMem", + "", + "If this property is set true then the MaxMem is for the whole device.", + FALSE, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:SyncCap: + * + * The These are the SyncCaps for the data store. This is a bit field. property. + */ + g_object_class_install_property (object_class, + PROP_SYNC_CAP, + g_param_spec_uint ("SyncCap", + "", + "These are the SyncCaps for the data store. This is a bit field.", + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfDataStore:SupportsHierarchicalSync: + * + * The SupportsHierarchicalSync property. + */ + g_object_class_install_property (object_class, + PROP_SUPPORTS_HIERARCHICAL_SYNC, + g_param_spec_boolean ("SupportsHierarchicalSync", + "", + "If this property is set true then hierarchical sync is supported.", + FALSE, + G_PARAM_READWRITE)); + +} + +static void +sml_dev_inf_data_store_init (SmlDevInfDataStore *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + SML_TYPE_DEV_INF_DATA_STORE, + SmlDevInfDataStorePrivate); +} + +/** + * sml_dev_inf_data_store_new: + * + * Creates a new instance of #SmlDevInfDataStore. + * + * Return value: the newly created #SmlDevInfDataStore instance + */ +SmlDevInfDataStore* +sml_dev_inf_data_store_new (const gchar *source_ref, GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail(source_ref, NULL, error, SML_ERROR_GENERIC, "The name of the local ressource is missing.") + sml_return_val_error_if_fail(strlen(source_ref) > 0, NULL, error, SML_ERROR_GENERIC, "The name of the local ressource must not be empty.") + g_type_init(); + + SmlDevInfDataStore *self = g_object_new (SML_TYPE_DEV_INF_DATA_STORE, NULL); + sml_return_val_error_if_fail(self, NULL, error, SML_ERROR_GENERIC, "Cannot create a new instance of SmlDevInfDataStore - out of memory.") + + self->priv->source_ref = g_strdup(source_ref); + if (!self->priv->source_ref) { + g_object_unref(self); + *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "Cannot create a new instance of SmlDevInfDataStore - out of memory."); + return NULL; + } + + return self; +} + +/** + * sml_dev_inf_data_store_get_source_ref: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_data_store_get_source_ref (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), NULL); + return self->priv->source_ref; +} + +/** + * sml_dev_inf_data_store_set_source_ref: + * @self: A #SmlDevInfDataStore + * @sourceref: + * + * Sets the property. + */ +gboolean +sml_dev_inf_data_store_set_source_ref (SmlDevInfDataStore *self, + const gchar* source_ref, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail(SML_IS_DEV_INF_DATA_STORE (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInfDataStore object.") + sml_return_val_error_if_fail(source_ref, FALSE, error, SML_ERROR_GENERIC, "The name of the local ressource is missing.") + sml_return_val_error_if_fail(strlen(source_ref) > 0, FALSE, error, SML_ERROR_GENERIC, "The name of the local ressource must not be empty.") + + g_free (self->priv->source_ref); + + self->priv->source_ref = g_strdup (source_ref); + sml_return_val_error_if_fail(self->priv->source_ref, FALSE, error, SML_ERROR_GENERIC, "The name of the local ressource is missing.") + + return TRUE; +} + +/** + * sml_dev_inf_data_store_get_display_name: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_data_store_get_display_name (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), NULL); + return self->priv->display_name; +} + +/** + * sml_dev_inf_data_store_set_display_name: + * @self: A #SmlDevInfDataStore + * @displayname: + * + * Sets the property. + */ +gboolean +sml_dev_inf_data_store_set_display_name (SmlDevInfDataStore *self, + const gchar* display_name, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail(SML_IS_DEV_INF_DATA_STORE (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInfDataStore object.") + + g_free (self->priv->display_name); + + /* normalization */ + if (display_name && strlen(display_name) == 0) + display_name = NULL; + + self->priv->display_name = g_strdup (display_name); + sml_return_val_error_if_fail(!display_name || self->priv->display_name, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the display name - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_data_store_get_max_guid_size: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gsize +sml_dev_inf_data_store_get_max_guid_size (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), 0); + return self->priv->max_guid_size; +} + +/** + * sml_dev_inf_data_store_set_max_guid_size: + * @self: A #SmlDevInfDataStore + * @maxguidsize: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_max_guid_size (SmlDevInfDataStore *self, + gsize max_guid_size) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + self->priv->max_guid_size = max_guid_size; +} + +/** + * sml_dev_inf_data_store_get_rx_pref: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +SmlDevInfContentType* +sml_dev_inf_data_store_get_rx_pref (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), NULL); + return self->priv->rx_pref; +} + +/** + * sml_dev_inf_data_store_set_rx_pref: + * @self: A #SmlDevInfDataStore + * @rxpref: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_rx_pref (SmlDevInfDataStore *self, + SmlDevInfContentType* rx_pref) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + g_return_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (rx_pref)); + + if (self->priv->rx_pref) + g_object_unref (self->priv->rx_pref); + g_object_ref (rx_pref); + self->priv->rx_pref = rx_pref; +} + +/** + * sml_dev_inf_data_store_get_tx_pref: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +SmlDevInfContentType* +sml_dev_inf_data_store_get_tx_pref (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), NULL); + return self->priv->tx_pref; +} + +/** + * sml_dev_inf_data_store_set_tx_pref: + * @self: A #SmlDevInfDataStore + * @txpref: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_tx_pref (SmlDevInfDataStore *self, + SmlDevInfContentType* tx_pref) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + g_return_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (tx_pref)); + + if (self->priv->tx_pref) + g_object_unref (self->priv->tx_pref); + g_object_ref (tx_pref); + self->priv->tx_pref = tx_pref; +} + +/** + * sml_dev_inf_data_store_get_max_id: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gsize +sml_dev_inf_data_store_get_max_id (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), 0); + return self->priv->max_id; +} + +/** + * sml_dev_inf_data_store_set_max_id: + * @self: A #SmlDevInfDataStore + * @maxid: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_max_id (SmlDevInfDataStore *self, + gsize max_id) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + self->priv->max_id = max_id; +} + +/** + * sml_dev_inf_data_store_get_max_mem: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gsize +sml_dev_inf_data_store_get_max_mem (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), 0); + return self->priv->max_mem; +} + +/** + * sml_dev_inf_data_store_set_max_mem: + * @self: A #SmlDevInfDataStore + * @maxmem: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_max_mem (SmlDevInfDataStore *self, + gsize max_mem) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + self->priv->max_mem = max_mem; +} + +/** + * sml_dev_inf_data_store_get_shared_mem: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gboolean +sml_dev_inf_data_store_get_shared_mem (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE); + return self->priv->shared_mem; +} + +/** + * sml_dev_inf_data_store_set_shared_mem: + * @self: A #SmlDevInfDataStore + * @sharedmem: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_shared_mem (SmlDevInfDataStore *self, + gboolean shared_mem) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + self->priv->shared_mem = shared_mem; +} + +/** + * sml_dev_inf_data_store_num_rx: + * @self: A #SmlDevInfDataStore + * + * + */ +gsize +sml_dev_inf_data_store_num_rx (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), 0); + return g_list_length(self->priv->rx); +} + +/** + * sml_dev_inf_data_store_get_nth_rx: + * @self: A #SmlDevInfDataStore + * + * + */ +SmlDevInfContentType* +sml_dev_inf_data_store_get_nth_rx (SmlDevInfDataStore *self, + gsize n) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), NULL); + return (SmlDevInfContentType *)g_list_nth_data(self->priv->rx, n); +} + +/** + * sml_dev_inf_data_store_add_rx: + * @self: A #SmlDevInfDataStore + * + * + */ +gboolean +sml_dev_inf_data_store_add_rx (SmlDevInfDataStore *self, + SmlDevInfContentType *ct, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfDataStore object."); + sml_return_val_error_if_fail (ct, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfContentType object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (ct), FALSE, error, SML_ERROR_GENERIC, "The ct parameter must be a SmlDevInfContentType object."); + + g_object_ref(ct); + self->priv->rx = g_list_append(self->priv->rx, ct); + sml_return_val_error_if_fail (self->priv->rx, FALSE, error, SML_ERROR_GENERIC, "Cannot add content type to Rx list of data store."); + + return TRUE; +} + +/** + * sml_dev_inf_data_store_num_tx: + * @self: A #SmlDevInfDataStore + * + * + */ +gsize +sml_dev_inf_data_store_num_tx (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), 0); + return g_list_length(self->priv->tx); +} + +/** + * sml_dev_inf_data_store_get_nth_tx: + * @self: A #SmlDevInfDataStore + * + * + */ +SmlDevInfContentType* +sml_dev_inf_data_store_get_nth_tx (SmlDevInfDataStore *self, + gsize n) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), NULL); + return (SmlDevInfContentType *)g_list_nth_data(self->priv->tx, n); +} + +/** + * sml_dev_inf_data_store_add_tx: + * @self: A #SmlDevInfDataStore + * + * + */ +gboolean +sml_dev_inf_data_store_add_tx (SmlDevInfDataStore *self, + SmlDevInfContentType *ct, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfDataStore object."); + sml_return_val_error_if_fail (ct, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfContentType object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (ct), FALSE, error, SML_ERROR_GENERIC, "The ct parameter must be a SmlDevInfContentType object."); + + g_object_ref(ct); + self->priv->tx = g_list_append(self->priv->tx, ct); + sml_return_val_error_if_fail (self->priv->tx, FALSE, error, SML_ERROR_GENERIC, "Cannot add content type to Tx list of data store."); + + return TRUE; +} + +/** + * sml_dev_inf_data_store_get_sync_cap: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gboolean +sml_dev_inf_data_store_get_sync_cap (SmlDevInfDataStore *self, + SmlDevInfSyncCap sync_cap) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE); + return self->priv->sync_cap & sync_cap ? TRUE : FALSE; +} + +/** + * sml_dev_inf_data_store_set_sync_cap: + * @self: A #SmlDevInfDataStore + * @sharedmem: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_sync_cap (SmlDevInfDataStore *self, + SmlDevInfSyncCap sync_cap, + gboolean supported) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + if (supported) + self->priv->sync_cap = self->priv->sync_cap | sync_cap; + else + self->priv->sync_cap = self->priv->sync_cap & ~sync_cap; +} + +/** + * sml_dev_inf_data_store_get_supports_hierarchical_sync: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gboolean +sml_dev_inf_data_store_get_supports_hierarchical_sync (SmlDevInfDataStore *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE); + return self->priv->supports_hierarchical_sync; +} + +/** + * sml_dev_inf_data_store_set_supports_hierarchical_sync: + * @self: A #SmlDevInfDataStore + * @sharedmem: + * + * Sets the property. + */ +void +sml_dev_inf_data_store_set_supports_hierarchical_sync (SmlDevInfDataStore *self, + gboolean supported) +{ + g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); + self->priv->supports_hierarchical_sync = supported; +} + +/** + * sml_dev_inf_data_store_is_compliant: + * @self: A #SmlDevInfDataStore + * + * Gets the property. + * + * Return value: + */ +gboolean +sml_dev_inf_data_store_is_compliant (SmlDevInfDataStore *self, GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfDataStore object."); + + sml_return_val_error_if_fail (self->priv->source_ref != NULL, FALSE, error, SML_ERROR_GENERIC, "The SourceRef must be set."); + sml_return_val_error_if_fail (strlen(self->priv->source_ref) > 0, FALSE, error, SML_ERROR_GENERIC, "The SourceRef must not be an empty string."); + sml_return_val_error_if_fail (self->priv->rx_pref, FALSE, error, SML_ERROR_GENERIC, "The RxPref content type must be set."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE(self->priv->rx_pref), FALSE, error, SML_ERROR_GENERIC, "The RxPref content type must be a SmlDevInfContentType object."); + sml_return_val_error_if_fail (self->priv->tx_pref, FALSE, error, SML_ERROR_GENERIC, "The TxPref content type must be set."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE(self->priv->tx_pref), FALSE, error, SML_ERROR_GENERIC, "The TxPref content type must be a SmlDevInfContentType object."); + sml_return_val_error_if_fail (self->priv->sync_cap > 0, FALSE, error, SML_ERROR_GENERIC, "There must be at minimum one supported SyncCap."); + + return TRUE; +} + Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h Mon Jun 22 18:13:17 2009 (r1111) @@ -0,0 +1,97 @@ +/* sml_dev_inf_data_store.h + * + * Copyright (C) 2009 Michael Bell <mic...@op...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef __SML_DEV_INF_DATA_STORE_H__ +#define __SML_DEV_INF_DATA_STORE_H__ + +#include <glib-object.h> +#include <libsyncml/dev_inf_api/sml_dev_inf_content_type.h> + +G_BEGIN_DECLS + +#define SML_TYPE_DEV_INF_DATA_STORE (sml_dev_inf_data_store_get_type()) +#define SML_DEV_INF_DATA_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SML_TYPE_DEV_INF_DATA_STORE, SmlDevInfDataStore)) +#define SML_DEV_INF_DATA_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SML_TYPE_DEV_INF_DATA_STORE, SmlDevInfDataStoreClass)) +#define SML_IS_DEV_INF_DATA_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SML_TYPE_DEV_INF_DATA_STORE)) +#define SML_IS_DEV_INF_DATA_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SML_TYPE_DEV_INF_DATA_STORE)) +#define SML_DEV_INF_DATA_STORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SML_TYPE_DEV_INF_DATA_STORE, SmlDevInfDataStoreClass)) + +typedef enum { + SML_DEVINF_SYNCTYPE_UNKNOWN = 0, + SML_DEVINF_SYNCTYPE_TWO_WAY = 1, + SML_DEVINF_SYNCTYPE_SLOW_SYNC = 1 << 1, + SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT = 1 << 2, + SML_DEVINF_SYNCTYPE_REFRESH_FROM_CLIENT = 1 << 3, + SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_SERVER = 1 << 4, + SML_DEVINF_SYNCTYPE_REFRESH_FROM_SERVER = 1 << 5, + SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC = 1 << 6 +} SmlDevInfSyncCap; + +typedef struct _SmlDevInfDataStore SmlDevInfDataStore; +typedef struct _SmlDevInfDataStoreClass SmlDevInfDataStoreClass; +typedef struct _SmlDevInfDataStorePrivate SmlDevInfDataStorePrivate; + +struct _SmlDevInfDataStore +{ + GObject parent; + + /*< private >*/ + SmlDevInfDataStorePrivate *priv; +}; + +struct _SmlDevInfDataStoreClass +{ + GObjectClass parent_class; + +}; + +GType sml_dev_inf_data_store_get_type (void); +SmlDevInfDataStore* sml_dev_inf_data_store_new (const char *source_ref, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_data_store_get_source_ref (SmlDevInfDataStore *self); +gboolean sml_dev_inf_data_store_set_source_ref (SmlDevInfDataStore *self, const gchar* source_ref, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_data_store_get_display_name (SmlDevInfDataStore *self); +gboolean sml_dev_inf_data_store_set_display_name (SmlDevInfDataStore *self, const gchar* display_name, GError **error); +gsize sml_dev_inf_data_store_get_max_guid_size (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_max_guid_size (SmlDevInfDataStore *self, gsize max_guid_size); +SmlDevInfContentType* sml_dev_inf_data_store_get_rx_pref (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_rx_pref (SmlDevInfDataStore *self, SmlDevInfContentType* rx_pref); +SmlDevInfContentType* sml_dev_inf_data_store_get_tx_pref (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_tx_pref (SmlDevInfDataStore *self, SmlDevInfContentType* tx_pref); +gsize sml_dev_inf_data_store_get_max_id (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_max_id (SmlDevInfDataStore *self, gsize max_id); +gsize sml_dev_inf_data_store_get_max_mem (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_max_mem (SmlDevInfDataStore *self, gsize max_mem); +gboolean sml_dev_inf_data_store_get_shared_mem (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_shared_mem (SmlDevInfDataStore *self, gboolean shared_mem); +gsize sml_dev_inf_data_store_num_rx (SmlDevInfDataStore *self); +SmlDevInfContentType* sml_dev_inf_data_store_get_nth_rx (SmlDevInfDataStore *self, gsize n); +gboolean sml_dev_inf_data_store_add_rx (SmlDevInfDataStore *self, SmlDevInfContentType *ct, GError **error); +gsize sml_dev_inf_data_store_num_tx (SmlDevInfDataStore *self); +SmlDevInfContentType* sml_dev_inf_data_store_get_nth_tx (SmlDevInfDataStore *self, gsize n); +gboolean sml_dev_inf_data_store_add_tx (SmlDevInfDataStore *self, SmlDevInfContentType *ct, GError **error); +gboolean sml_dev_inf_data_store_get_sync_cap (SmlDevInfDataStore *self, SmlDevInfSyncCap sync_cap); +void sml_dev_inf_data_store_set_sync_cap (SmlDevInfDataStore *self, SmlDevInfSyncCap sync_cap, gboolean supported); +gboolean sml_dev_inf_data_store_get_supports_hierarchical_sync (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_supports_hierarchical_sync (SmlDevInfDataStore *self, gboolean supported); +gboolean sml_dev_inf_data_store_is_compliant (SmlDevInfDataStore *self, GError **error); + +G_END_DECLS + +#endif /* __SML_DEV_INF_DATA_STORE_H__ */ Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Mon Jun 22 14:45:37 2009 (r1110) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Mon Jun 22 18:13:17 2009 (r1111) @@ -663,6 +663,7 @@ CHECK_ERROR_REF sml_return_val_error_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfProperty object."); sml_return_val_error_if_fail (param, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfPropParam object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_PROP_PARAM (param), FALSE, error, SML_ERROR_GENERIC, "The param must be a SmlDevInfPropParam object."); g_object_ref(param); self->priv->params = g_list_append(self->priv->params, param); Modified: trunk/libsyncml/parser/sml_xml_assm.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_assm.c Mon Jun 22 14:45:37 2009 (r1110) +++ trunk/libsyncml/parser/sml_xml_assm.c Mon Jun 22 18:13:17 2009 (r1111) @@ -2242,23 +2242,10 @@ GList *contentTypes = NULL; GError *gerror = NULL; - if (!datastore->sourceref) { - smlErrorSet(error, SML_ERROR_GENERIC, "Missing sourceref"); - goto error; - } - - if (!datastore->rxPrefContentType) { - smlErrorSet(error, SML_ERROR_GENERIC, "Missing rx-pref"); - goto error; - } - - if (!datastore->txPrefContentType) { - smlErrorSet(error, SML_ERROR_GENERIC, "Missing tx-pref"); - goto error; - } - - if (!datastore->synccap) { - smlErrorSet(error, SML_ERROR_GENERIC, "No sync capabilities"); + if (!sml_dev_inf_data_store_is_compliant(datastore, &gerror)) { + smlErrorSet(error, gerror->code, "%s", gerror->message); + g_error_free(gerror); + gerror = NULL; goto error; } @@ -2267,66 +2254,56 @@ goto error; //SourceRef - if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SOURCEREF, datastore->sourceref, error)) + if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SOURCEREF, sml_dev_inf_data_store_get_source_ref(datastore), error)) goto error; //displayname - if (datastore->displayname) { - if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_DISPLAYNAME, datastore->displayname, error)) + if (sml_dev_inf_data_store_get_display_name(datastore)) { + if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_DISPLAYNAME, sml_dev_inf_data_store_get_display_name(datastore), error)) goto error; } //maxguidsize - if (datastore->maxGUIDSize) { - if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXGUIDSIZE, datastore->maxGUIDSize, error)) + if (sml_dev_inf_data_store_get_max_guid_size(datastore)) { + if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXGUIDSIZE, sml_dev_inf_data_store_get_max_guid_size(datastore), error)) goto error; } //rx-pref - if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_RXPREF, datastore->rxPrefContentType, datastore->rxPrefVersion, error)) + SmlDevInfContentType *ct = sml_dev_inf_data_store_get_rx_pref(datastore); + if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_RXPREF, sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), error)) goto error; - /* FIXME: ignored error */ - contentTypes = g_list_append( - contentTypes, - sml_dev_inf_content_type_new( - datastore->rxPrefContentType, - datastore->rxPrefVersion, &gerror)); + g_object_ref(ct); + contentTypes = g_list_append(contentTypes, ct); //rx - if (datastore->rx) { - GList *hl; - for (hl = datastore->rx; hl; hl = hl->next) - { - SmlDevInfContentType *ct = hl->data; - if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_RX, sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), error)) - goto error; - contentTypes = g_list_append( - contentTypes, - sml_dev_inf_content_type_new(sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), &gerror)); - } + gsize length = sml_dev_inf_data_store_num_rx(datastore); + gsize i; + for (i = 0; i < length; i++) + { + ct = sml_dev_inf_data_store_get_nth_rx(datastore, i); + if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_RX, sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), error)) + goto error; + g_object_ref(ct); + contentTypes = g_list_append(contentTypes, ct); } //tx-pref - if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_TXPREF, datastore->txPrefContentType, datastore->txPrefVersion, error)) + ct = sml_dev_inf_data_store_get_tx_pref(datastore); + if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_TXPREF, sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), error)) goto error; - contentTypes = g_list_append( - contentTypes, - sml_dev_inf_content_type_new( - datastore->txPrefContentType, - datastore->txPrefVersion, &gerror)); + g_object_ref(ct); + contentTypes = g_list_append(contentTypes, ct); //tx - if (datastore->tx) { - GList *hl; - for (hl = datastore->tx; hl; hl = hl->next) - { - SmlDevInfContentType *ct = hl->data; - if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_TX, sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), error)) - goto error; - contentTypes = g_list_append( - contentTypes, - sml_dev_inf_content_type_new(sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), &gerror)); - } + length = sml_dev_inf_data_store_num_tx(datastore); + for (i = 0; i < length; i++) + { + ct = sml_dev_inf_data_store_get_nth_tx(datastore, i); + if (!_smlXmlDevInfDataStoreAssembleRxTx(assm, SML_ELEMENT_TX, sml_dev_inf_content_type_get_cttype(ct), sml_dev_inf_content_type_get_verct(ct), error)) + goto error; + g_object_ref(ct); + contentTypes = g_list_append(contentTypes, ct); } // CTCap (if SyncML version 1.2 device info) @@ -2334,7 +2311,7 @@ { GList *hct = NULL; for (hct = contentTypes; hct; hct = hct->next) { - SmlDevInfContentType *ct = hct->data; + ct = hct->data; SmlDevInfCTCap *ctcap = smlDevInfGetCTCap(devinf, ct); if (ctcap != NULL) { @@ -2361,26 +2338,26 @@ } //Dsmem - if (datastore->maxmem || datastore->maxid) { + if (sml_dev_inf_data_store_get_max_mem(datastore) || sml_dev_inf_data_store_get_max_id(datastore)) { //Dsmem if (!_smlXmlAssemblerStartNode(assm, SML_ELEMENT_DSMEM, error)) goto error; //shared - if (datastore->sharedMem) { + if (sml_dev_inf_data_store_get_shared_mem(datastore)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SHAREDMEM, "", error)) goto error; } //maxid - if (datastore->maxid) { - if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXID, datastore->maxid, error)) + if (sml_dev_inf_data_store_get_max_id(datastore)) { + if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXID, sml_dev_inf_data_store_get_max_id(datastore), error)) goto error; } //maxmem - if (datastore->maxmem) { - if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXMEM, datastore->maxmem, error)) + if (sml_dev_inf_data_store_get_max_mem(datastore)) { + if (!_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXMEM, sml_dev_inf_data_store_get_max_mem(datastore), error)) goto error; } @@ -2394,31 +2371,31 @@ goto error; //SyncTypes - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "1", error)) goto error; } - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "2", error)) goto error; } - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "3", error)) goto error; } - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_REFRESH_FROM_CLIENT)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_REFRESH_FROM_CLIENT)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "4", error)) goto error; } - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_SERVER)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_SERVER)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "5", error)) goto error; } - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_REFRESH_FROM_SERVER)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_REFRESH_FROM_SERVER)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "6", error)) goto error; } - if (smlDevInfDataStoreGetSyncCap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC)) { + if (sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC)) { if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_SYNCTYPE, "7", error)) goto error; } Modified: trunk/libsyncml/parser/sml_xml_parse.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_parse.c Mon Jun 22 14:45:37 2009 (r1110) +++ trunk/libsyncml/parser/sml_xml_parse.c Mon Jun 22 18:13:17 2009 (r1111) @@ -2559,10 +2559,12 @@ } if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_MAXID)) { - if (!_smlXmlParserGetID(parser, &(datastore->maxid), SML_ELEMENT_MAXID, error)) + unsigned int maxid = 0; + if (!_smlXmlParserGetID(parser, &maxid, SML_ELEMENT_MAXID, error)) goto error; + sml_dev_inf_data_store_set_max_id(datastore, maxid); } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_SHAREDMEM)) { - datastore->sharedMem = TRUE; + sml_dev_inf_data_store_set_shared_mem(datastore, TRUE); if (!_smlXmlParserStep(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); goto error; @@ -2577,8 +2579,10 @@ } continue; } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_MAXMEM)) { - if (!_smlXmlParserGetID(parser, &(datastore->maxmem), SML_ELEMENT_MAXMEM, error)) - goto error; + unsigned int maxmem = 0; + if (!_smlXmlParserGetID(parser, &maxmem, SML_ELEMENT_MAXMEM, error)) + goto error; + sml_dev_inf_data_store_set_max_mem(datastore, maxmem); } else { smlErrorSet(error, SML_ERROR_GENERIC, "wrong initial node"); goto error; @@ -2627,7 +2631,7 @@ goto error; if (synccap != SML_DEVINF_SYNCTYPE_UNKNOWN) - smlDevInfDataStoreSetSyncCap(datastore, synccap, TRUE); + sml_dev_inf_data_store_set_sync_cap(datastore, synccap, TRUE); } else { smlErrorSet(error, SML_ERROR_GENERIC, "wrong initial node"); goto error; @@ -3198,14 +3202,18 @@ return ret; } -static SmlBool _smlXmlDevInfDataStoreParseRxTx(SmlXmlParser *parser, const char *element, char **cttype, char **version, SmlError **error) +static SmlBool _smlXmlDevInfDataStoreParseRxTx(SmlXmlParser *parser, const char *element, SmlDevInfDataStore *datastore, SmlError **error) { - smlTrace(TRACE_ENTRY, "%s(%p, %s, %p, %p, %p)", __func__, parser, VA_STRING(element), cttype, version, error); + smlTrace(TRACE_ENTRY, "%s(%p, %s, %p, %p, %p)", __func__, parser, VA_STRING(element), datastore, error); CHECK_ERROR_REF smlAssert(parser); smlAssert(element); - smlAssert(cttype); + GError *gerror = NULL; + SmlDevInfContentType *ct = NULL; + char *cttype = NULL; + char *verct = NULL; + if (!_smlXmlParserStep(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); goto error; @@ -3223,7 +3231,7 @@ } if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_CTTYPE)) { - if (!_smlXmlParserGetString(parser, cttype, SML_ELEMENT_CTTYPE, error)) + if (!_smlXmlParserGetString(parser, &cttype, SML_ELEMENT_CTTYPE, error)) goto error; } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_VERCT)) { /* Some phones send an empty VerCT for formats that dont have a version @@ -3235,14 +3243,14 @@ if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_VERCT) && \ xmlTextReaderNodeType(parser->reader) == XML_NODE_CLOSE) { - *version = g_strdup(""); + verct = g_strdup(""); } else if (xmlTextReaderNodeType(parser->reader) == XML_NODE_TEXT) { - *version = g_strstrip(g_strdup((char *)xmlTextReaderConstValue(parser->reader))); + verct = g_strstrip(g_strdup((char *)xmlTextReaderConstValue(parser->reader))); if (!_smlXmlParserExpectNode(parser, XML_NODE_CLOSE, FALSE, SML_ELEMENT_VERCT, error)) goto error; } else { - *version = g_strdup(""); + verct = g_strdup(""); continue; } } else { @@ -3255,11 +3263,45 @@ goto error; } } + + /* configure data store */ + + ct = sml_dev_inf_content_type_new(cttype, verct, &gerror); + if (!ct) + goto error; + if (!strcmp(SML_ELEMENT_RX, element)) { + if (!sml_dev_inf_data_store_add_tx(datastore, ct, &gerror)) + goto error; + } else if (!strcmp(SML_ELEMENT_RXPREF, element)) { + sml_dev_inf_data_store_set_rx_pref(datastore, ct); + } else if (!strcmp(SML_ELEMENT_TX, element)) { + if (!sml_dev_inf_data_store_add_tx(datastore, ct, &gerror)) + goto error; + } else if (!strcmp(SML_ELEMENT_TXPREF, element)) { + sml_dev_inf_data_store_set_tx_pref(datastore, ct); + } else { + smlErrorSet(error, SML_ERROR_GENERIC, "The element %s is an unknown Rx/Tx element.", element); + goto error; + } + + smlSafeCFree(&cttype); + smlSafeCFree(&verct); + g_object_unref(ct); smlTrace(TRACE_EXIT, "%s", __func__); return TRUE; error: + if (gerror) { + smlErrorSet(error, gerror->code, "%s", gerror->message); + g_error_free(gerror); + } + if (cttype) + smlSafeCFree(&cttype); + if (verct) + smlSafeCFree(&verct); + if (ct) + g_object_unref(ct); smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); return FALSE; } @@ -3270,17 +3312,15 @@ CHECK_ERROR_REF smlAssert(devinf); smlAssert(parser); + GError *gerror = NULL; - SmlDevInfDataStore *datastore = smlTryMalloc0(sizeof(SmlDevInfDataStore), error); + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("dummy", &gerror); if (!datastore) goto error; - datastore->refCount = 1; - datastore->rxPrefContentType = NULL; - datastore->txPrefContentType = NULL; if (!_smlXmlParserStep(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); - goto error_free_datastore; + goto error; } while (1) { @@ -3292,71 +3332,55 @@ smlErrorSet(error, SML_ERROR_GENERIC, "The element %s is not a start node in Datastore.", xmlTextReaderConstName(parser->reader)); - goto error_free_datastore; + goto error; } if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_SOURCEREF)) { - if (!_smlXmlParserGetString(parser, &(datastore->sourceref), SML_ELEMENT_SOURCEREF, error)) - goto error_free_datastore; + char *sourceref = NULL; + if (!_smlXmlParserGetString(parser, &sourceref, SML_ELEMENT_SOURCEREF, error)) + goto error; + if (!sml_dev_inf_data_store_set_source_ref(datastore, sourceref, &gerror)) + goto error; + smlSafeCFree(&sourceref); } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_DISPLAYNAME)) { - if (!_smlXmlParserGetString(parser, &(datastore->displayname), SML_ELEMENT_DISPLAYNAME, error)) - goto error_free_datastore; + char *displayname = NULL; + if (!_smlXmlParserGetString(parser, &displayname, SML_ELEMENT_DISPLAYNAME, error)) + goto error; + if (!sml_dev_i... [truncated message content] |