2007-01-20 [colin] 2.7.1cvs42
[claws.git] / src / addritem.c
index 8a9adbf1edc65194b3eececc53840416241a43e4..d71b281b5791b7782630da84984fa4444f136de8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2001-2003 Match Grun
+ * Copyright (C) 2001-2007 Match Grun and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 /*
 #include <stdio.h>
 #include <string.h>
 
+#include "utils.h"
 #include "addritem.h"
 #include "mgutils.h"
+#include "codeconv.h"
 
 /**
  * Create new email address item.
@@ -79,15 +81,6 @@ ItemEMail *addritem_copyfull_item_email( ItemEMail *item ) {
        return itemNew;
 }
 
-/**
- * Specify ID for email.
- * \param email E-Mail item.
- * \param value ID.
- */
-void addritem_email_set_id( ItemEMail *email, const gchar *value ) {
-       ADDRITEM_ID(email) = mgu_replace_string( ADDRITEM_ID(email), value );
-}
-
 /**
  * Specify alias for email.
  * \param email E-Mail item.
@@ -254,22 +247,22 @@ ItemPerson *addritem_copy_item_person( ItemPerson *item ) {
        return itemNew;
 }
 
-/**
- * Specify ID for person object.
- * \param person Person object.
- * \param value ID.
- */
-void addritem_person_set_id( ItemPerson *person, const gchar *value ) {
-       ADDRITEM_ID(person) = mgu_replace_string( ADDRITEM_ID(person), value );
-}
-
 /**
  * Specify first name for person object.
  * \param person Person object.
  * \param value Name.
  */
 void addritem_person_set_first_name( ItemPerson *person, const gchar *value ) {
-       person->firstName = mgu_replace_string( person->firstName, value );
+       if (!value || g_utf8_validate(value, -1, NULL))
+               person->firstName = mgu_replace_string( person->firstName, value );
+       else {
+               gchar *out = conv_codeset_strdup(value, 
+                               conv_get_locale_charset_str_no_utf8(),
+                               CS_INTERNAL);
+               if (out)
+                       person->firstName = mgu_replace_string( person->firstName, out );
+               g_free(out);
+       }
 }
 
 /**
@@ -278,7 +271,16 @@ void addritem_person_set_first_name( ItemPerson *person, const gchar *value ) {
  * \param value name.
  */
 void addritem_person_set_last_name( ItemPerson *person, const gchar *value ) {
-       person->lastName = mgu_replace_string( person->lastName, value );
+       if (!value || g_utf8_validate(value, -1, NULL))
+               person->lastName = mgu_replace_string( person->lastName, value );
+       else {
+               gchar *out = conv_codeset_strdup(value, 
+                               conv_get_locale_charset_str_no_utf8(),
+                               CS_INTERNAL);
+               if (out)
+                       person->lastName = mgu_replace_string( person->lastName, out );
+               g_free(out);
+       }
 }
 
 /**
@@ -287,7 +289,16 @@ void addritem_person_set_last_name( ItemPerson *person, const gchar *value ) {
  * \param value name.
  */
 void addritem_person_set_nick_name( ItemPerson *person, const gchar *value ) {
-       person->nickName = mgu_replace_string( person->nickName, value );
+       if (!value || g_utf8_validate(value, -1, NULL))
+               person->nickName = mgu_replace_string( person->nickName, value );
+       else {
+               gchar *out = conv_codeset_strdup(value, 
+                               conv_get_locale_charset_str_no_utf8(),
+                               CS_INTERNAL);
+               if (out)
+                       person->nickName = mgu_replace_string( person->nickName, out );
+               g_free(out);
+       }
 }
 
 /**
@@ -296,7 +307,16 @@ void addritem_person_set_nick_name( ItemPerson *person, const gchar *value ) {
  * \param value name.
  */
 void addritem_person_set_common_name( ItemPerson *person, const gchar *value ) {
-       ADDRITEM_NAME(person) = mgu_replace_string( ADDRITEM_NAME(person), value );
+       if (!value || g_utf8_validate(value, -1, NULL))
+               ADDRITEM_NAME(person) = mgu_replace_string( ADDRITEM_NAME(person), value );
+       else {
+               gchar *out = conv_codeset_strdup(value, 
+                               conv_get_locale_charset_str_no_utf8(),
+                               CS_INTERNAL);
+               if (out)
+                       ADDRITEM_NAME(person) = mgu_replace_string( ADDRITEM_NAME(person), out );
+               g_free(out);
+       }
 }
 
 /**
@@ -433,7 +453,7 @@ void addritem_print_item_email( ItemEMail *item, FILE *stream ) {
  * \param item   Attribute to print.
  * \param stream Output stream.
  */
