diff options
author | Michael Zucci <zucchi@src.gnome.org> | 2003-08-02 05:07:43 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2003-08-02 05:07:43 +0800 |
commit | e2cd78ca9b706f30f51a648db9da220e9b5a68a2 (patch) | |
tree | a1a211c5f2e2447b22eb2d610c25f58173961c6f /camel/providers/imapp/camel-imapp-folder.c | |
parent | 330ecafed407197d31c30170e1c76674d3ed91e8 (diff) | |
download | gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.tar gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.tar.gz gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.tar.bz2 gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.tar.lz gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.tar.xz gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.tar.zst gsoc2013-evolution-e2cd78ca9b706f30f51a648db9da220e9b5a68a2.zip |
experimental, non-working imap implementation
svn path=/trunk/; revision=22061
Diffstat (limited to 'camel/providers/imapp/camel-imapp-folder.c')
-rw-r--r-- | camel/providers/imapp/camel-imapp-folder.c | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/camel/providers/imapp/camel-imapp-folder.c b/camel/providers/imapp/camel-imapp-folder.c new file mode 100644 index 0000000000..19f3795056 --- /dev/null +++ b/camel/providers/imapp/camel-imapp-folder.c @@ -0,0 +1,268 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* camel-imap-folder.c : class for a imap folder */ + +/* + * Authors: Michael Zucchi <notzed@ximian.com> + * + * Copyright (C) 2002 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> + +#include "camel/camel-exception.h" +#include "camel/camel-stream-mem.h" +#include "camel/camel-stream-filter.h" +#include "camel/camel-mime-message.h" +#include "camel/camel-operation.h" +#include "camel/camel-data-cache.h" +#include "camel/camel-session.h" + +#include "camel-imapp-store.h" +#include "camel-imapp-folder.h" +#include "camel-imapp-summary.h" +#include "camel-imapp-exception.h" + +#include <e-util/md5-utils.h> + +#include <stdlib.h> +#include <string.h> + +#define d(x) + +#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(o))) +static CamelFolderClass *parent_class; + +static void imap_finalize (CamelObject *object); +static void imap_refresh_info (CamelFolder *folder, CamelException *ex); +static void imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); +static CamelMimeMessage *imap_get_message (CamelFolder *folder, const char *uid, CamelException *ex); + +static void +imap_folder_class_init (CamelIMAPPFolderClass *camel_imapp_folder_class) +{ + CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS(camel_imapp_folder_class); + + parent_class = CAMEL_FOLDER_CLASS(camel_folder_get_type()); + + /* virtual method overload */ + camel_folder_class->refresh_info = imap_refresh_info; + camel_folder_class->sync = imap_sync; + + camel_folder_class->get_message = imap_get_message; + /*camel_folder_class->set_message_flags = imap_set_message_flags;*/ +} + +static void +imap_folder_init(CamelObject *o, CamelObjectClass *klass) +{ + CamelFolder *folder = (CamelFolder *)o; + CamelIMAPPFolder *ifolder = (CamelIMAPPFolder *)o; + + folder->folder_flags |= (CAMEL_FOLDER_HAS_SUMMARY_CAPABILITY | + CAMEL_FOLDER_HAS_SEARCH_CAPABILITY); + + folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | + CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_DRAFT | + CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; + + /* FIXME: this is just a skeleton */ + + ifolder->changes = camel_folder_change_info_new(); +} + +CamelType +camel_imapp_folder_get_type (void) +{ + static CamelType camel_imapp_folder_type = CAMEL_INVALID_TYPE; + + if (!camel_imapp_folder_type) { + camel_imapp_folder_type = camel_type_register (CAMEL_FOLDER_TYPE, "CamelIMAPPFolder", + sizeof (CamelIMAPPFolder), + sizeof (CamelIMAPPFolderClass), + (CamelObjectClassInitFunc) imap_folder_class_init, + NULL, + imap_folder_init, + (CamelObjectFinalizeFunc) imap_finalize); + } + + return camel_imapp_folder_type; +} + +void +imap_finalize (CamelObject *object) +{ + CamelIMAPPFolder *folder = (CamelIMAPPFolder *)object; + + camel_folder_change_info_free(folder->changes); +} + +CamelFolder * +camel_imapp_folder_new(CamelStore *store, const char *path) +{ + CamelFolder *folder; + char *root; + + d(printf("opening imap folder '%s'\n", path)); + + folder = CAMEL_FOLDER (camel_object_new (CAMEL_IMAPP_FOLDER_TYPE)); + camel_folder_construct(folder, store, path, path); + + ((CamelIMAPPFolder *)folder)->raw_name = g_strdup(path); + + folder->summary = camel_imapp_summary_new(); + + root = camel_session_get_storage_path(((CamelService *)store)->session, (CamelService *)store, NULL); + if (root) { + char *base = g_build_filename(root, path, NULL); + char *file = g_build_filename(base, ".ev-summary", NULL); + + camel_mkdir(base, 0777); + g_free(base); + + camel_folder_summary_set_filename(folder->summary, file); + printf("loading summary from '%s' (root=%s)\n", file, root); + g_free(file); + camel_folder_summary_load(folder->summary); + g_free(root); + } + + return folder; +} + +void +camel_imapp_folder_open(CamelIMAPPFolder *folder, CamelException *ex) +{ + /* */ +} + +void +camel_imapp_folder_delete(CamelIMAPPFolder *folder, CamelException *ex) +{ +} + +void +camel_imapp_folder_rename(CamelIMAPPFolder *folder, const char *new, CamelException *ex) +{ +} + +void +camel_imapp_folder_close(CamelIMAPPFolder *folder, CamelException *ex) +{ +} + +static void +imap_refresh_info (CamelFolder *folder, CamelException *ex) +{ + printf("imapp refresh info?\n"); +} + +static void +imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) +{ + camel_imapp_driver_sync(((CamelIMAPPStore *)(folder->parent_store))->driver, expunge, folder); +} + +static CamelMimeMessage * +imap_get_message (CamelFolder *folder, const char *uid, CamelException *ex) +{ + CamelMimeMessage * volatile msg = NULL; + CamelStream * volatile stream = NULL; + + printf("get message '%s'\n", uid); + + CAMEL_TRY { + /* simple implementation, just get whole message in 1 go */ + stream = camel_imapp_driver_fetch(((CamelIMAPPStore *)(folder->parent_store))->driver, (CamelIMAPPFolder *)folder, uid, ""); + camel_stream_reset(stream); + msg = camel_mime_message_new(); + if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, stream) != -1) { + /* do we care? */ + } + } CAMEL_CATCH(e) { + if (msg) + camel_object_unref(msg); + msg = NULL; + camel_exception_xfer(ex, e); + } CAMEL_DONE; + + if (stream) + camel_object_unref(stream); + + return msg; +} + + +/* Algorithm for selecting a folder: + + - If uidvalidity == old uidvalidity + and exsists == old exists + and recent == old recent + and unseen == old unseen + Assume our summary is correct + for each summary item + mark the summary item as 'old/not updated' + rof + fetch flags from 1:* + for each fetch response + info = summary[index] + if info.uid != uid + info = summary_by_uid[uid] + fi + if info == NULL + create new info @ index + fi + if got.flags + update flags + fi + if got.header + update based on header + mark as retrieved + else if got.body + update based on imap body + mark as retrieved + fi + + Async fetch response: + info = summary[index] + if info == null + if uid == null + force resync/select? + info = empty @ index + else if uid && info.uid != uid + force a resync? + return + fi + + if got.flags { + info.flags = flags + } + if got.header { + info.init(header) + info.empty = false + } + +info.state - 2 bit field in flags + 0 = empty, nothing set + 1 = uid & flags set + 2 = update required + 3 = up to date +*/ + |