New function to remove a folder from a vfolder.

2001-03-03  Not Zed  <NotZed@Ximian.com>

        * camel-vee-folder.c (vee_folder_remove_folder): New function to
        remove a folder from a vfolder.
        (camel_vee_folder_remove_folder): New public function to remove a
        folder from a vfolder.

svn path=/trunk/; revision=8532
This commit is contained in:
Not Zed
2001-03-02 23:37:43 +00:00
committed by Michael Zucci
parent 3c6de56485
commit ab118da377
3 changed files with 73 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2001-03-03 Not Zed <NotZed@Ximian.com>
* camel-vee-folder.c (vee_folder_remove_folder): New function to
remove a folder from a vfolder.
(camel_vee_folder_remove_folder): New public function to remove a
folder from a vfolder.
2001-03-02 Jeffrey Stedfast <fejj@ximian.com>
* providers/smtp/camel-smtp-provider.c: Doh! Set the

View File

@ -67,6 +67,7 @@ static void folder_changed(CamelFolder *sub, gpointer type, CamelVeeFolder *vf);
static void message_changed(CamelFolder *f, const char *uid, CamelVeeFolder *vf);
static void vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException *ex);
static void vee_folder_remove_folder(CamelVeeFolder *vf, CamelFolder *source);
static CamelFolderClass *camel_vee_folder_parent;
@ -702,6 +703,40 @@ message_changed(CamelFolder *f, const char *uid, CamelVeeFolder *vf)
g_free(vuid);
}
void
camel_vee_folder_remove_folder(CamelVeeFolder *vf, CamelFolder *sub)
{
struct _CamelVeeFolderPrivate *p = _PRIVATE(vf), *up = _PRIVATE(folder_unmatched);
CAMEL_VEE_FOLDER_LOCK(vf, subfolder_lock);
if (g_list_find(p->folders, sub) == NULL) {
CAMEL_VEE_FOLDER_UNLOCK(vf, subfolder_lock);
return;
}
p->folders = g_list_remove(p->folders, sub);
up->folders = g_list_remove(up->folders, sub);
CAMEL_VEE_FOLDER_UNLOCK(vf, subfolder_lock);
/* hrm, should this be run?? */
unmatched_finalise(sub, 0, folder_unmatched);
UNMATCHED_LOCK();
if (camel_folder_change_info_changed(folder_unmatched->changes)) {
camel_object_trigger_event((CamelObject *)folder_unmatched, "folder_changed", folder_unmatched->changes);
camel_folder_change_info_clear(folder_unmatched->changes);
}
UNMATCHED_UNLOCK();
CAMEL_VEE_FOLDER_LOCK(vf, summary_lock);
vee_folder_remove_folder(vf, sub);
if (camel_folder_change_info_changed(vf->changes)) {
camel_object_trigger_event((CamelObject *)vf, "folder_changed", vf->changes);
camel_folder_change_info_clear(vf->changes);
}
CAMEL_VEE_FOLDER_UNLOCK(vf, summary_lock);
}
void
camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
{
@ -717,7 +752,7 @@ camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
CAMEL_VEE_FOLDER_UNLOCK(vf, subfolder_lock);
printf("camel_vee_folder_add_folde(%p, %p)\n", vf, sub);
d(printf("camel_vee_folder_add_folde(%p, %p)\n", vf, sub));
camel_object_hook_event((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc)folder_changed, vf);
camel_object_hook_event((CamelObject *)sub, "message_changed", (CamelObjectEventHookFunc)message_changed, vf);
@ -726,9 +761,15 @@ camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
vee_folder_build_folder(vf, sub, NULL);
if (camel_folder_change_info_changed(vf->changes)) {
camel_object_trigger_event((CamelObject *)vf, "folder_changed", vf->changes);
camel_folder_change_info_clear(vf->changes);
}
#if 0
/* we'll assume the caller is going to update the whole list after they do this
this may or may not be the right thing to do, but it should be close enough */
camel_folder_change_info_clear(vf->changes);
#endif
CAMEL_VEE_FOLDER_UNLOCK(vf, summary_lock);
}
@ -880,6 +921,26 @@ removed_uid(void *key, void *value, void *data)
unmatched_uid_check(key, data);
}
static void
vee_folder_remove_folder(CamelVeeFolder *vf, CamelFolder *source)
{
int i, count;
CamelFolder *folder = (CamelFolder *)vf;
count = camel_folder_summary_count(folder->summary);
for (i=0;i<count;i++) {
CamelVeeMessageInfo *mi = (CamelVeeMessageInfo *)camel_folder_summary_index(folder->summary, i);
if (mi) {
if (mi->folder == source) {
camel_folder_change_info_remove_uid(vf->changes, camel_message_info_uid(mi));
camel_folder_summary_remove(folder->summary, (CamelMessageInfo *)mi);
i--;
}
camel_folder_summary_info_free(folder->summary, (CamelMessageInfo *)mi);
}
}
}
/* build query contents for a single folder */
/* must have summary_lock held when calling */
static void
@ -912,10 +973,13 @@ vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException
}
}
printf("searching folder with expression %s\n", vf->expression);
matches = camel_folder_search_by_expression(f, vf->expression, ex);
for (i = 0; i < matches->len; i++) {
g_hash_table_remove(left, matches->pdata[i]);
mi = vee_folder_add_uid(vf, f, matches->pdata[i]);
printf("adding match %s\n", matches->pdata[i]);
if (mi)
camel_folder_change_info_add_update(vf->changes, camel_message_info_uid(mi));
}

View File

@ -54,5 +54,6 @@ guint camel_vee_folder_get_type (void);
CamelFolder *camel_vee_folder_new (CamelStore *parent_store, const char *name, guint32 flags, CamelException *ex);
void camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub);
void camel_vee_folder_remove_folder(CamelVeeFolder *vf, CamelFolder *sub);
#endif /* ! _CAMEL_VEE_FOLDER_H */