1 /* foo-person.c
  2  *
  3  * Copyright (C) 2009 Christian Hergert <chris@dronelabs.com>
  4  *
  5  * This library is free software; you can redistribute it and/or
  6  * modify it under the terms of the GNU Library 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  * Library General Public License for more details.
 14  *
 15  * You should have received a copy of the GNU Library General Public
 16  * License along with this library; if not, write to the Free Software
 17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
 18  * 02110-1301 USA
 19  */
 20
 21 #include "foo-person.h"
 22
 23 G_DEFINE_TYPE (FooPerson, foo_person, G_TYPE_OBJECT)
 24
 25 enum
 26 {
 27         PROP_0,
 28         PROP_NAME,
 29         PROP_AGE,
 30         PROP_GENDER,
 31 };
 32
 33 enum
 34 {
 35         CHANGED,
 36         LAST_SIGNAL
 37 };
 38
 39 static guint signals [LAST_SIGNAL] = {0,};
 40
 41 struct _FooPersonPrivate
 42 {
 43         gchar* name;
 44         guint  age;
 45         gchar  gender;
 46 };
 47
 48 static void
 49 foo_person_get_property (GObject    *object,
 50                          guint       property_id,
 51                          GValue     *value,
 52                          GParamSpec *pspec)
 53 {
 54         switch (property_id) {
 55         case PROP_NAME:
 56                 g_value_set_string (value, FOO_PERSON (object)->priv->name);
 57                 break;
 58         case PROP_AGE:
 59                 g_value_set_uint (value, FOO_PERSON (object)->priv->age);
 60                 break;
 61         case PROP_GENDER:
 62                 g_value_set_char (value, FOO_PERSON (object)->priv->gender);
 63                 break;
 64         default:
 65                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 66         }
 67 }
 68
 69 static void
 70 foo_person_set_property (GObject      *object,
 71                          guint         property_id,
 72                          const GValue *value,
 73                          GParamSpec   *pspec)
 74 {
 75         switch (property_id) {
 76         case PROP_NAME:
 77                 g_free (FOO_PERSON (object)->priv->name);
 78                 FOO_PERSON (object)->priv->name = g_value_dup_string (value);
 79                 break;
 80         case PROP_AGE:
 81                 FOO_PERSON (object)->priv->age = g_value_get_uint (value);
 82                 break;
 83         case PROP_GENDER:
 84                 FOO_PERSON (object)->priv->gender = g_value_get_char (value);
 85                 break;
 86         default:
 87                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 88         }
 89 }
 90
 91 static void
 92 foo_person_finalize (GObject *object)
 93 {
 94         G_OBJECT_CLASS (foo_person_parent_class)->finalize (object);
 95 }
 96
 97 static void
 98 foo_person_dispose (GObject *object)
 99 {
100 }
101
102 static void
103 foo_person_class_init (FooPersonClass *klass)
104 {
105         GObjectClass *object_class;
106
107         object_class = G_OBJECT_CLASS (klass);
108         object_class->set_property = foo_person_set_property;
109         object_class->get_property = foo_person_get_property;
110         object_class->finalize     = foo_person_finalize;
111         object_class->dispose      = foo_person_dispose;
112
113         /**
114          * FooPerson::changed:
115          *
116          * The changed signal.
117          */
118         signals [CHANGED] = g_signal_new ("changed",
119                                           FOO_TYPE_PERSON,
120                                           G_SIGNAL_RUN_FIRST,
121                                           G_STRUCT_OFFSET (FooPersonClass, changed),
122                                           NULL,
123                                           NULL,
124                                           g_cclosure_marshal_VOID__VOID,
125                                           G_TYPE_NONE,
126                                           0);
127
128         /**
129          * FooPerson::name:
130          *
131          * The "name" property.
132          */
133         g_object_class_install_property (object_class,
134                                          PROP_NAME,
135                                          g_param_spec_string ("name",
136                                                               "Name",
137                                                               "Persons name",
138                                                               NULL,
139                                                               G_PARAM_READWRITE));
140
141         /**
142          * FooPerson::age:
143          *
144          * The "age" property.
145          */
146         g_object_class_install_property (object_class,
147                                          PROP_AGE,
148                                          g_param_spec_uint ("age",
149                                                             "Age",
150                                                             "Persons age",
151                                                             0,
152                                                             G_MAXUINT,
153                                                             0,
154                                                             G_PARAM_READWRITE));
155
156         /**
157          * FooPerson::gender:
158          *
159          * The "gender" property.
160          */
161         g_object_class_install_property (object_class,
162                                          PROP_GENDER,
163                                          g_param_spec_char ("gender",
164                                                             "Gender",
165                                                             "Perons gender",
166                                                             G_MININT8,
167                                                             G_MAXINT8,
168                                                             'M',
169                                                             G_PARAM_READWRITE));
170 }
171
172 static void
173 foo_person_init (FooPerson *person)
174 {
175         person->priv = G_TYPE_INSTANCE_GET_PRIVATE (person,
176                                                     FOO_TYPE_PERSON,
177                                                     FooPersonPrivate);
178 }
179
180 /**
181  * foo_person_new:
182  *
183  * Return value:
184  */
185 FooPerson*
186 foo_person_new (void)
187 {
188         return g_object_new (FOO_TYPE_PERSON, NULL);
189 }
190
191 /**
192  * foo_person_get_name:
193  * @person: A #FooPerson
194  *
195  * Return value:
196  */
197 G_CONST_RETURN gchar*
198 foo_person_get_name (FooPerson *person)
199 {
200         g_return_val_if_fail (FOO_IS_PERSON (person), NULL);
201         return FOO_PERSON (person)->priv->name;
202 }
203
204 /**
205  * foo_person_set_name:
206  * @person: A #FooPerson
207  * @name: A #const gchar
208  */
209 void
210 foo_person_set_name (FooPerson    *person,
211                      const gchar*  name)
212 {
213         g_return_if_fail (FOO_IS_PERSON (person));
214         g_free (FOO_PERSON (person)->priv->name);
215         FOO_PERSON (person)->priv->name = g_strdup (name);
216 }
217
218 /**
219  * foo_person_get_age:
220  * @person: A #FooPerson
221  *
222  * Return value:
223  */
224 guint
225 foo_person_get_age (FooPerson *person)
226 {
227         g_return_val_if_fail (FOO_IS_PERSON (person), 0);
228         return FOO_PERSON (person)->priv->age;
229 }
230
231 /**
232  * foo_person_set_age:
233  * @person: A #FooPerson
234  * @age: A #guint
235  */
236 void
237 foo_person_set_age (FooPerson *person,
238                     guint      age)
239 {
240         g_return_if_fail (FOO_IS_PERSON (person));
241         FOO_PERSON (person)->priv->age = age;
242 }
243
244 /**
245  * foo_person_get_gender:
246  * @person: A #FooPerson
247  *
248  * Return value:
249  */
250 gchar
251 foo_person_get_gender (FooPerson *person)
252 {
253         g_return_val_if_fail (FOO_IS_PERSON (person), 0);
254         return FOO_PERSON (person)->priv->gender;
255 }
256
257 /**
258  * foo_person_set_gender:
259  * @person: A #FooPerson
260  * @gender: A #gchar
261  */
262 void
263 foo_person_set_gender (FooPerson *person,
264                        gchar      gender)
265 {
266         g_return_if_fail (FOO_IS_PERSON (person));
267         FOO_PERSON (person)->priv->gender = gender;
268 }
269
270 /**
271  * foo_person_copy:
272  * @person: A #FooPerson
273  *
274  * Return value:
275  */
276 FooPerson*
277 foo_person_copy (FooPerson *person)
278 {
279         FooPersonPrivate *priv;
280
281         g_return_val_if_fail (FOO_IS_PERSON (person), NULL);
282
283         priv = person->priv;
284
285         return NULL;
286 }
287