1 /*
2  * Copyright (C) 2008 Massimo Cora <maxcvs@email.it>
3  * Copyright (C) 2008 - 2011 Vivien Malerba <malerba@gnome-db.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA  02110-1301, USA.
19  */
20 
21 
22 #ifndef __GDA_HOLDER_H_
23 #define __GDA_HOLDER_H_
24 
25 #include <libgda/gda-decl.h>
26 #include "gda-value.h"
27 
28 G_BEGIN_DECLS
29 
30 #define GDA_TYPE_HOLDER          (gda_holder_get_type())
31 #define GDA_HOLDER(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, gda_holder_get_type(), GdaHolder)
32 #define GDA_HOLDER_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, gda_holder_get_type (), GdaHolderClass)
33 #define GDA_IS_HOLDER(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, gda_holder_get_type ())
34 
35 /* error reporting */
36 extern GQuark gda_holder_error_quark (void);
37 #define GDA_HOLDER_ERROR gda_holder_error_quark ()
38 
39 typedef enum {
40 	GDA_HOLDER_STRING_CONVERSION_ERROR,
41 	GDA_HOLDER_VALUE_TYPE_ERROR,
42 	GDA_HOLDER_VALUE_NULL_ERROR
43 } GdaHolderError;
44 
45 /* struct for the object's data */
46 struct _GdaHolder
47 {
48 	GObject                 object;
49 	GdaHolderPrivate       *priv;
50 };
51 
52 
53 /* struct for the object's class */
54 struct _GdaHolderClass
55 {
56 	GObjectClass               parent_class;
57 	void                     (*changed)          (GdaHolder *holder);
58 	void                     (*source_changed)   (GdaHolder *holder);
59 	GError                  *(*validate_change)  (GdaHolder *holder, const GValue *new_value);
60 	void                     (*att_changed)      (GdaHolder *holder, const gchar *att_name, const GValue *att_value);
61 
62 	/*< private >*/
63 	/* Padding for future expansion */
64 	void (*_gda_reserved1) (void);
65 	void (*_gda_reserved2) (void);
66 	void (*_gda_reserved3) (void);
67 	void (*_gda_reserved4) (void);
68 };
69 
70 /**
71  * SECTION:gda-holder
72  * @short_description: Container for a single #GValue
73  * @title: GdaHolder
74  * @stability: Stable
75  * @see_also: The #GdaSet object which "groups" several #GdaHolder objects
76  *
77  * The #GdaHolder is a container for a single #GValue value. It also specifies various attributes
78  * of the contained value (default value, ...)
79  *
80  * The type of a #GdaHolder has to be set and cannot be modified, except if it's initialized
81  * with a GDA_TYPE_NULL GType (representing NULL values) where it can be changed once to a real GType.
82  *
83  * Each GdaHolder object is thread safe.
84  */
85 
86 GType               gda_holder_get_type                (void) G_GNUC_CONST;
87 GdaHolder          *gda_holder_new                     (GType type);
88 GdaHolder          *gda_holder_new_inline              (GType type, const gchar *id, ...);
89 GdaHolder          *gda_holder_copy                    (GdaHolder *orig);
90 
91 GType               gda_holder_get_g_type              (GdaHolder *holder);
92 const gchar        *gda_holder_get_id                  (GdaHolder *holder);
93 gchar *             gda_holder_get_alphanum_id         (GdaHolder *holder);
94 
95 
96 /**
97  * gda_holder_new_string:
98  * @id: a string
99  * @str: a string
100  *
101  * Creates a new boolean #GdaHolder object with an ID set to @id, and a value initialized to
102  * @str.
103  *
104  * Returns: a new #GdaHolder
105  */
106 #define gda_holder_new_string(id,str) gda_holder_new_inline (G_TYPE_STRING, (id), (str))
107 
108 /**
109  * gda_holder_new_boolean:
110  * @id: a string
111  * @abool: a boolean value
112  *
113  * Creates a new boolean #GdaHolder object with an ID set to @id, and a value initialized to
114  * @abool.
115  *
116  * Returns: a new #GdaHolder
117  */
118 #define gda_holder_new_boolean(id,abool) gda_holder_new_inline (G_TYPE_BOOLEAN, (id), (abool))
119 
120 /**
121  * gda_holder_new_int:
122  * @id: a string
123  * @anint: an int value
124  *
125  * Creates a new boolean #GdaHolder object with an ID set to @id, and a value initialized to
126  * @anint.
127  *
128  * Returns: a new #GdaHolder
129  */
130 #define gda_holder_new_int(id,anint) gda_holder_new_inline (G_TYPE_INT, (id), (anint))
131 
132 const GValue       *gda_holder_get_value               (GdaHolder *holder);
133 gchar              *gda_holder_get_value_str           (GdaHolder *holder, GdaDataHandler *dh);
134 gboolean            gda_holder_set_value               (GdaHolder *holder, const GValue *value, GError **error);
135 gboolean            gda_holder_take_value              (GdaHolder *holder, GValue *value, GError **error);
136 GValue             *gda_holder_take_static_value       (GdaHolder *holder, const GValue *value, gboolean *value_changed, GError **error);
137 gboolean            gda_holder_set_value_str           (GdaHolder *holder, GdaDataHandler *dh, const gchar *value, GError **error);
138 
139 const GValue       *gda_holder_get_default_value       (GdaHolder *holder);
140 void                gda_holder_set_default_value       (GdaHolder *holder, const GValue *value);
141 gboolean            gda_holder_set_value_to_default    (GdaHolder *holder);
142 gboolean            gda_holder_value_is_default        (GdaHolder *holder);
143 
144 void                gda_holder_force_invalid           (GdaHolder *holder);
145 void                gda_holder_force_invalid_e         (GdaHolder *holder, GError *error);
146 gboolean            gda_holder_is_valid                (GdaHolder *holder);
147 gboolean            gda_holder_is_valid_e              (GdaHolder *holder, GError **error);
148 
149 
150 void                gda_holder_set_not_null            (GdaHolder *holder, gboolean not_null);
151 gboolean            gda_holder_get_not_null            (GdaHolder *holder);
152 
153 gboolean            gda_holder_set_source_model         (GdaHolder *holder, GdaDataModel *model,
154 							 gint col, GError **error);
155 GdaDataModel       *gda_holder_get_source_model         (GdaHolder *holder, gint *col);
156 
157 gboolean            gda_holder_set_bind                 (GdaHolder *holder, GdaHolder *bind_to, GError **error);
158 GdaHolder          *gda_holder_get_bind                 (GdaHolder *holder);
159 
160 const GValue       *gda_holder_get_attribute            (GdaHolder *holder, const gchar *attribute);
161 void                gda_holder_set_attribute            (GdaHolder *holder, const gchar *attribute, const GValue *value,
162 							 GDestroyNotify destroy);
163 
164 /**
165  * gda_holder_set_attribute_static:
166  * @holder: a #GdaHolder
167  * @attribute: attribute's name
168  * @value: (allow-none): a #GValue, or %NULL
169  *
170  * This function is similar to gda_holder_set_attribute() but for static strings
171  */
172 #define gda_holder_set_attribute_static(holder,attribute,value) gda_holder_set_attribute((holder),(attribute),(value),NULL)
173 
174 G_END_DECLS
175 
176 #endif
177