From: <svn...@op...> - 2009-06-19 08:09:17
|
Author: bellmich Date: Fri Jun 19 10:09:09 2009 New Revision: 1093 URL: http://libsyncml.opensync.org/changeset/1093 Log: migrated SmlDevInfProperty to GObject style Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c trunk/libsyncml/dev_inf_api/sml_dev_inf_property.h trunk/tests/check_dev_inf_property.c Modified: trunk/libsyncml/CMakeLists.txt trunk/libsyncml/data_sync_api/data_sync_devinf.c trunk/libsyncml/parser/sml_xml_assm.c trunk/libsyncml/parser/sml_xml_parse.c trunk/libsyncml/sml_devinf.c trunk/libsyncml/sml_devinf.h trunk/libsyncml/syncml.h trunk/tests/CMakeLists.txt trunk/tests/check_dev_inf_prop_param.c Modified: trunk/libsyncml/CMakeLists.txt ============================================================================== --- trunk/libsyncml/CMakeLists.txt Thu Jun 18 11:16:28 2009 (r1092) +++ trunk/libsyncml/CMakeLists.txt Fri Jun 19 10:09:09 2009 (r1093) @@ -33,8 +33,9 @@ parser/sml_wbxml.c parser/sml_xml_assm.c parser/sml_xml_parse.c - dev_inf_api/sml_dev_inf_prop_param.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 ) IF ( ENABLE_OBEX ) @@ -97,6 +98,7 @@ INSTALL( FILES 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 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 Thu Jun 18 11:16:28 2009 (r1092) +++ trunk/libsyncml/data_sync_api/data_sync_devinf.c Fri Jun 19 10:09:09 2009 (r1093) @@ -32,10 +32,17 @@ smlAssert(ctcap); smlAssert(name); - SmlDevInfProperty *prop = smlDevInfNewProperty(error); - if (!prop) + SmlDevInfProperty *prop = sml_dev_inf_property_new(); + if (!prop) { + smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create new instance of SmlDevInfProperty - out of memory."); + goto error; + } + GError *gerror = NULL; + if (!sml_dev_inf_property_set_prop_name(prop, name, &gerror)) { + smlErrorSet(error, SML_ERROR_GENERIC, "%s", gerror->message); + g_error_free(gerror); goto error; - smlDevInfPropertySetPropName(prop, name); + } smlDevInfCTCapAddProperty(ctcap, prop); smlTrace(TRACE_EXIT, "%s", __func__); @@ -57,14 +64,20 @@ smlAssert(name); smlAssert(value); + GError *gerror = NULL; SmlDevInfProperty *prop = _add_ctcap_property_by_name(ctcap, name, error); if (!prop) goto error; - smlDevInfPropertyAddValEnum(prop, value); + if (!sml_dev_inf_property_add_val_enum(prop, value, &gerror)) + goto error; smlTrace(TRACE_EXIT, "%s", __func__); return prop; error: + if (gerror) { + smlErrorSet(error, gerror->code, gerror->message); + g_error_free(gerror); + } smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); return NULL; } @@ -79,28 +92,39 @@ smlAssert(prop); smlAssert(name); + GError *gerror = NULL; SmlDevInfPropParam *param = sml_dev_inf_prop_param_new(); if (!param) { smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create new PropParam for SyncML device information."); goto error; } - /* FIXME: missing error handling */ - GError *gerror = NULL; - sml_dev_inf_prop_param_set_param_name(param, name, &gerror); - smlDevInfPropertyAddPropParam(prop, param); + if (!sml_dev_inf_prop_param_set_param_name(param, name, &gerror)) + goto error; + if (!sml_dev_inf_property_add_param(prop, param, &gerror)) + goto error; smlTrace(TRACE_EXIT, "%s", __func__); return param; error: + if (gerror) { + smlErrorSet(error, gerror->code, gerror->message); + g_error_free(gerror); + } smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); return NULL; } +#define _ADD_PROPERTY_VAL_ENUM(text) \ + if (sml_dev_inf_property_add_val_enum(prop, text, &gerror)) \ + goto error; #define _ADD_PROPERTY_PARAM(text) \ param = _add_property_param(prop, text, error); \ if (!param) \ goto error; +#define _ADD_PROP_PARAM_VAL_ENUM(text) \ + if (sml_dev_inf_prop_param_add_val_enum(param, text, &gerror)) \ + goto error; #define _ADD_CTCAP_PROPERTY_BY_NAME(text) \ prop = _add_ctcap_property_by_name(ctcap, text, error); \ if (!prop) \ @@ -153,12 +177,12 @@ smlDevInfCTCapSetVerCT(ctcap, "2.1"); _ADD_CTCAP_PROPERTY_BY_NAME("ADR") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "HOME", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "WORK", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "PARCEL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "POSTAL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "INTL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "DOM", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("HOME") + _ADD_PROP_PARAM_VAL_ENUM("WORK") + _ADD_PROP_PARAM_VAL_ENUM("PARCEL") + _ADD_PROP_PARAM_VAL_ENUM("POSTAL") + _ADD_PROP_PARAM_VAL_ENUM("INTL") + _ADD_PROP_PARAM_VAL_ENUM("DOM") _ADD_PROPERTY_PARAM("HOME"); _ADD_PROPERTY_PARAM("WORK"); _ADD_PROPERTY_PARAM("PARCEL"); @@ -171,24 +195,24 @@ _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("END","VCARD") _ADD_CTCAP_PROPERTY_BY_NAME("EMAIL") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "INTERNET", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("INTERNET") _ADD_PROPERTY_PARAM("INTERNET"); _ADD_CTCAP_PROPERTY_BY_NAME("FN") _ADD_CTCAP_PROPERTY_BY_NAME("GEO") _ADD_CTCAP_PROPERTY_BY_NAME("KEY") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "X509", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "PGP", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("X509") + _ADD_PROP_PARAM_VAL_ENUM("PGP") _ADD_PROPERTY_PARAM("X509"); _ADD_PROPERTY_PARAM("PGP"); _ADD_CTCAP_PROPERTY_BY_NAME("LABEL") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "HOME", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "WORK", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "PARCEL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "POSTAL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "INTL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "DOM", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("HOME") + _ADD_PROP_PARAM_VAL_ENUM("WORK") + _ADD_PROP_PARAM_VAL_ENUM("PARCEL") + _ADD_PROP_PARAM_VAL_ENUM("POSTAL") + _ADD_PROP_PARAM_VAL_ENUM("INTL") + _ADD_PROP_PARAM_VAL_ENUM("DOM") _ADD_PROPERTY_PARAM("HOME"); _ADD_PROPERTY_PARAM("WORK"); _ADD_PROPERTY_PARAM("PARCEL"); @@ -197,7 +221,7 @@ _ADD_PROPERTY_PARAM("DOM"); _ADD_CTCAP_PROPERTY_BY_NAME("LOGO") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "JPEG", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("JPEG") _ADD_PROPERTY_PARAM("JPEG"); _ADD_CTCAP_PROPERTY_BY_NAME("MAILER") _ADD_CTCAP_PROPERTY_BY_NAME("N") @@ -205,32 +229,32 @@ _ADD_CTCAP_PROPERTY_BY_NAME("ORG") _ADD_CTCAP_PROPERTY_BY_NAME("PHOTO") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "JPEG", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("JPEG") _ADD_PROPERTY_PARAM("JPEG"); _ADD_CTCAP_PROPERTY_BY_NAME("REV") _ADD_CTCAP_PROPERTY_BY_NAME("ROLE") _ADD_CTCAP_PROPERTY_BY_NAME("SOUND") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "AIFF", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "PCM", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "WAVE", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("AIFF") + _ADD_PROP_PARAM_VAL_ENUM("PCM") + _ADD_PROP_PARAM_VAL_ENUM("WAVE") _ADD_PROPERTY_PARAM("AIFF"); _ADD_PROPERTY_PARAM("PCM"); _ADD_PROPERTY_PARAM("WAVE"); _ADD_CTCAP_PROPERTY_BY_NAME("TEL") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "WORK", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "VOICE", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "PREF", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "PAGER", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "MSG", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "MODEM", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "ISDN", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "HOME", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "FAX", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "CELL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "CAR", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "BBS", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("WORK") + _ADD_PROP_PARAM_VAL_ENUM("VOICE") + _ADD_PROP_PARAM_VAL_ENUM("PREF") + _ADD_PROP_PARAM_VAL_ENUM("PAGER") + _ADD_PROP_PARAM_VAL_ENUM("MSG") + _ADD_PROP_PARAM_VAL_ENUM("MODEM") + _ADD_PROP_PARAM_VAL_ENUM("ISDN") + _ADD_PROP_PARAM_VAL_ENUM("HOME") + _ADD_PROP_PARAM_VAL_ENUM("FAX") + _ADD_PROP_PARAM_VAL_ENUM("CELL") + _ADD_PROP_PARAM_VAL_ENUM("CAR") + _ADD_PROP_PARAM_VAL_ENUM("BBS") _ADD_PROPERTY_PARAM("WORK"); _ADD_PROPERTY_PARAM("VOICE"); _ADD_PROPERTY_PARAM("PREF"); @@ -248,8 +272,8 @@ _ADD_CTCAP_PROPERTY_BY_NAME("UID") _ADD_CTCAP_PROPERTY_BY_NAME("URL") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "WORK", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "HOME", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("WORK") + _ADD_PROP_PARAM_VAL_ENUM("HOME") _ADD_PROPERTY_PARAM("WORK"); _ADD_PROPERTY_PARAM("HOME"); _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "2.1") @@ -280,16 +304,16 @@ _ADD_CTCAP_PROPERTY_BY_NAME("URL") _ADD_CTCAP_PROPERTY_BY_NAME("TEL") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "CELL", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "HOME", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "WORK", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "FAX", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "MODEM", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "VOICE", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("CELL") + _ADD_PROP_PARAM_VAL_ENUM("HOME") + _ADD_PROP_PARAM_VAL_ENUM("WORK") + _ADD_PROP_PARAM_VAL_ENUM("FAX") + _ADD_PROP_PARAM_VAL_ENUM("MODEM") + _ADD_PROP_PARAM_VAL_ENUM("VOICE") _ADD_CTCAP_PROPERTY_BY_NAME("ADR") _ADD_PROPERTY_PARAM("TYPE") - sml_dev_inf_prop_param_add_val_enum(param, "HOME", &gerror); - sml_dev_inf_prop_param_add_val_enum(param, "WORK", &gerror); + _ADD_PROP_PARAM_VAL_ENUM("HOME") + _ADD_PROP_PARAM_VAL_ENUM("WORK") _ADD_CTCAP_PROPERTY_BY_NAME("BDAY") _ADD_CTCAP_PROPERTY_BY_NAME("NOTE") _ADD_CTCAP_PROPERTY_BY_NAME("PHOTO") @@ -319,15 +343,15 @@ _ADD_PROPERTY_PARAM("STATUS") _ADD_PROPERTY_PARAM("ROLE") _ADD_CTCAP_PROPERTY_BY_NAME("BEGIN") - smlDevInfPropertyAddValEnum(prop, "VCALENDAR"); - smlDevInfPropertyAddValEnum(prop, "VEVENT"); - smlDevInfPropertyAddValEnum(prop, "VTODO"); + _ADD_PROPERTY_VAL_ENUM("VCALENDAR") + _ADD_PROPERTY_VAL_ENUM("VEVENT") + _ADD_PROPERTY_VAL_ENUM("VTODO") _ADD_CTCAP_PROPERTY_BY_NAME("CATEGORIES") _ADD_CTCAP_PROPERTY_BY_NAME("COMPLETED") _ADD_CTCAP_PROPERTY_BY_NAME("CLASS") - smlDevInfPropertyAddValEnum(prop, "PUBLIC"); - smlDevInfPropertyAddValEnum(prop, "PRIVATE"); - smlDevInfPropertyAddValEnum(prop, "CONFIDENTIAL"); + _ADD_PROPERTY_VAL_ENUM("PUBLIC") + _ADD_PROPERTY_VAL_ENUM("PRIVATE") + _ADD_PROPERTY_VAL_ENUM("CONFIDENTIAL") _ADD_CTCAP_PROPERTY_BY_NAME("DALARM") _ADD_CTCAP_PROPERTY_BY_NAME("DAYLIGHT") _ADD_CTCAP_PROPERTY_BY_NAME("DCREATED") @@ -336,9 +360,9 @@ _ADD_CTCAP_PROPERTY_BY_NAME("DTEND") _ADD_CTCAP_PROPERTY_BY_NAME("DUE") _ADD_CTCAP_PROPERTY_BY_NAME("END") - smlDevInfPropertyAddValEnum(prop, "VCALENDAR"); - smlDevInfPropertyAddValEnum(prop, "VEVENT"); - smlDevInfPropertyAddValEnum(prop, "VTODO"); + _ADD_PROPERTY_VAL_ENUM("VCALENDAR") + _ADD_PROPERTY_VAL_ENUM("VEVENT") + _ADD_PROPERTY_VAL_ENUM("VTODO") _ADD_CTCAP_PROPERTY_BY_NAME("EXDATE") _ADD_CTCAP_PROPERTY_BY_NAME("LAST-MODIFIED") _ADD_CTCAP_PROPERTY_BY_NAME("LOCATION") @@ -370,15 +394,15 @@ _ADD_PROPERTY_PARAM("PARTSTAT") _ADD_PROPERTY_PARAM("ROLE") _ADD_CTCAP_PROPERTY_BY_NAME("BEGIN") - smlDevInfPropertyAddValEnum(prop, "VCALENDAR"); - smlDevInfPropertyAddValEnum(prop, "VEVENT"); - smlDevInfPropertyAddValEnum(prop, "VTODO"); + _ADD_PROPERTY_VAL_ENUM("VCALENDAR") + _ADD_PROPERTY_VAL_ENUM("VEVENT") + _ADD_PROPERTY_VAL_ENUM("VTODO") _ADD_CTCAP_PROPERTY_BY_NAME("CATEGORIES") _ADD_CTCAP_PROPERTY_BY_NAME("COMPLETED") _ADD_CTCAP_PROPERTY_BY_NAME("CLASS") - smlDevInfPropertyAddValEnum(prop, "PUBLIC"); - smlDevInfPropertyAddValEnum(prop, "PRIVATE"); - smlDevInfPropertyAddValEnum(prop, "CONFIDENTIAL"); + _ADD_PROPERTY_VAL_ENUM("PUBLIC") + _ADD_PROPERTY_VAL_ENUM("PRIVATE") + _ADD_PROPERTY_VAL_ENUM("CONFIDENTIAL") _ADD_CTCAP_PROPERTY_BY_NAME("DALARM") _ADD_CTCAP_PROPERTY_BY_NAME("DAYLIGHT") _ADD_CTCAP_PROPERTY_BY_NAME("DCREATED") @@ -387,9 +411,9 @@ _ADD_CTCAP_PROPERTY_BY_NAME("DTEND") _ADD_CTCAP_PROPERTY_BY_NAME("DUE") _ADD_CTCAP_PROPERTY_BY_NAME("END") - smlDevInfPropertyAddValEnum(prop, "VCALENDAR"); - smlDevInfPropertyAddValEnum(prop, "VEVENT"); - smlDevInfPropertyAddValEnum(prop, "VTODO"); + _ADD_PROPERTY_VAL_ENUM("VCALENDAR") + _ADD_PROPERTY_VAL_ENUM("VEVENT") + _ADD_PROPERTY_VAL_ENUM("VTODO") _ADD_CTCAP_PROPERTY_BY_NAME("EXDATE") _ADD_CTCAP_PROPERTY_BY_NAME("LAST-MODIFIED") _ADD_CTCAP_PROPERTY_BY_NAME("LOCATION") Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_property.c Fri Jun 19 10:09:09 2009 (r1093) @@ -0,0 +1,636 @@ +/* sml_dev_inf_property.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_property.h" +#include <libsyncml/syncml.h> + +G_DEFINE_TYPE (SmlDevInfProperty, sml_dev_inf_property, G_TYPE_OBJECT) + +enum +{ + PROP_0, + PROP_PROP_NAME, + PROP_SIZE, + PROP_DATA_TYPE, + PROP_MAX_OCCUR, + PROP_MAX_SIZE, + PROP_NO_TRUNCATE, + PROP_DISPLAY_NAME, + PROP_VAL_ENUMS, + PROP_PARAMS +}; + +struct _SmlDevInfPropertyPrivate +{ + gchar* prop_name; + guint size; + gchar* data_type; + guint max_occur; + guint max_size; + gboolean no_truncate; + gchar* display_name; + GList* val_enums; + GList* params; +}; + +static void +sml_dev_inf_property_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_PROP_NAME: + g_value_set_string (value, SML_DEV_INF_PROPERTY (object)->priv->prop_name); + break; + case PROP_SIZE: + g_value_set_uint (value, SML_DEV_INF_PROPERTY (object)->priv->size); + break; + case PROP_DATA_TYPE: + g_value_set_string (value, SML_DEV_INF_PROPERTY (object)->priv->data_type); + break; + case PROP_MAX_OCCUR: + g_value_set_uint (value, SML_DEV_INF_PROPERTY (object)->priv->max_occur); + break; + case PROP_MAX_SIZE: + g_value_set_uint (value, SML_DEV_INF_PROPERTY (object)->priv->max_size); + break; + case PROP_NO_TRUNCATE: + g_value_set_boolean (value, SML_DEV_INF_PROPERTY (object)->priv->no_truncate); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, SML_DEV_INF_PROPERTY (object)->priv->display_name); + break; + case PROP_VAL_ENUMS: + g_value_set_pointer (value, SML_DEV_INF_PROPERTY (object)->priv->val_enums); + break; + case PROP_PARAMS: + g_value_set_pointer (value, SML_DEV_INF_PROPERTY (object)->priv->params); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +sml_dev_inf_property_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_PROP_NAME: + g_free (SML_DEV_INF_PROPERTY (object)->priv->prop_name); + SML_DEV_INF_PROPERTY (object)->priv->prop_name = g_strdup (g_value_get_string (value)); + break; + case PROP_SIZE: + SML_DEV_INF_PROPERTY (object)->priv->size = g_value_get_uint (value); + break; + case PROP_DATA_TYPE: + g_free (SML_DEV_INF_PROPERTY (object)->priv->data_type); + SML_DEV_INF_PROPERTY (object)->priv->data_type = g_strdup (g_value_get_string (value)); + break; + case PROP_MAX_OCCUR: + SML_DEV_INF_PROPERTY (object)->priv->max_occur = g_value_get_uint (value); + break; + case PROP_MAX_SIZE: + SML_DEV_INF_PROPERTY (object)->priv->max_size = g_value_get_uint (value); + break; + case PROP_NO_TRUNCATE: + SML_DEV_INF_PROPERTY (object)->priv->no_truncate = g_value_get_boolean (value); + break; + case PROP_DISPLAY_NAME: + g_free (SML_DEV_INF_PROPERTY (object)->priv->display_name); + SML_DEV_INF_PROPERTY (object)->priv->display_name = g_strdup (g_value_get_string (value)); + break; + case PROP_VAL_ENUMS: + SML_DEV_INF_PROPERTY (object)->priv->val_enums = (GList *) g_value_get_pointer(value); + break; + case PROP_PARAMS: + SML_DEV_INF_PROPERTY (object)->priv->params = (GList *) g_value_get_pointer(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +sml_dev_inf_property_finalize (GObject *object) +{ + SmlDevInfProperty *self = (SmlDevInfProperty *) object; + g_free(self->priv->prop_name); + g_free(self->priv->data_type); + g_free(self->priv->display_name); + while(self->priv->val_enums) { + gchar *val_enum = self->priv->val_enums->data; + self->priv->val_enums = g_list_remove(self->priv->val_enums, val_enum); + g_free(val_enum); + } + while(self->priv->params) { + SmlDevInfPropParam *param = self->priv->params->data; + self->priv->params = g_list_remove(self->priv->params, param); + g_object_unref(param); + } + G_OBJECT_CLASS (sml_dev_inf_property_parent_class)->finalize (object); +} + +static void +sml_dev_inf_property_class_init (SmlDevInfPropertyClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (SmlDevInfPropertyPrivate)); + + object_class->get_property = sml_dev_inf_property_get_property; + object_class->set_property = sml_dev_inf_property_set_property; + object_class->finalize = sml_dev_inf_property_finalize; + + /** + * SmlDevInfProperty:PropName: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_PROP_NAME, + g_param_spec_string ("PropName", + "", + "", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:Size: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_SIZE, + g_param_spec_uint ("Size", + "", + "", + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:DataType: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_DATA_TYPE, + g_param_spec_string ("DataType", + "", + "", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:MaxOccur: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_MAX_OCCUR, + g_param_spec_uint ("MaxOccur", + "", + "", + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:MaxSize: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_MAX_SIZE, + g_param_spec_uint ("MaxSize", + "", + "", + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:NoTruncate: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_NO_TRUNCATE, + g_param_spec_boolean ("NoTruncate", + "", + "", + FALSE, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:DisplayName: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_DISPLAY_NAME, + g_param_spec_string ("DisplayName", + "", + "", + NULL, + G_PARAM_READWRITE)); + /** + * SmlDevInfProperty:ValEnums: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_VAL_ENUMS, + g_param_spec_pointer ("ValEnums", + "ValEnums", + "", + G_PARAM_PRIVATE)); + /** + * SmlDevInfProperty:PropParams: + * + * The property. + */ + g_object_class_install_property (object_class, + PROP_PARAMS, + g_param_spec_pointer ("Params", + "Params", + "", + G_PARAM_PRIVATE)); +} + +static void +sml_dev_inf_property_init (SmlDevInfProperty *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + SML_TYPE_DEV_INF_PROPERTY, + SmlDevInfPropertyPrivate); +} + +/** + * sml_dev_inf_property_new: + * + * Creates a new instance of #SmlDevInfProperty. + * + * Return value: the newly created #SmlDevInfProperty instance + */ +SmlDevInfProperty* +sml_dev_inf_property_new (void) +{ + return g_object_new (SML_TYPE_DEV_INF_PROPERTY, NULL); +} + +/** + * sml_dev_inf_property_get_prop_name: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_property_get_prop_name (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), NULL); + return self->priv->prop_name; +} + +/** + * sml_dev_inf_property_set_prop_name: + * @self: A #SmlDevInfProperty + * @prop_name: + * + * Sets the property. + */ +gboolean +sml_dev_inf_property_set_prop_name (SmlDevInfProperty *self, + const gchar* prop_name, + GError **error) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + g_free (self->priv->prop_name); + self->priv->prop_name = g_strdup (prop_name); + return TRUE; +} + +/** + * sml_dev_inf_property_get_size: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +guint +sml_dev_inf_property_get_size (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), 0); + return self->priv->size; +} + +/** + * sml_dev_inf_property_set_size: + * @self: A #SmlDevInfProperty + * @size: + * + * Sets the property. + */ +gboolean +sml_dev_inf_property_set_size (SmlDevInfProperty *self, + guint size, + GError **error) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + 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."); + return FALSE; + } + self->priv->size = size; + return TRUE; +} + +/** + * sml_dev_inf_property_get_datatype: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_property_get_data_type (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), NULL); + return self->priv->data_type; +} + +/** + * sml_dev_inf_property_set_data_type: + * @self: A #SmlDevInfProperty + * @data_type: + * + * Sets the property. + */ +gboolean +sml_dev_inf_property_set_data_type (SmlDevInfProperty *self, + const gchar* data_type, + GError **error) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + g_free (self->priv->data_type); + self->priv->data_type = g_strdup (data_type); + return TRUE; +} + +/** + * sml_dev_inf_property_get_max_occur: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +guint +sml_dev_inf_property_get_max_occur (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), 0); + return self->priv->max_occur; +} + +/** + * sml_dev_inf_property_set_max_occur: + * @self: A #SmlDevInfProperty + * @maxoccur: + * + * Sets the property. + */ +void +sml_dev_inf_property_set_max_occur (SmlDevInfProperty *self, + guint max_occur) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + self->priv->max_occur = max_occur; +} + +/** + * sml_dev_inf_property_get_max_size: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +guint +sml_dev_inf_property_get_max_size (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), 0); + return self->priv->max_size; +} + +/** + * sml_dev_inf_property_set_max_size: + * @self: A #SmlDevInfProperty + * @maxsize: + * + * Sets the property. + */ +gboolean +sml_dev_inf_property_set_max_size (SmlDevInfProperty *self, + guint max_size, + GError **error) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + 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; + } + self->priv->max_size = max_size; + return TRUE; +} + +/** + * sml_dev_inf_property_get_no_truncate: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +gboolean +sml_dev_inf_property_get_no_truncate (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + return self->priv->no_truncate; +} + +/** + * sml_dev_inf_property_set_no_truncate: + * @self: A #SmlDevInfProperty + * @notruncate: + * + * Sets the property. + */ +void +sml_dev_inf_property_set_no_truncate (SmlDevInfProperty *self, + gboolean no_truncate) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + self->priv->no_truncate = no_truncate; +} + +/** + * sml_dev_inf_property_get_display_name: + * @self: A #SmlDevInfProperty + * + * Gets the property. + * + * Return value: + */ +G_CONST_RETURN gchar* +sml_dev_inf_property_get_display_name (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), NULL); + return self->priv->display_name; +} + +/** + * sml_dev_inf_property_set_display_name: + * @self: A #SmlDevInfProperty + * @displayname: + * + * Sets the property. + */ +gboolean +sml_dev_inf_property_set_display_name (SmlDevInfProperty *self, + const gchar* display_name, + GError **error) +{ + g_return_if_fail (SML_IS_DEV_INF_PROPERTY (self)); + g_free (self->priv->display_name); + self->priv->display_name = g_strdup (display_name); + return TRUE; +} + +/** + * sml_dev_inf_property_num_val_enums: + * @self: A #SmlDevInfProperty + * + * + */ +guint +sml_dev_inf_property_num_val_enums (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), 0); + return g_list_length(self->priv->val_enums); +} + +/** + * sml_dev_inf_property_get_nth_val_enum: + * @self: A #SmlDevInfProperty + * + * + */ +const gchar* +sml_dev_inf_property_get_nth_val_enum (SmlDevInfProperty *self, + guint n) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), NULL); + return (gchar *)g_list_nth_data(self->priv->val_enums, n); +} + +/** + * sml_dev_inf_property_add_val_enum: + * @self: A #SmlDevInfProperty + * + * + */ +gboolean +sml_dev_inf_property_add_val_enum (SmlDevInfProperty *self, + const gchar* val_enum, + GError **error) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), FALSE); + 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; + } + return TRUE; +} + +/** + * sml_dev_inf_property_num_params: + * @self: A #SmlDevInfProperty + * + * + */ +guint +sml_dev_inf_property_num_params (SmlDevInfProperty *self) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), 0); + return g_list_length(self->priv->params); +} + +/** + * sml_dev_inf_property_get_nth_param: + * @self: A #SmlDevInfProperty + * + * + */ +SmlDevInfPropParam* +sml_dev_inf_property_get_nth_param (SmlDevInfProperty *self, + guint n) +{ + g_return_val_if_fail (SML_IS_DEV_INF_PROPERTY (self), NULL); + return (SmlDevInfPropParam *)g_list_nth_data(self->priv->params, n); +} + +/** + * sml_dev_inf_property_add_param: + * @self: A #SmlDevInfProperty + * + * The SmlDevInfPropParam object is handled like a normal const string. + * This means that the SmlDevInfProperty object registers an own reference + * to the object. The caller has to maintain its reference to the + * SmlDevInfPropParam object by himself. + * + * sml_dev_inf_property_add_prop_param does not consume a reference of + * the SmlDevInfPropParam object. + */ +gboolean +sml_dev_inf_property_add_param (SmlDevInfProperty *self, + 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; + } + 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; + } + return TRUE; +} + Added: trunk/libsyncml/dev_inf_api/sml_dev_inf_property.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/libsyncml/dev_inf_api/sml_dev_inf_property.h Fri Jun 19 10:09:09 2009 (r1093) @@ -0,0 +1,80 @@ +/* sml_dev_inf_property.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_PROPERTY_H__ +#define __SML_DEV_INF_PROPERTY_H__ + +#include <glib-object.h> +#include <libsyncml/dev_inf_api/sml_dev_inf_prop_param.h> + +G_BEGIN_DECLS + +#define SML_TYPE_DEV_INF_PROPERTY (sml_dev_inf_property_get_type()) +#define SML_DEV_INF_PROPERTY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SML_TYPE_DEV_INF_PROPERTY, SmlDevInfProperty)) +#define SML_DEV_INF_PROPERTY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SML_TYPE_DEV_INF_PROPERTY, SmlDevInfPropertyClass)) +#define SML_IS_DEV_INF_PROPERTY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SML_TYPE_DEV_INF_PROPERTY)) +#define SML_IS_DEV_INF_PROPERTY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SML_TYPE_DEV_INF_PROPERTY)) +#define SML_DEV_INF_PROPERTY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SML_TYPE_DEV_INF_PROPERTY, SmlDevInfPropertyClass)) + +typedef struct _SmlDevInfProperty SmlDevInfProperty; +typedef struct _SmlDevInfPropertyClass SmlDevInfPropertyClass; +typedef struct _SmlDevInfPropertyPrivate SmlDevInfPropertyPrivate; + +struct _SmlDevInfProperty +{ + GObject parent; + + /*< private >*/ + SmlDevInfPropertyPrivate *priv; +}; + +struct _SmlDevInfPropertyClass +{ + GObjectClass parent_class; + +}; + +GType sml_dev_inf_property_get_type (void); +SmlDevInfProperty* sml_dev_inf_property_new (void); +G_CONST_RETURN gchar* sml_dev_inf_property_get_prop_name (SmlDevInfProperty *self); +gboolean sml_dev_inf_property_set_prop_name (SmlDevInfProperty *self, const gchar* prop_name, GError **error); +guint sml_dev_inf_property_get_size (SmlDevInfProperty *self); +gboolean sml_dev_inf_property_set_size (SmlDevInfProperty *self, guint size, GError **error); +G_CONST_RETURN gchar* sml_dev_inf_property_get_data_type (SmlDevInfProperty *self); +gboolean sml_dev_inf_property_set_data_type (SmlDevInfProperty *self, const gchar* data_type, GError **error); +guint sml_dev_inf_property_get_max_occur (SmlDevInfProperty *self); +void sml_dev_inf_property_set_max_occur (SmlDevInfProperty *self, guint max_occur); +guint sml_dev_inf_property_get_max_size (SmlDevInfProperty *self); +gboolean sml_dev_inf_property_set_max_size (SmlDevInfProperty *self, guint max_size, GError **error); +gboolean sml_dev_inf_property_get_no_truncate (SmlDevInfProperty *self); +void sml_dev_inf_property_set_no_truncate (SmlDevInfProperty *self, gboolean no_truncate); +G_CONST_RETURN gchar* sml_dev_inf_property_get_display_name (SmlDevInfProperty *self); +gboolean sml_dev_inf_property_set_display_name (SmlDevInfProperty *self, const gchar* display_name, GError **error); +guint sml_dev_inf_property_num_val_enums (SmlDevInfProperty *self); +G_CONST_RETURN gchar* sml_dev_inf_property_get_nth_val_enum (SmlDevInfProperty *self, guint n); +gboolean sml_dev_inf_property_add_val_enum (SmlDevInfProperty *self, const gchar* val_enum, GError **error); +guint sml_dev_inf_property_num_params (SmlDevInfProperty *self); +SmlDevInfPropParam* sml_dev_inf_property_get_nth_param (SmlDevInfProperty *self, guint n); +gboolean sml_dev_inf_property_add_param (SmlDevInfProperty *self, SmlDevInfPropParam *param, GError **error); + +G_END_DECLS + +#endif /* __SML_DEV_INF_PROPERTY_H__ */ Modified: trunk/libsyncml/parser/sml_xml_assm.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_assm.c Thu Jun 18 11:16:28 2009 (r1092) +++ trunk/libsyncml/parser/sml_xml_assm.c Fri Jun 19 10:09:09 2009 (r1093) @@ -2089,42 +2089,42 @@ } // add PropName - if (property->propName != NULL && - !_smlXmlAssemblerAddString(assm, SML_ELEMENT_PROPNAME, property->propName, error)) + if (sml_dev_inf_property_get_prop_name(property) != NULL && + !_smlXmlAssemblerAddString(assm, SML_ELEMENT_PROPNAME, sml_dev_inf_property_get_prop_name(property), error)) goto error; // add DataType - if (property->dataType != NULL && - !_smlXmlAssemblerAddString(assm, SML_ELEMENT_DATATYPE, property->dataType, error)) + if (sml_dev_inf_property_get_data_type(property) != NULL && + !_smlXmlAssemblerAddString(assm, SML_ELEMENT_DATATYPE, sml_dev_inf_property_get_data_type(property), error)) goto error; // add MaxOccur - if (property->maxOccur > 0 && - !_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXOCCUR, property->maxOccur, error)) + if (sml_dev_inf_property_get_max_occur(property) > 0 && + !_smlXmlAssemblerAddID(assm, SML_ELEMENT_MAXOCCUR, sml_dev_inf_property_get_max_occur(property), error)) goto error; // add MaxSize - if (property->maxSize > 0) { + if (sml_dev_inf_property_get_max_size(property) > 0) { /* There was a change of the element name in OMA DS DevInf 1.2. */ if (flat) { if (!_smlXmlAssemblerAddID( assm, SML_ELEMENT_SIZE, - property->maxSize, + sml_dev_inf_property_get_max_size(property), error)) goto error; } else { if (!_smlXmlAssemblerAddID( assm, SML_ELEMENT_MAXSIZE, - property->maxSize, + sml_dev_inf_property_get_max_size(property), error)) goto error; } } // add NoTruncate - if (property->noTruncate) + if (sml_dev_inf_property_get_no_truncate(property)) { if (!_smlXmlAssemblerStartNode(assm, SML_ELEMENT_NOTRUNCATE, error)) goto error; @@ -2133,27 +2133,28 @@ } // add DisplayName - if (property->displayName != NULL && - !_smlXmlAssemblerAddString(assm, SML_ELEMENT_DISPLAYNAME, property->displayName, error)) + if (sml_dev_inf_property_get_display_name(property) != NULL && + !_smlXmlAssemblerAddString(assm, SML_ELEMENT_DISPLAYNAME, sml_dev_inf_property_get_display_name(property), error)) goto error; // add values - GList *hvalue = NULL; - for (hvalue = property->valEnums; hvalue; hvalue = hvalue->next) + guint length = sml_dev_inf_property_num_val_enums(property); + guint n; + for (n = 0; n < length; n++) { - char *valEnum = hvalue->data; + const char *valEnum = sml_dev_inf_property_get_nth_val_enum(property, n); // add ValEnum - if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_VALENUM, valEnum, error)) + if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_VALENUM, valEnum, error)) goto error; - + } // end values for loop // add parameters - GList *hparam = NULL; - for (hparam = property->propParams; hparam; hparam = hparam->next) + length = sml_dev_inf_property_num_params(property); + for (n = 0; n < length; n++); { - SmlDevInfPropParam *param = hparam->data; + SmlDevInfPropParam *param = sml_dev_inf_property_get_nth_param(property, n); if (!flat) { @@ -2179,10 +2180,10 @@ // add values guint length = sml_dev_inf_prop_param_num_val_enums(param); - guint n; - for (n=0; n < length; n++) + guint nn; + for (nn=0; nn < length; nn++) { - const char *valEnum = sml_dev_inf_prop_param_get_nth_val_enum(param, n); + const char *valEnum = sml_dev_inf_prop_param_get_nth_val_enum(param, nn); // add ValEnum if (!_smlXmlAssemblerAddString(assm, SML_ELEMENT_VALENUM, valEnum, error)) Modified: trunk/libsyncml/parser/sml_xml_parse.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_parse.c Thu Jun 18 11:16:28 2009 (r1092) +++ trunk/libsyncml/parser/sml_xml_parse.c Fri Jun 19 10:09:09 2009 (r1093) @@ -2649,6 +2649,8 @@ smlAssert(parser); smlAssert(devinf); + GError *gerror = NULL; + /* This function was designed to parse one CTCap section */ /* which can include several CTCap definitions */ @@ -2701,7 +2703,8 @@ { if (param != NULL) { - smlDevInfPropertyAddPropParam(property, param); + if (!sml_dev_inf_property_add_param(property, param, &gerror)) + goto error; param = NULL; } smlDevInfCTCapAddProperty(ctcap, property); @@ -2728,77 +2731,77 @@ { if (param != NULL) { - smlDevInfPropertyAddPropParam(property, param); + if (!sml_dev_inf_property_add_param(property, param, &gerror)) + goto error; param = NULL; } smlDevInfCTCapAddProperty(ctcap, property); property = NULL; } - property = smlDevInfNewProperty(error); - if (!property) + property = sml_dev_inf_property_new(); + if (!property) { + smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create new instance of SmlDevInfProperty - out of memory."); + goto error; + } + if (!sml_dev_inf_property_set_prop_name(property, value, &gerror)) goto error; - smlDevInfPropertySetPropName(property, value); break; case SML_DEVINF_CTCAP_DATATYPE: if (property == NULL) goto error; if (param != NULL) { - GError *gerror = NULL; - if (!sml_dev_inf_prop_param_set_data_type(param, value, &gerror)) { - smlErrorSet(error, SML_ERROR_GENERIC, "%s", gerror->message); - g_error_free(gerror); + if (!sml_dev_inf_prop_param_set_data_type(param, value, &gerror)) goto error; - } - } else - smlDevInfPropertySetDataType(property, value); + } else { + if (!sml_dev_inf_property_set_data_type(property, value, &gerror)) + goto error; + } break; case SML_DEVINF_CTCAP_MAXOCCUR: if (property == NULL) goto error; - smlDevInfPropertySetMaxOccur(property, atoi(value)); + sml_dev_inf_property_set_max_occur(property, atoi(value)); break; case SML_DEVINF_CTCAP_MAXSIZE: if (property == NULL) goto error; - smlDevInfPropertySetMaxSize(property, atoi(value)); + if (!sml_dev_inf_property_set_max_size(property, atoi(value), &gerror)) + goto error; break; case SML_DEVINF_CTCAP_NOTRUNCATE: if (property == NULL) goto error; - smlDevInfPropertySetNoTruncate(property); + sml_dev_inf_property_set_no_truncate(property, TRUE); break; case SML_DEVINF_CTCAP_DISPLAYNAME: if (property == NULL) goto error; if (param != NULL) { - GError *gerror = NULL; - if (!sml_dev_inf_prop_param_set_display_name(param, value, &gerror)) { - smlErrorSet(error, SML_ERROR_GENERIC, "%s", gerror->message); - g_error_free(gerror); + if (!sml_dev_inf_prop_param_set_display_name(param, value, &gerror)) goto error; - } - } else - smlDevInfPropertySetDisplayName(property, value); + } else { + if (!sml_dev_inf_property_set_display_name(property, value, &gerror)) + goto error; + } break; case SML_DEVINF_CTCAP_VALENUM: if (property == NULL) goto error; if (param != NULL) { - GError *gerror = NULL; - if (!sml_dev_inf_prop_param_add_val_enum(param, value, &gerror)) { - smlErrorSet(error, SML_ERROR_GENERIC, "%s", gerror->message); - g_error_free(gerror); + if (!sml_dev_inf_prop_param_add_val_enum(param, value, &gerror)) goto error; - } - } else - smlDevInfPropertyAddValEnum(property, value); + } else { + if (!sml_dev_inf_property_add_val_enum(property, value, &gerror)) + goto error; + } break; case SML_DEVINF_CTCAP_PARAMNAME: if (property == NULL) goto error; if (param != NULL) { - smlDevInfPropertyAddPropParam(property, param); + if (!sml_dev_inf_property_add_param(property, param, &gerror)) + goto error; param = NULL; } param = sml_dev_inf_prop_param_new(); @@ -2810,7 +2813,8 @@ sml_dev_inf_prop_param_set_param_name(param, value, &gerror); break; case SML_DEVINF_CTCAP_SIZE: - smlDevInfPropertySetPropSize(property, atoi(value)); + if (!sml_dev_inf_property_set_size(property, atoi(value), &gerror)) + goto error; break; default: smlErrorSet(error, SML_ERROR_GENERIC, "Unknown CTCapType: %s", elem_name); @@ -2823,8 +2827,8 @@ goto error; } } - if (param != NULL) - smlDevInfPropertyAddPropParam(property, param); + if (param != NULL && sml_dev_inf_property_add_param(property, param, &gerror)) + goto error; if (property != NULL) smlDevInfCTCapAddProperty(ctcap, property); if (ctcap != NULL) @@ -2834,6 +2838,10 @@ return TRUE; error: + if (gerror) { + smlErrorSet(error, gerror->code, gerror->message); + g_error_free(gerror); + } smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); if (value != NULL) smlSafeCFree(&value); @@ -2931,14 +2939,19 @@ CHECK_ERROR_REF smlAssert(parser); + GError *gerror = NULL; + SmlDevInfProperty *property = NULL; + if (!_smlXmlParserStep(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "Missing nodes"); goto error; } - SmlDevInfProperty *property = smlDevInfNewProperty(error); - if (!property) + property = sml_dev_inf_property_new(); + if (!property) { + smlErrorSet(error, SML_ERROR_GENERIC, "Cannot create new instance of SmlDevInfProperty - out of memory."); goto error; + } SmlDevInfPropParam *param; char *value = NULL; @@ -2976,34 +2989,41 @@ switch(type) { case SML_DEVINF_CTCAP_PROPNAME: - smlDevInfPropertySetPropName(property, value); + if(!sml_dev_inf_property_set_prop_name(property, value, &gerror)) + goto error; break; case SML_DEVINF_CTCAP_DATATYPE: - smlDevInfPropertySetDataType(property, value); + if (!sml_dev_inf_property_set_data_type(property, value, &gerror)) + goto error; break; case SML_DEVINF_CTCAP_MAXOCCUR: - smlDevInfPropertySetMaxOccur(property, atoi(value)); + sml_dev_inf_property_set_max_occur(property, atoi(value)); break; case SML_DEVINF_CTCAP_MAXSIZE: - smlDevInfPropertySetMaxSize(property, atoi(value)); + if (!sml_dev_inf_property_set_max_size(property, atoi(value), &gerror)) + goto error; break; case SML_DEVINF_CTCAP_NOTRUNCATE: - smlDevInfPropertySetNoTruncate(property); + sml_dev_inf_property_set_no_truncate(property, TRUE); break; case SML_DEVINF_CTCAP_DISPLAYNAME: - smlDevInfPropertySetDisplayName(property, value); + if (!sml_dev_inf_property_set_display_name(property, value, &gerror)) + goto error; break; case SML_DEVINF_CTCAP_VALENUM: - smlDevInfPropertyAddValEnum(property, value); + if (!sml_dev_inf_property_add_val_enum(property, value, &gerror)) + goto error; break; case SML_DEVINF_CTCAP_PROPPARAM: param = _smlXmlDevInfDataStoreParseCTCap12PropParam(parser, error); if (!param) goto error; - smlDevInfPropertyAddPropParam(property, param); + if (!sml_dev_inf_property_add_param(property, param, &gerror)) + goto error; break; case SML_DEVINF_CTCAP_SIZE: - smlDevInfPropertySetPropSize(property, atoi(value)); + if (!sml_dev_inf_property_set_size(property, atoi(value), &gerror)) + goto error; break; default: smlErrorSet(error, SML_ERROR_GENERIC, "Unknown CTCapType for Property: %s", elem_name); @@ -3021,9 +3041,15 @@ return property; error: + if (gerror) { + smlErrorSet(error, gerror->code, gerror->message); + g_error_free(gerror); + } smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); if (value != NULL) smlSafeCFree(&value); + if (property) + g_object_unref(property); return NULL; } Modified: trunk/libsyncml/sml_devinf.c ============================================================================== --- trunk/libsyncml/sml_devinf.c Thu Jun 18 11:16:28 2009 (r1092) +++ trunk/libsyncml/sml_devinf.c Fri Jun 19 10:09:09 2009 (r1093) @@ -154,26 +154,7 @@ while (ctcap->properties) { SmlDevInfProperty *prop = ctcap->properties->data; ctcap->properties = g_list_remove(ctcap->properties, prop); - smlSafeCFree(&(prop->propName)); - if (prop->dataType) - smlSafeCFree(&(prop->dataType)); - if (prop->displayName) - smlSafeCFree(&(prop->displayName)); - /* if lists are removed - * then the data must be removed separately - */ - while (prop->valEnums) { - char *valEnum = prop->valEnums->data; - prop->valEnums = g_list_remove(prop->valEnums, valEnum); - smlSafeCFree(&valEnum); - } - while (prop->propParams) { - SmlDevInfPropParam *param = prop->propParams->data; - prop->propParams = g_list_remove(prop->propParams, param); - g_object_unref(param); - } - /* free Property itself */ - smlSafeFree((gpointer *) &prop); + g_object_unref(prop); } /* don't use ctcap here because the list must be cleaned up */ smlSafeFree((gpointer *)&ctcap); @@ -824,237 +805,6 @@ return NULL; } -/* Property stuff */ - -SmlDevInfProperty *smlDevInfNewProperty(SmlError **error) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, error); - CHECK_ERROR_REF - - SmlDevInfProperty *property = smlTryMalloc0(sizeof(SmlDevInfProperty), error); - if (!property) { - smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); - return NULL; - } - - property->propName = NULL; - property->dataType = NULL; - property->maxOccur = 0; - property->maxSize = 0; - property->noTruncate = FALSE; - property->displayName = NULL; - property->valEnums = NULL; - property->propParams = NULL; - - smlTrace(TRACE_EXIT, "%s", __func__); - return property; -} - -void smlDevInfPropertySetPropName( - SmlDevInfProperty *property, - const char *propName) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %s)", __func__, property, VA_STRING(propName)); - smlAssert(property); - smlAssert(propName); - - if (property->propName != NULL) - smlSafeCFree(&(property->propName)); - property->propName = g_strdup(propName); - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertySetDataType( - SmlDevInfProperty *property, - const char *dataType) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %s)", __func__, property, VA_STRING(dataType)); - smlAssert(property); - smlAssert(dataType); - - if (property->dataType != NULL) - smlSafeCFree(&(property->dataType)); - property->dataType = g_strdup(dataType); - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertySetMaxOccur( - SmlDevInfProperty *property, - unsigned int maxOccur) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %d)", __func__, property, maxOccur); - smlAssert(property); - - property->maxOccur = maxOccur; - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertySetMaxSize( - SmlDevInfProperty *property, - unsigned int maxSize) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %d)", __func__, property, maxSize); - smlAssert(property); - - property->maxSize = maxSize; - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertySetPropSize( - SmlDevInfProperty *property, - unsigned int propSize) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %d)", __func__, property, propSize); - smlAssert(property); - - property->propSize = propSize; - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertySetNoTruncate( - SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - - property->noTruncate = TRUE; - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertySetDisplayName( - SmlDevInfProperty *property, - const char *displayName) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %s)", __func__, property, VA_STRING(displayName)); - smlAssert(property); - smlAssert(displayName); - - if (property->displayName != NULL) - smlSafeCFree(&(property->displayName)); - property->displayName = g_strdup(displayName); - - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertyAddValEnum( - SmlDevInfProperty *property, - const char *valEnum) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %s)", __func__, property, VA_STRING(valEnum)); - smlAssert(property); - smlAssert(valEnum); - property->valEnums = g_list_append(property->valEnums, g_strdup(valEnum)); - smlTrace(TRACE_EXIT, "%s", __func__); -} - -void smlDevInfPropertyAddPropParam( - SmlDevInfProperty *property, - SmlDevInfPropParam *propParam) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, property, propParam); - smlAssert(property); - smlAssert(propParam); - property->propParams = g_list_append(property->propParams, propParam); - smlTrace(TRACE_EXIT, "%s", __func__); -} - -char *smlDevInfPropertyGetPropName(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - char *result = g_strdup(property->propName); - smlTrace(TRACE_EXIT, "%s - %s", __func__, VA_STRING(result)); - return result; -} - -char *smlDevInfPropertyGetDataType(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - char *result = g_strdup(property->dataType); - smlTrace(TRACE_EXIT, "%s - %s", __func__, VA_STRING(result)); - return result; -} - -unsigned int smlDevInfPropertyGetMaxOccur(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - smlTrace(TRACE_EXIT, "%s - %d", __func__, property->maxOccur); - return property->maxOccur; -} - -unsigned int smlDevInfPropertyGetMaxSize(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - smlTrace(TRACE_EXIT, "%s - %d", __func__, property->maxSize); - return property->maxSize; -} - -SmlBool smlDevInfPropertyGetNoTruncate(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - smlTrace(TRACE_EXIT, "%s - %d", __func__, property->noTruncate); - return property->noTruncate; -} - -char *smlDevInfPropertyGetDisplayName(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - char *result = g_strdup(property->displayName); - smlTrace(TRACE_EXIT, "%s - %s", __func__, VA_STRING(result)); - return result; -} - -unsigned int smlDevInfPropertyNumValEnums(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - unsigned int num = g_list_length(property->valEnums); - smlTrace(TRACE_EXIT, "%s - %d", __func__, num); - return num; -} - -char *smlDevInfPropertyGetNthValEnum( - const SmlDevInfProperty *property, - unsigned int n) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %d)", __func__, property, n); - smlAssert(property); - char *result = g_strdup(g_list_nth_data(property->valEnums, n)); - smlTrace(TRACE_EXIT, "%s - %s", __func__, VA_STRING(result)); - return result; -} - -unsigned int smlDevInfPropertyNumPropParams(const SmlDevInfProperty *property) -{ - smlTrace(TRACE_ENTRY, "%s(%p)", __func__, property); - smlAssert(property); - unsigned int num = g_list_length(property->propParams); - smlTrace(TRACE_EXIT, "%s - %d", __func__, num); - return num; -} - -const SmlDevInfPropParam *smlDevInfPropertyGetNthPropParam( - const SmlDevInfProperty *property, - unsigned int n) -{ - smlTrace(TRACE_ENTRY, "%s(%p, %d)", __func__, property, n); - smlAssert(property); - SmlDevInfPropParam *param = g_list_nth_data(property->propParams, n); - smlTrace(TRACE_EXIT, "%s - %p", __func__, param); - return param; -} - /* CTCap stuff */ SmlDevInfCTCap *smlDevInfNewCTCap(SmlError **error) Modified: trunk/libsyncml/sml_devinf.h ============================================================================== --- trunk/libsyncml/sml_devinf.h Thu Jun 18 11:16:28 2009 (r1092) +++ trunk/libsyncml/sml_devinf.h Fri Jun 19 10:09:09 2009 (r1093) @@ -32,6 +32,7 @@ #include <libsyncml/dev_inf_api/sml_dev_inf_content_type.h> #include <libsyncml/dev_inf_api/sml_dev_inf_prop_param.h> +#include <libsyncml/dev_inf_api/sml_dev_inf_property.h> SmlDevInfDevTyp smlDevInfDevTypeFromString(const char *name, SmlError **error); const char *smlDevInfDevTypeToString(SmlDevInfDevTyp type, SmlError **error); @@ -111,61 +112,8 @@ /* 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 */ -/* Property stuff */ - -SmlDevInfProperty *smlDevInfNewProperty(SmlError **error); -void smlDevInfPropertySetPropName( // REQUIRED - SmlDevInfProperty *property, - const char *propName); -void smlDevInfPropertySetPropSize( - SmlDevInfProperty *property, - unsigned int propSize); -void smlDevInfPropertySetDataType( - SmlDevInfProperty *property, - const char *dataType); -void smlDevInfPropertySetMaxOccur( - SmlDevInfProperty *property, - unsigned int maxOccur); -void smlDevInfPropertySetMaxSize( - SmlDevInfProperty *property, - unsigned int maxSize); -void smlDevInfPropertySetNoTruncate( - SmlDevInfProperty *property); -void smlDevInfPropertySetDisplayName( - SmlDevInfProperty *property, - const char *displayName); -void smlDevInfPropertyAddValEnum( - SmlDevInfProperty *property, - const char *valEnum); -void smlDevInfPropertyAddPropParam( - SmlDevInfProperty *property, - SmlDevInfPropParam *propParam); - -char *smlDevInfPropertyGetPropName(const SmlDevInfProperty *property... [truncated message content] |