2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2017 Match Grun and the Claws Mail team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * General primitive address item objects.
28 #include "file-utils.h"
35 * Create new email address item.
36 * \return Initialized email item.
38 ItemEMail
*addritem_create_item_email( void ) {
40 item
= g_new0( ItemEMail
, 1 );
41 ADDRITEM_TYPE(item
) = ITEMTYPE_EMAIL
;
42 ADDRITEM_ID(item
) = NULL
;
43 ADDRITEM_NAME(item
) = NULL
;
44 ADDRITEM_PARENT(item
) = NULL
;
45 ADDRITEM_SUBTYPE(item
) = 0;
52 * Create a shallow copy of specified email address item.
53 * \param item E-Mail to copy.
54 * \return Copy of email, or <i>NULL</i> if null argument supplied.
56 ItemEMail
*addritem_copy_item_email( ItemEMail
*item
) {
57 ItemEMail
*itemNew
= NULL
;
59 itemNew
= addritem_create_item_email();
60 ADDRITEM_NAME(itemNew
) = g_strdup( ADDRITEM_NAME(item
) );
61 itemNew
->address
= g_strdup( item
->address
);
62 itemNew
->remarks
= g_strdup( item
->remarks
);
68 * Create a full copy (deep copy) of specified email address item.
69 * \param item E-Mail to copy.
70 * \return Copy of email.
72 ItemEMail
*addritem_copyfull_item_email( ItemEMail
*item
) {
73 ItemEMail
*itemNew
= NULL
;
75 itemNew
= addritem_create_item_email();
76 ADDRITEM_ID(itemNew
) = g_strdup( ADDRITEM_ID(item
) );
77 ADDRITEM_NAME(itemNew
) = g_strdup( ADDRITEM_NAME(item
) );
78 ADDRITEM_PARENT(itemNew
) = ADDRITEM_PARENT(item
);
79 itemNew
->address
= g_strdup( item
->address
);
80 itemNew
->remarks
= g_strdup( item
->remarks
);
86 * Specify alias for email.
87 * \param email E-Mail item.
90 void addritem_email_set_alias( ItemEMail
*email
, const gchar
*value
) {
91 ADDRITEM_NAME(email
) = mgu_replace_string( ADDRITEM_NAME(email
), value
);
95 * Specify address for email.
96 * \param email E-Mail item.
97 * \param value Address.
99 void addritem_email_set_address( ItemEMail
*email
, const gchar
*value
) {
100 email
->address
= mgu_replace_string( email
->address
, value
);
104 * Specify remarks for email.
105 * \param email E-Mail item.
106 * \param value Remarks.
108 void addritem_email_set_remarks( ItemEMail
*email
, const gchar
*value
) {
109 email
->remarks
= mgu_replace_string( email
->remarks
, value
);
113 * Free address item email object.
114 * \param item E-Mail item to free.
116 void addritem_free_item_email( ItemEMail
*item
) {
117 cm_return_if_fail( item
!= NULL
);
119 /* Free internal stuff */
120 g_free( ADDRITEM_ID(item
) );
121 g_free( ADDRITEM_NAME(item
) );
122 g_free( item
->address
);
123 g_free( item
->remarks
);
125 ADDRITEM_OBJECT(item
)->type
= ITEMTYPE_NONE
;
126 ADDRITEM_ID(item
) = NULL
;
127 ADDRITEM_NAME(item
) = NULL
;
128 ADDRITEM_PARENT(item
) = NULL
;
129 ADDRITEM_SUBTYPE(item
) = 0;
130 item
->address
= NULL
;
131 item
->remarks
= NULL
;
136 * Create new attribute object.
137 * \return Initialized attribute object.
139 UserAttribute
*addritem_create_attribute( void ) {
141 item
= g_new0( UserAttribute
, 1 );
149 * Create copy (deep copy) of specified attribute.
150 * \param item Attribute to copy.
151 * \return Copy of attribute, or <i>NULL</i> if null argument supplied.
153 UserAttribute
*addritem_copy_attribute( UserAttribute
*item
) {
154 UserAttribute
*itemNew
= NULL
;
156 itemNew
= addritem_create_attribute();
157 itemNew
->uid
= g_strdup( item
->uid
);
158 itemNew
->name
= g_strdup( item
->name
);
159 itemNew
->value
= g_strdup( item
->value
);
165 * Specify ID for attribute.
166 * \param item Attribute object.
169 void addritem_attrib_set_id( UserAttribute
*item
, const gchar
*value
) {
170 cm_return_if_fail( item
!= NULL
);
171 item
->uid
= mgu_replace_string( item
->uid
, value
);
175 * Specify name for attribute.
176 * \param item Attribute object.
179 void addritem_attrib_set_name( UserAttribute
*item
, const gchar
*value
) {
180 cm_return_if_fail( item
!= NULL
);
181 item
->name
= mgu_replace_string( item
->name
, value
);
185 * Specify value for attribute.
186 * \param item Attribute object.
187 * \param value Value.
189 void addritem_attrib_set_value( UserAttribute
*item
, const gchar
*value
) {
190 cm_return_if_fail( item
!= NULL
);
191 item
->value
= mgu_replace_string( item
->value
, value
);
195 * Free user attribute.
196 * \param item Attribute object to free.
198 void addritem_free_attribute( UserAttribute
*item
) {
199 cm_return_if_fail( item
!= NULL
);
201 g_free( item
->name
);
202 g_free( item
->value
);
210 * Create new address book person.
211 * \return Initialized person object.
213 ItemPerson
*addritem_create_item_person( void ) {
215 person
= g_new0( ItemPerson
, 1 );
216 ADDRITEM_TYPE(person
) = ITEMTYPE_PERSON
;
217 ADDRITEM_ID(person
) = NULL
;
218 ADDRITEM_NAME(person
) = NULL
;
219 ADDRITEM_PARENT(person
) = NULL
;
220 ADDRITEM_SUBTYPE(person
) = 0;
221 person
->picture
= NULL
;
222 person
->firstName
= NULL
;
223 person
->lastName
= NULL
;
224 person
->nickName
= NULL
;
225 person
->listEMail
= NULL
;
226 person
->listAttrib
= NULL
;
227 person
->externalID
= NULL
;
228 person
->isOpened
= FALSE
;
229 person
->status
= NONE
;
234 * Create a shallow copy of address book person object.
235 * \param item Person to copy.
236 * \return Copy of person, or <i>NULL</i> if null argument supplied.
238 ItemPerson
*addritem_copy_item_person( ItemPerson
*item
) {
243 itemNew
= addritem_create_item_person();
244 ADDRITEM_NAME(itemNew
) = g_strdup( ADDRITEM_NAME(item
) );
245 itemNew
->picture
= g_strdup( ADDRITEM_ID(itemNew
) );
246 itemNew
->firstName
= g_strdup( item
->firstName
);
247 itemNew
->lastName
= g_strdup( item
->lastName
);
248 itemNew
->nickName
= g_strdup( item
->nickName
);
249 itemNew
->externalID
= g_strdup( item
->externalID
);
250 itemNew
->status
= item
->status
;
256 * Specify picture for person object.
257 * \param person Person object.
258 * \param value Picture.
260 void addritem_person_set_picture( ItemPerson
*person
, const gchar
*value
) {
261 if (!value
|| g_utf8_validate(value
, -1, NULL
))
262 person
->picture
= mgu_replace_string( person
->picture
, value
);
264 gchar
*out
= conv_codeset_strdup(value
,
265 conv_get_locale_charset_str_no_utf8(),
268 person
->picture
= mgu_replace_string( person
->picture
, out
);
274 * Get picture filename for person object.
275 * \param person Person object.
276 * \return copy of picture file path string (to be freed by caller - and there is
277 * no guarantee that path does exist, or NULL.
279 gchar
*addritem_person_get_picture( ItemPerson
*person
) {
281 return g_strconcat( get_rc_dir(), G_DIR_SEPARATOR_S
,
282 ADDRBOOK_DIR
, G_DIR_SEPARATOR_S
, person
->picture
,
288 * Delete picture for person object.
289 * \param person Person object.
291 void addritem_person_remove_picture( ItemPerson
*person
) {
292 if (person
->picture
) {
293 gchar
*filename
= g_strconcat( get_rc_dir(), G_DIR_SEPARATOR_S
,
294 ADDRBOOK_DIR
, G_DIR_SEPARATOR_S
, person
->picture
,
296 if (is_file_exist(filename
)) {
297 debug_print("removing addressbook picture %s\n",
299 if (claws_unlink(filename
) < 0) {
300 FILE_OP_ERROR(filename
, "remove");
305 g_free(person
->picture
);
306 person
->picture
= NULL
;
312 * Specify first name for person object.
313 * \param person Person object.
316 void addritem_person_set_first_name( ItemPerson
*person
, const gchar
*value
) {
317 if (!value
|| g_utf8_validate(value
, -1, NULL
))
318 person
->firstName
= mgu_replace_string( person
->firstName
, value
);
320 gchar
*out
= conv_codeset_strdup(value
,
321 conv_get_locale_charset_str_no_utf8(),
324 person
->firstName
= mgu_replace_string( person
->firstName
, out
);
330 * Specify last name for person object.
331 * \param person Person object.
334 void addritem_person_set_last_name( ItemPerson
*person
, const gchar
*value
) {
335 if (!value
|| g_utf8_validate(value
, -1, NULL
))
336 person
->lastName
= mgu_replace_string( person
->lastName
, value
);
338 gchar
*out
= conv_codeset_strdup(value
,
339 conv_get_locale_charset_str_no_utf8(),
342 person
->lastName
= mgu_replace_string( person
->lastName
, out
);
348 * Specify nick name for person object.
349 * \param person Person object.
352 void addritem_person_set_nick_name( ItemPerson
*person
, const gchar
*value
) {
353 if (!value
|| g_utf8_validate(value
, -1, NULL
))
354 person
->nickName
= mgu_replace_string( person
->nickName
, value
);
356 gchar
*out
= conv_codeset_strdup(value
,
357 conv_get_locale_charset_str_no_utf8(),
360 person
->nickName
= mgu_replace_string( person
->nickName
, out
);
366 * Specify common name for person object.
367 * \param person Person object.
370 void addritem_person_set_common_name( ItemPerson
*person
, const gchar
*value
) {
371 if (!value
|| g_utf8_validate(value
, -1, NULL
))
372 ADDRITEM_NAME(person
) = mgu_replace_string( ADDRITEM_NAME(person
), value
);
374 gchar
*out
= conv_codeset_strdup(value
,
375 conv_get_locale_charset_str_no_utf8(),
378 ADDRITEM_NAME(person
) = mgu_replace_string( ADDRITEM_NAME(person
), out
);
384 * Specify external ID for person object.
385 * \param person Person object.
388 void addritem_person_set_external_id( ItemPerson
*person
, const gchar
*value
) {
389 person
->externalID
= mgu_replace_string( person
->externalID
, value
);
393 * Specify value of open indicator for person object. This is typically used to
394 * simplify open/close folders in the address book GUI.
395 * \param person Person object.
396 * \param value Value for indicator. Set to <i>TRUE</i> if opened.
398 void addritem_person_set_opened( ItemPerson
*person
, const gboolean value
) {
399 person
->isOpened
= value
;
403 * Free linked list of item addresses; both addresses and the list are freed.
404 * It is assumed that addresses are *NOT* contained within some other
406 * \param list List of addresses to be freed.
408 void addritem_free_list_email( GList
*list
) {
411 ItemEMail
*email
= node
->data
;
413 addritem_free_item_email( email
);
415 node
= g_list_next( node
);
422 * Free linked list of attributes; both attributes and the list are freed.
423 * It is assumed that attributes are *NOT* contained within some other
425 * \param list List of attributes to be freed.
427 void addritem_free_list_attribute( GList
*list
) {
430 addritem_free_attribute( node
->data
);
432 node
= g_list_next( node
);
438 * Free address person object.
439 * \param person Person object to free.
441 void addritem_free_item_person( ItemPerson
*person
) {
442 cm_return_if_fail( person
!= NULL
);
444 /* Free internal stuff */
445 g_free( ADDRITEM_ID(person
) );
446 g_free( ADDRITEM_NAME(person
) );
447 g_free( person
->picture
);
448 g_free( person
->firstName
);
449 g_free( person
->lastName
);
450 g_free( person
->nickName
);
451 g_free( person
->externalID
);
452 g_list_free( person
->listEMail
);
453 addritem_free_list_attribute( person
->listAttrib
);
455 ADDRITEM_OBJECT(person
)->type
= ITEMTYPE_NONE
;
456 ADDRITEM_ID(person
) = NULL
;
457 ADDRITEM_NAME(person
) = NULL
;
458 ADDRITEM_PARENT(person
) = NULL
;
459 ADDRITEM_SUBTYPE(person
) = 0;
460 person
->picture
= NULL
;
461 person
->firstName
= NULL
;
462 person
->lastName
= NULL
;
463 person
->nickName
= NULL
;
464 person
->externalID
= NULL
;
465 person
->listEMail
= NULL
;
466 person
->listAttrib
= NULL
;
472 * Print E-Mail address object for debug.
473 * \param item Item to print.
474 * \param stream Output stream.
476 void addritem_print_item_email( ItemEMail
*item
, FILE *stream
) {
477 cm_return_if_fail( item
!= NULL
);
478 fprintf( stream
, "\t\tt/id: %d : '%s'\n", ADDRITEM_TYPE(item
), ADDRITEM_ID(item
) );
479 fprintf( stream
, "\t\tsubty: %d\n", ADDRITEM_SUBTYPE(item
) );
480 fprintf( stream
, "\t\talis: '%s'\n", ADDRITEM_NAME(item
) );
481 fprintf( stream
, "\t\taddr: '%s'\n", item
->address
);
482 fprintf( stream
, "\t\trems: '%s'\n", item
->remarks
);
483 fprintf( stream
, "\t\t---\n" );
487 * Print user attribute object for debug.
488 * \param item Attribute to print.
489 * \param stream Output stream.
491 static void addritem_print_attribute( UserAttribute
*item
, FILE *stream
) {
492 cm_return_if_fail( item
!= NULL
);
493 fprintf( stream
, "\t\tuid : '%s'\n", item
->uid
);
494 fprintf( stream
, "\t\tname : '%s'\n", item
->name
);
495 fprintf( stream
, "\t\tvalue: '%s'\n", item
->value
);
496 fprintf( stream
, "\t\t---\n" );
500 * Print person item for debug.
501 * \param person Person to print.
502 * \param stream Output stream.
504 void addritem_print_item_person( ItemPerson
*person
, FILE *stream
) {
506 cm_return_if_fail( person
!= NULL
);
507 fprintf( stream
, "Person:\n" );
508 fprintf( stream
, "\tt/uid: %d : '%s'\n", ADDRITEM_TYPE(person
), ADDRITEM_ID(person
) );
509 fprintf( stream
, "\tsubty: %d\n", ADDRITEM_SUBTYPE(person
) );
510 fprintf( stream
, "\tcommn: '%s'\n", ADDRITEM_NAME(person
) );
511 fprintf( stream
, "\tphoto: '%s'\n", person
->picture
);
512 fprintf( stream
, "\tfirst: '%s'\n", person
->firstName
);
513 fprintf( stream
, "\tlast : '%s'\n", person
->lastName
);
514 fprintf( stream
, "\tnick : '%s'\n", person
->nickName
);
515 fprintf( stream
, "\textID: '%s'\n", person
->externalID
);
516 fprintf( stream
, "\teMail:\n" );
517 fprintf( stream
, "\t---\n" );
518 node
= person
->listEMail
;
520 addritem_print_item_email( node
->data
, stream
);
521 node
= g_list_next( node
);
523 fprintf( stream
, "\tuAttr:\n" );
524 fprintf( stream
, "\t---\n" );
525 node
= person
->listAttrib
;
527 addritem_print_attribute( node
->data
, stream
);
528 node
= g_list_next( node
);
530 gchar
*current_status
;
531 switch (person
->status
) {
532 case NONE
: current_status
= g_strdup("Unchanged"); break;
533 case ADD_ENTRY
: current_status
= g_strdup("New"); break;
534 case UPDATE_ENTRY
: current_status
= g_strdup("Updated"); break;
535 case DELETE_ENTRY
: current_status
= g_strdup("Deleted"); break;
536 default: current_status
= g_strdup("Unknown");
538 fprintf( stream
, "\t\tStatus: %s\n", current_status
);
539 if ( current_status
)
540 g_free(current_status
);
541 fprintf( stream
, "\t===\n" );
545 * Add E-Mail address object to person.
546 * \param person Person.
547 * \param email E-Mail object to add.
548 * \return <i>TRUE</i> if E-Mail added.
550 gboolean
addritem_person_add_email( ItemPerson
*person
, ItemEMail
*email
) {
553 cm_return_val_if_fail( person
!= NULL
, FALSE
);
554 cm_return_val_if_fail( email
!= NULL
, FALSE
);
556 node
= person
->listEMail
;
558 if( node
->data
== email
) return FALSE
;
559 node
= g_list_next( node
);
561 person
->listEMail
= g_list_append( person
->listEMail
, email
);
562 ADDRITEM_PARENT(email
) = ADDRITEM_OBJECT(person
);
567 * Remove email address for specified person.
568 * \param person Person.
569 * \param email EMail to remove.
570 * \return EMail object, or <i>NULL</i> if not found. Note that object should
571 * still be freed after calling this method.
573 ItemEMail
*addritem_person_remove_email( ItemPerson
*person
, ItemEMail
*email
) {
574 gboolean found
= FALSE
;
577 cm_return_val_if_fail( person
!= NULL
, NULL
);
578 if( email
== NULL
) return NULL
;
581 node
= person
->listEMail
;
583 if( node
-> data
== email
) {
587 node
= g_list_next( node
);
591 /* Remove email from person's address list */
592 if( person
->listEMail
) {
593 person
->listEMail
= g_list_remove( person
->listEMail
, email
);
595 /* Unlink reference to person. */
596 ADDRITEM_PARENT(email
) = NULL
;
603 * Add user attribute to specified person.
604 * \param person Person.
605 * \param attrib Attribute to add.
606 * \return <i>TRUE</i> if item added.
608 void addritem_person_add_attribute(
609 ItemPerson
*person
, UserAttribute
*attrib
)
611 cm_return_if_fail( person
!= NULL
);
612 person
->listAttrib
= g_list_append( person
->listAttrib
, attrib
);
616 * Remove user attribute from specified person.
617 * \param person Person.
618 * \param attrib Attribute to remove.
620 void addritem_person_remove_attribute( ItemPerson
*person
, const gchar
*attrib
) {
621 cm_return_if_fail( person
!= NULL
&& attrib
!= NULL
);
624 attrib_list
= person
->listAttrib
;
625 while (attrib_list
) {
626 UserAttribute
*user_attrib
= attrib_list
->data
;
627 if (strcmp(user_attrib
->name
, attrib
) == 0) {
628 person
->listAttrib
= g_list_remove(person
->listAttrib
, (gconstpointer
) user_attrib
);
631 attrib_list
= g_list_next(attrib_list
);
637 * Create new address book group object.
638 * \return Initialized group object.
640 ItemGroup
*addritem_create_item_group( void ) {
643 group
= g_new0( ItemGroup
, 1 );
644 ADDRITEM_TYPE(group
) = ITEMTYPE_GROUP
;
645 ADDRITEM_ID(group
) = NULL
;
646 ADDRITEM_NAME(group
) = NULL
;
647 ADDRITEM_PARENT(group
) = NULL
;
648 ADDRITEM_SUBTYPE(group
) = 0;
649 group
->remarks
= NULL
;
650 group
->listEMail
= NULL
;
655 * Copy (deep copy) address book group.
656 * \param item Group to copy.
657 * \return Copy of the group object, or <i>NULL</i> if null argument supplied.
659 ItemGroup
*addritem_copy_item_group( ItemGroup
*item
) {
664 itemNew
= addritem_create_item_group();
665 ADDRITEM_NAME(itemNew
) = g_strdup( ADDRITEM_NAME(item
) );
666 itemNew
->remarks
= g_strdup( item
->remarks
);
672 * Specify name to be used for group.
673 * \param group Group object.
674 * \param value Name of group.
676 void addritem_group_set_name( ItemGroup
*group
, const gchar
*value
) {
677 ADDRITEM_NAME(group
) = mgu_replace_string( ADDRITEM_NAME(group
), value
);
681 * Free address group object.
682 * \param group Group to free.
684 void addritem_free_item_group( ItemGroup
*group
) {
685 cm_return_if_fail( group
!= NULL
);
687 /* Free internal stuff */
688 g_free( ADDRITEM_ID(group
) );
689 g_free( ADDRITEM_NAME(group
) );
690 g_free( group
->remarks
);
691 g_list_free( group
->listEMail
);
693 ADDRITEM_TYPE(group
) = ITEMTYPE_NONE
;
694 ADDRITEM_ID(group
) = NULL
;
695 ADDRITEM_NAME(group
) = NULL
;
696 ADDRITEM_PARENT(group
) = NULL
;
697 ADDRITEM_SUBTYPE(group
) = 0;
698 group
->remarks
= NULL
;
699 group
->listEMail
= NULL
;
705 * Add EMail address to group. Note that a reference to an E-Mail item is
706 * added to a group. A person object is the only container that for an
708 * \param group Group.
709 * \param email E-Mail object.
710 * \return <i>TRUE</i> if email item added.
712 gboolean
addritem_group_add_email( ItemGroup
*group
, ItemEMail
*email
) {
715 cm_return_val_if_fail( group
!= NULL
, FALSE
);
716 cm_return_val_if_fail( email
!= NULL
, FALSE
);
718 node
= group
->listEMail
;
720 if( node
->data
== email
) return FALSE
;
721 node
= g_list_next( node
);
723 group
->listEMail
= g_list_append( group
->listEMail
, email
);
728 * Remove person object for specified group.
729 * \param group Group from which to remove address.
730 * \param email EMail to remove
731 * \return EMail object, or <i>NULL if email not found in group. Note that
732 * this object is referenced (linked) to a group and should *NOT*
733 * be freed. An E-Mail object object should only be freed after
734 * removing from a person.
736 ItemPerson
*addritem_folder_remove_person( ItemFolder
*group
, ItemPerson
*person
) {
737 if( group
&& person
) {
738 GList
*node
= group
->listPerson
;
740 if( node
->data
== person
) {
741 group
->listPerson
= g_list_remove( group
->listPerson
, person
);
744 node
= g_list_next( node
);
751 * Print address group item for debug.
752 * \param group Group to print.
753 * \param stream Output stream.
755 void addritem_print_item_group( ItemGroup
*group
, FILE *stream
) {
759 cm_return_if_fail( group
!= NULL
);
760 fprintf( stream
, "Group:\n" );
761 fprintf( stream
, "\tt/u: %d : '%s'\n", ADDRITEM_TYPE(group
), ADDRITEM_ID(group
) );
762 fprintf( stream
, "\tsub: %d\n", ADDRITEM_SUBTYPE(group
) );
763 fprintf( stream
, "\tgrp: '%s'\n", ADDRITEM_NAME(group
) );
764 fprintf( stream
, "\trem: '%s'\n", group
->remarks
);
765 fprintf( stream
, "\t---\n" );
766 node
= group
->listEMail
;
769 person
= ( ItemPerson
* ) ADDRITEM_PARENT(item
);
771 fprintf( stream
, "\t\tpid : '%s'\n", ADDRITEM_ID(person
) );
772 fprintf( stream
, "\t\tcomn: '%s'\n", ADDRITEM_NAME(person
) );
775 fprintf( stream
, "\t\tpid : ???\n" );
776 fprintf( stream
, "\t\tcomn: ???\n" );
778 addritem_print_item_email( item
, stream
);
779 node
= g_list_next( node
);
781 fprintf( stream
, "\t***\n" );
785 * Create new address folder.
786 * \return Initialized address folder object.
788 ItemFolder
*addritem_create_item_folder( void ) {
790 folder
= g_new0( ItemFolder
, 1 );
791 ADDRITEM_TYPE(folder
) = ITEMTYPE_FOLDER
;
792 ADDRITEM_ID(folder
) = NULL
;
793 ADDRITEM_NAME(folder
) = NULL
;
794 ADDRITEM_PARENT(folder
) = NULL
;
795 ADDRITEM_SUBTYPE(folder
) = 0;
796 folder
->remarks
= NULL
;
797 folder
->isRoot
= FALSE
;
798 folder
->listItems
= NULL
;
799 folder
->listFolder
= NULL
;
800 folder
->listPerson
= NULL
;
801 folder
->listGroup
= NULL
;
802 folder
->folderType
= ADDRFOLDER_NONE
;
803 folder
->folderData
= NULL
;
804 folder
->isHidden
= FALSE
;
809 * Copy address book folder. Note that only the folder and not its contents are
811 * \param item Folder to copy.
812 * \return A copy of the folder, or <i>NULL</i> if null argument supplied.
814 ItemFolder
*addritem_copy_item_folder( ItemFolder
*item
) {
817 itemNew
= g_new0( ItemFolder
, 1 );
819 itemNew
= addritem_create_item_folder();
820 ADDRITEM_NAME(itemNew
) = g_strdup( ADDRITEM_NAME(item
) );
821 itemNew
->folderType
= item
->folderType
;
827 * Specify name to be used for folder.
828 * \param folder Folder.
831 void addritem_folder_set_name( ItemFolder
*folder
, const gchar
*value
) {
832 ADDRITEM_NAME(folder
) = mgu_replace_string( ADDRITEM_NAME(folder
), value
);
836 * Specify remarks to be used for folder.
837 * \param folder Folder.
838 * \param value Remarks.
840 void addritem_folder_set_remarks( ItemFolder
*folder
, const gchar
*value
) {
841 folder
->remarks
= mgu_replace_string( folder
->remarks
, value
);
845 * Specify visibility of folder.
846 * \param folder Folder.
847 * \param value Set to <code>TRUE</code> to hide folder.
849 void addritem_folder_set_hidden( ItemFolder
*folder
, const gboolean value
) {
850 folder
->isHidden
= value
;
854 * Free address folder. Note: this does not free up the lists of children
855 * (folders, groups and person). This should be done prior to calling this
857 * \param folder Folder to free.
859 void addritem_free_item_folder( ItemFolder
*folder
) {
860 cm_return_if_fail( folder
!= NULL
);
862 /* Free internal stuff */
863 g_free( ADDRITEM_ID(folder
) );
864 g_free( ADDRITEM_NAME(folder
) );
865 g_free( folder
->remarks
);
866 g_list_free( folder
->listItems
);
868 ADDRITEM_TYPE(folder
) = ITEMTYPE_NONE
;
869 ADDRITEM_ID(folder
) = NULL
;
870 ADDRITEM_NAME(folder
) = NULL
;
871 ADDRITEM_PARENT(folder
) = NULL
;
872 ADDRITEM_SUBTYPE(folder
) = 0;
873 folder
->isRoot
= FALSE
;
874 folder
->remarks
= NULL
;
875 folder
->listItems
= NULL
;
876 folder
->listFolder
= NULL
;
877 folder
->listGroup
= NULL
;
878 folder
->listPerson
= NULL
;
879 folder
->folderType
= ADDRFOLDER_NONE
;
880 folder
->folderData
= NULL
;
881 folder
->isHidden
= FALSE
;
887 * Add person into folder.
888 * \param folder Folder.
889 * \param item Person to add.
890 * \return <i>TRUE</i> if person added.
892 gboolean
addritem_folder_add_person( ItemFolder
*folder
, ItemPerson
*item
) {
893 cm_return_val_if_fail( folder
!= NULL
, FALSE
);
894 cm_return_val_if_fail( item
!= NULL
, FALSE
);
896 folder
->listPerson
= g_list_append( folder
->listPerson
, item
);
897 ADDRITEM_PARENT(item
) = ADDRITEM_OBJECT(folder
);
902 * Add folder into folder.
903 * \param folder Folder.
904 * \param item Folder to add.
905 * \return <i>TRUE</i> if folder added.
907 gboolean
addritem_folder_add_folder( ItemFolder
*folder
, ItemFolder
*item
) {
908 cm_return_val_if_fail( folder
!= NULL
, FALSE
);
909 cm_return_val_if_fail( item
!= NULL
, FALSE
);
911 folder
->listFolder
= g_list_append( folder
->listFolder
, item
);
912 ADDRITEM_PARENT(item
) = ADDRITEM_OBJECT(folder
);
917 * Add group into folder.
918 * \param folder Folder.
919 * \param item Group to add.
920 * \return <i>TRUE</i> if group added.
922 gboolean
addritem_folder_add_group( ItemFolder
*folder
, ItemGroup
*item
) {
923 cm_return_val_if_fail( folder
!= NULL
, FALSE
);
924 cm_return_val_if_fail( item
!= NULL
, FALSE
);
926 folder
->listGroup
= g_list_append( folder
->listGroup
, item
);
927 ADDRITEM_PARENT(item
) = ADDRITEM_OBJECT(folder
);
932 * Print address folder item contents for debug.
933 * \param folder Folder to process.
934 * \param stream Output stream.
936 void addritem_print_item_folder( ItemFolder
*folder
, FILE *stream
) {
938 /* ItemPerson *person; */
941 cm_return_if_fail( folder
!= NULL
);
943 fprintf( stream
, "Folder:\n" );
944 fprintf( stream
, "\tt/u: %d : '%s'\n", ADDRITEM_TYPE(folder
), ADDRITEM_ID(folder
) );
945 fprintf( stream
, "\tsub: %d\n", ADDRITEM_SUBTYPE(folder
) );
946 fprintf( stream
, "\tnam: '%s'\n", ADDRITEM_NAME(folder
) );
947 fprintf( stream
, "\trem: '%s'\n", folder
->remarks
);
948 fprintf( stream
, "\ttyp: %d\n", folder
->folderType
);
949 fprintf( stream
, "\thid: %s\n", folder
->isHidden
? "hidden" : "visible" );
950 fprintf( stream
, "\t---\n" );
951 parent
= ( ItemFolder
* ) ADDRITEM_PARENT(folder
);
953 fprintf( stream
, "\tpar: %s : %s\n", ADDRITEM_ID(parent
), ADDRITEM_NAME(parent
) );
956 fprintf( stream
, "\tpar: NULL\n" );
958 node
= folder
->listFolder
;
960 AddrItemObject
*aio
= node
->data
;
962 if( aio
->type
== ITEMTYPE_FOLDER
) {
963 ItemFolder
*item
= ( ItemFolder
* ) aio
;
964 addritem_print_item_folder( item
, stream
);
968 fprintf( stream
, "\t\tpid : ???\n" );
971 node
= g_list_next( node
);
974 node
= folder
->listPerson
;
976 AddrItemObject
*aio
= node
->data
;
978 if( aio
->type
== ITEMTYPE_PERSON
) {
979 ItemPerson
*item
= ( ItemPerson
* ) aio
;
980 addritem_print_item_person( item
, stream
);
984 fprintf( stream
, "\t\tpid : ???\n" );
987 node
= g_list_next( node
);
990 node
= folder
->listGroup
;
992 AddrItemObject
*aio
= node
->data
;
994 if( aio
->type
== ITEMTYPE_GROUP
) {
995 ItemGroup
*item
= ( ItemGroup
* ) aio
;
996 addritem_print_item_group( item
, stream
);
1000 fprintf( stream
, "\t\tpid : ???\n" );
1002 node
= g_list_next( node
);
1004 fprintf( stream
, "\t###\n" );
1008 * Return link list of persons for specified folder. Note that the list contains
1009 * references to items and should be g_free() when done. Do *NOT* attempt to use the
1010 * addritem_free_xxx() functions... this will destroy the addressbook data!
1012 * \param folder Folder to process.
1013 * \return List of items, or <i>NULL</i> if none.
1015 GList
*addritem_folder_get_person_list( ItemFolder
*folder
) {
1019 cm_return_val_if_fail( folder
!= NULL
, NULL
);
1021 node
= folder
->listPerson
;
1023 ItemPerson
*person
= node
->data
;
1024 list
= g_list_prepend( list
, person
);
1025 node
= g_list_next( node
);
1027 return g_list_reverse(list
);
1031 * Return link list of groups for specified folder. Note that the list contains
1032 * references to items and should be g_free() when done. Do *NOT* attempt to use the
1033 * addritem_free_xxx() functions... this will destroy the addressbook data!
1035 * \param folder Folder to process.
1036 * \return List of items, or <i>NULL</i> if none.
1038 GList
*addritem_folder_get_group_list( ItemFolder
*folder
) {
1042 cm_return_val_if_fail( folder
!= NULL
, NULL
);
1044 node
= folder
->listGroup
;
1046 ItemGroup
*group
= node
->data
;
1047 list
= g_list_prepend( list
, group
);
1048 node
= g_list_next( node
);
1050 return g_list_reverse(list
);
1054 * Parse first and last names for person from common name.
1055 * \param person Person to process.
1057 void addritem_parse_first_last( ItemPerson
*person
) {
1059 gchar
*fName
, *lName
;
1063 cm_return_if_fail( person
!= NULL
);
1065 name
= ADDRITEM_NAME(person
);
1066 if( name
== NULL
) return;
1070 p
= strchr( name
, ',' );
1072 len
= ( size_t ) ( p
- name
);
1073 lName
= g_strndup( name
, len
);
1074 fName
= g_strdup( p
+ 1 );
1077 /* Other way around */
1080 if( name
[i
] == ' ' ) {
1081 fName
= g_strndup( name
, i
);
1082 lName
= g_strdup( &name
[i
] );
1087 if( fName
== NULL
) {
1088 fName
= g_strdup( name
);
1092 g_free( person
->firstName
);
1093 person
->firstName
= fName
;
1094 if( person
->firstName
)
1095 g_strstrip( person
->firstName
);
1097 g_free( person
->lastName
);
1098 person
->lastName
= lName
;
1099 if( person
->lastName
)
1100 g_strstrip( person
->lastName
);
1104 * Build a path of all ancestor folders for specified folder.
1105 * \param folder Folder.
1106 * \param seq Path sequence, FALSE top down, TRUE bottom up.
1107 * \return List of folders from the top down.
1109 GList
*addritem_folder_path( const ItemFolder
*folder
, const gboolean seq
) {
1111 AddrItemObject
*item
;
1114 item
= ( AddrItemObject
* ) folder
;
1117 list
= g_list_prepend( list
, item
);
1118 item
= ADDRITEM_PARENT( item
);
1123 list
= g_list_append( list
, item
);
1124 item
= ADDRITEM_PARENT( item
);
1131 * Format E-Mail address.
1132 * \param email EMail item to format.
1133 * \return Formatted string. Should be freed after use.
1135 gchar
*addritem_format_email( ItemEMail
*email
) {
1142 if( ADDRITEM_NAME( email
) ) {
1143 if( strlen( ADDRITEM_NAME( email
) ) ) {
1144 name
= ADDRITEM_NAME( email
);
1148 person
= ( ItemPerson
* ) ADDRITEM_PARENT( email
);
1149 name
= ADDRITEM_NAME( person
);
1153 if( strchr_with_skip_quote( name
, '"', ',' ) ) {
1154 address
= g_strdup_printf( "\"%s\" <%s>", name
, email
->address
);
1157 address
= g_strdup_printf( "%s <%s>", name
, email
->address
);
1161 address
= g_strdup_printf( "%s", email
->address
);