You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
(56) |
Apr
(109) |
May
(15) |
Jun
(3) |
Jul
(37) |
Aug
(96) |
Sep
(40) |
Oct
(4) |
Nov
(54) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(47) |
Feb
(30) |
Mar
(102) |
Apr
(120) |
May
(68) |
Jun
(54) |
Jul
(53) |
Aug
(122) |
Sep
(190) |
Oct
(71) |
Nov
(85) |
Dec
(108) |
2007 |
Jan
(72) |
Feb
(190) |
Mar
(53) |
Apr
(101) |
May
(145) |
Jun
(148) |
Jul
(167) |
Aug
(143) |
Sep
(23) |
Oct
(198) |
Nov
(223) |
Dec
(195) |
2008 |
Jan
(100) |
Feb
(129) |
Mar
(79) |
Apr
(77) |
May
(34) |
Jun
(95) |
Jul
(112) |
Aug
(160) |
Sep
(82) |
Oct
(124) |
Nov
(199) |
Dec
(355) |
2009 |
Jan
(436) |
Feb
(89) |
Mar
(298) |
Apr
(189) |
May
(33) |
Jun
(88) |
Jul
(105) |
Aug
(44) |
Sep
(181) |
Oct
(87) |
Nov
(75) |
Dec
(1) |
2010 |
Jan
(63) |
Feb
(21) |
Mar
(3) |
Apr
(1) |
May
(1) |
Jun
(3) |
Jul
(26) |
Aug
(37) |
Sep
(26) |
Oct
(15) |
Nov
(13) |
Dec
|
From: <svn...@op...> - 2009-06-26 13:03:55
|
Author: saschpe Date: Fri Jun 26 14:56:58 2009 New Revision: 1122 URL: http://libsyncml.opensync.org/changeset/1122 Log: Added a check in smlDataSyncAbort to prevent segfault when no session is running. Modified: trunk/libsyncml/data_sync_api/data_sync_abort.c Modified: trunk/libsyncml/data_sync_api/data_sync_abort.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_abort.c Fri Jun 26 14:55:04 2009 (r1121) +++ trunk/libsyncml/data_sync_api/data_sync_abort.c Fri Jun 26 14:56:58 2009 (r1122) @@ -44,6 +44,9 @@ { smlTrace(TRACE_ENTRY, "%s", __func__); + if (!dsObject || !dsObject->session) + return FALSE; + /* determine the state of the session */ if (!dsObject->session->sending && !dsObject->session->waiting) { |
From: <svn...@op...> - 2009-06-25 14:26:06
|
Author: bellmich Date: Thu Jun 25 16:25:55 2009 New Revision: 1119 URL: http://libsyncml.opensync.org/changeset/1119 Log: fixed two warnings from clio (wrong set_property code) Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Thu Jun 25 16:02:43 2009 (r1118) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Thu Jun 25 16:25:55 2009 (r1119) @@ -126,7 +126,8 @@ 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); + SML_DEV_INF_DATA_STORE (object)->priv->rx_pref = g_value_get_object (value); + g_object_ref(SML_DEV_INF_DATA_STORE (object)->priv->rx_pref); break; case PROP_RX: SML_DEV_INF_DATA_STORE (object)->priv->rx = (GList *) g_value_get_pointer(value); @@ -134,7 +135,8 @@ 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); + SML_DEV_INF_DATA_STORE (object)->priv->tx_pref = g_value_get_object (value); + g_object_ref(SML_DEV_INF_DATA_STORE (object)->priv->tx_pref); break; case PROP_TX: SML_DEV_INF_DATA_STORE (object)->priv->tx = (GList *) g_value_get_pointer(value); |
From: <svn...@op...> - 2009-06-25 14:09:02
|
Author: bellmich Date: Thu Jun 25 16:02:43 2009 New Revision: 1118 URL: http://libsyncml.opensync.org/changeset/1118 Log: migrated SmlDevInf to GObject style The tests are not complete but the old tests pass now. Added: trunk/libsyncml/dev_inf_api/glib_mkenums.sh trunk/libsyncml/dev_inf_api/sml_dev_inf.c trunk/libsyncml/dev_inf_api/sml_dev_inf.h trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.c trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.c.tmpl trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.h trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.h.tmpl trunk/tests/check_dev_inf.c Modified: trunk/libsyncml/CMakeLists.txt trunk/libsyncml/data_sync_api/data_sync.c trunk/libsyncml/data_sync_api/data_sync_devinf.c trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c trunk/libsyncml/objects/sml_devinf_obj.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/CMakeLists.txt trunk/tests/check_devinf.c trunk/tests/check_sync.c trunk/tests/check_xml_assembler.c trunk/tests/check_xml_parser.c trunk/tools/syncml-ds-tool.c Modified: trunk/libsyncml/CMakeLists.txt ============================================================================== --- trunk/libsyncml/CMakeLists.txt Wed Jun 24 11:54:05 2009 (r1117) +++ trunk/libsyncml/CMakeLists.txt Thu Jun 25 16:02:43 2009 (r1118) @@ -33,11 +33,13 @@ parser/sml_wbxml.c parser/sml_xml_assm.c parser/sml_xml_parse.c + dev_inf_api/sml_dev_inf_enum_types.c dev_inf_api/sml_dev_inf_content_type.c 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 + dev_inf_api/sml_dev_inf.c ) IF ( ENABLE_OBEX ) @@ -98,11 +100,13 @@ ## install header files of DevInf API INSTALL( FILES + dev_inf_api/sml_dev_inf_enum_types.h dev_inf_api/sml_dev_inf_content_type.h 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 + dev_inf_api/sml_dev_inf.h DESTINATION ${LIBSYNCML_INCLUDE_DIR}/libsyncml/dev_inf_api ) Modified: trunk/libsyncml/data_sync_api/data_sync.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync.c Wed Jun 24 11:54:05 2009 (r1117) +++ trunk/libsyncml/data_sync_api/data_sync.c Thu Jun 25 16:02:43 2009 (r1118) @@ -945,9 +945,9 @@ /* cleanup device information */ if ((*dsObject)->localDevInf) - smlDevInfUnref((*dsObject)->localDevInf); + g_object_unref((*dsObject)->localDevInf); if ((*dsObject)->remoteDevInf) - smlDevInfUnref((*dsObject)->remoteDevInf); + g_object_unref((*dsObject)->remoteDevInf); if ((*dsObject)->agent) smlDevInfAgentFree((*dsObject)->agent); Modified: trunk/libsyncml/data_sync_api/data_sync_devinf.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_devinf.c Wed Jun 24 11:54:05 2009 (r1117) +++ trunk/libsyncml/data_sync_api/data_sync_devinf.c Thu Jun 25 16:02:43 2009 (r1118) @@ -154,7 +154,7 @@ goto error; } - if (smlDevInfGetCTCap(devinf, ct) != NULL) + if (sml_dev_inf_get_ctcap(devinf, ct) != NULL) { g_object_unref(ct); smlTrace(TRACE_EXIT, "%s - content type already present in devinf", __func__); @@ -282,7 +282,8 @@ _ADD_PROPERTY_PARAM("WORK"); _ADD_PROPERTY_PARAM("HOME"); _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "2.1") - smlDevInfAppendCTCap(devinf, ctcap); + if (!sml_dev_inf_add_ctcap(devinf, ctcap, &gerror)) + goto error; } else if (!strcmp(cttype, SML_ELEMENT_TEXT_VCARD_30) && !strcmp(verct, "3.0")) @@ -326,7 +327,8 @@ _ADD_CTCAP_PROPERTY_BY_NAME("NOTE") _ADD_CTCAP_PROPERTY_BY_NAME("PHOTO") _ADD_PROPERTY_PARAM("TYPE") - smlDevInfAppendCTCap(devinf, ctcap); + if (!sml_dev_inf_add_ctcap(devinf, ctcap, &gerror)) + goto error; } /* Oracle collaboration Suite uses the content type to distinguish */ /* the versions of vCalendar (and iCalendar) */ @@ -383,7 +385,8 @@ _ADD_CTCAP_PROPERTY_BY_NAME("SUMMARY") _ADD_CTCAP_PROPERTY_BY_NAME("UID") _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "1.0") - smlDevInfAppendCTCap(devinf, ctcap); + if (!sml_dev_inf_add_ctcap(devinf, ctcap, &gerror)) + goto error; } else if (!strcmp(cttype, SML_ELEMENT_TEXT_ICAL) && !strcmp(verct, "2.0")) @@ -437,7 +440,8 @@ _ADD_CTCAP_PROPERTY_BY_NAME("SUMMARY") _ADD_CTCAP_PROPERTY_BY_NAME("UID") _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "2.0") - smlDevInfAppendCTCap(devinf, ctcap); + if (!sml_dev_inf_add_ctcap(devinf, ctcap, &gerror)) + goto error; } else { @@ -452,7 +456,8 @@ if (!ctcap) goto error; - smlDevInfAppendCTCap(devinf, ctcap); + if (!sml_dev_inf_add_ctcap(devinf, ctcap, &gerror)) + goto error; } smlTrace(TRACE_EXIT, "%s - content type newly added to devinf", __func__); @@ -474,12 +479,12 @@ // direct session config - smlSessionUseNumberOfChanges(session, smlDevInfSupportsNumberOfChanges(devinf)); - smlSessionUseLargeObjects(session, smlDevInfSupportsLargeObjs(devinf)); + smlSessionUseNumberOfChanges(session, sml_dev_inf_get_support_number_of_changes(devinf)); + smlSessionUseLargeObjects(session, sml_dev_inf_get_support_large_objs(devinf)); // local device information - if (smlDevInfSupportsUTC(devinf)) + if (sml_dev_inf_get_support_utc(devinf)) dsObject->onlyLocaltime = FALSE; else dsObject->onlyLocaltime = TRUE; @@ -620,13 +625,14 @@ // 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); + // sml_dev_inf_data_store_add_sync_cap(ds, SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT, TRUE); smlTrace(TRACE_INTERNAL, "%s: SyncML clients only support SLOW and TWO WAY SYNC", __func__); } else { sml_dev_inf_data_store_set_sync_cap(ds, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE); } - smlDevInfAddDataStore(devinf, ds); + if (!sml_dev_inf_add_data_store(devinf, ds, &gerror)) + goto error; smlTrace(TRACE_EXIT, "%s - content type newly added to devinf", __func__); return TRUE; error: @@ -652,13 +658,13 @@ * then cleanup the reference. */ if (dsObject->remoteDevInf) - smlDevInfUnref(dsObject->remoteDevInf); + g_object_unref(dsObject->remoteDevInf); dsObject->remoteDevInf = smlDevInfAgentGetSessionDevInf(dsObject->agent, dsObject->session); if (dsObject->remoteDevInf) { smlTrace(TRACE_INTERNAL, "%s: The remote DevInf was received.", __func__); - smlDevInfRef(dsObject->remoteDevInf); + g_object_ref(dsObject->remoteDevInf); _update_session_config_from_devinf(dsObject); /* DevInf caching is optional */ if (dsObject->writeDevInfCallback) { @@ -699,7 +705,7 @@ * So the reference counter must be incremented for * remoteDevInf. */ - smlDevInfRef(dsObject->remoteDevInf); + g_object_ref(dsObject->remoteDevInf); _update_session_config_from_devinf(dsObject); smlTrace(TRACE_EXIT, "%s - cached DevInf", __func__); return TRUE; @@ -746,6 +752,7 @@ SmlError **error) { CHECK_ERROR_REF + GError *gerror = NULL; SmlDevInf *devinf = NULL; /* fix missing identifier */ @@ -755,26 +762,40 @@ if (dsObject->fakeDevice) { smlTrace(TRACE_INTERNAL, "%s: faking devinf", __func__); - devinf = smlDevInfNew(dsObject->identifier, SML_DEVINF_DEVTYPE_SMARTPHONE, error); - if (!devinf) + devinf = sml_dev_inf_new(); + if (!devinf) { + smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create new SmlDevInf object - out of memory."); goto error; + } + if (!sml_dev_inf_set_dev_id(devinf, dsObject->identifier, &gerror)) + goto error; + sml_dev_inf_set_dev_typ(devinf, SML_DEVINF_DEVTYPE_SMARTPHONE); - smlDevInfSetManufacturer(devinf, dsObject->fakeManufacturer); - smlDevInfSetModel(devinf, dsObject->fakeModel); - smlDevInfSetSoftwareVersion(devinf, dsObject->fakeSoftwareVersion); + if (!sml_dev_inf_set_man(devinf, dsObject->fakeManufacturer, &gerror)) + goto error; + if (!sml_dev_inf_set_mod(devinf, dsObject->fakeModel, &gerror)) + goto error; + if (!sml_dev_inf_set_swv(devinf, dsObject->fakeSoftwareVersion, &gerror)) + goto error; } else { smlTrace(TRACE_INTERNAL, "%s: not faking devinf", __func__); - devinf = smlDevInfNew(dsObject->identifier, type, error); - if (!devinf) + devinf = sml_dev_inf_new(); + if (!devinf) { + smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create new SmlDevInf object - out of memory."); goto error; + } + if (!sml_dev_inf_set_dev_id(devinf, dsObject->identifier, &gerror)) + goto error; + sml_dev_inf_set_dev_typ(devinf, type); - smlDevInfSetSoftwareVersion(devinf, dsObject->fakeSoftwareVersion); + if (!sml_dev_inf_set_swv(devinf, dsObject->fakeSoftwareVersion, &gerror)) + goto error; } - smlDevInfSetSupportsNumberOfChanges(devinf, TRUE); - smlDevInfSetSupportsLargeObjs(devinf, TRUE); + sml_dev_inf_set_support_number_of_changes(devinf, TRUE); + sml_dev_inf_set_support_large_objs(devinf, TRUE); if (!dsObject->onlyLocaltime) - smlDevInfSetSupportsUTC(devinf, TRUE); + sml_dev_inf_set_support_utc(devinf, TRUE); smlAssert(dsObject->maxMsgSize); smlAssert(dsObject->maxObjSize); @@ -783,15 +804,19 @@ dsObject->agent = smlDevInfAgentNew(dsObject->localDevInf, error); if (!dsObject->agent) goto error; - smlDevInfRef(dsObject->localDevInf); /* the agent consumes the object */ + g_object_ref(dsObject->localDevInf); /* the agent consumes the object */ if (!smlDevInfAgentRegister(dsObject->agent, dsObject->manager, error)) goto error; return TRUE; error: + if (gerror) { + smlErrorSet(error, gerror->code, "%s", gerror->message); + g_error_free(gerror); + } if (devinf) - smlDevInfUnref(devinf); + g_object_unref(devinf); if (dsObject->agent) smlDevInfAgentFree(dsObject->agent); dsObject->localDevInf = NULL; @@ -846,7 +871,7 @@ * then dsObject must be configured properly */ if (dsObject->remoteDevInf && - !smlDevInfSupportsUTC(dsObject->remoteDevInf)) + !sml_dev_inf_get_support_utc(dsObject->remoteDevInf)) { smlTrace(TRACE_INTERNAL, "%s: enforcing localtime because of remote DevInf", Added: trunk/libsyncml/dev_inf_api/glib_mkenums.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/glib_mkenums.sh Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,6 @@ +glib-mkenums \ + --fhead "#ifndef __SML_DEV_INF_ENUM_TYPES_H\n#define __SML_DEV_INF_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \ + --fprod "/* enumeration types from \"@filename@\" */\n" \ + --vhead "GType @EnumName@ (void);\n#define @EnumName@ (@EnumName@())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __SML_DEV_INF_ENUM_TYPES_H__ */" \ + sml_dev_inf.h Added: trunk/libsyncml/dev_inf_api/sml_dev_inf.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf.c Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,1043 @@ +/* sml_dev_inf.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.h" +#include "sml_dev_inf_enum_types.h" +#include <libsyncml/syncml.h> +#include "../sml_error_internals.h" + +G_DEFINE_TYPE (SmlDevInf, sml_dev_inf, G_TYPE_OBJECT) + +enum +{ + PROP_0, + PROP_VER_DTD, + PROP_MAN, + PROP_MOD, + PROP_OEM, + PROP_FWV, + PROP_SWV, + PROP_HWV, + PROP_DEV_ID, + PROP_DEV_TYP, + PROP_SUPPORT_UTC, + PROP_SUPPORT_LARGE_OBJS, + PROP_SUPPORT_NUMBER_OF_CHANGES, + PROP_DATA_STORES, + PROP_CTCAPS +}; + +struct _SmlDevInfPrivate +{ + SmlDevInfVersion ver_dtd; + gchar* man; + gchar* mod; + gchar* oem; + gchar* fwv; + gchar* swv; + gchar* hwv; + gchar* dev_id; + SmlDevInfDevTyp dev_typ; + gboolean support_utc; + gboolean support_large_objs; + gboolean support_number_of_changes; + GList* data_stores; + GList* ctcaps; +}; + +static void +sml_dev_inf_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_VER_DTD: + g_value_set_enum (value, SML_DEV_INF (object)->priv->ver_dtd); + break; + case PROP_MAN: + g_value_set_string (value, SML_DEV_INF (object)->priv->man); + break; + case PROP_MOD: + g_value_set_string (value, SML_DEV_INF (object)->priv->mod); + break; + case PROP_OEM: + g_value_set_string (value, SML_DEV_INF (object)->priv->oem); + break; + case PROP_FWV: + g_value_set_string (value, SML_DEV_INF (object)->priv->fwv); + break; + case PROP_SWV: + g_value_set_string (value, SML_DEV_INF (object)->priv->swv); + break; + case PROP_HWV: + g_value_set_string (value, SML_DEV_INF (object)->priv->hwv); + break; + case PROP_DEV_ID: + g_value_set_string (value, SML_DEV_INF (object)->priv->dev_id); + break; + case PROP_DEV_TYP: + g_value_set_enum (value, SML_DEV_INF (object)->priv->dev_typ); + break; + case PROP_SUPPORT_UTC: + g_value_set_boolean (value, SML_DEV_INF (object)->priv->support_utc); + break; + case PROP_SUPPORT_LARGE_OBJS: + g_value_set_boolean (value, SML_DEV_INF (object)->priv->support_large_objs); + break; + case PROP_SUPPORT_NUMBER_OF_CHANGES: + g_value_set_boolean (value, SML_DEV_INF (object)->priv->support_number_of_changes); + break; + case PROP_DATA_STORES: + g_value_set_pointer (value, SML_DEV_INF (object)->priv->data_stores); + break; + case PROP_CTCAPS: + g_value_set_pointer (value, SML_DEV_INF (object)->priv->ctcaps); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +sml_dev_inf_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_VER_DTD: + SML_DEV_INF (object)->priv->ver_dtd = g_value_get_enum (value); + break; + case PROP_MAN: + g_free (SML_DEV_INF (object)->priv->man); + SML_DEV_INF (object)->priv->man = g_strdup (g_value_get_string (value)); + break; + case PROP_MOD: + g_free (SML_DEV_INF (object)->priv->mod); + SML_DEV_INF (object)->priv->mod = g_strdup (g_value_get_string (value)); + break; + case PROP_OEM: + g_free (SML_DEV_INF (object)->priv->oem); + SML_DEV_INF (object)->priv->oem = g_strdup (g_value_get_string (value)); + break; + case PROP_FWV: + g_free (SML_DEV_INF (object)->priv->fwv); + SML_DEV_INF (object)->priv->fwv = g_strdup (g_value_get_string (value)); + break; + case PROP_SWV: + g_free (SML_DEV_INF (object)->priv->swv); + SML_DEV_INF (object)->priv->swv = g_strdup (g_value_get_string (value)); + break; + case PROP_HWV: + g_free (SML_DEV_INF (object)->priv->hwv); + SML_DEV_INF (object)->priv->hwv = g_strdup (g_value_get_string (value)); + break; + case PROP_DEV_ID: + g_free (SML_DEV_INF (object)->priv->dev_id); + SML_DEV_INF (object)->priv->dev_id = g_strdup (g_value_get_string (value)); + break; + case PROP_DEV_TYP: + SML_DEV_INF (object)->priv->dev_typ = g_value_get_enum (value); + break; + case PROP_SUPPORT_UTC: + SML_DEV_INF (object)->priv->support_utc = g_value_get_boolean (value); + break; + case PROP_SUPPORT_LARGE_OBJS: + SML_DEV_INF (object)->priv->support_large_objs = g_value_get_boolean (value); + break; + case PROP_SUPPORT_NUMBER_OF_CHANGES: + SML_DEV_INF (object)->priv->support_number_of_changes = g_value_get_boolean (value); + break; + case PROP_DATA_STORES: + SML_DEV_INF (object)->priv->data_stores = (GList *) g_value_get_pointer(value); + break; + case PROP_CTCAPS: + SML_DEV_INF (object)->priv->ctcaps = (GList *) g_value_get_pointer(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +sml_dev_inf_finalize (GObject *object) +{ + SmlDevInf *self = (SmlDevInf *) object; + g_free(self->priv->man); + g_free(self->priv->mod); + g_free(self->priv->oem); + g_free(self->priv->fwv); + g_free(self->priv->swv); + g_free(self->priv->hwv); + g_free(self->priv->dev_id); + while(self->priv->data_stores) { + SmlDevInfDataStore *data_store = self->priv->data_stores->data; + self->priv->data_stores = g_list_remove(self->priv->data_stores, data_store); + g_object_unref(data_store); + } + while(self->priv->ctcaps) { + SmlDevInfCTCap *ctcap = self->priv->ctcaps->data; + self->priv->ctcaps = g_list_remove(self->priv->ctcaps, ctcap); + g_object_unref(ctcap); + } + /* all pointers must be NULL */ + self->priv->man = NULL; + self->priv->mod = NULL; + self->priv->oem = NULL; + self->priv->fwv = NULL; + self->priv->swv = NULL; + self->priv->hwv = NULL; + self->priv->dev_id = NULL; + G_OBJECT_CLASS (sml_dev_inf_parent_class)->finalize (object); +} + +static void +sml_dev_inf_class_init (SmlDevInfClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (SmlDevInfPrivate)); + + object_class->get_property = sml_dev_inf_get_property; + object_class->set_property = sml_dev_inf_set_property; + object_class->finalize = sml_dev_inf_finalize; + + /** + * SmlDevInf:VerDTD: + * + * The This is the protocol version of the device information. property. + */ + g_object_class_install_property (object_class, + PROP_VER_DTD, + g_param_spec_enum ("VerDTD", + "VersionDTD", + "This is the protocol version of the device information.", + SML_DEV_INF_TYPE_DEV_INF_VERSION, + SML_DEVINF_VERSION_UNKNOWN, + G_PARAM_READWRITE)); + /** + * SmlDevInf:Man: + * + * The This is the name of the manufacturer property. + */ + g_object_class_install_property (object_class, + PROP_MAN, + g_param_spec_string ("Man", + "Manufacturer", + "This is the name of the manufacturer", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:Mod: + * + * The This is the name of the model. property. + */ + g_object_class_install_property (object_class, + PROP_MOD, + g_param_spec_string ("Mod", + "Modell", + "This is the name of the model.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:OEM: + * + * The This is the name of the OEM. property. + */ + g_object_class_install_property (object_class, + PROP_OEM, + g_param_spec_string ("OEM", + "OEM", + "This is the name of the OEM.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:FwV: + * + * The This is the version if the firmware. property. + */ + g_object_class_install_property (object_class, + PROP_FWV, + g_param_spec_string ("FwV", + "FirmwareVersion", + "This is the version if the firmware.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:SwV: + * + * The This is the version of the firmware. property. + */ + g_object_class_install_property (object_class, + PROP_SWV, + g_param_spec_string ("SwV", + "SoftwareVersion", + "This is the version of the firmware.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:HwV: + * + * The This is the version of the hardware. property. + */ + g_object_class_install_property (object_class, + PROP_HWV, + g_param_spec_string ("HwV", + "HardwareVersion", + "This is the version of the hardware.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:DevID: + * + * The This is the identifier of the device. property. + */ + g_object_class_install_property (object_class, + PROP_DEV_ID, + g_param_spec_string ("DevID", + "DeviceID", + "This is the identifier of the device.", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInf:DevTyp: + * + * The This is the type of the device property. + */ + g_object_class_install_property (object_class, + PROP_DEV_TYP, + g_param_spec_enum ("DevTyp", + "DeviceType", + "This is the type of the device", + SML_DEV_INF_TYPE_DEV_INF_DEV_TYP, + SML_DEVINF_DEVTYPE_UNKNOWN, + G_PARAM_READWRITE)); + /** + * SmlDevInf:SupportUTC: + * + * The Does this device support UTC? property. + */ + g_object_class_install_property (object_class, + PROP_SUPPORT_UTC, + g_param_spec_boolean ("SupportUTC", + "SupportUTC", + "Does this device support UTC?", + FALSE, + G_PARAM_READWRITE)); + /** + * SmlDevInf:SupportLargeObjs: + * + * The Does this device support large objects? property. + */ + g_object_class_install_property (object_class, + PROP_SUPPORT_LARGE_OBJS, + g_param_spec_boolean ("SupportLargeObjs", + "SupportLargeObjs", + "Does this device support large objects?", + FALSE, + G_PARAM_READWRITE)); + /** + * SmlDevInf:SupportNumberOfChanges: + * + * The Does this device supports number of changes? property. + */ + g_object_class_install_property (object_class, + PROP_SUPPORT_NUMBER_OF_CHANGES, + g_param_spec_boolean ("SupportNumberOfChanges", + "SupportNumberOfChanges", + "Does this device supports number of changes?", + FALSE, + G_PARAM_READWRITE)); + /** + * SmlDevInf:DataStores: + * + * The Supported data stores. property. + */ + g_object_class_install_property (object_class, + PROP_DATA_STORES, + g_param_spec_pointer ("DataStores", + "DataStores", + "Supported data stores.", + G_PARAM_PRIVATE)); + /** + * SmlDevInf:CTCaps: + * + * The Supported CTCaps. property. + */ + g_object_class_install_property (object_class, + PROP_CTCAPS, + g_param_spec_pointer ("CTCaps", + "CTCaps", + "Supported CTCaps.", + G_PARAM_PRIVATE)); + +} + +static void +sml_dev_inf_init (SmlDevInf *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + SML_TYPE_DEV_INF, + SmlDevInfPrivate); +} + +/** + * sml_dev_inf_new: + * + * Creates a new instance of #SmlDevInf. + * + * Return value: the newly created #SmlDevInf instance + */ +SmlDevInf* +sml_dev_inf_new (void) +{ + return g_object_new (SML_TYPE_DEV_INF, NULL); +} + +/** + * sml_dev_inf_get_ver_dtd: + * @self: A #SmlDevInf + * + * Gets the VerDTD property. + * + * Return value: + */ +SmlDevInfVersion +sml_dev_inf_get_ver_dtd (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), SML_DEVINF_VERSION_UNKNOWN); + return self->priv->ver_dtd; +} + +/** + * sml_dev_inf_set_ver_dtd: + * @self: A #SmlDevInf + * @ver_dtd: + * + * Sets the VerDTD property. + */ +void +sml_dev_inf_set_ver_dtd (SmlDevInf *self, + SmlDevInfVersion ver_dtd) +{ + g_return_if_fail (SML_IS_DEV_INF (self)); + + /* The version of the DTD is a minimum requirement. + * It is not optional. + */ + g_return_if_fail (ver_dtd != SML_DEVINF_VERSION_UNKNOWN); + + self->priv->ver_dtd = ver_dtd; +} + +/** + * sml_dev_inf_get_man: + * @self: A #SmlDevInf + * + * Gets the Manufacturer property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_man (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->man; +} + +/** + * sml_dev_inf_set_man: + * @self: A #SmlDevInf + * @man: + * + * Sets the Manufacturer property. + */ +gboolean +sml_dev_inf_set_man (SmlDevInf *self, + const gchar* man, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + + /* normalize the man */ + if (man && strlen(man) == 0) + man = NULL; + + g_free (self->priv->man); + self->priv->man = g_strdup (man); + sml_return_val_error_if_fail (!man || self->priv->man, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the manufacturer - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_mod: + * @self: A #SmlDevInf + * + * Gets the Modell property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_mod (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->mod; +} + +/** + * sml_dev_inf_set_mod: + * @self: A #SmlDevInf + * @mod: + * + * Sets the Modell property. + */ +gboolean +sml_dev_inf_set_mod (SmlDevInf *self, + const gchar* mod, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + + /* normalize the mod */ + if (mod && strlen(mod) == 0) + mod = NULL; + + g_free (self->priv->mod); + self->priv->mod = g_strdup (mod); + sml_return_val_error_if_fail (!mod || self->priv->mod, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the model - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_oem: + * @self: A #SmlDevInf + * + * Gets the OEM property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_oem (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->oem; +} + +/** + * sml_dev_inf_set_oem: + * @self: A #SmlDevInf + * @oem: + * + * Sets the OEM property. + */ +gboolean +sml_dev_inf_set_oem (SmlDevInf *self, + const gchar* oem, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + + /* normalize the oem */ + if (oem && strlen(oem) == 0) + oem = NULL; + + g_free (self->priv->oem); + self->priv->oem = g_strdup (oem); + sml_return_val_error_if_fail (!oem || self->priv->oem, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the OEM - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_fwv: + * @self: A #SmlDevInf + * + * Gets the FirmwareVersion property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_fwv (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->fwv; +} + +/** + * sml_dev_inf_set_fwv: + * @self: A #SmlDevInf + * @fwv: + * + * Sets the FirmwareVersion property. + */ +gboolean +sml_dev_inf_set_fwv (SmlDevInf *self, + const gchar* fwv, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + + /* normalize the fwv */ + if (fwv && strlen(fwv) == 0) + fwv = NULL; + + g_free (self->priv->fwv); + self->priv->fwv = g_strdup (fwv); + sml_return_val_error_if_fail (!fwv || self->priv->fwv, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the firmware version - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_swv: + * @self: A #SmlDevInf + * + * Gets the SoftwareVersion property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_swv (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->swv; +} + +/** + * sml_dev_inf_set_swv: + * @self: A #SmlDevInf + * @swv: + * + * Sets the SoftwareVersion property. + */ +gboolean +sml_dev_inf_set_swv (SmlDevInf *self, + const gchar* swv, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + + /* normalize the swv */ + if (swv && strlen(swv) == 0) + swv = NULL; + + g_free (self->priv->swv); + self->priv->swv = g_strdup (swv); + sml_return_val_error_if_fail (!swv || self->priv->swv, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the software version - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_hwv: + * @self: A #SmlDevInf + * + * Gets the HardwareVersion property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_hwv (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->hwv; +} + +/** + * sml_dev_inf_set_hwv: + * @self: A #SmlDevInf + * @hwv: + * + * Sets the HardwareVersion property. + */ +gboolean +sml_dev_inf_set_hwv (SmlDevInf *self, + const gchar* hwv, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + + /* normalize the hwv */ + if (hwv && strlen(hwv) == 0) + hwv = NULL; + + g_free (self->priv->hwv); + self->priv->hwv = g_strdup (hwv); + sml_return_val_error_if_fail (!hwv || self->priv->hwv, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the hardware version - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_dev_id: + * @self: A #SmlDevInf + * + * Gets the DeviceID property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_get_dev_id (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return self->priv->dev_id; +} + +/** + * sml_dev_inf_set_dev_id: + * @self: A #SmlDevInf + * @dev_id: + * + * Sets the DeviceID property. + */ +gboolean +sml_dev_inf_set_dev_id (SmlDevInf *self, + const gchar* dev_id, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDevInf object."); + sml_return_val_error_if_fail (dev_id, FALSE, error, SML_ERROR_GENERIC, "The device ID is a required element."); + sml_return_val_error_if_fail (strlen(dev_id) > 0, FALSE, error, SML_ERROR_GENERIC, "The device ID cannot be the empty word."); + + g_free (self->priv->dev_id); + self->priv->dev_id = g_strdup (dev_id); + sml_return_val_error_if_fail (self->priv->dev_id, FALSE, error, SML_ERROR_GENERIC, "Cannot copy the device ID - out of memory."); + + return TRUE; +} + +/** + * sml_dev_inf_get_dev_typ: + * @self: A #SmlDevInf + * + * Gets the DeviceType property. + * + * Return value: + */ +SmlDevInfDevTyp +sml_dev_inf_get_dev_typ (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), SML_DEVINF_DEVTYPE_UNKNOWN); + return self->priv->dev_typ; +} + +/** + * sml_dev_inf_set_dev_typ: + * @self: A #SmlDevInf + * @dev_typ: + * + * Sets the DeviceType property. + */ +void +sml_dev_inf_set_dev_typ (SmlDevInf *self, + SmlDevInfDevTyp dev_typ) +{ + g_return_if_fail (SML_IS_DEV_INF (self)); + + /* The device ID is a minimum requirement. + * It is not optional. + */ + g_return_if_fail (dev_typ != SML_DEVINF_DEVTYPE_UNKNOWN); + + self->priv->dev_typ = dev_typ; +} + +/** + * sml_dev_inf_get_support_utc: + * @self: A #SmlDevInf + * + * Gets the SupportUTC property. + * + * Return value: + */ +gboolean +sml_dev_inf_get_support_utc (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), FALSE); + return self->priv->support_utc; +} + +/** + * sml_dev_inf_set_support_utc: + * @self: A #SmlDevInf + * @support_utc: + * + * Sets the SupportUTC property. + */ +void +sml_dev_inf_set_support_utc (SmlDevInf *self, + gboolean support_utc) +{ + g_return_if_fail (SML_IS_DEV_INF (self)); + self->priv->support_utc = support_utc; +} + +/** + * sml_dev_inf_get_support_large_objs: + * @self: A #SmlDevInf + * + * Gets the SupportLargeObjs property. + * + * Return value: + */ +gboolean +sml_dev_inf_get_support_large_objs (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), FALSE); + return self->priv->support_large_objs; +} + +/** + * sml_dev_inf_set_support_large_objs: + * @self: A #SmlDevInf + * @support_large_objs: + * + * Sets the SupportLargeObjs property. + */ +void +sml_dev_inf_set_support_large_objs (SmlDevInf *self, + gboolean support_large_objs) +{ + g_return_if_fail (SML_IS_DEV_INF (self)); + self->priv->support_large_objs = support_large_objs; +} + +/** + * sml_dev_inf_get_support_number_of_changes: + * @self: A #SmlDevInf + * + * Gets the SupportNumberOfChanges property. + * + * Return value: + */ +gboolean +sml_dev_inf_get_support_number_of_changes (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), FALSE); + return self->priv->support_number_of_changes; +} + +/** + * sml_dev_inf_set_support_number_of_changes: + * @self: A #SmlDevInf + * @support_number_of_changes: + * + * Sets the SupportNumberOfChanges property. + */ +void +sml_dev_inf_set_support_number_of_changes (SmlDevInf *self, + gboolean support_number_of_changes) +{ + g_return_if_fail (SML_IS_DEV_INF (self)); + self->priv->support_number_of_changes = support_number_of_changes; +} + +/** + * sml_dev_inf_num_data_stores: + * @self: A #SmlDevInf + * + * + */ +gsize +sml_dev_inf_num_data_stores (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), 0); + return g_list_length(self->priv->data_stores); +} + +/** + * sml_dev_inf_get_nth_data_store: + * @self: A #SmlDevInf + * + * + */ +SmlDevInfDataStore* +sml_dev_inf_get_nth_data_store (SmlDevInf *self, + gsize n) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return (SmlDevInfDataStore *)g_list_nth_data(self->priv->data_stores, n); +} + +/** + * sml_dev_inf_add_data_store: + * @self: A #SmlDevInf + * + * + */ +gboolean +sml_dev_inf_add_data_store (SmlDevInf *self, + SmlDevInfDataStore *data_store, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInf object."); + sml_return_val_error_if_fail (data_store, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfDataStore object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_DATA_STORE (data_store), FALSE, error, SML_ERROR_GENERIC, "The data store parameter must be a SmlDevInfDataStore object."); + + g_object_ref(data_store); + self->priv->data_stores = g_list_append(self->priv->data_stores, data_store); + sml_return_val_error_if_fail (self->priv->data_stores, FALSE, error, SML_ERROR_GENERIC, "Cannot add data store to data store list of device information."); + + return TRUE; +} + +/** + * sml_dev_inf_get_ctcap: + * @self: A #SmlDevInf + * + * + */ +SmlDevInfCTCap* +sml_dev_inf_get_ctcap (SmlDevInf *self, + SmlDevInfContentType* ct) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), 0); + g_return_val_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (ct), 0); + + GList *h; + for (h = self->priv->ctcaps; h; h = h->next) + { + SmlDevInfCTCap *ctcap = h->data; + /* check that the content type matches */ + if (!strcmp(sml_dev_inf_content_type_get_cttype(ct), + sml_dev_inf_content_type_get_cttype(sml_dev_inf_ctcap_get_content_type(ctcap))) && + !strcmp(sml_dev_inf_content_type_get_verct(ct), + sml_dev_inf_content_type_get_verct(sml_dev_inf_ctcap_get_content_type(ctcap)))) + { + return ctcap; + } + } + return NULL; +} + +/** + * sml_dev_inf_num_ctcaps: + * @self: A #SmlDevInf + * + * + */ +gsize +sml_dev_inf_num_ctcaps (SmlDevInf *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), 0); + return g_list_length(self->priv->ctcaps); +} + +/** + * sml_dev_inf_get_nth_ctcap: + * @self: A #SmlDevInf + * + * + */ +SmlDevInfCTCap* +sml_dev_inf_get_nth_ctcap (SmlDevInf *self, + gsize n) +{ + g_return_val_if_fail (SML_IS_DEV_INF (self), NULL); + return (SmlDevInfCTCap *)g_list_nth_data(self->priv->ctcaps, n); +} + +/** + * sml_dev_inf_add_ctcap: + * @self: A #SmlDevInf + * + * + */ +gboolean +sml_dev_inf_add_ctcap (SmlDevInf *self, + SmlDevInfCTCap *ctcap, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInf object."); + sml_return_val_error_if_fail (ctcap, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfCTCap object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CTCAP (ctcap), FALSE, error, SML_ERROR_GENERIC, "The ctcap parameter must be a SmlDevInfCTCap object."); + + g_object_ref(ctcap); + self->priv->ctcaps = g_list_append(self->priv->ctcaps, ctcap); + sml_return_val_error_if_fail (self->priv->ctcaps, FALSE, error, SML_ERROR_GENERIC, "Cannot add CTCap to CTCap list of device information."); + + return TRUE; +} + +/** + * sml_dev_inf_is_compliant: + * @self: A #SmlDevInfDataStore + * @error: A #GError + * + * This is the only function of this class where you have not to provide a pointer to the error parameter. + * If you only want to know if the data store is already compliant + * then you can ignore the error. + * + * Return value: + */ +gboolean +sml_dev_inf_is_compliant (SmlDevInf *self, + GError **error) +{ + sml_return_val_error_if_fail (SML_IS_DEV_INF (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInf object."); + + /* Common SyncML requirements */ + + sml_return_val_error_if_fail (self->priv->ver_dtd == SML_DEVINF_VERSION_UNKNOWN, FALSE, error, SML_ERROR_GENERIC, "The VerDTD must be set."); + sml_return_val_error_if_fail (self->priv->dev_id != NULL, FALSE, error, SML_ERROR_GENERIC, "The device ID must be set."); + sml_return_val_error_if_fail (self->priv->dev_typ != SML_DEVINF_DEVTYPE_UNKNOWN, FALSE, error, SML_ERROR_GENERIC, "The device type must be set."); + sml_return_val_error_if_fail (self->priv->data_stores != NULL, FALSE, error, SML_ERROR_GENERIC, "There must be at minimum one data store."); + + /* SyncML 1.0 requirements */ + + if (self->priv->ver_dtd == SML_DEVINF_VERSION_10) { + sml_return_val_error_if_fail (self->priv->support_utc, FALSE, error, SML_ERROR_GENERIC, "SyncML 1.0 does not specify UTC support."); + sml_return_val_error_if_fail (self->priv->support_large_objs, FALSE, error, SML_ERROR_GENERIC, "SyncML 1.0 does not specify large object support."); + sml_return_val_error_if_fail (self->priv->support_number_of_changes, FALSE, error, SML_ERROR_GENERIC, "SyncML 1.0 does not specify number of changes support."); + } + + /* SyncML 1.2 requirements */ + + if (self->priv->ver_dtd >= SML_DEVINF_VERSION_12) { + sml_return_val_error_if_fail (self->priv->man != NULL, FALSE, error, SML_ERROR_GENERIC, "The manufacturer must be set."); + sml_return_val_error_if_fail (self->priv->mod != NULL, FALSE, error, SML_ERROR_GENERIC, "The model must be set."); + sml_return_val_error_if_fail (self->priv->fwv != NULL, FALSE, error, SML_ERROR_GENERIC, "The firmware version must be set."); + sml_return_val_error_if_fail (self->priv->swv != NULL, FALSE, error, SML_ERROR_GENERIC, "The software version must be set."); + sml_return_val_error_if_fail (self->priv->hwv != NULL, FALSE, error, SML_ERROR_GENERIC, "The hardware version must be set."); + } + + /* SyncML server requirements */ + + if (self->priv->dev_typ == SML_DEVINF_DEVTYPE_SERVER) { + sml_return_val_error_if_fail (!self->priv->support_utc, FALSE, error, SML_ERROR_GENERIC, "A server must support UTC."); + sml_return_val_error_if_fail (!self->priv->support_large_objs, FALSE, error, SML_ERROR_GENERIC, "A server must support large objects."); + sml_return_val_error_if_fail (!self->priv->support_number_of_changes, FALSE, error, SML_ERROR_GENERIC, "A server must support number of changes."); + } + + return TRUE; +} + Added: trunk/libsyncml/dev_inf_api/sml_dev_inf.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf.h Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,114 @@ +/* sml_dev_inf.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_H__ +#define __SML_DEV_INF_H__ + +#include <glib-object.h> +#include <libsyncml/dev_inf_api/sml_dev_inf_ctcap.h> +#include <libsyncml/dev_inf_api/sml_dev_inf_data_store.h> + +/* this interface enforce the logical structure behind the devinf spec */ +/* so we can generate SyncML 1.0, 1.1 and 1.2 devinf from this structure */ +/* the CTCap will be assigned to a datastore if CTType and VerCT match */ + +G_BEGIN_DECLS + +#define SML_TYPE_DEV_INF (sml_dev_inf_get_type()) +#define SML_DEV_INF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SML_TYPE_DEV_INF, SmlDevInf)) +#define SML_DEV_INF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SML_TYPE_DEV_INF, SmlDevInfClass)) +#define SML_IS_DEV_INF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SML_TYPE_DEV_INF)) +#define SML_IS_DEV_INF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SML_TYPE_DEV_INF)) +#define SML_DEV_INF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SML_TYPE_DEV_INF, SmlDevInfClass)) + +typedef enum { + SML_DEVINF_VERSION_UNKNOWN = 0, + SML_DEVINF_VERSION_10 = 1, + SML_DEVINF_VERSION_11 = 2, + SML_DEVINF_VERSION_12 = 3 +} SmlDevInfVersion; + +typedef enum { + SML_DEVINF_DEVTYPE_UNKNOWN = 0, + SML_DEVINF_DEVTYPE_PAGER = 1, + SML_DEVINF_DEVTYPE_HANDHELD = 2, + SML_DEVINF_DEVTYPE_PDA = 3, + SML_DEVINF_DEVTYPE_PHONE = 4, + SML_DEVINF_DEVTYPE_SMARTPHONE = 5, + SML_DEVINF_DEVTYPE_SERVER = 6, + SML_DEVINF_DEVTYPE_WORKSTATION = 7 +} SmlDevInfDevTyp; + +typedef struct _SmlDevInf SmlDevInf; +typedef struct _SmlDevInfClass SmlDevInfClass; +typedef struct _SmlDevInfPrivate SmlDevInfPrivate; + +struct _SmlDevInf +{ + GObject parent; + + /*< private >*/ + SmlDevInfPrivate *priv; +}; + +struct _SmlDevInfClass +{ + GObjectClass parent_class; + +}; + +GType sml_dev_inf_get_type (void); +SmlDevInf* sml_dev_inf_new (void); +SmlDevInfVersion sml_dev_inf_get_ver_dtd (SmlDevInf *self); +void sml_dev_inf_set_ver_dtd (SmlDevInf *self, SmlDevInfVersion ver_dtd); +G_CONST_RETURN gchar* sml_dev_inf_get_man (SmlDevInf *self); +gboolean sml_dev_inf_set_man (SmlDevInf *self, const gchar* man, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_get_mod (SmlDevInf *self); +gboolean sml_dev_inf_set_mod (SmlDevInf *self, const gchar* mod, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_get_oem (SmlDevInf *self); +gboolean sml_dev_inf_set_oem (SmlDevInf *self, const gchar* oem, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_get_fwv (SmlDevInf *self); +gboolean sml_dev_inf_set_fwv (SmlDevInf *self, const gchar* fwv, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_get_swv (SmlDevInf *self); +gboolean sml_dev_inf_set_swv (SmlDevInf *self, const gchar* swv, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_get_hwv (SmlDevInf *self); +gboolean sml_dev_inf_set_hwv (SmlDevInf *self, const gchar* hwv, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_get_dev_id (SmlDevInf *self); +gboolean sml_dev_inf_set_dev_id (SmlDevInf *self, const gchar* devid, GError **error); +SmlDevInfDevTyp sml_dev_inf_get_dev_typ (SmlDevInf *self); +void sml_dev_inf_set_dev_typ (SmlDevInf *self, SmlDevInfDevTyp devtyp); +gboolean sml_dev_inf_get_support_utc (SmlDevInf *self); +void sml_dev_inf_set_support_utc (SmlDevInf *self, gboolean support_utc); +gboolean sml_dev_inf_get_support_large_objs (SmlDevInf *self); +void sml_dev_inf_set_support_large_objs (SmlDevInf *self, gboolean support_large_objs); +gboolean sml_dev_inf_get_support_number_of_changes (SmlDevInf *self); +void sml_dev_inf_set_support_number_of_changes (SmlDevInf *self, gboolean support_number_of_changes); +gsize sml_dev_inf_num_data_stores (SmlDevInf *self); +SmlDevInfDataStore* sml_dev_inf_get_nth_data_store (SmlDevInf *self, gsize n); +gboolean sml_dev_inf_add_data_store (SmlDevInf *self, SmlDevInfDataStore *data_store, GError **error); +SmlDevInfCTCap* sml_dev_inf_get_ctcap (SmlDevInf *self, SmlDevInfContentType*); +gsize sml_dev_inf_num_ctcaps (SmlDevInf *self); +SmlDevInfCTCap* sml_dev_inf_get_nth_ctcap (SmlDevInf *self, gsize n); +gboolean sml_dev_inf_add_ctcap (SmlDevInf *self, SmlDevInfCTCap *ctcap, GError **error); +gboolean sml_dev_inf_is_compliant (SmlDevInf *self, GError **error); + +G_END_DECLS + +#endif /* __SML_DEV_INF_H__ */ Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Wed Jun 24 11:54:05 2009 (r1117) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Thu Jun 25 16:02:43 2009 (r1118) @@ -858,7 +858,8 @@ * Return value: */ gboolean -sml_dev_inf_data_store_is_compliant (SmlDevInfDataStore *self, GError **error) +sml_dev_inf_data_store_is_compliant (SmlDevInfDataStore *self, + GError **error) { sml_return_val_error_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfDataStore object."); Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.c Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,83 @@ + +/* Generated data (by glib-mkenums) */ + + +/* WARNING: This file was generated by glib-mkenums. + * WARNING: + * WARNING: glib-mkenums --template sml_dev_inf_enum_types.h.tmpl *.h > sml_dev_inf_enum_types.h + * WARNING: + * WARNING: If you need to update this file then please run the command again. + */ + + +/* enumerations from "sml_dev_inf.h" */ + +#include <libsyncml/dev_inf_api/sml_dev_inf.h> + +GType +sml_dev_inf_version_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY (etype == 0)) { + static const GEnumValue values[] = { + { SML_DEVINF_VERSION_UNKNOWN, "SML_DEVINF_VERSION_UNKNOWN", "unknown" }, + { SML_DEVINF_VERSION_10, "SML_DEVINF_VERSION_10", "10" }, + { SML_DEVINF_VERSION_11, "SML_DEVINF_VERSION_11", "11" }, + { SML_DEVINF_VERSION_12, "SML_DEVINF_VERSION_12", "12" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static (g_intern_static_string ("SmlDevInfVersion"), values); + } + return etype; +} + +GType +sml_dev_inf_dev_typ_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY (etype == 0)) { + static const GEnumValue values[] = { + { SML_DEVINF_DEVTYPE_UNKNOWN, "SML_DEVINF_DEVTYPE_UNKNOWN", "unknown" }, + { SML_DEVINF_DEVTYPE_PAGER, "SML_DEVINF_DEVTYPE_PAGER", "pager" }, + { SML_DEVINF_DEVTYPE_HANDHELD, "SML_DEVINF_DEVTYPE_HANDHELD", "handheld" }, + { SML_DEVINF_DEVTYPE_PDA, "SML_DEVINF_DEVTYPE_PDA", "pda" }, + { SML_DEVINF_DEVTYPE_PHONE, "SML_DEVINF_DEVTYPE_PHONE", "phone" }, + { SML_DEVINF_DEVTYPE_SMARTPHONE, "SML_DEVINF_DEVTYPE_SMARTPHONE", "smartphone" }, + { SML_DEVINF_DEVTYPE_SERVER, "SML_DEVINF_DEVTYPE_SERVER", "server" }, + { SML_DEVINF_DEVTYPE_WORKSTATION, "SML_DEVINF_DEVTYPE_WORKSTATION", "workstation" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static (g_intern_static_string ("SmlDevInfDevTyp"), values); + } + return etype; +} + + +/* enumerations from "sml_dev_inf_data_store.h" */ + +#include <libsyncml/dev_inf_api/sml_dev_inf_data_store.h> + +GType +sml_dev_inf_sync_cap_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY (etype == 0)) { + static const GFlagsValue values[] = { + { SML_DEVINF_SYNCTYPE_UNKNOWN, "SML_DEVINF_SYNCTYPE_UNKNOWN", "unknown" }, + { SML_DEVINF_SYNCTYPE_TWO_WAY, "SML_DEVINF_SYNCTYPE_TWO_WAY", "two-way" }, + { SML_DEVINF_SYNCTYPE_SLOW_SYNC, "SML_DEVINF_SYNCTYPE_SLOW_SYNC", "slow-sync" }, + { SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT, "SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_CLIENT", "one-way-from-client" }, + { SML_DEVINF_SYNCTYPE_REFRESH_FROM_CLIENT, "SML_DEVINF_SYNCTYPE_REFRESH_FROM_CLIENT", "refresh-from-client" }, + { SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_SERVER, "SML_DEVINF_SYNCTYPE_ONE_WAY_FROM_SERVER", "one-way-from-server" }, + { SML_DEVINF_SYNCTYPE_REFRESH_FROM_SERVER, "SML_DEVINF_SYNCTYPE_REFRESH_FROM_SERVER", "refresh-from-server" }, + { SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, "SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC", "server-alerted-sync" }, + { 0, NULL, NULL } + }; + etype = g_flags_register_static (g_intern_static_string ("SmlDevInfSyncCap"), values); + } + return etype; +} + + +/* Generated data ends here */ + Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.c.tmpl ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.c.tmpl Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,44 @@ +/*** BEGIN file-header ***/ + +/* WARNING: This file was generated by glib-mkenums. + * WARNING: + * WARNING: glib-mkenums --template sml_dev_inf_enum_types.h.tmpl *.h > sml_dev_inf_enum_types.h + * WARNING: + * WARNING: If you need to update this file then please run the command again. + */ + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ + +#include <libsyncml/dev_inf_api/@filename@> + +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY (etype == 0)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + } + return etype; +} + +/*** END value-tail ***/ + +/*** BEGIN file-tail ***/ +/*** END file-tail ***/ Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.h Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,32 @@ + +/* Generated data (by glib-mkenums) */ + +#ifndef __SML_DEV_INF_ENUM_TYPES_H__ +#define __SML_DEV_INF_ENUM_TYPES_H__ + +/* WARNING: This file was generated by glib-mkenums. + * WARNING: + * WARNING: glib-mkenums --template sml_dev_inf_enum_types.h.tmpl *.h > sml_dev_inf_enum_types.h + * WARNING: + * WARNING: If you need to update this file then please run the command again. + */ + +#include <glib-object.h> + +G_BEGIN_DECLS + +/* enumerations from "sml_dev_inf.h" */ +GType sml_dev_inf_version_get_type (void) G_GNUC_CONST; +#define SML_DEV_INF_TYPE_DEV_INF_VERSION (sml_dev_inf_version_get_type ()) +GType sml_dev_inf_dev_typ_get_type (void) G_GNUC_CONST; +#define SML_DEV_INF_TYPE_DEV_INF_DEV_TYP (sml_dev_inf_dev_typ_get_type ()) + +/* enumerations from "sml_dev_inf_data_store.h" */ +GType sml_dev_inf_sync_cap_get_type (void) G_GNUC_CONST; +#define SML_DEV_INF_TYPE_DEV_INF_SYNC_CAP (sml_dev_inf_sync_cap_get_type ()) +G_END_DECLS + +#endif /* __SML_DEV_INF_ENUM_TYPES_H__ */ + +/* Generated data ends here */ + Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.h.tmpl ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_enum_types.h.tmpl Thu Jun 25 16:02:43 2009 (r1118) @@ -0,0 +1,31 @@ +/*** BEGIN file-header ***/ +#ifndef __SML_DEV_INF_ENUM_TYPES_H__ +#define __SML_DEV_INF_ENUM_TYPES_H__ + +/* WARNING: This file was generated by glib-mkenums. + * WARNING: + * WARNING: glib-mkenums --template sml_dev_inf_enum_types.h.tmpl *.h > sml_dev_inf_enum_types.h + * WARNING: + * WARNING: If you need to update this file then please run the command again. + */ + +#include <glib-object.h> + +G_BEGIN_DECLS +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define SML_DEV_INF_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +#endif /* __SML_DEV_INF_ENUM_TYPES_H__ */ +/*** END file-tail ***/ Modified: trunk/libsyncml/objects/sml_devinf_obj.c ============================================================================== --- trunk/libsyncml/objects/sml_devinf_obj.c Wed Jun 24 11:54:05 2009 (r1117) +++ trunk/libsyncml/objects/sml_devinf_obj.c Thu Jun 25 16:02:43 2009 (r1118) @@ -92,8 +92,10 @@ smlTrace(TRACE_ENTRY, "%s(%p)", __func__, data); SmlDevInfAgentSession *as = data; - if (as->recvDevInf) - smlDevInfUnref(as->recvDevInf); + if (as->recvDevInf) { + g_object_unref(as->recvDevInf); + as->recvDevInf = NULL; + } smlSafeFree((gpointer *) &as); smlTrace(TRACE_EXIT, "%s", __func__); @@ -171,7 +173,7 @@ */ if (smlSessionGetVersion(session) >= SML_VERSION_11 && session->sessionType == SML_SESSION_TYPE_SERVER && - !smlDevInfSupportsLargeObjs(agent->devinf)) + !sml_dev_inf_get_support_large_objs(agent->devinf)) { smlErrorSet(error, SML_ERROR_INTERNAL_MISCONFIGURATION, "OMA DS Server must support large object handling if SyncML 1.1 or higher is used."); @@ -181,7 +183,7 @@ /* If large object support is enabled then MaxMsgSize and * MaxObjSize must be set. */ - if (smlDevInfSupportsLargeObjs(agent->devinf)) + if (sml_dev_inf_get_support_large_objs(agent->devinf)) { if (smlSessionGetLocalMaxMsgSize(session) < 1) { @@ -358,6 +360,7 @@ smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, devinf, error); CHECK_ERROR_REF smlAssert(devinf); + GError *gerror = NULL; SmlDevInfAgent *agent = smlTryMalloc0(sizeof(SmlDevInfAgent), error); if (!agent) @@ -370,14 +373,17 @@ goto error; } - if (!smlDevInfGetManufacturer(devinf)) - smlDevInfSetManufacturer(devinf, "OpenSync"); - if (!smlDevInfGetModel(devinf)) - smlDevInfSetModel(devinf, "libsyncml"); - if (!smlDevInfGetOEM(devinf)) + if (!sml_dev_inf_get_man(devinf) && + !sml_dev_inf_set_man(devinf, "OpenSync", &gerror)) + goto error; + if (!sml_dev_inf_get_mod(devinf) && + !sml_dev_inf_set_mod(devinf, "libsyncml", &gerror)) + goto error; + if (!sml_dev_inf_get_oem(devinf)) { #ifdef WIN32 - smlDevInfSetOEM(devinf, "Windows"); + if (!sml_dev_inf_set_oem(devinf, "Microsoft (R)", &gerror)) + goto error; DW... [truncated message content] |
From: <svn...@op...> - 2009-06-24 09:55:12
|
Author: bellmich Date: Wed Jun 24 11:54:05 2009 New Revision: 1117 URL: http://libsyncml.opensync.org/changeset/1117 Log: The property is called SupportHierarchicalSync in the OMA specficiations. Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h trunk/libsyncml/parser/sml_xml_parse.c trunk/libsyncml/sml_devinf.h trunk/tests/check_dev_inf_data_store.c Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:37:11 2009 (r1116) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Wed Jun 24 11:54:05 2009 (r1117) @@ -38,7 +38,7 @@ PROP_MAX_MEM, PROP_SHARED_MEM, PROP_SYNC_CAP, - PROP_SUPPORTS_HIERARCHICAL_SYNC + PROP_SUPPORT_HIERARCHICAL_SYNC }; struct _SmlDevInfDataStorePrivate @@ -54,7 +54,7 @@ gsize max_mem; gboolean shared_mem; guint32 sync_cap; - gboolean supports_hierarchical_sync; + gboolean support_hierarchical_sync; }; static void @@ -97,8 +97,8 @@ 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); + case PROP_SUPPORT_HIERARCHICAL_SYNC: + g_value_set_boolean (value, SML_DEV_INF_DATA_STORE (object)->priv->support_hierarchical_sync); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -151,8 +151,8 @@ 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); + case PROP_SUPPORT_HIERARCHICAL_SYNC: + SML_DEV_INF_DATA_STORE (object)->priv->support_hierarchical_sync = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -340,7 +340,7 @@ * The SupportsHierarchicalSync property. */ g_object_class_install_property (object_class, - PROP_SUPPORTS_HIERARCHICAL_SYNC, + PROP_SUPPORT_HIERARCHICAL_SYNC, g_param_spec_boolean ("SupportsHierarchicalSync", "", "If this property is set true then hierarchical sync is supported.", @@ -817,7 +817,7 @@ } /** - * sml_dev_inf_data_store_get_supports_hierarchical_sync: + * sml_dev_inf_data_store_get_support_hierarchical_sync: * @self: A #SmlDevInfDataStore * * Gets the property. @@ -825,25 +825,25 @@ * Return value: */ gboolean -sml_dev_inf_data_store_get_supports_hierarchical_sync (SmlDevInfDataStore *self) +sml_dev_inf_data_store_get_support_hierarchical_sync (SmlDevInfDataStore *self) { g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE); - return self->priv->supports_hierarchical_sync; + return self->priv->support_hierarchical_sync; } /** - * sml_dev_inf_data_store_set_supports_hierarchical_sync: + * sml_dev_inf_data_store_set_support_hierarchical_sync: * @self: A #SmlDevInfDataStore * @sharedmem: * * Sets the property. */ void -sml_dev_inf_data_store_set_supports_hierarchical_sync (SmlDevInfDataStore *self, +sml_dev_inf_data_store_set_support_hierarchical_sync (SmlDevInfDataStore *self, gboolean supported) { g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); - self->priv->supports_hierarchical_sync = supported; + self->priv->support_hierarchical_sync = supported; } /** Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h Tue Jun 23 17:37:11 2009 (r1116) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h Wed Jun 24 11:54:05 2009 (r1117) @@ -88,8 +88,8 @@ 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_get_support_hierarchical_sync (SmlDevInfDataStore *self); +void sml_dev_inf_data_store_set_support_hierarchical_sync (SmlDevInfDataStore *self, gboolean supported); gboolean sml_dev_inf_data_store_is_compliant (SmlDevInfDataStore *self, GError **error); G_END_DECLS Modified: trunk/libsyncml/parser/sml_xml_parse.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_parse.c Tue Jun 23 17:37:11 2009 (r1116) +++ trunk/libsyncml/parser/sml_xml_parse.c Wed Jun 24 11:54:05 2009 (r1117) @@ -3388,7 +3388,7 @@ smlErrorSet(error, SML_ERROR_GENERIC, "SupportHierarchicalSync is only supported in OMA DS 1.2 DevInf and later."); goto error; } - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, TRUE); if (!xmlTextReaderIsEmptyElement(parser->reader)) { if (!_smlXmlParserStep(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "The closing element of %s is missing.", SML_ELEMENT_SUPPORT_HIERARCHICAL_SYNC); Modified: trunk/libsyncml/sml_devinf.h ============================================================================== --- trunk/libsyncml/sml_devinf.h Tue Jun 23 17:37:11 2009 (r1116) +++ trunk/libsyncml/sml_devinf.h Wed Jun 24 11:54:05 2009 (r1117) @@ -70,33 +70,6 @@ unsigned int smlDevInfNumDataStores(SmlDevInf *devinf); const SmlDevInfDataStore *smlDevInfGetNthDataStore(const SmlDevInf *devinf, unsigned int nth); -//SmlDevInfDataStore *smlDevInfDataStoreNew(const char *sourceRef, SmlError **error); -//SmlDevInfDataStore *smlDevInfDataStoreRef(SmlDevInfDataStore *datastore); -//void smlDevInfDataStoreUnref(SmlDevInfDataStore *datastore); -// -//const char *smlDevInfDataStoreGetSourceRef(const SmlDevInfDataStore *datastore); -//void smlDevInfDataStoreSetSourceRef(SmlDevInfDataStore *datastore, const char *sourceref); -//const char *smlDevInfDataStoreGetDisplayName(const SmlDevInfDataStore *datastore); -//void smlDevInfDataStoreSetDisplayName(SmlDevInfDataStore *datastore, const char *displayName); -//unsigned int smlDevInfGetMaxGUIDSize(const SmlDevInfDataStore *datastore); -//void smlDevInfSetMaxGUIDSize(SmlDevInfDataStore *datastore, unsigned int max); -// -//void smlDevInfDataStoreSetRxPref(SmlDevInfDataStore *datastore, const char *contenttype, const char *version); -//SmlBool smlDevInfDataStoreGetRxPref(const SmlDevInfDataStore *datastore, char **contenttype, char **version); -//void smlDevInfDataStoreAddRx(SmlDevInfDataStore *datastore, SmlDevInfContentType *ct); -//unsigned int smlDevInfDataStoreNumRx(const SmlDevInfDataStore *datastore); -//const SmlDevInfContentType *smlDevInfDataStoreGetNthRx(const SmlDevInfDataStore *datastore, unsigned int n); -//void smlDevInfDataStoreSetTxPref(SmlDevInfDataStore *datastore, const char *contenttype, const char *version); -//SmlBool smlDevInfDataStoreGetTxPref(const SmlDevInfDataStore *datastore, char **contenttype, char **version); -//void smlDevInfDataStoreAddTx(SmlDevInfDataStore *datastore, SmlDevInfContentType *ct); -//unsigned int smlDevInfDataStoreNumTx(const SmlDevInfDataStore *datastore); -//const SmlDevInfContentType *smlDevInfDataStoreGetNthTx(const SmlDevInfDataStore *datastore, unsigned int n); -// -//void smlDevInfDataStoreSetMemory(SmlDevInfDataStore *datastore, SmlBool shared, unsigned int maxid, unsigned int maxmem); -//void smlDevInfDataStoreGetMemory(const SmlDevInfDataStore *datastore, SmlBool *shared, unsigned int *maxid, unsigned int *maxmem); -//void smlDevInfDataStoreSetSyncCap(SmlDevInfDataStore *datastore, SmlDevInfSyncCap cap, SmlBool supported); -//SmlBool smlDevInfDataStoreGetSyncCap(const SmlDevInfDataStore *datastore, SmlDevInfSyncCap cap); - SmlBool smlDevInfAssemble(SmlDevInf *devinf, char **data, unsigned int *size, SmlError **error); SmlCommand *smlDevInfNewResult(SmlCommand *cmd, SmlDevInf *devinf, SmlDevInfVersion version, SmlError **error); SmlCommand *smlDevInfNewPut(SmlDevInf *devinf, SmlDevInfVersion version, SmlError **error); Modified: trunk/tests/check_dev_inf_data_store.c ============================================================================== --- trunk/tests/check_dev_inf_data_store.c Tue Jun 23 17:37:11 2009 (r1116) +++ trunk/tests/check_dev_inf_data_store.c Wed Jun 24 11:54:05 2009 (r1117) @@ -64,8 +64,8 @@ sml_fail_unless(sml_dev_inf_data_store_set_display_name(datastore, NULL, &error), "%s", error?error->message:"No GError set."); sml_dev_inf_data_store_set_max_guid_size(datastore, 0); sml_dev_inf_data_store_set_max_id(datastore, 0); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, TRUE); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, FALSE); /* The unknown SyncCap removes all configured SyncCaps. */ @@ -135,11 +135,11 @@ sml_dev_inf_data_store_set_max_id(datastore, 0); sml_fail_unless(sml_dev_inf_data_store_get_max_id(datastore) == 0, "The default MaxID was overwritten"); - sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == FALSE, "The default SupportsHierarchicalSync is FALSE."); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); - sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == TRUE, "SupportsHierarchicalSync must be TRUE."); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); - sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == FALSE, "SupportsHierarchicalSync must be FALSE."); + sml_fail_unless(sml_dev_inf_data_store_get_support_hierarchical_sync(datastore) == FALSE, "The default SupportsHierarchicalSync is FALSE."); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, TRUE); + sml_fail_unless(sml_dev_inf_data_store_get_support_hierarchical_sync(datastore) == TRUE, "SupportsHierarchicalSync must be TRUE."); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, FALSE); + sml_fail_unless(sml_dev_inf_data_store_get_support_hierarchical_sync(datastore) == FALSE, "SupportsHierarchicalSync must be FALSE."); /* The unknown SyncCap is set if no other SynCap is set. */ @@ -242,8 +242,8 @@ sml_dev_inf_data_store_set_max_id(datastore, 1000000000); sml_dev_inf_data_store_set_max_id(datastore, 0); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, TRUE); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, FALSE); /* The unknown SyncCap is set if no other SynCap is set. */ @@ -322,10 +322,10 @@ sml_dev_inf_data_store_set_max_id(datastore, 0); sml_fail_unless(sml_dev_inf_data_store_get_max_id(datastore) == 0, "The MaxID was not copied correctly."); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); - sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == TRUE, "SupportsHierarchicalSync must be TRUE."); - sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); - sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == FALSE, "SupportsHierarchicalSync must be FALSE."); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, TRUE); + sml_fail_unless(sml_dev_inf_data_store_get_support_hierarchical_sync(datastore) == TRUE, "SupportsHierarchicalSync must be TRUE."); + sml_dev_inf_data_store_set_support_hierarchical_sync(datastore, FALSE); + sml_fail_unless(sml_dev_inf_data_store_get_support_hierarchical_sync(datastore) == FALSE, "SupportsHierarchicalSync must be FALSE."); /* The unknown SyncCap is set if no other SynCap is set. */ |
From: <svn...@op...> - 2009-06-23 15:37:20
|
Author: bellmich Date: Tue Jun 23 17:37:11 2009 New Revision: 1116 URL: http://libsyncml.opensync.org/changeset/1116 Log: g_type_init should always be called by the library user and not by the objects themselves Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c trunk/tests/check_dev_inf_content_type.c trunk/tests/check_dev_inf_ctcap.c trunk/tests/check_dev_inf_data_store.c trunk/tests/check_dev_inf_prop_param.c trunk/tests/check_dev_inf_property.c Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c Tue Jun 23 17:37:11 2009 (r1116) @@ -142,7 +142,6 @@ GError **error) { CHECK_ERROR_REF - g_type_init(); SmlDevInfContentType* self = g_object_new (SML_TYPE_DEV_INF_CONTENT_TYPE, NULL); if (cttype != NULL) { Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c Tue Jun 23 17:37:11 2009 (r1116) @@ -148,7 +148,6 @@ sml_dev_inf_ctcap_new (SmlDevInfContentType *ct, GError **error) { CHECK_ERROR_REF - g_type_init(); if (ct == NULL) { *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "Every CTCap must have a content type."); Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:37:11 2009 (r1116) @@ -368,7 +368,6 @@ sml_dev_inf_data_store_new (const gchar *source_ref, GError **error) { CHECK_ERROR_REF - g_type_init(); 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.") Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c Tue Jun 23 17:37:11 2009 (r1116) @@ -191,7 +191,6 @@ SmlDevInfPropParam* sml_dev_inf_prop_param_new (void) { - g_type_init(); return g_object_new (SML_TYPE_DEV_INF_PROP_PARAM, NULL); } Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Tue Jun 23 17:37:11 2009 (r1116) @@ -300,7 +300,6 @@ SmlDevInfProperty* sml_dev_inf_property_new (void) { - g_type_init(); return g_object_new (SML_TYPE_DEV_INF_PROPERTY, NULL); } Modified: trunk/tests/check_dev_inf_content_type.c ============================================================================== --- trunk/tests/check_dev_inf_content_type.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/tests/check_dev_inf_content_type.c Tue Jun 23 17:37:11 2009 (r1116) @@ -24,6 +24,8 @@ START_TEST (dev_inf_content_type_create) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -45,6 +47,8 @@ START_TEST (dev_inf_content_type_empty_get) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -58,6 +62,8 @@ START_TEST (dev_inf_content_type_filled_get) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new("text/x-vCalendar", "1.0", &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -71,6 +77,8 @@ START_TEST (dev_inf_content_type_references) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new("text/x-vCalendar", "1.0", &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); Modified: trunk/tests/check_dev_inf_ctcap.c ============================================================================== --- trunk/tests/check_dev_inf_ctcap.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/tests/check_dev_inf_ctcap.c Tue Jun 23 17:37:11 2009 (r1116) @@ -24,6 +24,8 @@ START_TEST (dev_inf_ctcap_create) { + g_type_init(); + GError *error = NULL; SmlDevInfCTCap *ctcap = sml_dev_inf_ctcap_new(NULL, &error); @@ -45,6 +47,8 @@ START_TEST (dev_inf_ctcap_empty_set) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -86,6 +90,8 @@ START_TEST (dev_inf_ctcap_empty_get) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -131,6 +137,8 @@ START_TEST (dev_inf_ctcap_filled_set) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -171,6 +179,8 @@ START_TEST (dev_inf_ctcap_filled_get) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); @@ -229,6 +239,8 @@ START_TEST (dev_inf_ctcap_references) { + g_type_init(); + GError *error = NULL; SmlDevInfContentType *ct = sml_dev_inf_content_type_new(NULL, NULL, &error); sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); Modified: trunk/tests/check_dev_inf_data_store.c ============================================================================== --- trunk/tests/check_dev_inf_data_store.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/tests/check_dev_inf_data_store.c Tue Jun 23 17:37:11 2009 (r1116) @@ -22,21 +22,10 @@ #include <libsyncml/dev_inf_api/sml_dev_inf_data_store.h> -/* -is_compliant => separat - -source_ref -rx/tx/_pref -properpties - hierarchical sync - memory management max_id, mex_mem, shared_mem - sync_cap - display_nae - max_guid -*/ - START_TEST (dev_inf_data_store_create) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new(NULL, &error); sml_fail_unless(datastore == NULL, "The source reference must be set."); @@ -52,6 +41,8 @@ START_TEST (dev_inf_data_store_empty_set) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); sml_fail_unless(datastore != NULL, NULL); @@ -111,6 +102,8 @@ START_TEST (dev_inf_data_store_empty_get) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); sml_fail_unless(datastore != NULL, NULL); @@ -222,6 +215,8 @@ START_TEST (dev_inf_data_store_filled_set) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); sml_fail_unless(datastore != NULL, NULL); @@ -286,6 +281,8 @@ START_TEST (dev_inf_data_store_filled_get) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); sml_fail_unless(datastore != NULL, NULL); @@ -391,6 +388,8 @@ START_TEST (dev_inf_data_store_compliance) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); sml_fail_unless(datastore != NULL, NULL); @@ -476,6 +475,8 @@ START_TEST (dev_inf_data_store_references) { + g_type_init(); + GError *error = NULL; SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); sml_fail_unless(datastore != NULL, NULL); Modified: trunk/tests/check_dev_inf_prop_param.c ============================================================================== --- trunk/tests/check_dev_inf_prop_param.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/tests/check_dev_inf_prop_param.c Tue Jun 23 17:37:11 2009 (r1116) @@ -24,6 +24,8 @@ START_TEST (dev_inf_prop_param_create) { + g_type_init(); + SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); g_object_unref(propParam); @@ -32,6 +34,8 @@ START_TEST (dev_inf_prop_param_empty_set) { + g_type_init(); + GError *error = NULL; SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); @@ -86,6 +90,8 @@ START_TEST (dev_inf_prop_param_empty_get) { + g_type_init(); + GError *error = NULL; SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); @@ -157,6 +163,8 @@ START_TEST (dev_inf_prop_param_filled_set) { + g_type_init(); + GError *error = NULL; SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); @@ -173,6 +181,8 @@ START_TEST (dev_inf_prop_param_filled_get) { + g_type_init(); + GError *error = NULL; SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); @@ -212,6 +222,8 @@ START_TEST (dev_inf_prop_param_references) { + g_type_init(); + GError *error = NULL; SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, "Cannot create SmlDevInfPropParam."); Modified: trunk/tests/check_dev_inf_property.c ============================================================================== --- trunk/tests/check_dev_inf_property.c Tue Jun 23 17:22:36 2009 (r1115) +++ trunk/tests/check_dev_inf_property.c Tue Jun 23 17:37:11 2009 (r1116) @@ -24,6 +24,8 @@ START_TEST (dev_inf_property_create) { + g_type_init(); + SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); g_object_unref(prop); @@ -32,6 +34,8 @@ START_TEST (dev_inf_property_empty_set) { + g_type_init(); + GError *error = NULL; SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); @@ -100,6 +104,8 @@ START_TEST (dev_inf_property_empty_get) { + g_type_init(); + GError *error = NULL; SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); @@ -192,6 +198,8 @@ START_TEST (dev_inf_property_size_integrity) { + g_type_init(); + GError *error = NULL; SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); @@ -227,6 +235,8 @@ START_TEST (dev_inf_property_filled_set) { + g_type_init(); + GError *error = NULL; SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); @@ -263,6 +273,8 @@ START_TEST (dev_inf_property_filled_get) { + g_type_init(); + GError *error = NULL; SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); @@ -348,6 +360,8 @@ START_TEST (dev_inf_property_references) { + g_type_init(); + GError *error = NULL; SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, "Cannot create SmlDevInfProperty."); |
From: <svn...@op...> - 2009-06-23 15:22:43
|
Author: bellmich Date: Tue Jun 23 17:22:36 2009 New Revision: 1115 URL: http://libsyncml.opensync.org/changeset/1115 Log: fixed potential memory leak Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:15:30 2009 (r1114) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:22:36 2009 (r1115) @@ -368,9 +368,9 @@ sml_dev_inf_data_store_new (const gchar *source_ref, GError **error) { CHECK_ERROR_REF + g_type_init(); 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.") |
From: <svn...@op...> - 2009-06-23 15:15:54
|
Author: bellmich Date: Tue Jun 23 17:15:30 2009 New Revision: 1114 URL: http://libsyncml.opensync.org/changeset/1114 Log: - added tests for SmlDevInfDataStore - fixed API flaws uncovered by the tests of SmlDevInfDataStore Added: trunk/tests/check_dev_inf_data_store.c Modified: trunk/libsyncml/data_sync_api/data_sync_devinf.c trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h trunk/libsyncml/parser/sml_xml_parse.c trunk/tests/CMakeLists.txt trunk/tests/support.h Modified: trunk/libsyncml/data_sync_api/data_sync_devinf.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_devinf.c Tue Jun 23 17:13:55 2009 (r1113) +++ trunk/libsyncml/data_sync_api/data_sync_devinf.c Tue Jun 23 17:15:30 2009 (r1114) @@ -511,7 +511,8 @@ ctype = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ if (!ctype) \ goto error; \ - sml_dev_inf_data_store_set_rx_pref(ds, ctype); \ + if (!sml_dev_inf_data_store_set_rx_pref(ds, ctype, &gerror)) \ + goto error; \ g_object_unref(ctype); \ ctype = NULL; @@ -519,7 +520,8 @@ ctype = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ if (!ctype) \ goto error; \ - sml_dev_inf_data_store_set_tx_pref(ds, ctype); \ + if (!sml_dev_inf_data_store_set_tx_pref(ds, ctype, &gerror)) \ + goto error; \ g_object_unref(ctype); \ ctype = NULL; @@ -617,11 +619,12 @@ 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) + 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 + } else { 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__); Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:13:55 2009 (r1113) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.c Tue Jun 23 17:15:30 2009 (r1114) @@ -162,6 +162,26 @@ static void sml_dev_inf_data_store_finalize (GObject *object) { + SmlDevInfDataStore *self = (SmlDevInfDataStore *) object; + g_free(self->priv->source_ref); + g_free(self->priv->display_name); + g_object_unref(self->priv->rx_pref); + g_object_unref(self->priv->tx_pref); + while(self->priv->rx) { + SmlDevInfContentType *ct = self->priv->rx->data; + self->priv->rx = g_list_remove(self->priv->rx, ct); + g_object_unref(ct); + } + while(self->priv->tx) { + SmlDevInfContentType *ct = self->priv->tx->data; + self->priv->tx = g_list_remove(self->priv->tx, ct); + g_object_unref(ct); + } + /* all pointers must be NULL */ + self->priv->source_ref = NULL; + self->priv->display_name = NULL; + self->priv->rx_pref = NULL; + self->priv->tx_pref = NULL; G_OBJECT_CLASS (sml_dev_inf_data_store_parent_class)->finalize (object); } @@ -499,17 +519,21 @@ * * Sets the property. */ -void +gboolean sml_dev_inf_data_store_set_rx_pref (SmlDevInfDataStore *self, - SmlDevInfContentType* rx_pref) + SmlDevInfContentType* rx_pref, + GError **error) { - g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); - g_return_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (rx_pref)); + 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 (rx_pref, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfContentType object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (rx_pref), FALSE, error, SML_ERROR_GENERIC, "The RxPref parameter must be a SmlDevInfContentType object."); if (self->priv->rx_pref) g_object_unref (self->priv->rx_pref); g_object_ref (rx_pref); self->priv->rx_pref = rx_pref; + return TRUE; } /** @@ -534,17 +558,21 @@ * * Sets the property. */ -void +gboolean sml_dev_inf_data_store_set_tx_pref (SmlDevInfDataStore *self, - SmlDevInfContentType* tx_pref) + SmlDevInfContentType* tx_pref, + GError **error) { - g_return_if_fail (SML_IS_DEV_INF_DATA_STORE (self)); - g_return_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (tx_pref)); + 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 (tx_pref, FALSE, error, SML_ERROR_GENERIC, "The SmlDevInfContentType object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (tx_pref), FALSE, error, SML_ERROR_GENERIC, "The TxPref parameter must be a SmlDevInfContentType object."); if (self->priv->tx_pref) g_object_unref (self->priv->tx_pref); g_object_ref (tx_pref); self->priv->tx_pref = tx_pref; + return TRUE; } /** @@ -750,6 +778,12 @@ SmlDevInfSyncCap sync_cap) { g_return_val_if_fail (SML_IS_DEV_INF_DATA_STORE (self), FALSE); + + /* If no SyncCap is set then the SyncCap is unknown. */ + if (sync_cap == SML_DEVINF_SYNCTYPE_UNKNOWN && + self->priv->sync_cap == SML_DEVINF_SYNCTYPE_UNKNOWN) + return TRUE; + return self->priv->sync_cap & sync_cap ? TRUE : FALSE; } @@ -766,10 +800,21 @@ 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; + + if (sync_cap == SML_DEVINF_SYNCTYPE_UNKNOWN) { + if (supported) { + self->priv->sync_cap = 0; + } else { + /* Ignore but warn on senseless configuration ... */ + g_warning("You cannot disabled an unknown SyncCap in a data store of the device information."); + } + } else { + if (supported) { + self->priv->sync_cap = self->priv->sync_cap | sync_cap; + } else { + self->priv->sync_cap = self->priv->sync_cap & ~sync_cap; + } + } } /** @@ -805,15 +850,17 @@ /** * sml_dev_inf_data_store_is_compliant: * @self: A #SmlDevInfDataStore - * - * Gets the property. + * @error: A #GError + * + * This is the only function of this class where you have not to provide a pointer to the error parameter. + * If you only want to know if the data store is already compliant + * then you can ignore the error. * * 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."); Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h Tue Jun 23 17:13:55 2009 (r1113) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_data_store.h Tue Jun 23 17:15:30 2009 (r1114) @@ -71,9 +71,9 @@ 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); +gboolean sml_dev_inf_data_store_set_rx_pref (SmlDevInfDataStore *self, SmlDevInfContentType* rx_pref, GError **error); 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); +gboolean sml_dev_inf_data_store_set_tx_pref (SmlDevInfDataStore *self, SmlDevInfContentType* tx_pref, GError **error); 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); Modified: trunk/libsyncml/parser/sml_xml_parse.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_parse.c Tue Jun 23 17:13:55 2009 (r1113) +++ trunk/libsyncml/parser/sml_xml_parse.c Tue Jun 23 17:15:30 2009 (r1114) @@ -2603,6 +2603,8 @@ CHECK_ERROR_REF smlAssert(parser); smlAssert(datastore); + + GError *gerror = NULL; while (1) { if (!_smlXmlParserStep(parser)) { @@ -2642,6 +2644,10 @@ 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; } @@ -3273,12 +3279,14 @@ 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); + if (!sml_dev_inf_data_store_set_rx_pref(datastore, ct, &gerror)) + goto error; } 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); + if (!sml_dev_inf_data_store_set_tx_pref(datastore, ct, &gerror)) + goto error; } else { smlErrorSet(error, SML_ERROR_GENERIC, "The element %s is an unknown Rx/Tx element.", element); goto error; Modified: trunk/tests/CMakeLists.txt ============================================================================== --- trunk/tests/CMakeLists.txt Tue Jun 23 17:13:55 2009 (r1113) +++ trunk/tests/CMakeLists.txt Tue Jun 23 17:15:30 2009 (r1114) @@ -253,7 +253,7 @@ SML_ADD_TESTCASE( san_parse_error7 ) SML_END_TEST() - SML_START_TEST( "DevInf" devinf check_devinf.c ${TEST_TARGET_LIBRARIES} ) + SML_START_TEST( "DevInfHelper" devinf check_devinf.c ${TEST_TARGET_LIBRARIES} ) IF( ENABLE_HTTP ) SML_ADD_TESTCASE( devinf_crash ) SML_ADD_TESTCASE( devinf_result ) @@ -296,6 +296,16 @@ SML_ADD_TESTCASE( dev_inf_ctcap_references ) SML_END_TEST() + SML_START_TEST( "DevInfDataStore" dev_inf_data_store check_dev_inf_data_store.c ${TEST_TARGET_LIBRARIES} ) + SML_ADD_TESTCASE( dev_inf_data_store_create ) + SML_ADD_TESTCASE( dev_inf_data_store_empty_set ) + SML_ADD_TESTCASE( dev_inf_data_store_empty_get ) + SML_ADD_TESTCASE( dev_inf_data_store_filled_set ) + SML_ADD_TESTCASE( dev_inf_data_store_filled_get ) + SML_ADD_TESTCASE( dev_inf_data_store_compliance ) + SML_ADD_TESTCASE( dev_inf_data_store_references ) + SML_END_TEST() + SML_START_TEST( "Sync" sync check_sync.c ${TEST_TARGET_LIBRARIES} ) IF ( ENABLE_HTTP ) SML_ADD_TESTCASE( sync_multi_start ) Added: trunk/tests/check_dev_inf_data_store.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/tests/check_dev_inf_data_store.c Tue Jun 23 17:15:30 2009 (r1114) @@ -0,0 +1,496 @@ +/* + * libsyncml - A syncml protocol implementation + * 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 Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "tests/support.h" + +#include <libsyncml/dev_inf_api/sml_dev_inf_data_store.h> + +/* +is_compliant => separat + +source_ref +rx/tx/_pref +properpties + hierarchical sync + memory management max_id, mex_mem, shared_mem + sync_cap + display_nae + max_guid +*/ + +START_TEST (dev_inf_data_store_create) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new(NULL, &error); + sml_fail_unless(datastore == NULL, "The source reference must be set."); + sml_fail_unless(error != NULL, "The error must be set on failure."); + g_error_free(error); + error = NULL; + + datastore = sml_dev_inf_data_store_new("contacts", &error); + sml_fail_unless(datastore != NULL, "%s", error?error->message:"No GError set."); + g_object_unref(datastore); +} +END_TEST + +START_TEST (dev_inf_data_store_empty_set) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); + sml_fail_unless(datastore != NULL, NULL); + + /* enforce SourceRef name */ + + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, NULL, &error) == FALSE, "A data store must have a SourceRef."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, "", &error) == FALSE, "A data store must have a SourceRef."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* the following parameters can be NULL or 0 */ + + sml_fail_unless(sml_dev_inf_data_store_set_display_name(datastore, NULL, &error), "%s", error?error->message:"No GError set."); + sml_dev_inf_data_store_set_max_guid_size(datastore, 0); + sml_dev_inf_data_store_set_max_id(datastore, 0); + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); + + /* The unknown SyncCap removes all configured SyncCaps. */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, TRUE); + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, FALSE); + + /* RxPref/TxPref must be set */ + + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, NULL, &error) == FALSE, "A data store must have a RxPref."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, NULL, &error) == FALSE, "A data store must have a TxPref."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* Rx/Tx does not accept empty values */ + + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, NULL, &error) == FALSE, "Rx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, NULL, &error) == FALSE, "Tx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + g_object_unref(datastore); +} +END_TEST + +START_TEST (dev_inf_data_store_empty_get) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); + sml_fail_unless(datastore != NULL, NULL); + + SmlDevInfContentType *ct = sml_dev_inf_content_type_new("text/x-vcard", "2.1", &error); + sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); + + /* enforce SourceRef name */ + + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, NULL, &error) == FALSE, "A data store must have a SourceRef."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + const gchar *source_ref = sml_dev_inf_data_store_get_source_ref(datastore); + sml_fail_unless(source_ref != NULL, "The SourceRef must always be available."); + sml_fail_unless(strcmp(source_ref, "Contacts") == 0, "The original SourceRef was damaged."); + + /* the following parameters can be NULL or 0 */ + + sml_fail_unless(sml_dev_inf_data_store_get_display_name(datastore) == NULL, "The default display name is empty."); + sml_fail_unless(sml_dev_inf_data_store_set_display_name(datastore, NULL, &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_get_display_name(datastore) == NULL, "The default display name was overwritten."); + + sml_fail_unless(sml_dev_inf_data_store_get_max_guid_size(datastore) == 0, "The default MaxGUIDSize is 0."); + sml_dev_inf_data_store_set_max_guid_size(datastore, 0); + sml_fail_unless(sml_dev_inf_data_store_get_max_guid_size(datastore) == 0, "The default MaxGUIDSize was overwritten"); + + sml_fail_unless(sml_dev_inf_data_store_get_max_id(datastore) == 0, "The default MaxID is 0."); + sml_dev_inf_data_store_set_max_id(datastore, 0); + sml_fail_unless(sml_dev_inf_data_store_get_max_id(datastore) == 0, "The default MaxID was overwritten"); + + sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == FALSE, "The default SupportsHierarchicalSync is FALSE."); + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); + sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == TRUE, "SupportsHierarchicalSync must be TRUE."); + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); + sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == FALSE, "SupportsHierarchicalSync must be FALSE."); + + /* The unknown SyncCap is set if no other SynCap is set. */ + + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == TRUE, "The default SyncCap is no SyncCap."); + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, TRUE); + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, FALSE); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == TRUE, "The default SyncCap was overwritten."); + + /* RxPref/TxPref must be set */ + + sml_fail_unless(sml_dev_inf_data_store_get_rx_pref(datastore) == NULL, "The default RxPref is NULL."); + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, NULL, &error) == FALSE, "A data store must have a RxPref."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_get_rx_pref(datastore) == NULL, "The default RxPref is NULL."); + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_get_rx_pref(datastore) == ct, "The RxPref was not set correctly."); + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, NULL, &error) == FALSE, "A data store must have a RxPref."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_get_rx_pref(datastore) == ct, "The RxPref was overwritten."); + + sml_fail_unless(sml_dev_inf_data_store_get_tx_pref(datastore) == NULL, "The default TxPref is NULL."); + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, NULL, &error) == FALSE, "A data store must have a TxPref."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_get_tx_pref(datastore) == NULL, "The default TxPref is NULL."); + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_get_tx_pref(datastore) == ct, "The TxPref was not set correctly."); + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, NULL, &error) == FALSE, "A data store must have a TxPref."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_get_tx_pref(datastore) == ct, "The TxPref was overwritten."); + + /* Rx/Tx does not accept empty values */ + + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 0, "The default Rx list is empty."); + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, NULL, &error) == FALSE, "Rx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 0, "The default Rx list must be still empty."); + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 1, "There is a new content type in the Rx list."); + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, NULL, &error) == FALSE, "Rx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 1, "There is still one content type in the Rx list."); + + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 0, "The default Tx list is empty."); + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, NULL, &error) == FALSE, "Tx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 0, "The default Tx list must be still empty."); + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 1, "There is a new content type in the Tx list."); + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, NULL, &error) == FALSE, "Tx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 1, "There is still one content type in the Tx list."); + + g_object_unref(ct); + g_object_unref(datastore); +} +END_TEST + +START_TEST (dev_inf_data_store_filled_set) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); + sml_fail_unless(datastore != NULL, NULL); + + SmlDevInfContentType *ct = sml_dev_inf_content_type_new("text/x-vcard", "2.1", &error); + sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); + + /* enforce SourceRef name */ + + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, "AddressBook", &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, NULL, &error) == FALSE, "A data store must have a SourceRef."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* the following parameters can be NULL or 0 */ + + sml_fail_unless(sml_dev_inf_data_store_set_display_name(datastore, "address book", &error), "%s", error?error->message:"No GError set."); + + sml_dev_inf_data_store_set_max_guid_size(datastore, 128); + sml_dev_inf_data_store_set_max_guid_size(datastore, 0); + + sml_dev_inf_data_store_set_max_id(datastore, 1000000000); + sml_dev_inf_data_store_set_max_id(datastore, 0); + + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); + + /* The unknown SyncCap is set if no other SynCap is set. */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, FALSE); + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, FALSE); /* has no effect */ + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, TRUE); /* deletes all SyncCaps */ + + /* RxPref/TxPref must be set */ + + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + + /* Rx/Tx does not accept empty values */ + + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, NULL, &error) == FALSE, "Rx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, NULL, &error) == FALSE, "Tx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + + g_object_unref(ct); + g_object_unref(datastore); +} +END_TEST + +START_TEST (dev_inf_data_store_filled_get) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); + sml_fail_unless(datastore != NULL, NULL); + + SmlDevInfContentType *ct = sml_dev_inf_content_type_new("text/x-vcard", "2.1", &error); + sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); + + /* enforce SourceRef name */ + + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, "AddressBook", &error), "%s", error?error->message:"No GError set."); + const gchar *source_ref = sml_dev_inf_data_store_get_source_ref(datastore); + sml_fail_unless(source_ref != NULL, "The SourceRef must always be available."); + sml_fail_unless(strcmp(source_ref, "AddressBook") == 0, "The SourceRef was not copied correctly."); + + sml_fail_unless(sml_dev_inf_data_store_set_source_ref(datastore, NULL, &error) == FALSE, "A data store must have a SourceRef."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + source_ref = sml_dev_inf_data_store_get_source_ref(datastore); + sml_fail_unless(source_ref != NULL, "The SourceRef was erased."); + sml_fail_unless(strcmp(source_ref, "AddressBook") == 0, "The SourceRef was overwritten."); + + /* the following parameters can be NULL or 0 */ + + sml_fail_unless(sml_dev_inf_data_store_set_display_name(datastore, "address book", &error), "%s", error?error->message:"No GError set."); + const gchar *display_name = sml_dev_inf_data_store_get_display_name(datastore); + sml_fail_unless(display_name != NULL, "The DisplayName was erased."); + sml_fail_unless(strcmp(display_name, "address book") == 0, "The DisplayName was not copied correctly."); + + sml_dev_inf_data_store_set_max_guid_size(datastore, 128); + sml_fail_unless(sml_dev_inf_data_store_get_max_guid_size(datastore) == 128, "The MaxGUIDSize was not copied correctly."); + sml_dev_inf_data_store_set_max_guid_size(datastore, 0); + sml_fail_unless(sml_dev_inf_data_store_get_max_guid_size(datastore) == 0, "The MaxGUIDSize was not copied correctly."); + + sml_dev_inf_data_store_set_max_id(datastore, 1000000000); + sml_fail_unless(sml_dev_inf_data_store_get_max_id(datastore) == 1000000000, "The MaxID was not copied correctly."); + sml_dev_inf_data_store_set_max_id(datastore, 0); + sml_fail_unless(sml_dev_inf_data_store_get_max_id(datastore) == 0, "The MaxID was not copied correctly."); + + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, TRUE); + sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == TRUE, "SupportsHierarchicalSync must be TRUE."); + sml_dev_inf_data_store_set_supports_hierarchical_sync(datastore, FALSE); + sml_fail_unless(sml_dev_inf_data_store_get_supports_hierarchical_sync(datastore) == FALSE, "SupportsHierarchicalSync must be FALSE."); + + /* The unknown SyncCap is set if no other SynCap is set. */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY) == TRUE, "The Two-Way SyncCap was lost."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == FALSE, "There must be a Two-Way SyncCap."); + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC) == TRUE, "The Slow-Sync SyncCap was lost."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY) == TRUE, "The Two-Way SyncCap was lost."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == FALSE, "There must be two SyncCaps."); + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, FALSE); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY) == FALSE, "The Two-Way SyncCap was not removed."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC) == TRUE, "The Slow-Sync SyncCap was lost."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == FALSE, "There must be a Slow-Sync SyncCap."); + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, FALSE); /* has no effect */ + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC) == TRUE, "The Slow-Sync SyncCap was lost."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == FALSE, "There must be a Slow-Sync SyncCap."); + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, TRUE); /* deletes all SyncCaps */ + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC) == FALSE, "The Slow-Sync SyncCap was not removed."); + sml_fail_unless(sml_dev_inf_data_store_get_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN) == TRUE, "The default SyncCap was restored."); + + /* RxPref/TxPref must be set */ + + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_get_rx_pref(datastore) == ct, "The RxPref was not set correctly."); + + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_get_tx_pref(datastore) == ct, "The TxPref was not set correctly."); + + /* Rx/Tx does not accept empty values */ + + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 1, "There is a new content type in the Rx list."); + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, NULL, &error) == FALSE, "Rx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 1, "There is still one content type in the Rx list."); + sml_fail_unless(sml_dev_inf_data_store_add_rx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_num_rx(datastore) == 2, "There are two content types in the Rx list."); + + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 1, "There is a new content type in the Tx list."); + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, NULL, &error) == FALSE, "Tx content type must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 1, "There is still one content type in the Tx list."); + sml_fail_unless(sml_dev_inf_data_store_add_tx(datastore, ct, &error) == TRUE, "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_num_tx(datastore) == 2, "There are two content types in the Tx list."); + + g_object_unref(ct); + g_object_unref(datastore); +} +END_TEST + +START_TEST (dev_inf_data_store_compliance) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); + sml_fail_unless(datastore != NULL, NULL); + + SmlDevInfContentType *ct = sml_dev_inf_content_type_new("text/x-vcard", "2.1", &error); + sml_fail_unless(ct != NULL, "%s", error?error->message:"No GError set."); + + /* The compliance function will be tested first + * always with the error paramater present. */ + + /* missing RxPref, TxPref and SyncCap */ + + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, &error) == FALSE, "RxPref, TxPref and one SyncCap are required."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* missing RxPref and TxPref */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, &error) == FALSE, "RxPref and TxPref are required."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* missing TxPref and SyncCap */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, TRUE); + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, ct, &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, &error) == FALSE, "TxPref and one SyncCap are required."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* missing TxPref */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, &error) == FALSE, "TxPref is required."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* missing SyncCap */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_UNKNOWN, TRUE); + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, ct, &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, &error) == FALSE, "One SyncCap is required."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* correct */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, &error) == TRUE, "%s", error?error->message:"No GError set."); + + /* The compliance function will be tested now + * always without the error paramater. */ + + /* cleanup datastore because RxPref cannot be removed from the object */ + g_object_unref(datastore); + datastore = sml_dev_inf_data_store_new("Contacts", &error); + + /* missing RxPref and SyncCap */ + + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, ct, &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, NULL) == FALSE, "RxPref and one SyncCap are required."); + + /* missing RxPref */ + + sml_dev_inf_data_store_set_sync_cap(datastore, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, NULL) == FALSE, "RxPref is required."); + + /* correct */ + + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, ct, &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_data_store_is_compliant(datastore, NULL) == TRUE, "All requirements should be present."); + + g_object_unref(ct); + g_object_unref(datastore); +} +END_TEST + +START_TEST (dev_inf_data_store_references) +{ + GError *error = NULL; + SmlDevInfDataStore *datastore = sml_dev_inf_data_store_new("Contacts", &error); + sml_fail_unless(datastore != NULL, NULL); + + g_object_ref(datastore); + + sml_fail_unless(sml_dev_inf_data_store_get_source_ref(datastore) != NULL, "The source reference was not set."); + + g_object_unref(datastore); + + sml_fail_unless(sml_dev_inf_data_store_get_source_ref(datastore) != NULL, "The source reference is already cleaned up."); + + g_object_unref(datastore); +} +END_TEST + +@SML_TESTCASE_CODE@ + Modified: trunk/tests/support.h ============================================================================== --- trunk/tests/support.h Tue Jun 23 17:13:55 2009 (r1113) +++ trunk/tests/support.h Tue Jun 23 17:15:30 2009 (r1114) @@ -99,7 +99,7 @@ SmlDevInfContentType *ct = NULL; \ ct = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ sml_fail_unless(ct != NULL, "%s", gerror?gerror->message:"No GError set."); \ - sml_dev_inf_data_store_set_rx_pref(datastore, ct); \ + sml_fail_unless(sml_dev_inf_data_store_set_rx_pref(datastore, ct, &gerror), "%s", gerror?gerror->message:"No GError set."); \ g_object_unref(ct); \ ct = NULL; \ } @@ -110,7 +110,7 @@ SmlDevInfContentType *ct = NULL; \ ct = sml_dev_inf_content_type_new(cttype, verct, &gerror); \ sml_fail_unless(ct != NULL, "%s", gerror?gerror->message:"No GError set."); \ - sml_dev_inf_data_store_set_tx_pref(datastore, ct); \ + sml_fail_unless(sml_dev_inf_data_store_set_tx_pref(datastore, ct, &gerror), "%s", gerror?gerror->message:"No GError set."); \ g_object_unref(ct); \ ct = NULL; \ } |
From: <svn...@op...> - 2009-06-23 15:14:03
|
Author: bellmich Date: Tue Jun 23 17:13:55 2009 New Revision: 1113 URL: http://libsyncml.opensync.org/changeset/1113 Log: finalize should set all pointers to NULL after freeing their memory Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c Tue Jun 23 17:12:16 2009 (r1112) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c Tue Jun 23 17:13:55 2009 (r1113) @@ -72,10 +72,14 @@ { g_return_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (object)); SmlDevInfContentType *self = (SmlDevInfContentType*) object; - if (self->priv->cttype != NULL) + if (self->priv->cttype != NULL) { g_free(self->priv->cttype); - if (self->priv->verct != NULL) + self->priv->cttype = NULL; + } + if (self->priv->verct != NULL) { g_free(self->priv->verct); + self->priv->verct = NULL; + } G_OBJECT_CLASS (sml_dev_inf_content_type_parent_class)->finalize (object); } Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c Tue Jun 23 17:12:16 2009 (r1112) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c Tue Jun 23 17:13:55 2009 (r1113) @@ -87,6 +87,8 @@ self->priv->properties = g_list_remove(self->priv->properties, prop); g_object_unref(prop); } + /* all pointers must be NULL */ + self->priv->content_type = NULL; G_OBJECT_CLASS (sml_dev_inf_ctcap_parent_class)->finalize (object); } Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c Tue Jun 23 17:12:16 2009 (r1112) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c Tue Jun 23 17:13:55 2009 (r1113) @@ -105,6 +105,10 @@ self->priv->val_enums = g_list_remove(self->priv->val_enums, val_enum); g_free(val_enum); } + /* all pointers must be NULL */ + self->priv->param_name = NULL; + self->priv->data_type = NULL; + self->priv->display_name = NULL; G_OBJECT_CLASS (sml_dev_inf_prop_param_parent_class)->finalize (object); } Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Tue Jun 23 17:12:16 2009 (r1112) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Tue Jun 23 17:13:55 2009 (r1113) @@ -150,6 +150,10 @@ self->priv->params = g_list_remove(self->priv->params, param); g_object_unref(param); } + /* all pointers must be NULL */ + self->priv->prop_name = NULL; + self->priv->data_type = NULL; + self->priv->display_name = NULL; G_OBJECT_CLASS (sml_dev_inf_property_parent_class)->finalize (object); } |
From: <svn...@op...> - 2009-06-23 15:12:30
|
Author: bellmich Date: Tue Jun 23 17:12:16 2009 New Revision: 1112 URL: http://libsyncml.opensync.org/changeset/1112 Log: fixed uncheck usage of *error Modified: trunk/libsyncml/sml_error_internals.h Modified: trunk/libsyncml/sml_error_internals.h ============================================================================== --- trunk/libsyncml/sml_error_internals.h Mon Jun 22 18:13:17 2009 (r1111) +++ trunk/libsyncml/sml_error_internals.h Tue Jun 23 17:12:16 2009 (r1112) @@ -48,8 +48,10 @@ #define sml_return_val_error_if_fail(d_expr,d_value,d_error,d_error_code, d_error_msg) \ g_set_error(d_error, SML_ERROR, d_error_code, d_error_msg); \ g_return_val_if_fail(d_expr, d_value); \ - if (d_error) g_error_free(*d_error); \ - *d_error = NULL; + if (d_error) { \ + g_error_free(*d_error); \ + *d_error = NULL; \ + } /* Error messages for assertions */ #define SML_ASSERT_MSG_ERROR_MUST_NOT_BE_NULL "The error handling of the function must be used." |
From: <svn...@op...> - 2009-06-23 10:24:53
|
Author: bricks Date: Tue Jun 23 12:23:59 2009 New Revision: 5683 URL: http://www.opensync.org/changeset/5683 Log: updated file format for latest osync_format_env_register_converter api changes Modified: plugins/file-sync/src/file.c Modified: plugins/file-sync/src/file.c ============================================================================== --- plugins/file-sync/src/file.c Mon Jun 22 01:52:43 2009 (r5682) +++ plugins/file-sync/src/file.c Tue Jun 23 12:23:59 2009 (r5683) @@ -240,14 +240,14 @@ if (!conv) return FALSE; - osync_format_env_register_converter(env, conv); + osync_format_env_register_converter(env, conv, error); osync_converter_unref(conv); conv = osync_converter_new(OSYNC_CONVERTER_ENCAP, plain, file, conv_plain_to_file, error); if (!conv) return FALSE; - osync_format_env_register_converter(env, conv); + osync_format_env_register_converter(env, conv, error); osync_converter_unref(conv); return TRUE; } |
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] |
From: <svn...@op...> - 2009-06-22 14:53:52
|
Author: bellmich Date: Mon Jun 22 14:35:26 2009 New Revision: 1107 URL: http://libsyncml.opensync.org/changeset/1107 Log: - GError *error is already defined earlier - the returned result was not checked Modified: trunk/libsyncml/parser/sml_xml_parse.c Modified: trunk/libsyncml/parser/sml_xml_parse.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_parse.c Mon Jun 22 10:55:01 2009 (r1106) +++ trunk/libsyncml/parser/sml_xml_parse.c Mon Jun 22 14:35:26 2009 (r1107) @@ -2817,8 +2817,8 @@ smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create SmlDevInfPropParam during SyncML 1.1 DevInf parsing."); goto error; } - GError *gerror = NULL; - sml_dev_inf_prop_param_set_param_name(param, value, &gerror); + if (!sml_dev_inf_prop_param_set_param_name(param, value, &gerror)) + goto error; break; case SML_DEVINF_CTCAP_SIZE: if (!sml_dev_inf_property_set_size(property, atoi(value), &gerror)) |
From: <svn...@op...> - 2009-06-22 14:48:53
|
Author: bellmich Date: Mon Jun 22 14:41:54 2009 New Revision: 1108 URL: http://libsyncml.opensync.org/changeset/1108 Log: - properties can have empty names (e.g. content type text/plain and a maximum size is set) - fixed several error reportings (If an error is expected but does not happen then it is useless to print a not present error.) - added some test cases for properties Modified: trunk/tests/check_dev_inf_prop_param.c trunk/tests/check_dev_inf_property.c Modified: trunk/tests/check_dev_inf_prop_param.c ============================================================================== --- trunk/tests/check_dev_inf_prop_param.c Mon Jun 22 14:35:26 2009 (r1107) +++ trunk/tests/check_dev_inf_prop_param.c Mon Jun 22 14:41:54 2009 (r1108) @@ -36,9 +36,24 @@ SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); - sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, "", &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, NULL, &error), "%s", error?error->message:"No GError set."); + /* enforce parameter name */ + + sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, NULL, &error) == FALSE, "A parameter must have a name."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, "", &error) == FALSE, "A parameter must have a name."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, NULL, &error) == FALSE, "A parameter must have a name."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* test the normal properties */ sml_fail_unless(sml_dev_inf_prop_param_set_data_type(propParam, NULL, &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_prop_param_set_data_type(propParam, "", &error), "%s", error?error->message:"No GError set."); @@ -48,9 +63,22 @@ sml_fail_unless(sml_dev_inf_prop_param_set_display_name(propParam, "", &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_prop_param_set_display_name(propParam, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, "", &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error), "%s", error?error->message:"No GError set."); + /* ValEnums does not accept empty values */ + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, "", &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; g_object_unref(propParam); } @@ -62,25 +90,66 @@ SmlDevInfPropParam *propParam = sml_dev_inf_prop_param_new(); sml_fail_unless(propParam != NULL, NULL); + /* enforce parameter name */ + sml_fail_unless(sml_dev_inf_prop_param_get_param_name(propParam) == NULL, NULL); - sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, NULL, &error), "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, NULL, &error) == FALSE, "The parameter name must be set."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_prop_param_get_param_name(propParam) == NULL, NULL); + sml_fail_unless(sml_dev_inf_prop_param_set_param_name(propParam, "", &error) == FALSE, "The parameter name must be set."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_get_param_name(propParam) == NULL, NULL); + + /* test the normal properties */ + sml_fail_unless(sml_dev_inf_prop_param_get_data_type(propParam) == NULL, NULL); sml_fail_unless(sml_dev_inf_prop_param_set_data_type(propParam, NULL, &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_prop_param_get_data_type(propParam) == NULL, NULL); + sml_fail_unless(sml_dev_inf_prop_param_set_data_type(propParam, "", &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_prop_param_get_data_type(propParam) == NULL, NULL); sml_fail_unless(sml_dev_inf_prop_param_get_display_name(propParam) == NULL, NULL); sml_fail_unless(sml_dev_inf_prop_param_set_display_name(propParam, NULL, &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_prop_param_get_display_name(propParam) == NULL, NULL); + sml_fail_unless(sml_dev_inf_prop_param_set_display_name(propParam, "", &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_prop_param_get_display_name(propParam) == NULL, NULL); + + /* ValEnums does not accept empty values */ sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 0, NULL); - sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error), "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error) == FALSE, "The parameter name must be set."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 0, NULL); + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, "", &error) == FALSE, "The parameter name must be set."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 0, NULL); + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, "value", &error), "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 1, NULL); + + sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error) == FALSE, "The parameter name must be set."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 1, NULL); - sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, "", &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 2, NULL); - sml_fail_unless(sml_dev_inf_prop_param_add_val_enum(propParam, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_prop_param_num_val_enums(propParam) == 3, NULL); g_object_unref(propParam); } Modified: trunk/tests/check_dev_inf_property.c ============================================================================== --- trunk/tests/check_dev_inf_property.c Mon Jun 22 14:35:26 2009 (r1107) +++ trunk/tests/check_dev_inf_property.c Mon Jun 22 14:41:54 2009 (r1108) @@ -36,9 +36,22 @@ SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); - sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, "", &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, NULL, &error), "%s", error?error->message:"No GError set."); + /* enforce parameter name */ + + sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, NULL, &error) == FALSE, "A property must have a name."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* this is allowed */ + sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, "", &error) == TRUE, "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, NULL, &error) == FALSE, "A property must have a name."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + /* test the normal properties */ sml_fail_unless(sml_dev_inf_property_set_data_type(prop, NULL, &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_property_set_data_type(prop, "", &error), "%s", error?error->message:"No GError set."); @@ -48,9 +61,22 @@ sml_fail_unless(sml_dev_inf_property_set_display_name(prop, "", &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_property_set_display_name(prop, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, "", &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error), "%s", error?error->message:"No GError set."); + /* ValEnums does not accept empty values */ + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, "", &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; /* parameter checks must be a little bit more careful */ @@ -78,25 +104,65 @@ SmlDevInfProperty *prop = sml_dev_inf_property_new(); sml_fail_unless(prop != NULL, NULL); + /* enforce parameter name */ + sml_fail_unless(sml_dev_inf_property_get_prop_name(prop) == NULL, NULL); - sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, NULL, &error), "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, NULL, &error) == FALSE, "The parameter name must be set."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_property_get_prop_name(prop) == NULL, NULL); + /* this is allowed */ + sml_fail_unless(sml_dev_inf_property_set_prop_name(prop, "", &error) == TRUE, "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_property_get_prop_name(prop) != NULL, NULL); + sml_fail_unless(strlen(sml_dev_inf_property_get_prop_name(prop)) == 0, NULL); + + /* test the normal properties */ + sml_fail_unless(sml_dev_inf_property_get_data_type(prop) == NULL, NULL); sml_fail_unless(sml_dev_inf_property_set_data_type(prop, NULL, &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_property_get_data_type(prop) == NULL, NULL); + sml_fail_unless(sml_dev_inf_property_set_data_type(prop, "", &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_property_get_data_type(prop) == NULL, NULL); sml_fail_unless(sml_dev_inf_property_get_display_name(prop) == NULL, NULL); sml_fail_unless(sml_dev_inf_property_set_display_name(prop, NULL, &error), "%s", error?error->message:"No GError set."); sml_fail_unless(sml_dev_inf_property_get_display_name(prop) == NULL, NULL); + sml_fail_unless(sml_dev_inf_property_set_display_name(prop, "", &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(sml_dev_inf_property_get_display_name(prop) == NULL, NULL); + + /* ValEnums does not accept empty values */ sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 0, NULL); - sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error), "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 0, NULL); + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, "", &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + + sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 0, NULL); + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, "value", &error) == TRUE, "%s", error?error->message:"No GError set."); + + sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 1, NULL); + + sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error) == FALSE, "ValEnums must be not empty."); + sml_fail_unless(error != NULL, "The error must be set if an error appears."); + g_error_free(error); + error = NULL; + sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 1, NULL); - sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, "", &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 2, NULL); - sml_fail_unless(sml_dev_inf_property_add_val_enum(prop, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(sml_dev_inf_property_num_val_enums(prop) == 3, NULL); /* parameter checks must be a little bit more careful */ |
From: <svn...@op...> - 2009-06-22 14:48:52
|
Author: bellmich Date: Mon Jun 22 14:43:15 2009 New Revision: 1109 URL: http://libsyncml.opensync.org/changeset/1109 Log: - SML_ERROR is internal - sml_return_val_error_if_fail is an extension of g_return_val_if_fail because the glib does not support error setting Modified: trunk/libsyncml/sml_error.h trunk/libsyncml/sml_error_internals.h Modified: trunk/libsyncml/sml_error.h ============================================================================== --- trunk/libsyncml/sml_error.h Mon Jun 22 14:41:54 2009 (r1108) +++ trunk/libsyncml/sml_error.h Mon Jun 22 14:43:15 2009 (r1109) @@ -113,8 +113,6 @@ } SmlErrorType; -#define SML_ERROR g_quark_from_static_string("Sml") - SmlError **smlErrorRef(SmlError **error); void smlErrorDeref(SmlError **error); SmlBool smlErrorIsSet(SmlError **error); Modified: trunk/libsyncml/sml_error_internals.h ============================================================================== --- trunk/libsyncml/sml_error_internals.h Mon Jun 22 14:41:54 2009 (r1108) +++ trunk/libsyncml/sml_error_internals.h Mon Jun 22 14:43:15 2009 (r1109) @@ -43,6 +43,14 @@ smlAssertMsg(error, SML_ASSERT_MSG_ERROR_MUST_NOT_BE_NULL); \ smlAssertMsg(*error == NULL, SML_ASSERT_MSG_ERROR_MUST_BE_EMPTY); +#define SML_ERROR g_quark_from_static_string("Sml") + +#define sml_return_val_error_if_fail(d_expr,d_value,d_error,d_error_code, d_error_msg) \ + g_set_error(d_error, SML_ERROR, d_error_code, d_error_msg); \ + g_return_val_if_fail(d_expr, d_value); \ + if (d_error) g_error_free(*d_error); \ + *d_error = NULL; + /* Error messages for assertions */ #define SML_ASSERT_MSG_ERROR_MUST_NOT_BE_NULL "The error handling of the function must be used." #define SML_ASSERT_MSG_ERROR_MUST_BE_EMPTY "The error parameter is already filled (ignored error)." |
From: <svn...@op...> - 2009-06-22 14:44:02
|
Author: bellmich Date: Mon Jun 22 14:45:37 2009 New Revision: 1110 URL: http://libsyncml.opensync.org/changeset/1110 Log: - use sml_return_val_error_if_fail - PropParam names are enforced (NULL and "" are no valid names) - Property supports empty names - NULL and "" are normalized to NULL (names and data type) Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c Mon Jun 22 14:43:15 2009 (r1109) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_content_type.c Mon Jun 22 14:45:37 2009 (r1110) @@ -20,6 +20,7 @@ #include "sml_dev_inf_content_type.h" #include <libsyncml/syncml.h> +#include "../sml_error_internals.h" G_DEFINE_TYPE (SmlDevInfContentType, sml_dev_inf_content_type, G_TYPE_OBJECT) @@ -136,6 +137,7 @@ const gchar* verct, GError **error) { + CHECK_ERROR_REF g_type_init(); SmlDevInfContentType* self = g_object_new (SML_TYPE_DEV_INF_CONTENT_TYPE, NULL); @@ -191,16 +193,18 @@ gboolean sml_dev_inf_content_type_set_cttype (SmlDevInfContentType *self, const gchar* cttype, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (self), FALSE); - if (cttype == NULL) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The CTType must always be set for a SmlDevInfContentType object."); - return FALSE; - } + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfContentType object."); + sml_return_val_error_if_fail (cttype != NULL, FALSE, error, SML_ERROR_GENERIC, "The CTType must always be set for a SmlDevInfContentType object."); + if (self->priv->cttype) { g_free(self->priv->cttype); self->priv->cttype = NULL; } + self->priv->cttype = g_strdup(cttype); + sml_return_val_error_if_fail (self->priv->cttype, FALSE, error, SML_ERROR_GENERIC, "Cannot copy cttype - out of memory."); + return TRUE; } @@ -217,16 +221,18 @@ gboolean sml_dev_inf_content_type_set_verct (SmlDevInfContentType *self, const gchar* verct, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (self), FALSE); - if (verct == NULL) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The VerCT must always be set for a SmlDevInfContentType object."); - return FALSE; - } + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfContentType object."); + sml_return_val_error_if_fail (verct != NULL, FALSE, error, SML_ERROR_GENERIC, "The VerCT must always be set for a SmlDevInfContentType object."); + if (self->priv->verct) { g_free(self->priv->verct); self->priv->verct = NULL; } + self->priv->verct = g_strdup(verct); + sml_return_val_error_if_fail (self->priv->verct, FALSE, error, SML_ERROR_GENERIC, "Cannot copy verct - out of memory."); + return TRUE; } Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c Mon Jun 22 14:43:15 2009 (r1109) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_ctcap.c Mon Jun 22 14:45:37 2009 (r1110) @@ -20,6 +20,7 @@ #include "sml_dev_inf_ctcap.h" #include <libsyncml/syncml.h> +#include "../sml_error_internals.h" G_DEFINE_TYPE (SmlDevInfCTCap, sml_dev_inf_ctcap, G_TYPE_OBJECT) @@ -144,6 +145,7 @@ SmlDevInfCTCap* sml_dev_inf_ctcap_new (SmlDevInfContentType *ct, GError **error) { + CHECK_ERROR_REF g_type_init(); if (ct == NULL) { @@ -183,17 +185,16 @@ SmlDevInfContentType *content_type, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_CTCAP (self), FALSE); - - if (content_type == NULL) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The content type cannot be deleted only replace is allowed."); - return FALSE; - } - g_return_val_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (content_type), FALSE); + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_CTCAP (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfCTCap object."); + sml_return_val_error_if_fail (content_type, FALSE, error, SML_ERROR_GENERIC, "The content type cannot be deleted only replace is allowed."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_CONTENT_TYPE (content_type), FALSE, error, SML_ERROR_GENERIC, "The content_type must be of type SmlDevInfContentType."); if (self->priv->content_type) g_object_unref (self->priv->content_type); + self->priv->content_type = g_object_ref (content_type); + sml_return_val_error_if_fail (self->priv->content_type, FALSE, error, SML_ERROR_GENERIC, "Cannot copy content type - out of memory."); return TRUE; } @@ -236,16 +237,14 @@ SmlDevInfProperty *property, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_CTCAP (self), FALSE); - if (!property) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The SmlDevInfProperty object is missing."); - return FALSE; - } + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_CTCAP (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfCTCap object."); + sml_return_val_error_if_fail (property, FALSE, error, SML_ERROR_GENERIC, "The property object is missing."); + sml_return_val_error_if_fail (SML_IS_DEV_INF_PROPERTY (property), FALSE, error, SML_ERROR_GENERIC, "The property must be of type SmlDevInfProperty."); + g_object_ref(property); self->priv->properties = g_list_append(self->priv->properties, property); - if (!self->priv->properties) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "Cannot add Property to Property list of CTCap."); - return FALSE; - } + sml_return_val_error_if_fail (self->priv->properties, FALSE, error, SML_ERROR_GENERIC, "Cannot add Property to Property list of CTCap."); + return TRUE; } Modified: trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c ============================================================================== --- trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c Mon Jun 22 14:43:15 2009 (r1109) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_prop_param.c Mon Jun 22 14:45:37 2009 (r1110) @@ -21,6 +21,7 @@ #include "sml_dev_inf_prop_param.h" #include <libsyncml/syncml.h> +#include "../sml_error_internals.h" G_DEFINE_TYPE (SmlDevInfPropParam, sml_dev_inf_prop_param, G_TYPE_OBJECT) @@ -217,9 +218,16 @@ const gchar* param_name, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE); + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfPropParam object."); + sml_return_val_error_if_fail (param_name, FALSE, error, SML_ERROR_GENERIC, "The parameter name is required."); + sml_return_val_error_if_fail (strlen(param_name) > 0, FALSE, error, SML_ERROR_GENERIC, "The parameter name must not be the empty."); + g_free (self->priv->param_name); + self->priv->param_name = g_strdup (param_name); + sml_return_val_error_if_fail (self->priv->param_name, FALSE, error, SML_ERROR_GENERIC, "Cannot copy parameter name - out of memory."); + return TRUE; } @@ -250,9 +258,18 @@ const gchar* data_type, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE); + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfPropParam object."); + g_free (self->priv->data_type); + + /* normalization */ + if (data_type && strlen(data_type) == 0) + data_type = NULL; + self->priv->data_type = g_strdup (data_type); + sml_return_val_error_if_fail (!data_type || self->priv->data_type, FALSE, error, SML_ERROR_GENERIC, "Cannot copy data type - out of memory."); + return TRUE; } @@ -283,9 +300,18 @@ const gchar* display_name, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE); + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfPropParam 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 display name - out of memory."); + return TRUE; } @@ -327,11 +353,13 @@ const gchar* val_enum, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE); + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DEV_INF_PROP_PARAM (self), FALSE, error, SML_ERROR_GENERIC, "There is no SmlDevInfPropParam object."); + sml_return_val_error_if_fail (val_enum, FALSE, error, SML_ERROR_GENERIC, "The ValEnum must be filled."); + sml_return_val_error_if_fail (strlen(val_enum), FALSE, error, SML_ERROR_GENERIC, "The ValEnum must not be the empty word."); + self->priv->val_enums = g_list_append(self->priv->val_enums, g_strdup(val_enum)); - if (!self->priv->val_enums) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "Cannot add ValEnum to ValEnum list of PropParam."); - return FALSE; - } + sml_return_val_error_if_fail (self->priv->val_enums, FALSE, error, SML_ERROR_GENERIC, "Cannot add ValEnum to ValEnum list of PropParam."); + return TRUE; } 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:43:15 2009 (r1109) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Mon Jun 22 14:45:37 2009 (r1110) @@ -21,6 +21,7 @@ #include "sml_dev_inf_property.h" #include <libsyncml/syncml.h> +#include "../sml_error_internals.h" G_DEFINE_TYPE (SmlDevInfProperty, sml_dev_inf_property, G_TYPE_OBJECT) @@ -320,15 +321,28 @@ * @prop_name: * * Sets the property. + * The property cannot have the name NULL but it can have the name "" + * (the empty word) because SyncML 1.1 requires that a CTCap has at + * minimum one property. + * + * Example: If the content type is text/plain then it makes no sense + * to define properties with names but it makes sense to define a + * maximum size for the document. */ gboolean sml_dev_inf_property_set_prop_name (SmlDevInfProperty *self, const gchar* prop_name, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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 (prop_name, FALSE, error, SML_ERROR_GENERIC, "The property name is required."); + g_free (self->priv->prop_name); + self->priv->prop_name = g_strdup (prop_name); + sml_return_val_error_if_fail (self->priv->prop_name, FALSE, error, SML_ERROR_GENERIC, "Cannot copy property name - out of memory."); + return TRUE; } @@ -359,12 +373,15 @@ gsize size, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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."); + if (0 < self->priv->max_size && self->priv->max_size < size) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The size must be lower than the maximum size."); + g_set_error(error, SML_ERROR, SML_ERROR_GENERIC, "The size must be lower than the maximum size."); return FALSE; } self->priv->size = size; + return TRUE; } @@ -395,9 +412,18 @@ const gchar* data_type, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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."); + g_free (self->priv->data_type); + + /* normalization */ + if (data_type && strlen(data_type) == 0) + data_type = NULL; + self->priv->data_type = g_strdup (data_type); + sml_return_val_error_if_fail (!data_type || self->priv->data_type, FALSE, error, SML_ERROR_GENERIC, "Cannot copy data type - out of memory."); + return TRUE; } @@ -458,7 +484,9 @@ gsize max_size, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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."); + if (0 < max_size && max_size < self->priv->size) { *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The maximum size must be greater than the size."); return FALSE; @@ -524,9 +552,18 @@ const gchar* display_name, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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."); + 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 display name - out of memory."); + return TRUE; } @@ -568,12 +605,14 @@ const gchar* val_enum, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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 (val_enum, FALSE, error, SML_ERROR_GENERIC, "The ValEnum must be filled."); + sml_return_val_error_if_fail (strlen(val_enum), FALSE, error, SML_ERROR_GENERIC, "The ValEnum must not be the empty word."); + self->priv->val_enums = g_list_append(self->priv->val_enums, g_strdup(val_enum)); - if (!self->priv->val_enums) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "Cannot add ValEnum to ValEnum list of Property."); - return FALSE; - } + sml_return_val_error_if_fail (self->priv->val_enums, FALSE, error, SML_ERROR_GENERIC, "Cannot add ValEnum to ValEnum list of Property."); + return TRUE; } @@ -621,17 +660,14 @@ SmlDevInfPropParam *param, GError **error) { - g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); - if (!param) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "The SmlDevInfPropParam object is missing."); - return FALSE; - } + 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."); + g_object_ref(param); self->priv->params = g_list_append(self->priv->params, param); - if (!self->priv->params) { - *error = g_error_new(SML_ERROR, SML_ERROR_GENERIC, "Cannot add PropParam to PropParam list of Property."); - return FALSE; - } + sml_return_val_error_if_fail (self->priv->params, FALSE, error, SML_ERROR_GENERIC, "Cannot add PropParam to PropParam list of Property."); + return TRUE; } |
From: <svn...@op...> - 2009-06-22 08:55:04
|
Author: bellmich Date: Mon Jun 22 10:55:01 2009 New Revision: 1106 URL: http://libsyncml.opensync.org/changeset/1106 Log: committed patch from krake for ticket #241 Modified: branches/libsyncml-0.5.x/libsyncml/data_sync_api/standard.h branches/libsyncml-0.5.x/libsyncml/sml_manager.h branches/libsyncml-0.5.x/libsyncml/sml_session.h trunk/libsyncml/data_sync_api/standard.h trunk/libsyncml/sml_manager.h trunk/libsyncml/sml_session.h Modified: branches/libsyncml-0.5.x/libsyncml/data_sync_api/standard.h ============================================================================== --- branches/libsyncml-0.5.x/libsyncml/data_sync_api/standard.h Mon Jun 22 10:50:55 2009 (r1105) +++ branches/libsyncml-0.5.x/libsyncml/data_sync_api/standard.h Mon Jun 22 10:55:01 2009 (r1106) @@ -49,7 +49,7 @@ SML_DATA_SYNC_EVENT_GOT_ALL_CHANGES = 3, SML_DATA_SYNC_EVENT_GOT_ALL_MAPPINGS = 4, SML_DATA_SYNC_EVENT_DISCONNECT = 5, - SML_DATA_SYNC_EVENT_FINISHED = 6, + SML_DATA_SYNC_EVENT_FINISHED = 6 } SmlDataSyncEventType; typedef struct SmlDataSyncObject SmlDataSyncObject; Modified: branches/libsyncml-0.5.x/libsyncml/sml_manager.h ============================================================================== --- branches/libsyncml-0.5.x/libsyncml/sml_manager.h Mon Jun 22 10:50:55 2009 (r1105) +++ branches/libsyncml-0.5.x/libsyncml/sml_manager.h Mon Jun 22 10:55:01 2009 (r1106) @@ -40,7 +40,7 @@ SML_MANAGER_SESSION_FLUSH, SML_MANAGER_SESSION_WARNING, SML_MANAGER_SESSION_ERROR, - SML_MANAGER_SESSION_ESTABLISHED, + SML_MANAGER_SESSION_ESTABLISHED } SmlManagerEventType; typedef void (* SmlManagerEventCb) (SmlManager *manager, SmlManagerEventType type, SmlSession *session, SmlError *error, void *userdata); Modified: branches/libsyncml-0.5.x/libsyncml/sml_session.h ============================================================================== --- branches/libsyncml-0.5.x/libsyncml/sml_session.h Mon Jun 22 10:50:55 2009 (r1105) +++ branches/libsyncml-0.5.x/libsyncml/sml_session.h Mon Jun 22 10:55:01 2009 (r1106) @@ -37,7 +37,7 @@ SML_SESSION_EVENT_FLUSH, SML_SESSION_EVENT_COMMAND_END, SML_SESSION_EVENT_RESPONSE_URI, - SML_SESSION_EVENT_ESTABLISHED, + SML_SESSION_EVENT_ESTABLISHED } SmlSessionEventType; typedef void (* SmlSessionEventCallback) (SmlSession *session, SmlSessionEventType type, SmlCommand *command, SmlCommand *parent, SmlStatus *reply, SmlError *error, void *userdata); Modified: trunk/libsyncml/data_sync_api/standard.h ============================================================================== --- trunk/libsyncml/data_sync_api/standard.h Mon Jun 22 10:50:55 2009 (r1105) +++ trunk/libsyncml/data_sync_api/standard.h Mon Jun 22 10:55:01 2009 (r1106) @@ -49,7 +49,7 @@ SML_DATA_SYNC_EVENT_GOT_ALL_CHANGES = 3, SML_DATA_SYNC_EVENT_GOT_ALL_MAPPINGS = 4, SML_DATA_SYNC_EVENT_DISCONNECT = 5, - SML_DATA_SYNC_EVENT_FINISHED = 6, + SML_DATA_SYNC_EVENT_FINISHED = 6 } SmlDataSyncEventType; typedef struct SmlDataSyncObject SmlDataSyncObject; Modified: trunk/libsyncml/sml_manager.h ============================================================================== --- trunk/libsyncml/sml_manager.h Mon Jun 22 10:50:55 2009 (r1105) +++ trunk/libsyncml/sml_manager.h Mon Jun 22 10:55:01 2009 (r1106) @@ -40,7 +40,7 @@ SML_MANAGER_SESSION_FLUSH, SML_MANAGER_SESSION_WARNING, SML_MANAGER_SESSION_ERROR, - SML_MANAGER_SESSION_ESTABLISHED, + SML_MANAGER_SESSION_ESTABLISHED } SmlManagerEventType; typedef void (* SmlManagerEventCb) (SmlManager *manager, SmlManagerEventType type, SmlSession *session, SmlError *error, void *userdata); Modified: trunk/libsyncml/sml_session.h ============================================================================== --- trunk/libsyncml/sml_session.h Mon Jun 22 10:50:55 2009 (r1105) +++ trunk/libsyncml/sml_session.h Mon Jun 22 10:55:01 2009 (r1106) @@ -37,7 +37,7 @@ SML_SESSION_EVENT_FLUSH, SML_SESSION_EVENT_COMMAND_END, SML_SESSION_EVENT_RESPONSE_URI, - SML_SESSION_EVENT_ESTABLISHED, + SML_SESSION_EVENT_ESTABLISHED } SmlSessionEventType; typedef void (* SmlSessionEventCallback) (SmlSession *session, SmlSessionEventType type, SmlCommand *command, SmlCommand *parent, SmlStatus *reply, SmlError *error, void *userdata); |
From: <svn...@op...> - 2009-06-22 08:51:02
|
Author: bellmich Date: Mon Jun 22 10:50:55 2009 New Revision: 1105 URL: http://libsyncml.opensync.org/changeset/1105 Log: applied patch from krake (ticket #243) Modified: branches/libsyncml-0.5.x/libsyncml-1.0.pc.cmake.in trunk/libsyncml-1.0.pc.cmake.in Modified: branches/libsyncml-0.5.x/libsyncml-1.0.pc.cmake.in ============================================================================== --- branches/libsyncml-0.5.x/libsyncml-1.0.pc.cmake.in Mon Jun 22 10:32:38 2009 (r1104) +++ branches/libsyncml-0.5.x/libsyncml-1.0.pc.cmake.in Mon Jun 22 10:50:55 2009 (r1105) @@ -7,5 +7,6 @@ Name: libsyncml Description: SyncML protocol library Version: @LIBSYNCML_VERSION@ +Requires: glib-2.0 gobject-2.0 Libs: -L${libdir} -lsyncml Cflags: -I${includedir} Modified: trunk/libsyncml-1.0.pc.cmake.in ============================================================================== --- trunk/libsyncml-1.0.pc.cmake.in Mon Jun 22 10:32:38 2009 (r1104) +++ trunk/libsyncml-1.0.pc.cmake.in Mon Jun 22 10:50:55 2009 (r1105) @@ -7,5 +7,6 @@ Name: libsyncml Description: SyncML protocol library Version: @LIBSYNCML_VERSION@ +Requires: glib-2.0 gobject-2.0 Libs: -L${libdir} -lsyncml Cflags: -I${includedir} |
From: <svn...@op...> - 2009-06-22 08:32:45
|
Author: bellmich Date: Mon Jun 22 10:32:38 2009 New Revision: 1104 URL: http://libsyncml.opensync.org/changeset/1104 Log: attach the cmake modules dynamically Modified: branches/libsyncml-0.5.x/ (props changed) |
From: <svn...@op...> - 2009-06-21 23:52:47
|
Author: dgollub Date: Mon Jun 22 01:52:43 2009 New Revision: 5682 URL: http://www.opensync.org/changeset/5682 Log: Add missing parsing of the CapsFormat name refs #1084 Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 01:36:54 2009 (r5681) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 01:52:43 2009 (r5682) @@ -85,6 +85,7 @@ OSyncCapability *capability = NULL; OSyncCapabilities *capabilities = NULL; xmlNodePtr cur = NULL; + xmlChar *capsformat; osync_trace(TRACE_ENTRY, "%s(%p, %u, %p)", __func__, buffer, size, error); osync_assert(buffer); @@ -102,6 +103,12 @@ goto error; } capabilities->doc->_private = capabilities; + + + /* Get CapsFormat Name */ + capsformat = xmlGetProp(capabilities->doc->children, (const xmlChar*)"CapsFormat"); + osync_capabilities_set_format(capabilities, (const char *) capsformat); + xmlFree(capsformat); cur = xmlDocGetRootElement(capabilities->doc); |
From: <svn...@op...> - 2009-06-21 23:37:01
|
Author: dgollub Date: Mon Jun 22 01:36:54 2009 New Revision: 5681 URL: http://www.opensync.org/changeset/5681 Log: Exported osync_capabilities_objtype_new to public API. For plugin discovery function refs #1084 Modified: branches/opensync-ticket1084/opensync.sym branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.h branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h Modified: branches/opensync-ticket1084/opensync.sym ============================================================================== --- branches/opensync-ticket1084/opensync.sym Mon Jun 22 01:29:13 2009 (r5680) +++ branches/opensync-ticket1084/opensync.sym Mon Jun 22 01:36:54 2009 (r5681) @@ -2,6 +2,7 @@ osync_capabilities_get_objtype osync_capabilities_new osync_capabilities_objtype_get_caps +osync_capabilities_objtype_new osync_capabilities_ref osync_capabilities_unref osync_capability_get_displayname Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.h Mon Jun 22 01:29:13 2009 (r5680) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.h Mon Jun 22 01:36:54 2009 (r5681) @@ -32,6 +32,15 @@ */ /*@{*/ + +/** + * @brief Creates a new capabilities object type object + * @param error The error which will hold the info in case of an error + * @return The pointer to the newly allocated capabilities object type object or NULL in case of error + */ + +OSYNC_EXPORT OSyncCapabilitiesObjType *osync_capabilities_objtype_new(OSyncCapabilities *capabilities, const char *objtype, OSyncError **error); + OSYNC_EXPORT OSyncList *osync_capabilities_objtype_get_caps(OSyncCapabilitiesObjType *capsobjtype); /*@}*/ Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h Mon Jun 22 01:29:13 2009 (r5680) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h Mon Jun 22 01:36:54 2009 (r5681) @@ -33,15 +33,6 @@ /*@{*/ /** - * @brief Creates a new capabilities object type object - * @param error The error which will hold the info in case of an error - * @return The pointer to the newly allocated capabilities object type object or NULL in case of error - */ - -OSYNC_TEST_EXPORT OSyncCapabilitiesObjType *osync_capabilities_objtype_new(OSyncCapabilities *capabilities, const char *objtype, OSyncError **error); - - -/** * @brief Creates a new capabilitiesobjtype object * @param capabilities The pointer to a capabilities object * @param node The ObjType XML node |
From: <svn...@op...> - 2009-06-21 23:29:16
|
Author: dgollub Date: Mon Jun 22 01:29:13 2009 New Revision: 5680 URL: http://www.opensync.org/changeset/5680 Log: fix build of wrapper. Dropped obsolate interface. Adapted to new osync_capabilities_new() interface. Modified: branches/opensync-ticket1084/wrapper/opensync-merger.i Modified: branches/opensync-ticket1084/wrapper/opensync-merger.i ============================================================================== --- branches/opensync-ticket1084/wrapper/opensync-merger.i Mon Jun 22 01:24:36 2009 (r5679) +++ branches/opensync-ticket1084/wrapper/opensync-merger.i Mon Jun 22 01:29:13 2009 (r5680) @@ -29,9 +29,9 @@ typedef struct {} Capabilities; %extend Capabilities { - Capabilities() { + Capabilities(const char *capsformat) { Error *err = NULL; - Capabilities *caps = osync_capabilities_new(&err); + Capabilities *caps = osync_capabilities_new(capsformat, &err); if (raise_exception_on_error(err)) return NULL; else @@ -41,20 +41,6 @@ ~Capabilities() { osync_capabilities_unref(self); } - - /* returns a python string object */ - PyObject *assemble() { - char *buf; - int size; - Error *err = NULL; - osync_bool ret = osync_capabilities_assemble(self, &buf, &size, &err); - if (raise_exception_on_error(err)) - return NULL; - - PyObject *obj = PyString_FromStringAndSize(buf, size); - free(buf); - return obj; - } } /* FIXME: cstring_input_binary is broken in my version of swig, so I've recreated it here */ @@ -66,18 +52,6 @@ } } - %inline %{ - static Capabilities *capabilities_parse(const char *buffer, size_t size) { - Error *err = NULL; - Capabilities *caps = osync_capabilities_parse(buffer, (unsigned int)size, &err); - if (raise_exception_on_error(err)) - return NULL; - else - return caps; /* new object, no need to inc ref */ - } -%} - - %{ /* convert an XMLFieldList to a python list */ static PyObject *xmlfieldlist_to_pylist(XMLFieldList *list) |
From: <svn...@op...> - 2009-06-21 23:24:41
|
Author: dgollub Date: Mon Jun 22 01:24:36 2009 New Revision: 5679 URL: http://www.opensync.org/changeset/5679 Log: Dropped assemble/prase interface from OSyncCapabilities API osynctool requries porting. Applications must not have direct access to edit the internal stored format (e.g. XML editing via editor) refs #1084 Modified: branches/opensync-ticket1084/opensync.sym branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h branches/opensync-ticket1084/opensync/client/opensync_client_proxy.c Modified: branches/opensync-ticket1084/opensync.sym ============================================================================== --- branches/opensync-ticket1084/opensync.sym Mon Jun 22 01:13:07 2009 (r5678) +++ branches/opensync-ticket1084/opensync.sym Mon Jun 22 01:24:36 2009 (r5679) @@ -1,8 +1,7 @@ -osync_capabilities_assemble osync_capabilities_get_format +osync_capabilities_get_objtype osync_capabilities_new osync_capabilities_objtype_get_caps -osync_capabilities_parse osync_capabilities_ref osync_capabilities_unref osync_capability_get_displayname Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h Mon Jun 22 01:13:07 2009 (r5678) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h Mon Jun 22 01:24:36 2009 (r5679) @@ -43,15 +43,6 @@ OSYNC_EXPORT OSyncCapabilities *osync_capabilities_new(const char *capsformat, OSyncError **error); /** - * @brief Creates a new capabilities object from an xml document. - * @param buffer The pointer to the xml document - * @param size The size of the xml document - * @param error The error which will hold the info in case of an error - * @return The pointer to the newly allocated capabilities object or NULL in case of error - */ -OSYNC_EXPORT OSyncCapabilities *osync_capabilities_parse(const char *buffer, unsigned int size, OSyncError **error); - -/** * @brief Increments the reference counter * @param capabilities The pointer to a capabilities object */ @@ -64,24 +55,13 @@ */ OSYNC_EXPORT void osync_capabilities_unref(OSyncCapabilities *capabilities); - /** - * @brief Get the first capability for a given objtype from the capabilities + * @brief Get the first capabilitiesobjtype for a given objtype from the capabilities * @param capabilities The pointer to a capabilities object * @param objtype The name of the objtype (e.g.: contact) - * @return The first capability for a given objtype from the capabilities + * @return The capabilitiesobjtype for a given objtype from the capabilities */ -OSYNC_EXPORT OSyncCapability *osync_capabilities_get_first(OSyncCapabilities *capabilities, const char *objtype); - -/** - * @brief Dump the capabilities into memory. - * @param capabilities The pointer to a capabilities object - * @param error The error which will hold the info in case of an error - * @return The xml document and the size of it. It's up to the caller to free - * the buffer. Always it return TRUE. - */ -OSYNC_EXPORT osync_bool osync_capabilities_assemble(OSyncCapabilities *capabilities, char **buffer, int *size, OSyncError **error); - +OSYNC_EXPORT OSyncCapabilitiesObjType *osync_capabilities_get_objtype(OSyncCapabilities *capabilities, const char *objtype); OSYNC_EXPORT const char *osync_capabilities_get_format(OSyncCapabilities *capabilities); Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h Mon Jun 22 01:13:07 2009 (r5678) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h Mon Jun 22 01:24:36 2009 (r5679) @@ -68,12 +68,22 @@ OSYNC_TEST_EXPORT OSyncCapabilities *osync_capabilities_load_identifier(const char *file, OSyncError **error); /** - * @brief Get the first capabilitiesobjtype for a given objtype from the capabilities - * @param capabilities The pointer to a capabilities object - * @param objtype The name of the objtype (e.g.: contact) - * @return The capabilitiesobjtype for a given objtype from the capabilities + * @brief Dump the capabilities into memory. + * @param capabilities The pointer to a capabilities object + * @param error The error which will hold the info in case of an error + * @return The xml document and the size of it. It's up to the caller to free + * the buffer. Always it return TRUE. */ -OSYNC_TEST_EXPORT OSyncCapabilitiesObjType *osync_capabilities_get_objtype(OSyncCapabilities *capabilities, const char *objtype); +OSYNC_TEST_EXPORT osync_bool osync_capabilities_assemble(OSyncCapabilities *capabilities, char **buffer, int *size, OSyncError **error); + +/** + * @brief Creates a new capabilities object from an xml document. + * @param buffer The pointer to the xml document + * @param size The size of the xml document + * @param error The error which will hold the info in case of an error + * @return The pointer to the newly allocated capabilities object or NULL in case of error + */ +OSYNC_TEST_EXPORT OSyncCapabilities *osync_capabilities_parse(const char *buffer, unsigned int size, OSyncError **error); /*@}*/ Modified: branches/opensync-ticket1084/opensync/client/opensync_client_proxy.c ============================================================================== --- branches/opensync-ticket1084/opensync/client/opensync_client_proxy.c Mon Jun 22 01:13:07 2009 (r5678) +++ branches/opensync-ticket1084/opensync/client/opensync_client_proxy.c Mon Jun 22 01:24:36 2009 (r5679) @@ -30,6 +30,8 @@ #include "plugin/opensync_objtype_sink_internals.h" #include "opensync-capabilities.h" +#include "capabilities/opensync_capabilities_internals.h" + #include "opensync-group.h" #include "opensync-plugin.h" #include "opensync-format.h" |
From: <svn...@op...> - 2009-06-21 23:13:16
|
Author: dgollub Date: Mon Jun 22 01:13:07 2009 New Revision: 5678 URL: http://www.opensync.org/changeset/5678 Log: Fixed wrong error struct reference (compiler warning) Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 00:55:33 2009 (r5677) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 01:13:07 2009 (r5678) @@ -242,7 +242,7 @@ filename = osync_strdup_printf("%s%c%s", OPENSYNC_CAPABILITIESDIR, G_DIR_SEPARATOR, file); - capabilities = osync_capabilities_load(filename, &error); + capabilities = osync_capabilities_load(filename, error); if (!capabilities) goto error; |
From: <svn...@op...> - 2009-06-21 22:55:37
|
Author: dgollub Date: Mon Jun 22 00:55:33 2009 New Revision: 5677 URL: http://www.opensync.org/changeset/5677 Log: Added interfaces and tests to save and load capabilities as file refs #1084 Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h branches/opensync-ticket1084/opensync/group/opensync_member.c branches/opensync-ticket1084/opensync/version/opensync_version.c branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 00:18:50 2009 (r5676) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 00:55:33 2009 (r5677) @@ -175,20 +175,46 @@ return FALSE; } +osync_bool osync_capabilities_save(OSyncCapabilities *capabilities, const char *file, OSyncError **error) +{ + unsigned int size; + char *buffer; + osync_bool ret; + + osync_trace(TRACE_ENTRY, "%s(%p, %s, %p)", __func__, capabilities, __NULLSTR(file), error); + + osync_assert(capabilities); + osync_assert(file); + + ret = osync_capabilities_assemble(capabilities, &buffer, &size, error); + if (!ret) + goto error; + + ret = osync_file_write(file, buffer, size, 0600, error); + osync_free(buffer); + + if (!ret) + goto error; + + osync_trace(TRACE_EXIT, "%s", __func__); + return TRUE; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); + return FALSE; +} + OSyncCapabilities *osync_capabilities_load(const char *file, OSyncError **error) { unsigned int size; - char *buffer, *filename; + char *buffer; OSyncCapabilities *capabilities; osync_bool b; osync_trace(TRACE_ENTRY, "%s(%s, %p)", __func__, file, error); osync_assert(file); - filename = osync_strdup_printf("%s%c%s", OPENSYNC_CAPABILITIESDIR, G_DIR_SEPARATOR, file); - - b = osync_file_read(filename, &buffer, &size, error); - osync_free(filename); + b = osync_file_read(file, &buffer, &size, error); if(!b) { osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); return NULL; @@ -205,6 +231,29 @@ return capabilities; } +OSyncCapabilities *osync_capabilities_load_identifier(const char *file, OSyncError **error) +{ + unsigned int size; + char *buffer, *filename; + OSyncCapabilities *capabilities; + + osync_trace(TRACE_ENTRY, "%s(%s, %p)", __func__, file, error); + osync_assert(file); + + filename = osync_strdup_printf("%s%c%s", OPENSYNC_CAPABILITIESDIR, G_DIR_SEPARATOR, file); + + capabilities = osync_capabilities_load(filename, &error); + if (!capabilities) + goto error; + + osync_trace(TRACE_EXIT, "%s: %p", __func__, capabilities); + return capabilities; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); + return NULL; +} + const char *osync_capabilities_get_format(OSyncCapabilities *capabilities) { osync_assert(capabilities); Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h Mon Jun 22 00:18:50 2009 (r5676) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h Mon Jun 22 00:55:33 2009 (r5677) @@ -39,14 +39,33 @@ */ OSYNC_TEST_EXPORT void osync_capabilities_sort(OSyncCapabilities *capabilities); +/** + * @brief Save a capabilities object in a file + * @param capabilities The pointer to a capabilities object + * @param file The name of the file + * @param error The error which will hold the info in case of an error + * @return TRUE on success, FALSE otherwise + */ +OSYNC_TEST_EXPORT osync_bool osync_capabilities_save(OSyncCapabilities *capabilities, const char *file, OSyncError **error); + +/** + * @brief Load a capabilities object from a file + * @param file The name of the file + * @param error The error which will hold the info in case of an error + * @return The pointer to the newly allocated capabilities object or NULL in case of error + */ +OSYNC_TEST_EXPORT OSyncCapabilities *osync_capabilities_load(const char *file, OSyncError **error); /** * @brief Load a capabilities object from a prepackaged file + * + * The location of the prepackaged file is: OPENSYNC_CAPABILITIESDIR/$file + * * @param file The name of the file * @param error The error which will hold the info in case of an error * @return The pointer to the newly allocated capabilities object or NULL in case of error */ -OSyncCapabilities *osync_capabilities_load(const char *file, OSyncError **error); +OSYNC_TEST_EXPORT OSyncCapabilities *osync_capabilities_load_identifier(const char *file, OSyncError **error); /** * @brief Get the first capabilitiesobjtype for a given objtype from the capabilities Modified: branches/opensync-ticket1084/opensync/group/opensync_member.c ============================================================================== --- branches/opensync-ticket1084/opensync/group/opensync_member.c Mon Jun 22 00:18:50 2009 (r5676) +++ branches/opensync-ticket1084/opensync/group/opensync_member.c Mon Jun 22 00:55:33 2009 (r5677) @@ -985,8 +985,7 @@ OSyncCapabilities* osync_member_load_capabilities(OSyncMember *member, OSyncError** error) { - unsigned int size; - char* buffer, *filename; + char *filename; OSyncCapabilities *capabilities; osync_bool res; @@ -994,45 +993,35 @@ osync_assert(member); filename = osync_strdup_printf("%s%ccapabilities.xml", osync_member_get_configdir(member), G_DIR_SEPARATOR); - res = osync_file_read(filename, &buffer, &size, error); + capabilities = osync_capabilities_load(filename, error); osync_free(filename); - - if(!res) { - osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); - return NULL; - } - - capabilities = osync_capabilities_parse(buffer, size, error); - osync_free(buffer); - if(!capabilities) { - osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); - return NULL; - } + + if (!capabilities) + goto error; osync_trace(TRACE_EXIT, "%s: %p", __func__, capabilities); return capabilities; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); + return NULL; } osync_bool osync_member_save_capabilities(OSyncMember *member, OSyncCapabilities* capabilities, OSyncError** error) { - int size; - char* buffer, *filename; + char *filename; osync_bool res; osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, member, capabilities, error); osync_assert(member); osync_assert(capabilities); - if (!osync_capabilities_assemble(capabilities, &buffer, &size, error)) - goto error; filename = osync_strdup_printf("%s%ccapabilities.xml", osync_member_get_configdir(member), G_DIR_SEPARATOR); - res = osync_file_write(filename, buffer, size, 0600, error); + res = osync_capabilities_save(capabilities, filename, error); osync_free(filename); - osync_free(buffer); if (!res) goto error; - osync_trace(TRACE_EXIT, "%s: %i", __func__, res); return res; Modified: branches/opensync-ticket1084/opensync/version/opensync_version.c ============================================================================== --- branches/opensync-ticket1084/opensync/version/opensync_version.c Mon Jun 22 00:18:50 2009 (r5676) +++ branches/opensync-ticket1084/opensync/version/opensync_version.c Mon Jun 22 00:55:33 2009 (r5677) @@ -470,7 +470,7 @@ { osync_trace(TRACE_INTERNAL, "Found capabilities file by version: %s ", (const char*)osync_version_get_identifier(winner)); - capabilities = osync_capabilities_load((const char*)osync_version_get_identifier(winner), error); + capabilities = osync_capabilities_load_identifier((const char*)osync_version_get_identifier(winner), error); osync_version_unref(winner); if (!capabilities) Modified: branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c ============================================================================== --- branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c Mon Jun 22 00:18:50 2009 (r5676) +++ branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c Mon Jun 22 00:55:33 2009 (r5677) @@ -49,11 +49,11 @@ START_TEST (capabilities_parse) { char *testbed = setup_testbed("capabilities"); + + char *dummy_caps_file = osync_strdup_printf("%s%cdummy.caps", testbed, G_DIR_SEPARATOR); OSyncCapability *capability; OSyncError *error = NULL; - char* buffer; - unsigned int size; OSyncCapabilities *capabilities = osync_capabilities_new("testformat", &error); fail_unless(capabilities != NULL, NULL); @@ -85,15 +85,13 @@ osync_capability_set_name(capability, "capmock3"); - fail_unless(osync_capabilities_assemble(capabilities, &buffer, &size, &error) != FALSE, NULL); + fail_unless(osync_capabilities_save(capabilities, dummy_caps_file, &error) != FALSE, NULL); fail_unless(error == NULL, NULL); - fail_unless(size > 0, NULL); - fail_unless(buffer != NULL, NULL); osync_capabilities_unref(capabilities); /** Parse */ - capabilities = osync_capabilities_parse(buffer, size, &error); + capabilities = osync_capabilities_load(dummy_caps_file, &error); fail_unless(capabilities != NULL, NULL); fail_unless(error == NULL, NULL); @@ -120,7 +118,7 @@ osync_capabilities_unref(capabilities); - g_free(buffer); + osync_free(dummy_caps_file); destroy_testbed(testbed); } |
From: <svn...@op...> - 2009-06-21 22:18:58
|
Author: dgollub Date: Mon Jun 22 00:18:50 2009 New Revision: 5676 URL: http://www.opensync.org/changeset/5676 Log: Fixed assembling and parsing of new capabilities interface refs #1084 Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.c branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h branches/opensync-ticket1084/opensync/capabilities/opensync_capability.c branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.c Mon Jun 22 00:18:50 2009 (r5676) @@ -32,7 +32,7 @@ #include "opensync_capabilities_private.h" -OSyncCapabilities *osync_capabilities_new(OSyncError **error) +OSyncCapabilities *osync_capabilities_new(const char *capsformat, OSyncError **error) { OSyncCapabilities *capabilities = NULL; osync_trace(TRACE_ENTRY, "%s(%p)", __func__, error); @@ -45,8 +45,10 @@ capabilities->ref_count = 1; capabilities->doc = xmlNewDoc(BAD_CAST "1.0"); - capabilities->doc->children = xmlNewDocNode(capabilities->doc, NULL, (xmlChar *)"capabilities", NULL); + capabilities->doc->children = xmlNewDocNode(capabilities->doc, NULL, (xmlChar *)"Caps", NULL); capabilities->doc->_private = capabilities; + + osync_capabilities_set_format(capabilities, capsformat); osync_trace(TRACE_EXIT, "%s: %p", __func__, capabilities); return capabilities; @@ -105,17 +107,17 @@ cur = cur->children; for(; cur != NULL; cur = cur->next) { + + if (cur->type != XML_ELEMENT_NODE) + continue; + OSyncCapabilitiesObjType *capabilitiesobjtype = osync_capabilities_objtype_parse(capabilities, cur, error); if (!capabilitiesobjtype) { osync_capabilities_unref(capabilities); goto error; } - - capabilities->objtypes = osync_list_prepend(capabilities->objtypes, capabilitiesobjtype); } - capabilities->objtypes = osync_list_reverse(capabilities->objtypes); - osync_trace(TRACE_EXIT, "%s: %p", __func__, capabilities); return capabilities; @@ -143,13 +145,7 @@ goto error; } - doc = xmlNewDoc((xmlChar*)"1.0"); - if (!doc) - goto error_oom; - - doc->children = xmlNewDocNode(doc, NULL, (xmlChar*)"Caps", NULL); - if (!doc) - goto error_oom; + doc = capabilities->doc; /* Set version for capabilities configuration */ version_str = osync_strdup_printf("%u.%u", OSYNC_CAPS_MAJOR_VERSION, OSYNC_CAPS_MINOR_VERSION); @@ -168,7 +164,7 @@ goto error; } - xmlDocDumpFormatMemoryEnc(capabilities->doc, (xmlChar **) buffer, size, NULL, 1); + xmlDocDumpFormatMemoryEnc(doc, (xmlChar **) buffer, size, NULL, 1); return TRUE; @@ -215,6 +211,17 @@ return capabilities->format; } +void osync_capabilities_set_format(OSyncCapabilities *capabilities, const char *capsformat) +{ + osync_assert(capabilities); + osync_assert(capsformat); + + if (capabilities->format) + osync_free(capabilities->format); + + capabilities->format = osync_strdup(capsformat); +} + OSyncCapabilitiesObjType *osync_capabilities_get_objtype(OSyncCapabilities *capabilities, const char *objtype) { OSyncList *l = NULL; @@ -232,3 +239,13 @@ return capobjtype; } + +void osync_capabilities_add_objtype(OSyncCapabilities *capabilities, OSyncCapabilitiesObjType *capabilitiesobjtype) +{ + osync_assert(capabilities); + osync_assert(capabilitiesobjtype); + + + capabilities->objtypes = osync_list_append(capabilities->objtypes, capabilitiesobjtype); +} + Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities.h Mon Jun 22 00:18:50 2009 (r5676) @@ -36,10 +36,11 @@ /** * @brief Creates a new capabilities object + * @param capsformat Name of the used capabilities format * @param error The error which will hold the info in case of an error * @return The pointer to the newly allocated capabilities object or NULL in case of error */ -OSYNC_EXPORT OSyncCapabilities *osync_capabilities_new(OSyncError **error); +OSYNC_EXPORT OSyncCapabilities *osync_capabilities_new(const char *capsformat, OSyncError **error); /** * @brief Creates a new capabilities object from an xml document. Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_internals.h Mon Jun 22 00:18:50 2009 (r5676) @@ -58,6 +58,11 @@ /*@}*/ + +OSYNC_TEST_EXPORT void osync_capabilities_add_objtype(OSyncCapabilities *capabilities, OSyncCapabilitiesObjType *capsobjtype); + +OSYNC_TEST_EXPORT void osync_capabilities_set_format(OSyncCapabilities *capabilities, const char *capsformat); + OSYNC_TEST_EXPORT OSyncCapabilityParameter *osync_capability_parameter_new(OSyncError **error); OSYNC_TEST_EXPORT OSyncCapabilityParameter *osync_capability_parameter_ref(OSyncCapabilityParameter *capparam); OSYNC_TEST_EXPORT void osync_capability_parameter_unref(OSyncCapabilityParameter *capparam); Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.c ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.c Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype.c Mon Jun 22 00:18:50 2009 (r5676) @@ -38,9 +38,11 @@ capobjtype = osync_try_malloc0(sizeof(OSyncCapabilitiesObjType), error); if (!capobjtype) goto error; - + capobjtype->name = osync_strdup(objtype); + osync_capabilities_add_objtype(capabilities, capobjtype); + return capobjtype; error: @@ -67,11 +69,12 @@ cur = node->children; for(; cur != NULL; cur = cur->next) { + + if (cur->type != XML_ELEMENT_NODE) + continue; + if (!(capability = osync_capability_parse(capobjtype, cur, error))) goto error; - - /* TODO: prepend instaed of append */ - capobjtype->capabilities = osync_list_append(capobjtype->capabilities, capability); } return capobjtype; @@ -153,3 +156,9 @@ return capsobjtype->capabilities; } +void osync_capabilities_objtype_add_capability(OSyncCapabilitiesObjType *capsobjtype, OSyncCapability *capability) +{ + osync_assert(capsobjtype); + capsobjtype->capabilities = osync_list_append(capsobjtype->capabilities, capability); +} + Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capabilities_objtype_internals.h Mon Jun 22 00:18:50 2009 (r5676) @@ -60,6 +60,8 @@ OSYNC_TEST_EXPORT osync_bool osync_capabilities_objtype_assemble(OSyncCapabilitiesObjType *capsobjtype, xmlNode *node, OSyncError **error); +OSYNC_TEST_EXPORT void osync_capabilities_objtype_add_capability(OSyncCapabilitiesObjType *capsobjtype, OSyncCapability *capability); + /*@}*/ #endif /*OPENSYNC_CAPABILITIES_OBJTYPE_INTERNAL_H_*/ Modified: branches/opensync-ticket1084/opensync/capabilities/opensync_capability.c ============================================================================== --- branches/opensync-ticket1084/opensync/capabilities/opensync_capability.c Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/opensync/capabilities/opensync_capability.c Mon Jun 22 00:18:50 2009 (r5676) @@ -94,7 +94,7 @@ osync_assert(cap); osync_assert(node); - cur = xmlNewChild(cur, NULL, (xmlChar*)"Cap", NULL); + cur = xmlNewChild(node, NULL, (xmlChar*)"Cap", NULL); if (!cur) goto error_oom; @@ -162,8 +162,7 @@ if(!capability) goto error; - l = osync_capabilities_objtype_get_caps(capobjtype); - l = osync_list_prepend(l, capability); + osync_capabilities_objtype_add_capability(capobjtype, capability); osync_trace(TRACE_EXIT, "%s: %p", __func__, capability); return capability; Modified: branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c ============================================================================== --- branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c Sun Jun 21 16:16:08 2009 (r5675) +++ branches/opensync-ticket1084/tests/capabilities-tests/check_capabilities.c Mon Jun 22 00:18:50 2009 (r5676) @@ -8,7 +8,7 @@ char *testbed = setup_testbed("capabilities"); OSyncError *error = NULL; - OSyncCapabilities *capabilities = osync_capabilities_new(&error); + OSyncCapabilities *capabilities = osync_capabilities_new("testformat", &error); fail_unless(capabilities != NULL, NULL); fail_unless(error == NULL, NULL); @@ -26,7 +26,7 @@ char *testbed = setup_testbed("capabilities"); OSyncError *error = NULL; - OSyncCapabilities *capabilities = osync_capabilities_new(&error); + OSyncCapabilities *capabilities = osync_capabilities_new("testformat", &error); fail_unless(capabilities != NULL, NULL); fail_unless(error == NULL, NULL); @@ -50,23 +50,73 @@ { char *testbed = setup_testbed("capabilities"); + OSyncCapability *capability; OSyncError *error = NULL; char* buffer; unsigned int size; - fail_unless(osync_file_read("capabilities.xml", &buffer, &size, &error), NULL); - OSyncCapabilities *capabilities = osync_capabilities_parse(buffer, size, &error); + OSyncCapabilities *capabilities = osync_capabilities_new("testformat", &error); fail_unless(capabilities != NULL, NULL); fail_unless(error == NULL, NULL); - OSyncCapabilitiesObjType *capsobjtype = osync_capabilities_get_objtype(capabilities, "contact"); + + OSyncCapabilitiesObjType *capsobjtype = osync_capabilities_objtype_new(capabilities, "contact", &error); + fail_unless(capsobjtype != NULL, NULL); + fail_unless(error == NULL, NULL); + + /** capmock1 */ + capability = osync_capability_new(capsobjtype, &error); + fail_unless(capability != NULL, NULL); + fail_unless(error == NULL, NULL); + + osync_capability_set_name(capability, "capmock1"); + + /** capmock2 */ + capability = osync_capability_new(capsobjtype, &error); + fail_unless(capability != NULL, NULL); + fail_unless(error == NULL, NULL); + + osync_capability_set_name(capability, "capmock2"); + + /** capmock3 */ + capability = osync_capability_new(capsobjtype, &error); + fail_unless(capability != NULL, NULL); + fail_unless(error == NULL, NULL); + + osync_capability_set_name(capability, "capmock3"); + + fail_unless(osync_capabilities_assemble(capabilities, &buffer, &size, &error) != FALSE, NULL); + fail_unless(error == NULL, NULL); + fail_unless(size > 0, NULL); + fail_unless(buffer != NULL, NULL); + + osync_capabilities_unref(capabilities); + + /** Parse */ + capabilities = osync_capabilities_parse(buffer, size, &error); + fail_unless(capabilities != NULL, NULL); + fail_unless(error == NULL, NULL); + + capsobjtype = osync_capabilities_get_objtype(capabilities, "contact"); fail_unless(capsobjtype != NULL, NULL); OSyncList *c = osync_capabilities_objtype_get_caps(capsobjtype); - fail_unless(osync_list_length(c) == 9, NULL); + fail_unless(osync_list_length(c) == 3, NULL); - OSyncCapability *cap = osync_list_nth_data(c, 6); - fail_unless(!strcmp(osync_capability_get_name(cap), "im_jabber"), NULL); + /** capmock1 */ + OSyncCapability *cap = osync_list_nth_data(c, 0); + fail_unless(cap != NULL, NULL); + fail_unless(!strcmp(osync_capability_get_name(cap), "capmock1"), NULL); + + /** capmock2 */ + cap = osync_list_nth_data(c, 1); + fail_unless(cap != NULL, NULL); + fail_unless(!strcmp(osync_capability_get_name(cap), "capmock2"), NULL); + + /** capmock3 */ + cap = osync_list_nth_data(c, 2); + fail_unless(cap != NULL, NULL); + fail_unless(!strcmp(osync_capability_get_name(cap), "capmock3"), NULL); osync_capabilities_unref(capabilities); |