-void addritem_print_attribute( UserAttribute *item, FILE *stream ) {
+static void addritem_print_attribute( UserAttribute *item, FILE *stream ) {
        g_return_if_fail( item != NULL );
        fprintf( stream, "\t\tuid  : '%s'\n", item->uid );
        fprintf( stream, "\t\tname : '%s'\n", item->name );
@@ -496,72 +516,6 @@ gboolean addritem_person_add_email( ItemPerson *person, ItemEMail *email ) {
        return TRUE;
 }
 
-/**
- * Return email object with specified ID for specified person.
- * \param  person Person object.
- * \param  eid    EMail ID.
- * \return EMail object, or <i>NULL</i> if not found.
- */
-ItemEMail *addritem_person_get_email( ItemPerson *person, const gchar *eid ) {
-       ItemEMail *email = NULL;
-       GList *node;
-
-       g_return_val_if_fail( person != NULL, NULL );
-       if( eid == NULL || *eid == '\0' ) return NULL;
-
-       /* Look for email */
-       node = person->listEMail;
-       while( node ) {
-               AddrItemObject *objE = node->data;
-               gchar *ide = ADDRITEM_ID(objE);
-               if( ide ) {
-                       if( strcmp( ide, eid ) == 0 ) {
-                               email = ( ItemEMail * ) objE;
-                       }
-               }
-               node = g_list_next( node );
-       }
-       return email;
-}
-
-/**
- * Remove email address with specified ID for specified person.
- * \param  person Person object.
- * \param  eid    EMail ID.
- * \return EMail object, or <i>NULL</i> if not found. Note that object should
- *         still be freed after calling this function.
- */
-ItemEMail *addritem_person_remove_email_id( ItemPerson *person, const gchar *eid ) {
-       ItemEMail *email = NULL;
-       GList *node;
-
-       g_return_val_if_fail( person != NULL, NULL );
-       if( eid == NULL || *eid == '\0' ) return NULL;
-
-       /* Look for email */
-       node = person->listEMail;
-       while( node ) {
-               AddrItemObject *objE = node->data;
-               gchar *ide = ADDRITEM_ID(objE);
-               if( ide ) {
-                       if( strcmp( ide, eid ) == 0 ) {
-                               email = ( ItemEMail * ) objE;
-                       }
-               }
-               node = g_list_next( node );
-       }
-
-       if( email ) {
-               /* Remove email from person's address list */
-               if( person->listEMail ) {
-                       person->listEMail = g_list_remove( person->listEMail, email );
-               }
-               /* Unlink reference to person. */
-               ADDRITEM_PARENT(email) = NULL;
-       }
-       return email;
-}
-
 /**
  * Remove email address for specified person.
  * \param  person Person.
@@ -611,36 +565,6 @@ void addritem_person_add_attribute(
        person->listAttrib = g_list_append( person->listAttrib, attrib );
 }
 
-/**
- * Return attribute with specified ID for person.
- * \param  person Person object.
- * \param  aid    Attribute ID.
- * \return Reference to UserAttribute object, or <i>NULL</i> if not found.
- */
-UserAttribute *addritem_person_get_attribute(
-                       ItemPerson *person, const gchar *aid )
-{
-       UserAttribute *attrib = NULL;
-       GList *node;
-
-       g_return_val_if_fail( person != NULL, NULL );
-       if( aid == NULL || *aid == '\0' ) return NULL;
-
-       /* Look for attribute */
-       node = person->listAttrib;
-       while( node ) {
-               UserAttribute *attr = node->data;
-               gchar *ida = attr->uid;
-               if( ida ) {
-                       if( strcmp( ida, aid ) == 0 ) {
-                               attrib = attr;
-                       }
-               }
-               node = g_list_next( node );
-       }
-       return attrib;
-}
-
 /**
  * Remove attribute with specified ID from person.
  * \param  person Person object.
@@ -747,15 +671,6 @@ ItemGroup *addritem_copy_item_group( ItemGroup *item ) {
        return itemNew;
 }
 
-/**
- * Specify ID to be used for group.
- * \param group Group object.
- * \param value ID of group.
- */
-void addritem_group_set_id( ItemGroup *group, const gchar *value ) {
-       ADDRITEM_ID(group) = mgu_replace_string( ADDRITEM_ID(group), value );
-}
-
 /**
  * Specify name to be used for group.
  * \param group Group object.
@@ -765,15 +680,6 @@ void addritem_group_set_name( ItemGroup *group, const gchar *value ) {
        ADDRITEM_NAME(group) = mgu_replace_string( ADDRITEM_NAME(group), value );
 }
 
-/**
- * Specify remarks to be used for group.
- * \param group Group object.
- * \param value Remarks for group.
- */
-void addritem_group_set_remarks( ItemGroup *group, const gchar *value ) {
-       group->remarks = mgu_replace_string( group->remarks, value );
-}
-
 /**
  * Free address group object.
  * \param group Group to free.
@@ -823,7 +729,7 @@ gboolean addritem_group_add_email( ItemGroup *group, ItemEMail *email ) {
 }
 
 /**
- * Remove email address object for specified group.
+ * Remove person object for specified group.
  * \param  group Group from which to remove address.
  * \param  email EMail to remove
  * \return EMail object, or <i>NULL if email not found in group. Note that
@@ -831,37 +737,13 @@ gboolean addritem_group_add_email( ItemGroup *group, ItemEMail *email ) {
  *         be freed. An E-Mail object object should only be freed after
  *         removing from a person.
  */
-ItemEMail *addritem_group_remove_email( ItemGroup *group, ItemEMail *email ) {
-       if( group && email ) {
-               GList *node = group->listEMail;
-               while( node ) {
-                       if( node->data == email ) {
-                               group->listEMail = g_list_remove( group->listEMail, email );
-                               return email;
-                       }
-                       node = g_list_next( node );
-               }
-       }
-       return NULL;
-}
-
-/**
- * Remove email address of specified ID for specified group.
- * \param  group Group from which to remove address.
- * \param  eid  EMail ID.
- * \return EMail object, or <i>NULL</i> if email not found in group. Note that
- *         this object is referenced (linked) to a group and should *NOT* be
- *         freed. An E-Mail object should only be freed after removing from a
- *         person.
- */
-ItemEMail *addritem_group_remove_email_id( ItemGroup *group, const gchar *eid ) {
-       if( group ) {
-               GList *node = group->listEMail;
+ItemPerson *addritem_folder_remove_person( ItemFolder *group, ItemPerson *person ) {
+       if( group && person ) {
+               GList *node = group->listPerson;
                while( node ) {
-                       ItemEMail *email = ( ItemEMail * ) node->data;
-                       if( strcmp( ADDRITEM_ID( email ), eid ) == 0 ) {
-                               group->listEMail = g_list_remove( group->listEMail, email );
-                               return email;
+                       if( node->data == person ) {
+                               group->listPerson = g_list_remove( group->listPerson, person );
+                               return person;
                        }
                        node = g_list_next( node );
                }
@@ -945,15 +827,6 @@ ItemFolder *addritem_copy_item_folder( ItemFolder *item ) {
        return itemNew;
 }
 
-/**
- * Specify ID to be used for folder.
- * \param folder Folder.
- * \param value  ID.
- */
-void addritem_folder_set_id( ItemFolder *folder, const gchar *value ) {
-       ADDRITEM_ID(folder) = mgu_replace_string( ADDRITEM_ID(folder), value );
-}
-
 /**
  * Specify name to be used for folder.
  * \param folder Folder.
@@ -1021,7 +894,7 @@ void addritem_free_item_folder( ItemFolder *folder ) {
  * This should be done prior to calling this function.
  * \param parent Parent folder object to be processed.
  */
-void addritem_free_item_folder_recurse( ItemFolder *parent ) {
+static void addritem_free_item_folder_recurse( ItemFolder *parent ) {
        GList *node = parent->listFolder;
 
        while( node ) {
@@ -1037,25 +910,6 @@ void addritem_free_item_folder_recurse( ItemFolder *parent ) {
        parent->listFolder = NULL;
 }
 
-/**
- * Free up list of person objects contained in specified folder.
- * \param folder Folder to process.
- */
-void addritem_folder_free_person( ItemFolder *folder ) {
-       GList *node;
-
-       g_return_if_fail( folder != NULL );
-       
-       /* Free up folder of persons. */
-       node = folder->listPerson;
-       while( node ) {
-               ItemPerson *person = node->data;
-               addritem_free_item_person( person );
-               person = NULL;
-               node = g_list_next( node );
-       }
-}
-
 /**
  * Add person into folder.
  * \param  folder Folder.
@@ -1177,32 +1031,6 @@ void addritem_print_item_folder( ItemFolder *folder, FILE *stream ) {
        fprintf( stream, "\t###\n" );
 }
 
-/**
- * Print address item for debug.
- * \param aio    Address item to format.
- * \param stream Output stream.
- */
-void addritem_print_item( AddrItemObject *aio, FILE *stream ) {
-       g_return_if_fail( aio != NULL );
-
-       if( aio->type == ITEMTYPE_PERSON ) {
-               ItemPerson *item = ( ItemPerson * ) aio;
-               addritem_print_item_person( item, stream );
-       }
-       else if( aio->type == ITEMTYPE_EMAIL ) {
-               ItemEMail *item = ( ItemEMail * ) aio;
-               addritem_print_item_email( item, stream );
-       }
-       else if( aio->type == ITEMTYPE_GROUP ) {
-               ItemGroup *item = ( ItemGroup * ) aio;
-               addritem_print_item_group( item, stream );
-       }
-       else if( aio->type == ITEMTYPE_FOLDER ) {
-               ItemFolder *item = ( ItemFolder * ) aio;
-               addritem_print_item_folder( item, stream );
-       }
-}
-
 /**
  * Return link list of persons for specified folder. Note that the list contains
  * references to items and should be g_free() when done. Do *NOT* attempt to use the
@@ -1345,16 +1173,12 @@ void addritem_parse_first_last( ItemPerson *person ) {
                }
        }
 
-       if( person->firstName ) {
-               g_free( person->firstName );
-       }
+       g_free( person->firstName );
        person->firstName = fName;
        if( person->firstName )
                g_strstrip( person->firstName );
 
-       if( person->lastName ) {
-               g_free( person->lastName );
-       }
+       g_free( person->lastName );
        person->lastName = lName;
        if( person->lastName )
                g_strstrip( person->lastName );