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