/* * Remove folder from cache. Children are re-parented to parent folder. * param: folder Folder to remove. * return: Folder, or NULL if not found. Note that object should still be freed. */ ItemFolder *addrcache_remove_folder( AddressCache *cache, ItemFolder *folder ) { AddrItemObject *obj = NULL; cm_return_val_if_fail( cache != NULL, NULL ); if( folder ) { gchar *uid = ADDRITEM_ID(folder); if( uid == NULL || *uid == '\0' ) return NULL; obj = ( AddrItemObject * ) g_hash_table_lookup( cache->itemHash, uid ); if( obj ) { ItemFolder *parent = ( ItemFolder * ) ADDRITEM_PARENT(folder); GList *node; AddrItemObject *aio; if( ! parent ) parent = cache->rootFolder; /* Re-parent children in folder */ node = folder->listFolder; while( node ) { aio = ( AddrItemObject * ) node->data; parent->listFolder = g_list_append( parent->listFolder, aio ); aio->parent = ADDRITEM_OBJECT(parent); node = g_list_next( node ); } node = folder->listPerson; while( node ) { aio = ( AddrItemObject * ) node->data; parent->listPerson = g_list_append( parent->listPerson, aio ); aio->parent = ADDRITEM_OBJECT(parent); node = g_list_next( node ); } node = folder->listGroup; while( node ) { aio = ( AddrItemObject * ) node->data; parent->listGroup = g_list_append( parent->listGroup, aio ); aio->parent = ADDRITEM_OBJECT(parent); node = g_list_next( node ); } /* Remove folder from parent's list and hash table */ parent->listFolder = g_list_remove( parent->listFolder, folder ); ADDRITEM_PARENT(folder) = NULL; g_hash_table_remove( cache->itemHash, uid ); cache->dirtyFlag = TRUE; return folder; } } return NULL; }
/** * Free address person object. * \param person Person object to free. */ void addritem_free_item_person( ItemPerson *person ) { g_return_if_fail( person != NULL ); /* Free internal stuff */ g_free( ADDRITEM_ID(person) ); g_free( ADDRITEM_NAME(person) ); g_free( person->firstName ); g_free( person->lastName ); g_free( person->nickName ); g_free( person->externalID ); g_list_free( person->listEMail ); addritem_free_list_attribute( person->listAttrib ); ADDRITEM_OBJECT(person)->type = ITEMTYPE_NONE; ADDRITEM_ID(person) = NULL; ADDRITEM_NAME(person) = NULL; ADDRITEM_PARENT(person) = NULL; ADDRITEM_SUBTYPE(person) = 0; person->firstName = NULL; person->lastName = NULL; person->nickName = NULL; person->externalID = NULL; person->listEMail = NULL; person->listAttrib = NULL; g_free( person ); }
/** * Add group into folder. * \param folder Folder. * \param item Group to add. * \return <i>TRUE</i> if group added. */ gboolean addritem_folder_add_group( ItemFolder *folder, ItemGroup *item ) { g_return_val_if_fail( folder != NULL, FALSE ); g_return_val_if_fail( item != NULL, FALSE ); folder->listGroup = g_list_append( folder->listGroup, item ); ADDRITEM_PARENT(item) = ADDRITEM_OBJECT(folder); return TRUE; }
/** * Add person into folder. * \param folder Folder. * \param item Person to add. * \return <i>TRUE</i> if person added. */ gboolean addritem_folder_add_person( ItemFolder *folder, ItemPerson *item ) { g_return_val_if_fail( folder != NULL, FALSE ); g_return_val_if_fail( item != NULL, FALSE ); folder->listPerson = g_list_append( folder->listPerson, item ); ADDRITEM_PARENT(item) = ADDRITEM_OBJECT(folder); return TRUE; }
/** * Add folder into folder. * \param folder Folder. * \param item Folder to add. * \return <i>TRUE</i> if folder added. */ gboolean addritem_folder_add_folder( ItemFolder *folder, ItemFolder *item ) { cm_return_val_if_fail( folder != NULL, FALSE ); cm_return_val_if_fail( item != NULL, FALSE ); folder->listFolder = g_list_append( folder->listFolder, item ); ADDRITEM_PARENT(item) = ADDRITEM_OBJECT(folder); return TRUE; }
/** * Add E-Mail address object to person. * \param person Person. * \param email E-Mail object to add. * \return <i>TRUE</i> if E-Mail added. */ gboolean addritem_person_add_email( ItemPerson *person, ItemEMail *email ) { GList *node; g_return_val_if_fail( person != NULL, FALSE ); g_return_val_if_fail( email != NULL, FALSE ); node = person->listEMail; while( node ) { if( node->data == email ) return FALSE; node = g_list_next( node ); } person->listEMail = g_list_append( person->listEMail, email ); ADDRITEM_PARENT(email) = ADDRITEM_OBJECT(person); return TRUE; }
/* * Move folder to destination folder. * Enter: cache Cache. * folder Folder to move. * target Target folder. */ void addrcache_folder_move_folder( AddressCache *cache, ItemFolder *folder, ItemFolder *target ) { ItemFolder *parent; cm_return_if_fail( cache != NULL ); cm_return_if_fail( folder != NULL ); parent = ( ItemFolder * ) ADDRITEM_PARENT(folder); if( ! parent ) parent = cache->rootFolder; parent->listFolder = g_list_remove( parent->listFolder, folder ); target->listFolder = g_list_append( target->listFolder, folder ); ADDRITEM_PARENT(folder) = ADDRITEM_OBJECT(target); cache->dirtyFlag = TRUE; }
/* * Move person to destination folder. * Enter: cache Cache. * person Person to move. * target Target folder. */ void addrcache_folder_move_person( AddressCache *cache, ItemPerson *person, ItemFolder *target ) { ItemFolder *parent; cm_return_if_fail( cache != NULL ); cm_return_if_fail( person != NULL ); parent = ( ItemFolder * ) ADDRITEM_PARENT(person); if( ! parent ) parent = cache->rootFolder; parent->listPerson = g_list_remove( parent->listPerson, person ); target->listPerson = g_list_append( target->listPerson, person ); ADDRITEM_PARENT(person) = ADDRITEM_OBJECT(target); cache->dirtyFlag = TRUE; }
/** * Free address item email object. * \param item E-Mail item to free. */ void addritem_free_item_email( ItemEMail *item ) { g_return_if_fail( item != NULL ); /* Free internal stuff */ g_free( ADDRITEM_ID(item) ); g_free( ADDRITEM_NAME(item) ); g_free( item->address ); g_free( item->remarks ); ADDRITEM_OBJECT(item)->type = ITEMTYPE_NONE; ADDRITEM_ID(item) = NULL; ADDRITEM_NAME(item) = NULL; ADDRITEM_PARENT(item) = NULL; ADDRITEM_SUBTYPE(item) = 0; item->address = NULL; item->remarks = NULL; g_free( item ); }
/* * Group visitor function. */ static void addrcache_get_grp_person_vis( gpointer key, gpointer value, gpointer data ) { AddrItemObject *obj = ( AddrItemObject * ) value; if( ADDRITEM_TYPE(obj) == ITEMTYPE_GROUP ) { AddressCache *cache = data; ItemGroup *group = ( ItemGroup * ) obj; ItemPerson *person = ( ItemPerson * ) cache->tempList->data; GList *node = group->listEMail; while( node ) { ItemEMail *email = ( ItemEMail * ) node->data; if( ADDRITEM_PARENT(email) == ADDRITEM_OBJECT(person) ) { if( ! g_list_find( cache->tempList, group ) ) { cache->tempList = g_list_append( cache->tempList, group ); } } node = g_list_next( node ); } } }
/** * Create a new folder and add to address cache. * \param cache Address cache. * \param folder Parent folder where to add folder, or <i>NULL</i> for * root folder. * \return Folder that was created. This should <b>*NOT*</b> be * <code>g_free()</code> when done. */ ItemFolder *addrcache_add_new_folder( AddressCache *cache, ItemFolder *parent ) { ItemFolder *folder; ItemFolder *p = parent; cm_return_val_if_fail( cache != NULL, NULL ); if( !p ) p = cache->rootFolder; folder = addritem_create_item_folder(); addrcache_id_folder( cache, folder ); if( addrcache_hash_add_folder( cache, folder ) ) { p->listFolder = g_list_append( p->listFolder, folder ); ADDRITEM_PARENT(folder) = ADDRITEM_OBJECT(p); addrcache_set_dirty( cache, TRUE ); } else { addritem_free_item_folder( folder ); folder = NULL; } return folder; }