From: Andrea Zagli Date: Wed, 28 Oct 2015 21:11:20 +0000 (+0100) Subject: Added class FormElement (abstract). X-Git-Tag: debian/0.0.1-1~53 X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=862154744ae986d10d93f2fd4c16a95fa5a64540;p=zakform%2Flibzakform Added class FormElement (abstract). --- diff --git a/src/Makefile.am b/src/Makefile.am index e2db130..ff33003 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,6 +7,7 @@ lib_LTLIBRARIES = libzakform.la libzakform_la_SOURCES = \ form.c \ + formelement.c \ formelementifilter.c \ formelementfiltertrim.c \ formelementivalidator.c \ @@ -18,6 +19,7 @@ libzakform_la_LDFLAGS = -no-undefined libzakform_include_HEADERS = \ libzakform.h \ form.h \ + formelement.h \ formelementifilter.h \ formelementfiltertrim.h \ formelementivalidator.h \ diff --git a/src/form.h b/src/form.h index c166f67..e750055 100644 --- a/src/form.h +++ b/src/form.h @@ -26,7 +26,7 @@ G_BEGIN_DECLS -#define ZAK_TYPE_FORM_FORM zak_form_form_get_type () +#define ZAK_FORM_TYPE_FORM zak_form_form_get_type () G_DECLARE_DERIVABLE_TYPE (ZakFormForm, zak_form_form, ZAK_FORM, FORM, GObject) struct _ZakFormFormClass diff --git a/src/formelement.c b/src/formelement.c new file mode 100644 index 0000000..feb0345 --- /dev/null +++ b/src/formelement.c @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2015 Andrea Zagli + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include "formelement.h" + +enum +{ + PROP_0 +}; + +static void zak_form_element_class_init (ZakFormElementClass *class); +static void zak_form_element_init (ZakFormElement *zak_form_element); + +static void zak_form_element_construct (ZakFormElement *element, + const gchar *id, + GHashTable *ht_attrs); + +static void zak_form_element_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void zak_form_element_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + +static void zak_form_element_dispose (GObject *gobject); +static void zak_form_element_finalize (GObject *gobject); + +typedef struct + { + gchar *value; + GPtrArray *pa_filters; + GPtrArray *pa_validators; + } ZakFormElementPrivate; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ZakFormElement, zak_form_element, G_TYPE_OBJECT) + +static void +zak_form_element_class_init (ZakFormElementClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = zak_form_element_set_property; + object_class->get_property = zak_form_element_get_property; + object_class->dispose = zak_form_element_dispose; + object_class->finalize = zak_form_element_finalize; +} + +static void +zak_form_element_init (ZakFormElement *zak_form_element) +{ + ZakFormElementPrivate *priv = zak_form_element_get_instance_private (zak_form_element); + + priv->value = NULL; + priv->pa_filters = NULL; + priv->pa_validators = NULL; +} + +/** + * zak_form_element_add_filter: + * @element: + * @filter: + * + */ +void +zak_form_element_add_filter (ZakFormElement *element, ZakFormElementIFilter *filter) +{ + ZakFormElementPrivate *priv; + + priv = zak_form_element_get_instance_private (element); + + if (priv->pa_filters == NULL) + { + priv->pa_filters = g_ptr_array_new (); + } + + g_ptr_array_add (priv->pa_filters, filter); +} + +/** + * zak_form_element_filter: + * @element: + * + */ +void +zak_form_element_filter (ZakFormElement *element) +{ + guint i; + + ZakFormElementPrivate *priv; + + priv = zak_form_element_get_instance_private (element); + + if (priv->pa_filters == NULL) + { + return; + } + + for (i = 0; i < priv->pa_filters->len; i++) + { + gchar *value; + gchar *val; + + value = zak_form_element_get_value (element); + + val = zak_form_element_ifilter_filter ((ZakFormElementIFilter *)g_ptr_array_index (priv->pa_filters, i), + value); + zak_form_element_set_value (element, val); + } +} + +/** + * zak_form_element_set_value: + * @element: + * @value: + * + */ +void +zak_form_element_set_value (ZakFormElement *element, const gchar *value) +{ + ZakFormElementPrivate *priv; + + priv = zak_form_element_get_instance_private (element); + + priv->value = g_strdup (value); +} + +/** + * zak_form_element_get_value: + * @element: + * + */ +gchar +*zak_form_element_get_value (ZakFormElement *element) +{ + ZakFormElementPrivate *priv; + + priv = zak_form_element_get_instance_private (element); + + return g_strdup (priv->value); +} + +/** + * zak_form_element_add_validator: + * @element: + * @validator: + * + */ +void +zak_form_element_add_validator (ZakFormElement *element, ZakFormElementIValidator *validator) +{ + ZakFormElementPrivate *priv; + + priv = zak_form_element_get_instance_private (element); + + if (priv->pa_validators == NULL) + { + priv->pa_validators = g_ptr_array_new (); + } + + g_ptr_array_add (priv->pa_validators, validator); +} + +/** + * zak_form_element_is_valid: + * @element: + * + */ +gboolean +zak_form_element_is_valid (ZakFormElement *element) +{ + gboolean ret; + + gchar *value; + guint i; + + ZakFormElementPrivate *priv; + + priv = zak_form_element_get_instance_private (element); + + ret = TRUE; + + zak_form_element_filter (element); + + if (priv->pa_validators != NULL) + { + value = zak_form_element_get_value (element); + + for (i = 0; i < priv->pa_validators->len; i++) + { + if (!zak_form_element_ivalidator_validate ((ZakFormElementIValidator *)g_ptr_array_index (priv->pa_validators, i), + value)) + { + ret = FALSE; + } + } + } + + return ret; +} + +/* PRIVATE */ +static void +zak_form_element_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + ZakFormElement *zak_form_element = (ZakFormElement *)object; + ZakFormElementPrivate *priv = zak_form_element_get_instance_private (zak_form_element); + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +zak_form_element_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + ZakFormElement *zak_form_element = (ZakFormElement *)object; + ZakFormElementPrivate *priv = zak_form_element_get_instance_private (zak_form_element); + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +zak_form_element_dispose (GObject *gobject) +{ + ZakFormElement *zak_form_element = (ZakFormElement *)gobject; + ZakFormElementPrivate *priv = zak_form_element_get_instance_private (zak_form_element); + + + + GObjectClass *parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (gobject)); + parent_class->dispose (gobject); +} + +static void +zak_form_element_finalize (GObject *gobject) +{ + ZakFormElement *zak_form_element = (ZakFormElement *)gobject; + ZakFormElementPrivate *priv = zak_form_element_get_instance_private (zak_form_element); + + + + GObjectClass *parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (gobject)); + parent_class->finalize (gobject); +} diff --git a/src/formelement.h b/src/formelement.h new file mode 100644 index 0000000..199a8f8 --- /dev/null +++ b/src/formelement.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 Andrea Zagli + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __ZAK_FORM_ELEMENT_H__ +#define __ZAK_FORM_ELEMENT_H__ + + +#include + +#include "formelementifilter.h" +#include "formelementivalidator.h" + + +G_BEGIN_DECLS + + +#define ZAK_FORM_TYPE_ELEMENT zak_form_element_get_type () +G_DECLARE_DERIVABLE_TYPE (ZakFormElement, zak_form_element, ZAK_FORM, ELEMENT, GObject) + +struct _ZakFormElementClass + { + GObjectClass parent_class; + }; + + +void zak_form_element_set_value (ZakFormElement *element, const gchar *value); +gchar *zak_form_element_get_value (ZakFormElement *element); + +void zak_form_element_add_filter (ZakFormElement *element, ZakFormElementIFilter *filter); +void zak_form_element_filter (ZakFormElement *element); + +void zak_form_element_add_validator (ZakFormElement *element, ZakFormElementIValidator *validator); +gboolean zak_form_element_is_valid (ZakFormElement *element); + + +G_END_DECLS + + +#endif /* __ZAK_FORM_ELEMENT_H__ */ diff --git a/src/formelementfiltertrim.c b/src/formelementfiltertrim.c index 1ee5b29..f4b22bc 100644 --- a/src/formelementfiltertrim.c +++ b/src/formelementfiltertrim.c @@ -39,7 +39,7 @@ static void zak_form_element_filter_trim_get_property (GObject *object, static void zak_form_element_filter_trim_dispose (GObject *gobject); static void zak_form_element_filter_trim_finalize (GObject *gobject); -static GValue *zak_form_element_filter_trim_filter (ZakFormElementIFilter *filter_trim, GValue *value); +static gchar *zak_form_element_filter_trim_filter (ZakFormElementIFilter *filter_trim, const gchar *value); struct _ZakFormElementFilterTrim { @@ -159,22 +159,18 @@ zak_form_element_filter_trim_finalize (GObject *gobject) parent_class->finalize (gobject); } -static GValue +static gchar *zak_form_element_filter_trim_filter (ZakFormElementIFilter *filter_trim, - GValue *value) + const gchar *value) { - GValue *ret; + gchar *ret; gchar *_value; - ret = g_new0 (GValue, 1); - g_value_init (ret, G_TYPE_STRING); - g_value_set_string (ret, g_strdup ("")); + g_return_val_if_fail (value != NULL, g_strdup ("")); - g_return_val_if_fail (value != NULL, ret); + _value = g_strdup (value); - _value = g_strdup (g_value_get_string (value)); - - g_value_set_string (ret, g_strdup (g_strstrip (_value))); + ret = g_strdup (g_strstrip (_value)); return ret; } diff --git a/src/formelementifilter.c b/src/formelementifilter.c index 30a7259..22ba445 100644 --- a/src/formelementifilter.c +++ b/src/formelementifilter.c @@ -26,8 +26,8 @@ zak_form_element_ifilter_default_init (ZakFormElementIFilterInterface *iface) /* add properties and signals to the interface here */ } -GValue -*zak_form_element_ifilter_filter (ZakFormElementIFilter *self, GValue *value) +gchar +*zak_form_element_ifilter_filter (ZakFormElementIFilter *self, const gchar *value) { g_return_val_if_fail (ZAK_FORM_IS_ELEMENT_IFILTER (self), NULL); diff --git a/src/formelementifilter.h b/src/formelementifilter.h index 10676be..f6ff856 100644 --- a/src/formelementifilter.h +++ b/src/formelementifilter.h @@ -32,10 +32,10 @@ struct _ZakFormElementIFilterInterface { GTypeInterface parent_iface; - GValue *(*filter) (ZakFormElementIFilter *self, GValue *value); + gchar *(*filter) (ZakFormElementIFilter *self, const gchar *value); }; -GValue *zak_form_element_ifilter_filter (ZakFormElementIFilter *self, GValue *value); +gchar *zak_form_element_ifilter_filter (ZakFormElementIFilter *self, const gchar *value); G_END_DECLS diff --git a/src/formelementivalidator.c b/src/formelementivalidator.c index 1b8bc6c..8cd6705 100644 --- a/src/formelementivalidator.c +++ b/src/formelementivalidator.c @@ -27,7 +27,7 @@ zak_form_element_ivalidator_default_init (ZakFormElementIValidatorInterface *ifa } gboolean -zak_form_element_ivalidator_validate (ZakFormElementIValidator *self, GValue *value) +zak_form_element_ivalidator_validate (ZakFormElementIValidator *self, const gchar *value) { g_return_val_if_fail (ZAK_FORM_IS_ELEMENT_IVALIDATOR (self), FALSE); diff --git a/src/formelementivalidator.h b/src/formelementivalidator.h index c0d76ec..4ef234d 100644 --- a/src/formelementivalidator.h +++ b/src/formelementivalidator.h @@ -32,10 +32,10 @@ struct _ZakFormElementIValidatorInterface { GTypeInterface parent_iface; - gboolean (*validate) (ZakFormElementIValidator *self, GValue *value); + gboolean (*validate) (ZakFormElementIValidator *self, const gchar *value); }; -gboolean zak_form_element_ivalidator_validate (ZakFormElementIValidator *self, GValue *value); +gboolean zak_form_element_ivalidator_validate (ZakFormElementIValidator *self, const gchar *value); G_END_DECLS diff --git a/src/formelementvalidatornotempty.c b/src/formelementvalidatornotempty.c index 37ef0e8..5bd4a61 100644 --- a/src/formelementvalidatornotempty.c +++ b/src/formelementvalidatornotempty.c @@ -39,7 +39,7 @@ static void zak_form_element_validator_notempty_get_property (GObject *object, static void zak_form_element_validator_notempty_dispose (GObject *gobject); static void zak_form_element_validator_notempty_finalize (GObject *gobject); -static gboolean zak_form_element_validator_notempty_validate (ZakFormElementIValidator *validator_notempty, GValue *value); +static gboolean zak_form_element_validator_notempty_validate (ZakFormElementIValidator *validator_notempty, const gchar *value); struct _ZakFormElementValidatorNotempty { @@ -161,13 +161,13 @@ zak_form_element_validator_notempty_finalize (GObject *gobject) static gboolean zak_form_element_validator_notempty_validate (ZakFormElementIValidator *validator_notempty, - GValue *value) + const gchar *value) { gboolean ret; g_return_val_if_fail (value != NULL, FALSE); - ret = (g_strcmp0 (g_value_get_string (value), "") != 0); + ret = (g_strcmp0 (value, "") != 0); return ret; } diff --git a/src/formelementvalidatorregex.c b/src/formelementvalidatorregex.c index 94fd0fc..7243f56 100644 --- a/src/formelementvalidatorregex.c +++ b/src/formelementvalidatorregex.c @@ -41,7 +41,7 @@ static void zak_form_element_validator_regex_get_property (GObject *object, static void zak_form_element_validator_regex_dispose (GObject *gobject); static void zak_form_element_validator_regex_finalize (GObject *gobject); -static gboolean zak_form_element_validator_regex_validate (ZakFormElementIValidator *validator_regex, GValue *value); +static gboolean zak_form_element_validator_regex_validate (ZakFormElementIValidator *validator_regex, const gchar *value); struct _ZakFormElementValidatorRegex { @@ -173,33 +173,28 @@ zak_form_element_validator_regex_finalize (GObject *gobject) static gboolean zak_form_element_validator_regex_validate (ZakFormElementIValidator *validator_regex, - GValue *value) + const gchar *value) { gboolean ret; GRegex *regex; GError *error; + g_return_val_if_fail (value != NULL, FALSE); + ZakFormElementValidatorRegexPrivate *priv = ZAK_FORM_ELEMENT_VALIDATOR_REGEX_GET_PRIVATE (validator_regex); - if (G_VALUE_HOLDS (value, G_TYPE_STRING)) - { - error = NULL; - regex = g_regex_new (priv->regex, 0, 0, &error); - if (regex == NULL - || error != NULL) - { - syslog (LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), "Error on creating regex: %s.", - error->message != NULL ? error->message : "no details"); - return FALSE; - } - - ret = g_regex_match ((const GRegex *)regex, g_value_get_string (value), 0, NULL); - } - else + error = NULL; + regex = g_regex_new (priv->regex, 0, 0, &error); + if (regex == NULL + || error != NULL) { - ret = FALSE; + syslog (LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), "Error on creating regex: %s.", + error->message != NULL ? error->message : "no details"); + return FALSE; } + ret = g_regex_match ((const GRegex *)regex, value, 0, NULL); + return ret; } diff --git a/src/libzakform.h b/src/libzakform.h index 1e85421..74a8a96 100644 --- a/src/libzakform.h +++ b/src/libzakform.h @@ -22,6 +22,8 @@ #include +#include + #include #include