1 /*
2 * RAL -- Rubrica Addressbook Library
3 * file: work.c
4 *
5 * Copyright (C) Nicola Fragale <nicolafragale@libero.it>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21
22 #include <glib.h>
23 #include <glib-object.h>
24
25 #include "work.h"
26 #include "utils.h"
27
28
29 enum {
30 WORK_ASSIGNMENT = 1,
31 WORK_ORG,
32 WORK_DEP,
33 WORK_SUBDEP,
34 WORK_MANAGER,
35 WORK_MPHONE,
36 WORK_COLLABORATOR,
37 WORK_CPHONE
38 };
39
40 struct _RWorkPrivate {
41 gchar* assignment; /* contact role */
42 gchar* org; /* organization */
43 gchar* dep; /* department */
44 gchar* subdep; /* sub department */
45 gchar* manager; /* contact's manager */
46 gchar* mphone; /* manager telephone */
47 gchar* collaborator; /* contact's collaborator */
48 gchar* cphone; /* collaborator's telephone */
49
50 gboolean dispose_has_run;
51 };
52
53 #define R_WORK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
54 R_WORK_TYPE, RWorkPrivate))
55
56
57 static void r_work_class_init (RWorkClass* klass);
58 static void r_work_init (RWork* obj);
59
60 static void r_work_dispose (RWork* obj);
61 static void r_work_finalize (RWork* obj);
62
63
64 static void r_work_set_property (GObject* obj, guint property_id,
65 GValue* value, GParamSpec* spec);
66 static void r_work_get_property (GObject* obj, guint property_id,
67 GValue* value, GParamSpec* spec);
68
69
70 GType
r_work_get_type()71 r_work_get_type()
72 {
73 static GType work_type = 0;
74
75 if (!work_type)
76 {
77 static const GTypeInfo work_info =
78 {
79 sizeof(RWorkClass),
80 NULL,
81 NULL,
82 (GClassInitFunc) r_work_class_init,
83 NULL,
84 NULL,
85 sizeof(RWork),
86 0,
87 (GInstanceInitFunc) r_work_init
88 };
89
90 work_type = g_type_register_static (G_TYPE_OBJECT, "RWork",
91 &work_info, 0);
92 }
93
94 return work_type;
95 }
96
97
98 static void
r_work_class_init(RWorkClass * klass)99 r_work_class_init(RWorkClass* klass)
100 {
101 GObjectClass *class;
102 GParamSpec* pspec;
103
104 class = G_OBJECT_CLASS (klass);
105
106 class->dispose = (GObjectFinalizeFunc) r_work_dispose;
107 class->finalize = (GObjectFinalizeFunc) r_work_finalize;
108
109 class->set_property = (gpointer) r_work_set_property;
110 class->get_property = (gpointer) r_work_get_property;
111
112 g_type_class_add_private (klass, sizeof(RWorkPrivate));
113
114 /**
115 * RWork:assignment
116 *
117 * the contact's assignment
118 */
119 pspec = g_param_spec_string("assignment",
120 "the contact's assignment",
121 "the contact's assignment",
122 NULL,
123 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
124 g_object_class_install_property(class, WORK_ASSIGNMENT, pspec);
125
126 /**
127 * RWork:organization:
128 *
129 * The organization the contact works for
130 */
131 pspec = g_param_spec_string("organization",
132 "organization",
133 "The organization the contact works for",
134 NULL,
135 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
136 g_object_class_install_property(class, WORK_ORG, pspec);
137
138 /**
139 * RWork:department:
140 *
141 * The department where contact works
142 */
143 pspec = g_param_spec_string("department",
144 "department",
145 "The department where contact works",
146 NULL,
147 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
148 g_object_class_install_property(class, WORK_DEP, pspec);
149
150 /**
151 * RWork:sub-department:
152 *
153 * The sub department where contact works
154 */
155 pspec = g_param_spec_string("sub-department",
156 "sub department",
157 "The sub department where contact works",
158 NULL,
159 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
160 g_object_class_install_property(class, WORK_SUBDEP, pspec);
161
162 /**
163 * RWork:manager-name:
164 *
165 * the contact's manager
166 */
167 pspec = g_param_spec_string("manager-name",
168 "contact's manager",
169 "the contact's manager ",
170 NULL,
171 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
172 g_object_class_install_property(class, WORK_MANAGER, pspec);
173
174 /**
175 * RWork:manager-phone:
176 *
177 * the manager's telephone number
178 */
179 pspec = g_param_spec_string("manager-phone",
180 "manager's phone",
181 "the manager's telephone number",
182 NULL,
183 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
184 g_object_class_install_property(class, WORK_MPHONE, pspec);
185
186 /**
187 * RWork:collaborator:
188 *
189 * contact's collaborator
190 */
191 pspec = g_param_spec_string("collaborator",
192 "contact's collaborator",
193 "contact's collaborator",
194 NULL,
195 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
196 g_object_class_install_property(class, WORK_COLLABORATOR, pspec);
197
198 /**
199 * RWork:collaborator-phone:
200 *
201 * collaborator's phone
202 */
203 pspec = g_param_spec_string("collaborator-phone",
204 "collaborator's phone",
205 "collaborator's phone",
206 NULL,
207 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
208 g_object_class_install_property(class, WORK_CPHONE, pspec);
209 }
210
211
212 static void
r_work_init(RWork * self)213 r_work_init(RWork* self)
214 {
215 RWorkPrivate* priv = R_WORK_GET_PRIVATE(self);
216
217 priv->assignment = NULL;
218 priv->org = NULL;
219 priv->dep = NULL;
220 priv->subdep = NULL;
221 priv->manager = NULL;
222 priv->mphone = NULL;
223 priv->collaborator = NULL;
224 priv->cphone = NULL;
225
226 priv->dispose_has_run = FALSE;
227 }
228
229
230
231 static void
r_work_dispose(RWork * self)232 r_work_dispose (RWork* self)
233 {
234 RWorkPrivate* priv;
235
236 g_return_if_fail(IS_R_WORK(self));
237
238 priv = R_WORK_GET_PRIVATE(self);
239 if (priv->dispose_has_run)
240 return;
241
242 priv->dispose_has_run = TRUE;
243 }
244
245
246 static void
r_work_finalize(RWork * self)247 r_work_finalize (RWork* self)
248 {
249 RWorkPrivate* priv;
250
251 g_return_if_fail(IS_R_WORK(self));
252
253 priv = R_WORK_GET_PRIVATE(self);
254 r_utils_free_string(priv->assignment);
255 r_utils_free_string(priv->org);
256 r_utils_free_string(priv->dep);
257 r_utils_free_string(priv->subdep);
258 r_utils_free_string(priv->manager);
259 r_utils_free_string(priv->mphone);
260 r_utils_free_string(priv->collaborator);
261 r_utils_free_string(priv->cphone);
262
263 priv->assignment = NULL;
264 priv->org = NULL;
265 priv->dep = NULL;
266 priv->subdep = NULL;
267 priv->manager = NULL;
268 priv->mphone = NULL;
269 priv->collaborator = NULL;
270 priv->cphone = NULL;
271 }
272
273
274 static void
r_work_set_property(GObject * obj,guint property_id,GValue * value,GParamSpec * spec)275 r_work_set_property (GObject* obj, guint property_id,
276 GValue* value, GParamSpec* spec)
277 {
278 RWork* self = (RWork*) obj;
279 RWorkPrivate* priv = R_WORK_GET_PRIVATE(self);
280
281 switch (property_id)
282 {
283 case WORK_ASSIGNMENT:
284 g_free(priv->assignment);
285 priv->assignment = g_value_dup_string(value);
286 break;
287
288 case WORK_ORG:
289 g_free(priv->org);
290 priv->org = g_value_dup_string(value);
291 break;
292
293 case WORK_DEP:
294 g_free(priv->dep);
295 priv->dep = g_value_dup_string(value);
296 break;
297
298 case WORK_SUBDEP:
299 g_free(priv->subdep);
300 priv->subdep = g_value_dup_string(value);
301 break;
302
303 case WORK_MANAGER:
304 g_free(priv->manager);
305 priv->manager = g_value_dup_string(value);
306 break;
307
308 case WORK_MPHONE:
309 g_free(priv->mphone);
310 priv->mphone = g_value_dup_string(value);
311 break;
312
313 case WORK_COLLABORATOR:
314 g_free(priv->collaborator);
315 priv->collaborator = g_value_dup_string(value);
316 break;
317
318 case WORK_CPHONE:
319 g_free(priv->cphone);
320 priv->cphone = g_value_dup_string(value);
321 break;
322
323 default:
324 break;
325 }
326 }
327
328
329 static void
r_work_get_property(GObject * obj,guint property_id,GValue * value,GParamSpec * spec)330 r_work_get_property (GObject* obj, guint property_id,
331 GValue* value, GParamSpec* spec)
332 {
333 RWork* self = (RWork*) obj;
334 RWorkPrivate* priv = R_WORK_GET_PRIVATE(self);
335
336 switch (property_id)
337 {
338 case WORK_ASSIGNMENT:
339 g_value_set_string(value, priv->assignment);
340 break;
341
342 case WORK_ORG:
343 g_value_set_string(value, priv->org);
344 break;
345
346 case WORK_DEP:
347 g_value_set_string(value, priv->dep);
348 break;
349
350 case WORK_SUBDEP:
351 g_value_set_string(value, priv->subdep);
352 break;
353
354 case WORK_MANAGER:
355 g_value_set_string(value, priv->manager);
356 break;
357
358 case WORK_MPHONE:
359 g_value_set_string(value, priv->mphone);
360 break;
361
362 case WORK_COLLABORATOR:
363 g_value_set_string(value, priv->collaborator);
364 break;
365
366 case WORK_CPHONE:
367 g_value_set_string(value, priv->cphone);
368 break;
369
370 default:
371 break;
372 }
373 }
374
375
376 /* Public
377 */
378
379
380 /**
381 * r_work_new
382 *
383 * create a new #RWork
384 *
385 * returns: a new #RWork*
386 */
387 RWork*
r_work_new(void)388 r_work_new(void)
389 {
390 RWork* work;
391
392 work = g_object_new(r_work_get_type(), NULL);
393
394 return work;
395 }
396
397 /**
398 * r_work_free
399 * @work: a #RWork
400 *
401 * free the memory owned by object
402 */
403 void
r_work_free(RWork * work)404 r_work_free(RWork* work)
405 {
406 g_return_if_fail(IS_R_WORK(work));
407
408 g_object_unref(work);
409 }
410
411
412 gboolean
r_work_have_data(RWork * work)413 r_work_have_data (RWork* work)
414 {
415 RWorkPrivate* priv;
416
417 g_return_val_if_fail(IS_R_WORK(work), FALSE);
418
419 priv = R_WORK_GET_PRIVATE(work);
420
421 if (priv->assignment || priv->org || priv->dep || priv->subdep ||
422 priv->manager || priv->mphone || priv->collaborator || priv->cphone)
423 return TRUE;
424
425 return FALSE;
426 }
427
428
429 /**
430 * r_work_check
431 * @work: a #RWork
432 * @property: an #RWork's property
433 * @value: the property's value (if set)
434 *
435 * check if the given property is set.
436 *
437 * returns: %FALSE if the property is %NULL, otherwise it return %TRUE and
438 * the content of the property is copied into value
439 **/
440 gboolean
r_work_check(RWork * work,const gchar * property,gchar ** value)441 r_work_check (RWork* work, const gchar* property, gchar** value)
442 {
443 gchar* tmp;
444
445 g_return_val_if_fail(IS_R_WORK(work), FALSE);
446 g_return_val_if_fail(property != NULL, FALSE);
447
448 g_object_get(work, property, &tmp, NULL);
449
450 if (tmp)
451 {
452 if (value)
453 *value = tmp;
454
455 return TRUE;
456 }
457
458 return FALSE;
459 }
460
461
462 gboolean
r_work_search(RWork * work,const gchar * str)463 r_work_search (RWork* work, const gchar* str)
464 {
465 RWorkPrivate* priv;
466
467 g_return_val_if_fail(IS_R_WORK(work), FALSE);
468 g_return_val_if_fail(str != NULL, FALSE);
469
470 priv = R_WORK_GET_PRIVATE(work);
471
472 if (priv->assignment && g_strrstr(priv->assignment, str))
473 return TRUE;
474
475 if (priv->org && g_strrstr(priv->org, str))
476 return TRUE;
477
478 if (priv->dep && g_strrstr(priv->dep, str))
479 return TRUE;
480
481 if (priv->subdep && g_strrstr(priv->subdep, str))
482 return TRUE;
483
484 if (priv->manager && g_strrstr(priv->manager, str))
485 return TRUE;
486
487 if (priv->mphone && g_strrstr(priv->mphone, str))
488 return TRUE;
489
490 if (priv->collaborator && g_strrstr(priv->collaborator, str))
491 return TRUE;
492
493 if (priv->cphone && g_strrstr(priv->cphone, str))
494 return TRUE;
495
496 return FALSE;
497 }
498
499
500
501
502 /**
503 * r_work_copy
504 * @work: a #RWork
505 *
506 * copy the given #RWork
507 *
508 * returns: a new allocated #RWork*
509 */
510 RWork*
r_work_copy(RWork * work)511 r_work_copy (RWork* work)
512 {
513 RWork* new;
514 gchar *assignment, *org, *dep, *subdep;
515 gchar *manager, *mphone, *collaborator, *cphone;
516
517 g_return_val_if_fail(IS_R_WORK(work), NULL);
518
519 new = r_work_new();
520
521 g_object_get(G_OBJECT(work), "assignment", &assignment,
522 "organization", &org, "department", &dep,
523 "sub-department", &subdep, "manager-name", &manager,
524 "manager-phone", &mphone, "collaborator", &collaborator,
525 "collaborator-phone", &cphone, NULL);
526
527 g_object_set(G_OBJECT(new), "assignment", assignment,
528 "organization", org, "department", dep,
529 "sub-department", subdep, "manager-name", manager,
530 "manager-phone", mphone, "collaborator", collaborator,
531 "collaborator-phone", cphone, NULL);
532
533 return new;
534 }
535
536