diff options
author | nobody <nobody@localhost> | 2000-05-29 23:42:50 +0800 |
---|---|---|
committer | nobody <nobody@localhost> | 2000-05-29 23:42:50 +0800 |
commit | 5b2764be1af7b1a4aa2e027c71697883abe3afed (patch) | |
tree | 47f7d2447d64eb8e27296917d78b128ddf21cde1 /camel/providers/imap | |
parent | ccb665a0262b51c92ca5a54a074dda0dec91a573 (diff) | |
download | gsoc2013-evolution-G.tar gsoc2013-evolution-G.tar.gz gsoc2013-evolution-G.tar.bz2 gsoc2013-evolution-G.tar.lz gsoc2013-evolution-G.tar.xz gsoc2013-evolution-G.tar.zst gsoc2013-evolution-G.zip |
This commit was manufactured by cvs2svn to create tag 'G'.G
svn path=/tags/G/; revision=3261
Diffstat (limited to 'camel/providers/imap')
-rw-r--r-- | camel/providers/imap/.cvsignore | 7 | ||||
-rw-r--r-- | camel/providers/imap/Makefile.am | 41 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 689 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-folder.h | 75 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-provider.c | 51 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-store.c | 531 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-store.h | 84 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-summary.h | 81 | ||||
-rw-r--r-- | camel/providers/imap/imap.c | 835 | ||||
-rw-r--r-- | camel/providers/imap/imap.h | 86 | ||||
-rw-r--r-- | camel/providers/imap/libcamelimap.urls | 1 |
11 files changed, 0 insertions, 2481 deletions
diff --git a/camel/providers/imap/.cvsignore b/camel/providers/imap/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/imap/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/imap/Makefile.am b/camel/providers/imap/Makefile.am deleted file mode 100644 index 00cad46ec2..0000000000 --- a/camel/providers/imap/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = - -libcamelmboxincludedir = $(includedir)/camel - - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelimap.la -provider_DATA = libcamelimap.urls - -INCLUDES = -I.. \ - -I$(srcdir)/.. \ - -I$(top_srcdir)/camel \ - -I$(top_srcdir)/intl \ - -I$(top_srcdir)/libibex \ - -I$(top_srcdir)/e-util \ - -I$(top_srcdir) \ - -I$(includedir) \ - $(GTK_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"camel-imap-provider\" - -libcamelimap_la_SOURCES = \ - camel-imap-folder.c \ - camel-imap-provider.c \ - camel-imap-store.c \ - camel-imap-summary.c - -libcamelimapinclude_HEADERS = \ - camel-imap-folder.h \ - camel-imap-store.h \ - camel-imap-summary.h - -libcamelimap_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - -libcamelimap_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) -#libcamelimap_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS) - -EXTRA_DIST = libcamelimap.urls - diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c deleted file mode 100644 index e4ad9699fb..0000000000 --- a/camel/providers/imap/camel-imap-folder.c +++ /dev/null @@ -1,689 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ -/* camel-imap-folder.c : Abstract class for an email folder */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 - */ - - -#include <config.h> - -#include <stdlib.h> -#include <sys/types.h> -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> - -#include "camel-imap-folder.h" -#include "camel-imap-store.h" -#include "string-utils.h" -#include "camel-stream-fs.h" -#include "camel-data-wrapper.h" -#include "camel-mime-message.h" -#include "camel-stream-filter.h" -#include "camel-mime-filter-from.h" -#include "camel-exception.h" - -#define d(x) - -static CamelFolderClass *parent_class = NULL; - -static void imap_init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar separator, CamelException *ex); - -static void imap_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex); -static void imap_close (CamelFolder *folder, gboolean expunge, CamelException *ex); -static gboolean imap_exists (CamelFolder *folder, CamelException *ex); -static gboolean imap_create(CamelFolder *folder, CamelException *ex); -static gboolean imap_delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean imap_delete_messages (CamelFolder *folder, CamelException *ex); -static gint imap_get_message_count (CamelFolder *folder, CamelException *ex); -static void imap_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static GPtrArray *imap_get_uids (CamelFolder *folder, CamelException *ex); -static GPtrArray *imap_get_subfolder_names (CamelFolder *folder, CamelException *ex); -static GPtrArray *imap_get_summary (CamelFolder *folder, CamelException *ex); -static void imap_free_summary (CamelFolder *folder, GPtrArray *array); -static CamelMimeMessage *imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, - CamelException *ex); - -static void imap_expunge (CamelFolder *folder, CamelException *ex); - -#if 0 -static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, - CamelFolder *dest_folder, CamelException *ex); -static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, - CamelException *ex); -#endif - -static void imap_delete_message_by_uid(CamelFolder *folder, const gchar *uid, CamelException *ex); - -static const CamelMessageInfo *imap_summary_get_by_uid(CamelFolder *f, const char *uid); - -static GList *imap_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); - -static void imap_finalize (GtkObject *object); - -static void -camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_imap_folder_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - - /* virtual method overload */ - camel_folder_class->init = imap_init; - - camel_folder_class->open = imap_open; - camel_folder_class->close = imap_close; - - camel_folder_class->exists = imap_exists; - camel_folder_class->create = imap_create; - camel_folder_class->delete = imap_delete; - - camel_folder_class->delete_messages = imap_delete_messages; - camel_folder_class->get_message_count = imap_get_message_count; - camel_folder_class->append_message = imap_append_message; - camel_folder_class->get_uids = imap_get_uids; - camel_folder_class->get_subfolder_names = imap_get_subfolder_names; - camel_folder_class->get_summary = imap_get_summary; - camel_folder_class->free_summary = imap_free_summary; - camel_folder_class->expunge = imap_expunge; - - camel_folder_class->get_message_by_uid = imap_get_message_by_uid; - camel_folder_class->delete_message_by_uid = imap_delete_message_by_uid; - - camel_folder_class->search_by_expression = imap_search_by_expression; - - camel_folder_class->summary_get_by_uid = imap_summary_get_by_uid; - - gtk_object_class->finalize = imap_finalize; - -} - -static void -camel_imap_folder_init (gpointer object, gpointer klass) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object); - CamelFolder *folder = CAMEL_FOLDER (object); - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = FALSE; - folder->has_search_capability = FALSE; - - imap_folder->count = -1; -} - -GtkType -camel_imap_folder_get_type (void) -{ - static GtkType camel_imap_folder_type = 0; - - if (!camel_imap_folder_type) { - GtkTypeInfo camel_imap_folder_info = - { - "CamelImapFolder", - sizeof (CamelImapFolder), - sizeof (CamelImapFolderClass), - (GtkClassInitFunc) camel_imap_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_imap_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_imap_folder_info); - } - - return camel_imap_folder_type; -} - -CamelFolder * -camel_imap_folder_new (CamelStore *parent, CamelException *ex) -{ - /* TODO: code this */ - CamelFolder *folder = CAMEL_FOLDER (gtk_object_new (camel_imap_folder_get_type (), NULL)); - - CF_CLASS (folder)->init (folder, parent, NULL, "inbox", '/', ex); - return folder; -} - -static void -imap_finalize (GtkObject *object) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object); - - g_free (imap_folder->folder_file_path); - g_free (imap_folder->folder_dir_path); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -imap_init (CamelFolder *folder, CamelStore *parent_store, CamelFolder *parent_folder, - const gchar *name, gchar separator, CamelException *ex) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - const gchar *root_dir_path; - - /* call parent method */ - parent_class->init (folder, parent_store, parent_folder, name, separator, ex); - if (camel_exception_get_id (ex)) - return; - - /* we assume that the parent init - method checks for the existance of @folder */ - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = FALSE; /* TODO: double-check this */ - folder->has_search_capability = TRUE; - - folder->permanent_flags = CAMEL_MESSAGE_SEEN | - CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_FLAGGED | - CAMEL_MESSAGE_DELETED | - CAMEL_MESSAGE_DRAFT | - CAMEL_MESSAGE_USER; /* some IMAP daemons support user-flags */ - - imap_folder->summary = NULL; - imap_folder->search = NULL; - - /* now set the name info */ - g_free (imap_folder->folder_file_path); - g_free (imap_folder->folder_dir_path); - g_free (imap_folder->index_file_path); - - root_dir_path = camel_imap_store_get_toplevel_dir (CAMEL_IMAP_STORE(folder->parent_store)); - - imap_folder->folder_file_path = g_strdup_printf ("%s/%s", root_dir_path, folder->full_name); - imap_folder->folder_dir_path = g_strdup_printf ("%s/%s.sdb", root_dir_path, folder->full_name); - imap_folder->index_file_path = g_strdup_printf ("%s/%s.ibex", root_dir_path, folder->full_name); -} - -static void -imap_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - gchar *result; - gint status; - - camel_imap_store_open (CAMEL_IMAP_STORE (folder->parent_store), ex); - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) { - /* do we actually want to do this? probably not */ - parent_class->open (folder, mode, ex); - - /* SELECT the IMAP mail spool */ - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "SELECT %s", imap_folder->folder_file_path); - - if (status != CAMEL_IMAP_OK) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not SELECT %s on IMAP " - "server %s: %s.", imap_folder->folder_file_path, - service->url->host, - status == CAMEL_IMAP_ERR ? result : - "Unknown error"); - g_free (result); - return -1; - } - - g_free(result); - } -} - -static void -imap_close (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - camel_imap_store_close (CAMEL_IMAP_STORE (folder->parent_store), expunge, ex); - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) - parent_class->close (folder, expunge, ex); -} - -static void -imap_expunge (CamelFolder *folder, CamelException *ex) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - gchar *result; - gint status; - - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "EXPUNGE"); - - if (status != CAMEL_IMAP_OK) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not EXPUNGE from IMAP " - "server %s: %s.", service->url->host, - status == CAMEL_IMAP_ERR ? result : - "Unknown error"); - g_free (result); - return -1; - } - - g_free(result); -} - -static gboolean -imap_exists (CamelFolder *folder, CamelException *ex) -{ - /* TODO: look at Mbox code and figure out exactly what needs to be done here */ - CamelImapFolder *imap_folder; - struct stat stat_buf; - gint stat_error; - gboolean exists; - - g_assert(folder != NULL); - - imap_folder = CAMEL_IMAP_FOLDER (folder); - - /* check if the imap file path is determined */ - if (!imap_folder->folder_file_path) { - camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, - "undetermined folder file path. Maybe use set_name ?"); - return FALSE; - } - - /* check if the imap dir path is determined */ - if (!imap_folder->folder_dir_path) { - camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, - "undetermined folder directory path. Maybe use set_name ?"); - return FALSE; - } - - /* TODO: Finish coding this. */ -} - -static gboolean -imap_create (CamelFolder *folder, CamelException *ex) -{ - /* NOTE: this should probably be pretty easy to code... */ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - const gchar *folder_file_path, *folder_dir_path; - gboolean folder_already_exists; - - g_assert(folder != NULL); - - /* call default implementation */ - parent_class->create (folder, ex); - - /* get the paths of what we need to create */ - folder_file_path = imap_folder->folder_file_path; - folder_dir_path = imap_folder->folder_dir_path; - - if (!(folder_file_path || folder_dir_path)) { - camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, - "invalid folder path. Use set_name ?"); - return FALSE; - } - - - /* if the folder already exists, simply return */ - folder_already_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) - return FALSE; - - if (folder_already_exists) - return TRUE; - - - /* create the directory for the subfolder */ - /* TODO: actually code this */ -} - - -static gboolean -imap_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - /* NOTE: should be pretty simple as well, just needa break out the RFC ;-) */ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - - return TRUE; -} - -/* TODO: remove this */ -gboolean -imap_delete_messages (CamelFolder *folder, CamelException *ex) -{ - /* TODO: delete the messages (mark as deleted/whatever) */ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - gchar *result; - gint status; - - g_return_val_if_fail (folder != NULL, FALSE); - - - return TRUE; -} - -static gint -imap_get_message_count (CamelFolder *folder, CamelException *ex) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - gint status; - gchar *result, *msg_count; - - g_return_val_if_fail (folder != NULL, -1); - - if (imap_folder->count != -1) - imap_folder->count; - - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "STATUS %s (MESSAGES)", imap_folder->folder_file_path); - - if (status != CAMEL_IMAP_OK) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not get message count from IMAP " - "server %s: %s.", service->url->host, - status == CAMEL_IMAP_ERR ? result : - "Unknown error"); - g_free (result); - return -1; - } - - /* parse out the message count - should come in the form: "* STATUS <folder> (MESSAGES <count>)\r\n" */ - if (result && *result == '*' ) { - if (msg_count = strstr(result, "MESSAGES")) { - msg_count += strlen("MESSAGES") + 1; - - /* we should now be pointing to the message count */ - imap_folder->count = atoi(msg_count); - } - } - g_free(result); - - return imap_folder->count; -} - -static void -imap_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - g_warning("CamelImapFolder::imap_append_message(): This feature not supported by IMAP\n"); - - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "This feature not supported by IMAP"); -} - -static GPtrArray * -imap_get_uids (CamelFolder *folder, CamelException *ex) -{ - /* TODO: Find out what this is actually supposed to do */ - GPtrArray *array; - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - gint i, count; - - count = camel_folder_summary_count((CamelFolderSummary *)imap_folder->summary); - array = g_ptr_array_new (); - g_ptr_array_set_size (array, count); - for (i = 0; i < count; i++) { - CamelImapMessageInfo *info = - (CamelImapMessageInfo *)camel_folder_summary_index((CamelFolderSummary *)imap_folder->summary, i); - array->pdata[i] = g_strdup(info->info.uid); - } - - return array; -} - -static GPtrArray * -imap_get_subfolder_names (CamelFolder *folder, CamelException *ex) -{ - /* NOTE: use LSUB or LIST - preferably LSUB but I managed with LIST in Spruce */ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - GPtrArray *listing; - gint status; - gchar *result; - - g_return_val_if_fail (folder != NULL, g_ptr_array_new()); - - if (imap_folder->count != -1) - imap_folder->count; - - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "LSUB \"\" \"%s\"", imap_folder->folder_file_path); - - if (status != CAMEL_IMAP_OK) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not get subfolder listing from IMAP " - "server %s: %s.", service->url->host, - status == CAMEL_IMAP_ERR ? result : - "Unknown error"); - g_free (result); - return g_ptr_array_new (); - } - - /* parse out the subfolders */ - listing = g_ptr_array_new (); - if (result) { - ptr = result; - while (*ptr == '*') { - gchar *flags, *param, *end, *dir_sep; - - ptr = flags = strchr(ptr, '(') + 1; /* jump to the flags section */ - end = strchr(flags, ')'); /* locate end of flags */ - flags = strndup(flags, (gint)(end - flags)); - - if (strstr(flags, "\\NoSelect")) { - g_free(flags); - continue; - } - g_free(flags); - - ptr = dir_sep = strchr(ptr, '"') + 1; /* jump to the first param */ - end = strchr(param, '"'); /* locate the end of the param */ - dir_sep = g_strndup(dir_sep, (gint)(end - param)); - - /* skip to the actual directory parameter */ - for (ptr = end++; *ptr == ' '; ptr++); - for (end = ptr; *end && *end != '\n'; end++); - param = g_strndup(ptr, (gint)(end - ptr)); - - g_ptr_array_add (listing, param); - - g_free(dir_sep); /* TODO: decide if we really need dir_sep */ - - if (*end) - ptr = end + 1; - else - ptr = end; - } - } - g_free(result); - - return listing; -} - -static void -imap_delete_message_by_uid(CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - /* NOTE: should be as easy as marking as deleted - which should be easy in IMAP */ - CamelImapFolder *mf = (CamelImapFolder *)folder; - - info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, uid); - if (info) { - info->flags |= CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_folder_summary_touch((CamelFolderSummary *)mf->summary); - } -} - -/* track flag changes in the summary */ -static void -message_changed(CamelMimeMessage *m, int type, CamelImapFolder *mf) -{ - /* TODO: find a way to do this in IMAP - will probably not be easy */ - CamelMessageInfo *info; - CamelFlag *flag; - - printf("Message changed: %s: %d\n", m->message_uid, type); - switch (type) { - case MESSAGE_FLAGS_CHANGED: - info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, m->message_uid); - if (info) { - info->flags = m->flags | CAMEL_MESSAGE_FOLDER_FLAGGED; - camel_flag_list_free(&info->user_flags); - flag = m->user_flags; - while (flag) { - camel_flag_set(&info->user_flags, flag->name, TRUE); - flag = flag->next; - } - camel_folder_summary_touch((CamelFolderSummary *)mf->summary); - } else - g_warning("Message changed event on message not in summary: %s", m->message_uid); - break; - default: - printf("Unhandled message change event: %d\n", type); - break; - } -} - -static CamelMimeMessage * -imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - /* NOTE: extremely easy to do in IMAP - just needa code it ;-) */ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelStream *message_stream = NULL; - CamelMimeMessage *message = NULL; - CamelImapMessageInfo *info; - CamelMimeParser *parser = NULL; - char *buffer; - int len; - - /* get the message summary info */ - info = (CamelImapMessageInfo *)camel_folder_summary_uid((CamelFolderSummary *)imap_folder->summary, uid); - - if (info == NULL) { - errno = ENOENT; - goto fail; - } - - /* if this has no content, its an error in the library */ - g_assert(info->info.content); - g_assert(info->frompos != -1); - - /* where we read from */ - message_stream = camel_stream_fs_new_with_name (imap_folder->folder_file_path, O_RDONLY, 0); - if (message_stream == NULL) - goto fail; - - /* we use a parser to verify the message is correct, and in the correct position */ - parser = camel_mime_parser_new(); - camel_mime_parser_init_with_stream(parser, message_stream); - gtk_object_unref((GtkObject *)message_stream); - camel_mime_parser_scan_from(parser, TRUE); - - camel_mime_parser_seek(parser, info->frompos, SEEK_SET); - if (camel_mime_parser_step(parser, &buffer, &len) != HSCAN_FROM) { - g_warning("File appears truncated"); - goto fail; - } - - if (camel_mime_parser_tell_start_from(parser) != info->frompos) { - g_warning("Summary doesn't match the folder contents! eek!"); - errno = EINVAL; - goto fail; - } - - message = camel_mime_message_new(); - if (camel_mime_part_construct_from_parser((CamelMimePart *)message, parser) == -1) { - g_warning("Construction failed"); - goto fail; - } - - /* we're constructed, finish setup and clean up */ - message->folder = folder; - gtk_object_ref((GtkObject *)folder); - message->message_uid = g_strdup(uid); - message->flags = info->info.flags; - gtk_signal_connect((GtkObject *)message, "message_changed", message_changed, folder); - - gtk_object_unref((GtkObject *)parser); - - return message; - -fail: - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, - "Cannot get message: %s", - g_strerror(errno)); - - if (parser) - gtk_object_unref((GtkObject *)parser); - if (message) - gtk_object_unref((GtkObject *)message); - - return NULL; -} - -GPtrArray * -imap_get_summary (CamelFolder *folder, CamelException *ex) -{ - /* TODO: what should we do here?? */ - CamelImapFolder *imap_folder = (CamelImapFolder *)folder; - - return ((CamelFolderSummary *)imap_folder->summary)->messages; -} - -void -imap_free_summary (CamelFolder *folder, GPtrArray *array) -{ - /* This is IMAP dude, no need to free a summary */ - return; -} - -/* get a single message info, by uid */ -static const CamelMessageInfo * -imap_summary_get_by_uid(CamelFolder *f, const char *uid) -{ - /* TODO: what do we do here? */ - CamelImapFolder *imap_folder = (CamelImapFolder *)f; - - return camel_folder_summary_uid((CamelFolderSummary *)imap_folder->summary, uid); -} - -static GList * -imap_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex) -{ - /* TODO: find a good way of doing this */ - CamelImapFolder *imap_folder = (CamelImapFolder *)folder; - - if (imap_folder->search == NULL) { - imap_folder->search = camel_folder_search_new(); - } - - camel_folder_search_set_folder(imap_folder->search, folder); - if (imap_folder->summary) - /* FIXME: dont access summary array directly? */ - camel_folder_search_set_summary(imap_folder->search, ((CamelFolderSummary *)imap_folder->summary)->messages); - camel_folder_search_set_body_index(imap_folder->search, imap_folder->index); - - return camel_folder_search_execute_expression(imap_folder->search, expression, ex); -} - - - - - diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h deleted file mode 100644 index 54605cfb35..0000000000 --- a/camel/providers/imap/camel-imap-folder.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-folder.h : Abstract class for an imap folder */ - -/* - * Author: - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * 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 the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 - */ - - -#ifndef CAMEL_IMAP_FOLDER_H -#define CAMEL_IMAP_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-folder.h" - -#define CAMEL_IMAP_FOLDER_TYPE (camel_imap_folder_get_type ()) -#define CAMEL_IMAP_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_IMAP_FOLDER_TYPE, CamelImapFolder)) -#define CAMEL_IMAP_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_IMAP_FOLDER_TYPE, CamelImapFolderClass)) -#define IS_CAMEL_IMAP_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_IMAP_FOLDER_TYPE)) - -typedef struct { - CamelFolder parent_object; - - gchar *folder_file_path; /* contains the messages */ - gchar *folder_dir_path; /* contains the subfolders */ - gchar *index_file_path; /* index of body contents */ - - ibex *index; /* index for this folder */ - CamelImapSummary *summary; - CamelFolderSearch *search; /* used to run searches, we just use the real thing (tm) */ -} CamelImapFolder; - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelImapFolderClass; - - -/* public methods */ -CamelFolder *camel_imap_folder_new (CamelStore *parent, CamelException *ex); - -/* Standard Gtk function */ -GtkType camel_imap_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_IMAP_FOLDER_H */ diff --git a/camel/providers/imap/camel-imap-provider.c b/camel/providers/imap/camel-imap-provider.c deleted file mode 100644 index 92013a9643..0000000000 --- a/camel/providers/imap/camel-imap-provider.c +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-provider.c: imap provider registration code */ - -/* - * Authors : - * Jeffrey Stedfast <fejj@helixcode.com> - * - * Copyright (C) 2000 HelixCode (www.helixcode.com). - * - * 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 the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 - */ - -#include "config.h" -#include "camel-imap-store.h" -#include "camel-provider.h" -#include "camel-session.h" - -static CamelProvider imap_provider = { - "imap", - "IMAPv4", - - "For reading and storing mail on IMAP servers.", - - "mail", - - 0, - - { 0, 0 } -}; - -void -camel_provider_module_init (CamelSession *session) -{ - imap_provider.object_types[CAMEL_PROVIDER_STORE] = - camel_imap_store_get_type(); - - camel_session_register_provider (session, &imap_provider); -} diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c deleted file mode 100644 index 0d35e971b2..0000000000 --- a/camel/providers/imap/camel-imap-store.c +++ /dev/null @@ -1,531 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-store.c : class for an imap store */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * Ross Golder <ross@golder.org> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 - */ - - -#include <config.h> - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - - -#include "camel-imap-store.h" -#include "camel-imap-folder.h" -#include "camel-exception.h" -#include "camel-session.h" -#include "camel-stream.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-url.h" - -/* Specified in RFC 2060 */ -#define IMAP_PORT 143 - -static CamelServiceClass *service_class = NULL; - -static void finalize (GtkObject *object); - -static gboolean imap_connect (CamelService *service, CamelException *ex); -static gboolean imap_disconnect (CamelService *service, CamelException *ex); -static GList *query_auth_types (CamelService *service, CamelException *ex); -static void free_auth_types (CamelService *service, GList *authtypes); - -static CamelFolder *get_folder (CamelStore *store, const char *folder_name, - CamelException *ex); -static char *get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex); - -static void -camel_imap_store_class_init (CamelImapStoreClass *camel_imap_store_class) -{ - /* virtual method overload */ - GtkObjectClass *object_class = - GTK_OBJECT_CLASS (camel_imap_store_class); - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_imap_store_class); - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_imap_store_class); - - service_class = gtk_type_class (camel_service_get_type ()); - - /* virtual method overload */ - object_class->finalize = finalize; - - camel_service_class->connect = imap_connect; - camel_service_class->disconnect = imap_disconnect; - camel_service_class->query_auth_types = query_auth_types; - camel_service_class->free_auth_types = free_auth_types; - - camel_store_class->get_folder = get_folder; - camel_store_class->get_folder_name = get_folder_name; -} - - -static void -camel_imap_store_init (gpointer object, gpointer klass) -{ - CamelService *service = CAMEL_SERVICE (object); - CamelStore *store = CAMEL_STORE (object); - - service->url_flags = ( CAMEL_SERVICE_URL_NEED_USER | - CAMEL_SERVICE_URL_NEED_HOST ); - - store->folders = g_hash_table_new (g_str_hash, g_str_equal); -} - - -GtkType -camel_imap_store_get_type (void) -{ - static GtkType camel_imap_store_type = 0; - - if (!camel_imap_store_type) { - GtkTypeInfo camel_imap_store_info = - { - "CamelImapStore", - sizeof (CamelImapStore), - sizeof (CamelImapStoreClass), - (GtkClassInitFunc) camel_imap_store_class_init, - (GtkObjectInitFunc) camel_imap_store_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_imap_store_type = gtk_type_unique (CAMEL_STORE_TYPE, &camel_imap_store_info); - } - - return camel_imap_store_type; -} - -static void -finalize (GtkObject *object) -{ - CamelException ex; - - camel_exception_init (&ex); - imap_disconnect (CAMEL_SERVICE (object), &ex); - camel_exception_clear (&ex); -} - -static CamelServiceAuthType password_authtype = { - "Password", - - "This option will connect to the IMAP server using a " - "plaintext password.", - - "", - TRUE -}; - -static gboolean -try_connect (CamelService *service, CamelException *ex) -{ - struct hostent *h; - struct sockaddr_in sin; - gint fd; - - h = camel_service_gethost (service, ex); - if (!h) - return FALSE; - - sin.sin_family = h->h_addrtype; - sin.sin_port = htons (service->url->port ? service->url->port : IMAP_PORT); - memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr)); - - fd = socket (h->h_addrtype, SOCK_STREAM, 0); - if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { - - /* We don't want to set a CamelException here */ - - if (fd > -1) - close (fd); - - return FALSE; - } - - close (fd); - return TRUE; -} - -static GList * -query_auth_types (CamelService *service, CamelException *ex) -{ - GList *ret = NULL; - gboolean passwd = TRUE; - - - if (service->url) { - passwd = try_connect (service, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) - return NULL; - } - - if (passwd) - ret = g_list_append (ret, &password_authtype); - - if (!ret) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not connect to IMAP server on " - "%s.", service->url->host); - } - - return ret; -} - -static void -free_auth_types (CamelService *service, GList *authtypes) -{ - g_list_free (authtypes); -} - -static gboolean -imap_connect (CamelService *service, CamelException *ex) -{ - struct hostent *h; - struct sockaddr_in sin; - gint fd, status; - gchar *buf, *msg; - CamelImapStore *store = CAMEL_IMAP_STORE (service); - - - h = camel_service_gethost (service, ex); - if (!h) - return FALSE; - - if (!service->url->authmech && !service->url->passwd) { - gchar *prompt = g_strdup_printf ("Please enter the IMAP password for %s@%s", - service->url->user, h->h_name); - service->url->passwd = - camel_session_query_authenticator (camel_service_get_session (service), - prompt, TRUE, - service, "password", - ex); - g_free (prompt); - if (!service->url->passwd) - return FALSE; - } - - sin.sin_family = h->h_addrtype; - if (service->url->port) - sin.sin_port = htons(service->url->port); - else - sin.sin_port = htons(IMAP_PORT); - - memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr)); - - fd = socket (h->h_addrtype, SOCK_STREAM, 0); - if (fd == -1 || connect (fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not connect to %s (port %s): %s", - service->url->host, service->url->port, - strerror(errno)); - if (fd > -1) - close (fd); - - return FALSE; - } - - - store->ostream = camel_stream_fs_new_with_fd (fd); - store->istream = camel_stream_buffer_new (store->ostream, - CAMEL_STREAM_BUFFER_READ); - store->command = 0; - - /* Read the greeting, if any. */ - buf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream)); - if (!buf) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not read greeting from IMAP " - "server: %s", - camel_exception_get_description (ex)); - gtk_object_unref (GTK_OBJECT (store->ostream)); - gtk_object_unref (GTK_OBJECT (store->istream)); - return FALSE; - } - g_free (buf); - - status = camel_imap_command (store, &msg, "LOGIN \"%s\" \"%s\"", - service->url->user, - service->url->passwd); - - if (status != CAMEL_IMAP_OK) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - "Unable to authenticate to IMAP " - "server. Error sending password:" - " %s", msg ? msg : "(Unknown)"); - g_free (msg); - gtk_object_unref (GTK_OBJECT (store->ostream)); - gtk_object_unref (GTK_OBJECT (store->istream)); - return FALSE; - } - - service_class->connect (service, ex); - return TRUE; -} - -static gboolean -imap_disconnect (CamelService *service, CamelException *ex) -{ - CamelImapStore *store = CAMEL_IMAP_STORE (service); - - if (!service->connected) - return TRUE; - - if (!service_class->disconnect (service, ex)) - return FALSE; - - gtk_object_unref (GTK_OBJECT (store->ostream)); - gtk_object_unref (GTK_OBJECT (store->istream)); - store->ostream = NULL; - store->istream = NULL; - - return TRUE; -} - -const gchar * -camel_imap_store_get_toplevel_dir (CamelImapStore *store) -{ - CamelURL *url = CAMEL_SERVICE (store)->url; - - g_assert(url != NULL); - return url->path; -} - - -static CamelFolder -*get_folder (CamelStore *store, const char *folder_name, CamelException *ex) -{ - CamelImapFolder *new_imap_folder; - CamelFolder *new_folder; - - new_imap_folder = gtk_type_new (CAMEL_IMAP_FOLDER_TYPE); - new_folder = CAMEL_FOLDER (new_imap_folder); - - /* XXX We shouldn't be passing NULL here, but it's equivalent to - * what was there before, and there's no - * CamelImapFolder::get_subfolder yet anyway... - */ - CF_CLASS (new_folder)->init (new_folder, store, NULL, - folder_name, '/', ex); - - return new_folder; -} - -static gchar -*get_folder_name (CamelStore *store, const char *folder_name, - CamelException *ex) -{ - return g_strdup (folder_name); -} - -/** - * camel_imap_command: Send a command to a IMAP server. - * @store: the IMAP store - * @ret: a pointer to return the full server response in - * @fmt: a printf-style format string, followed by arguments - * - * This command sends the command specified by @fmt and the following - * arguments to the connected IMAP store specified by @store. It then - * reads the server's response and parses out the status code. If - * the caller passed a non-NULL pointer for @ret, camel_imap_command - * will set it to point to an buffer containing the rest of the - * response from the IMAP server. (If @ret was passed but there was - * no extended response, @ret will be set to NULL.) The caller must - * free this buffer when it is done with it. - * - * Return value: one of CAMEL_IMAP_OK (command executed successfully), - * CAMEL_IMAP_ERR (command encounted an error), or CAMEL_IMAP_FAIL - * (a protocol-level error occurred, and Camel is uncertain of the - * result of the command.) - **/ -gint -camel_imap_command (CamelImapStore *store, char **ret, char *fmt, ...) -{ - gchar *cmdbuf, *respbuf; - gchar *cmdid; - va_list ap; - gint status; - - /* create the command */ - cmdid = g_strdup_printf("A%.5d", store->command++); - va_start (ap, fmt); - cmdbuf = g_strdup_vprintf (fmt, ap); - va_end (ap); - - fprintf(stderr, "sending : %s %s\r\n", cmdid, cmdbuf); - - if (camel_stream_printf (store->ostream, "%s %s\r\n", cmdid, cmdbuf) == -1) { - g_free(cmdbuf); - g_free(cmdid); - if (*ret) - *ret = g_strdup(strerror(errno)); - return CAMEL_IMAP_FAIL; - } - g_free(cmdbuf); - g_free(cmdid); - - /* Read the response */ - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream)); - if (respbuf == NULL) { - if (*ret) - *ret = g_strdup(strerror(errno)); - return CAMEL_IMAP_FAIL; - } - - fprintf(stderr, "received: %s\n", respbuf); - - /* TODO: We should really check the command id, da? */ - if (!strncmp (respbuf + 11, "OK", 2)) - status = CAMEL_IMAP_OK; - else if (!strncmp (respbuf + 11, "NO", 2)) - status = CAMEL_IMAP_ERR; - else - status = CAMEL_IMAP_FAIL; - - if (ret) { - if (status != CAMEL_IMAP_FAIL) { - *ret = strchr (respbuf, ' '); - if (*ret) - *ret = g_strdup (*ret + 1); - } else - *ret = NULL; - } - g_free (respbuf); - - return status; -} - -/** - * camel_imap_command_extended: Send a command to a IMAP server and get - * a multi-line response. - * @store: the IMAP store - * @ret: a pointer to return the full server response in - * @fmt: a printf-style format string, followed by arguments - * - * This command sends the command specified by @fmt and the following - * arguments to the connected IMAP store specified by @store. It then - * reads the server's response and parses out the status code. - * Camel_imap_command_extended will set it to point to a buffer containing the - * response from the IMAP server. (If @ret was passed but there was The caller - * must free this buffer when it is done with it. - * - * This command gets the additional data returned by "multi-line" IMAP - * commands, such as SELECT, LIST, LSUB, and various other commands. - * The returned data is un-byte-stuffed, and has lines termined by - * newlines rather than CR/LF pairs. - * - * Return value: one of CAMEL_IMAP_OK (command executed successfully), - * CAMEL_IMAP_ERR (command encounted an error), or CAMEL_IMAP_FAIL - * (a protocol-level error occurred, and Camel is uncertain of the - * result of the command.) - **/ - -gint -camel_imap_command_extended (CamelImapStore *store, char **ret, char *fmt, ...) -{ - CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream); - GPtrArray *data; - gchar *cmdid, *cmdbuf, *respbuf, *code; - va_list app; - gint i, status = CAMEL_IMAP_OK; - - /* Create the command */ - cmdid = g_strdup_printf("A%.5d", store->command++); - va_start (ap, fmt); - cmdbuf = g_strdup_vprintf (fmt, ap); - va_end (ap); - - fprintf(stderr, "sending : %s %s\r\n", cmdid, cmdbuf); - - if (camel_stream_printf (store->ostream, "%s %s\r\n", cmdid, cmdbuf) == -1) { - g_free(cmdbuf); - g_free(cmdid); - - *ret = g_strdup(strerror(errno)); - - return CAMEL_IMAP_FAIL; - } - g_free(cmdbuf); - g_free(cmdid); - - data = g_ptr_array_new (); - while (1) { - respbuf = camel_stream_buffer_read_line (stream); - if (!respbuf || !strncmp(respbuf, cmdid, strlen(cmdid)) ) { - /* IMAP's last response starts with our command id */ - break; - } - - fprintf(stderr, "received: %s\n", respbuf); - - g_ptr_array_add (data, respbuf); - } - - if (respbuf) { - code = respbuf + strlen(cmdid) + 1; - if (!strncmp(code, "OK", 2)) - status = CAMEL_IMAP_OK; - else if (!strncmp(code, "NO", 2)) - status = CAMEL_IMAP_ERR; - else - status = CAMEL_IMAP_FAIL; - } else { - status = CAMEL_IMAP_FAIL; - } - - if (status == CAMEL_IMAP_OK) { - /* Append an empty string to the end of the array - * so when we g_strjoinv it, we get a "\n" after - * the last real line. - */ - g_ptr_array_add (data, ""); - g_ptr_array_add (data, NULL); - *ret = g_strjoinv ("\n", (gchar **)data->pdata); - } else { - if (status != CAMEL_IMAP_FAIL) - *ret = g_strdup (strchr (respbuf, ' ' + 1); - else - *ret = NULL; - } - - for (i = 0; i < data->len - 2; i++) - g_free (data->pdata[i]); - g_ptr_array_free (data, TRUE); - - return status; -} - - - - - - diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h deleted file mode 100644 index fc6ac9b61c..0000000000 --- a/camel/providers/imap/camel-imap-store.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-imap-store.h : class for an imap store */ - -/* - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * Ross Golder <ross@golder.org> - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 - */ - - -#ifndef CAMEL_IMAP_STORE_H -#define CAMEL_IMAP_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-store.h" - -#define CAMEL_IMAP_STORE_TYPE (camel_imap_store_get_type ()) -#define CAMEL_IMAP_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_IMAP_STORE_TYPE, CamelImapStore)) -#define CAMEL_IMAP_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_IMAP_STORE_TYPE, CamelImapStoreClass)) -#define IS_CAMEL_IMAP_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_IMAP_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - - CamelStream *istream, *ostream; - guint32 command; - -} CamelImapStore; - - - -typedef struct { - CamelStoreClass parent_class; - -} CamelImapStoreClass; - - -/* public methods */ -void camel_imap_store_open (CamelImapStore *store, CamelException *ex); -void camel_imap_store_close (CamelImapStore *store, gboolean expunge, - CamelException *ex); - -/* support functions */ - -enum { CAMEL_IMAP_OK, CAMEL_IMAP_ERR, CAMEL_IMAP_FAIL }; - -gint camel_imap_command (CamelImapStore *store, char **ret, char *fmt, ...); -gchar *camel_imap_command_extended (CamelImapStore *store, char **ret, char *fmt, ...); - -/* Standard Gtk function */ -GtkType camel_imap_store_get_type (void); - -const gchar *camel_imap_store_get_toplevel_dir (CamelImapStore *store); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_IMAP_STORE_H */ - - diff --git a/camel/providers/imap/camel-imap-summary.h b/camel/providers/imap/camel-imap-summary.h deleted file mode 100644 index 437331ce30..0000000000 --- a/camel/providers/imap/camel-imap-summary.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2000 Helix Code Inc. - * - * Authors: Jeffrey Stedfast <fejj@helixcode.com> - * - * 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 the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * 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 - */ - -#ifndef _CAMEL_IMAP_SUMMARY_H -#define _CAMEL_IMAP_SUMMARY_H - -#include <gtk/gtk.h> -#include <camel/camel-folder-summary.h> -#include <libibex/ibex.h> - -#define CAMEL_IMAP_SUMMARY(obj) GTK_CHECK_CAST (obj, camel_imap_summary_get_type (), CamelImapSummary) -#define CAMEL_IMAP_SUMMARY_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, camel_imap_summary_get_type (), CamelImapSummaryClass) -#define IS_CAMEL_IMAP_SUMMARY(obj) GTK_CHECK_TYPE (obj, camel_imap_summary_get_type ()) - -typedef struct _CamelImapSummary CamelImapSummary; -typedef struct _CamelImapSummaryClass CamelImapSummaryClass; - -/* extra summary flags */ -enum { - CAMEL_MESSAGE_FOLDER_NOXEV = 1<<16, -/* CAMEL_MESSAGE_FOLDER_FLAGGED = 1<<17,*/ -}; - -typedef struct _CamelImapMessageContentInfo { - CamelMessageContentInfo info; -} CamelImapMessageContentInfo; - -typedef struct _CamelImapMessageInfo { - CamelMessageInfo info; - - off_t frompos; -} CamelImapMessageInfo; - -struct _CamelImapSummary { - CamelFolderSummary parent; - - struct _CamelImapSummaryPrivate *priv; - - char *folder_path; /* name of matching folder */ - size_t folder_size; /* size of the imap file, last sync */ - - ibex *index; - int index_force; /* do we force index during creation? */ -}; - -struct _CamelImapSummaryClass { - CamelFolderSummaryClass parent_class; -}; - -guint camel_imap_summary_get_type (void); - -CamelImapSummary *camel_imap_summary_new (const char *filename, const char *imap_name, ibex *index); - -/* load/check the summary */ -int camel_imap_summary_load(CamelImapSummary *mbs, int forceindex); - -/* incremental update */ -int camel_imap_summary_update(CamelImapSummary *mbs, off_t offset); - -/* perform a folder expunge */ -int camel_imap_summary_expunge(CamelImapSummary *mbs); - -#endif /* ! _CAMEL_IMAP_SUMMARY_H */ diff --git a/camel/providers/imap/imap.c b/camel/providers/imap/imap.c deleted file mode 100644 index 3a4109ed47..0000000000 --- a/camel/providers/imap/imap.c +++ /dev/null @@ -1,835 +0,0 @@ -/* Spruce - * Copyright (C) 1999-2000 Jeffrey Stedfast - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 "imap.h" - -#define IMAP_LOGGING - -/* this is used in the tag before each command */ -static guint32 imap_commands = 0; - -extern gint timeout; -extern GList *mime_parts; - - -gint imap_ok (gint tag, gchar *line) -{ - /* returns 1 if <tag> OK was found */ - gchar find[64]; - gint ret; - - g_snprintf(find, sizeof(find)-1, "A%.5d OK", tag); - - ret = find_string (line, find); - - if (ret < 0) - return 0; - - return 1; -} - -gint imap_login_cram_md5 (gint socket, gchar *username, gchar *password) -{ - /* Log in to server using CRAM-MD5 keyed hash. */ - gchar buffer[512]; - gchar *retstr; - gint pos; - - if (username == NULL || password == NULL) - return ERROR; - - memset(buffer, 0, sizeof(buffer)); - if (recvline(socket, buffer, sizeof(buffer)-1) < 0) - return ERROR; /* Fetch the OK line from the server */ - - if (find_string(buffer, "OK") == -1) - return ERROR; - - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d AUTHENTICATE CRAM-MD5\r\n", imap_commands); - - if (send(socket, buffer, strlen(buffer), 0) < 0) - return ERROR; - - memset(buffer, 0, sizeof(buffer)); - if (recvline(socket, buffer, sizeof(buffer)-1) < 0) - return ERROR; - - pos = find_string(buffer, "\r\n"); - if (pos != -1) - buffer[pos] = '\0'; - retstr = cram_md5(username, password, buffer); - - if (retstr[strlen(retstr)-1] == '\n') - retstr[strlen(retstr)-1] = '\0'; - - g_snprintf(buffer, sizeof(buffer)-1, "%s\r\n", retstr); - g_free(retstr); - - if (send (socket, buffer, strlen(buffer), 0) < 0) - return ERROR; - - if (recvline(socket, buffer, sizeof(buffer)-1) < 0) - return ERROR; - - if (!imap_ok(imap_commands, buffer)) - return ERROR; - - imap_commands++; - - return SUCCESS; -} - -gint imap_login (gint socket, gchar *username, gchar *password) -{ - /* this logs us in to the server */ - gchar buffer[512]; - gchar temp[64]; - - if (username == NULL || password == NULL) - return ERROR; - - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d LOGIN \"%s\" \"%s\"\r\n", imap_commands, username, password); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send (socket, buffer, strlen(buffer), 0) < 0) - { - return ERROR; - } - - g_snprintf(temp, sizeof(temp)-1, "A%.5d", imap_commands); - - memset(buffer, 0, sizeof(buffer)); - recvline_timeo(socket, buffer, sizeof(buffer)-1, timeout); - while (!strstr(buffer, temp)) - { - memset(buffer, 0, sizeof(buffer)); - recvline_timeo(socket, buffer, sizeof(buffer)-1, timeout); - } - - if (!imap_ok(imap_commands, buffer)) - return ERROR; - - imap_commands++; - - return SUCCESS; -} - -GList *imap_list (gint socket, gchar *namespace) -{ - /* this gets the names of all the mailboxes */ - gchar buffer[512]; - gchar flags[256]; - gchar temp[64], *ptr = NULL, *flagptr = NULL; - gchar slashdot = '\0'; - GList *list = NULL; - gint ret, size = 0, flaglen = 0; - - if (namespace && *namespace) - { - if (*namespace && namespace[strlen(namespace)-1] != '/' && namespace[strlen(namespace)-1] != '.') - slashdot = '/'; - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d LIST \"\" %s%c*\r\n", imap_commands, namespace, slashdot); - } - else - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d LIST \"\" INBOX.*\r\n", imap_commands); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send(socket, buffer, strlen(buffer), 0) < 0) - { - return NULL; - } - - do - { - memset(buffer, 0, sizeof(buffer)); - ret = recvline(socket, buffer, sizeof(buffer)-1); - if (ret > 0) - { -#ifdef IMAP_LOGGING - fprintf(stderr, "received: %s", buffer); -#endif - if (buffer[0] == '*') - { - strip(buffer, '\r'); - strip(buffer, '\n'); - - /* skip ahead to the flag section */ - ptr = strstr(buffer, "("); - - /* find the end of the flags section */ - flagptr = ptr + 1; - ptr = strstr(ptr, ")") + 1; - - /* eventually we will need to parse this */ - memset(flags, 0, sizeof(flags)); - flaglen = (gint)(ptr - flagptr) - 1; - size = sizeof(flags); - strncpy(flags, flagptr, flaglen > size ? size : flaglen); - if (!strstrcase(flags, "\\NoSelect")) /* is this a selectable mailbox? */ - { - /* skip the reference name */ - ptr += imap_get_string (ptr, temp, sizeof(temp)-1, ""); - - /* the rest of the return string is fair play... */ - g_strstrip(ptr); /* trim off any extra white space */ - unquote(ptr); /* unquote the mailbox name if it is quoted */ - if (slashdot) - strcut(ptr, 0, strlen(namespace)+1); /* cut out the namespace and the '/' */ - else - strcut(ptr, 0, strlen(namespace)); /* cut out the namespace */ - - - list = g_list_append (list, g_strdup(ptr)); - } - } - else - break; - } - } while (ret > 0); - - imap_commands++; - - return list; -} - -gint imap_select_mailbox (gint socket, gchar *mailbox, gchar *namespace) -{ - /* selects a mailbox, returns the number of messages in that mailbox - * or -1 on error */ - gchar *cmdbuf, buffer[512], temp[64], *index, mesgs[16]; - gchar slashdot = '\0'; - gint ret, i; - - if (mailbox == NULL) - return ERROR; - - if (namespace && strcmp(mailbox, "INBOX")) - { - if (*namespace && namespace[strlen(namespace)-1] != '/' && namespace[strlen(namespace)-1] != '.') - slashdot = '/'; - - cmdbuf = g_strdup_printf("A%.5d SELECT %s%c%s\r\n", imap_commands, namespace, slashdot, mailbox); - } - else - cmdbuf = g_strdup_printf("A%.5d SELECT %s\r\n", imap_commands, mailbox); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", cmdbuf); -#endif - - if (send(socket, cmdbuf, strlen(cmdbuf), 0) < 0) - { - g_free(cmdbuf); - return -1; - } - g_free(cmdbuf); - - g_snprintf(temp, sizeof(temp)-1, "A%.5d", imap_commands); - - memset(buffer, 0, sizeof(buffer)); - ret = recvline(socket, buffer, sizeof(buffer)-1); - while (ret > 0) - { -#ifdef IMAP_LOGGING - fprintf(stderr, "received: %s", buffer); -#endif - if (strstr(buffer, temp)) - break; - if (buffer[0] == '*') - { - if (strstr(buffer, "EXISTS")) - { - index = buffer; - while (*index != ' ') - index++; - index++; - - i = 0; - memset(mesgs, 0, sizeof(mesgs)); - while (*index != ' ' && i < sizeof(mesgs)-1) - { - mesgs[i] = *index; - index++; - i++; - } - } - } - memset(buffer, 0, sizeof(buffer)); - ret = recvline(socket, buffer, sizeof(buffer)-1); - } - - if (!imap_ok(imap_commands, buffer)) - return -1; - - imap_commands++; - - return atoi(mesgs); -} - -gint imap_logout (gint socket) -{ - /* logs out */ - gchar buffer[256]; - - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d LOGOUT\r\n", imap_commands); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send(socket, buffer, strlen(buffer), 0) < 0) - { - return ERROR; - } - - return SUCCESS; -} - -gint imap_mailbox_create (gint socket, gchar *mailbox) -{ - /* creates a new mailbox */ - gchar buffer[256]; - - if (mailbox == NULL) - return ERROR; - - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d CREATE %s\r\n", imap_commands, mailbox); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send(socket, buffer, strlen(buffer), 0) < 0) - { - return ERROR; - } - - memset(buffer, 0, sizeof(buffer)); - if (recvline(socket, buffer, sizeof(buffer)-1) < 0 || !imap_ok(imap_commands, buffer)) - { - return ERROR; - } - - imap_commands++; - - return SUCCESS; -} - -gint imap_mailbox_delete (gint socket, gchar *mailbox) -{ - /* deletes a mailbox */ - gchar buffer[256]; - - if (mailbox == NULL) - return ERROR; - - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d DELETE %s\r\n", imap_commands, mailbox); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send(socket, buffer, strlen(buffer), 0) < 0) - { - return ERROR; - } - - memset(buffer, 0, sizeof(buffer)); - if (recvline(socket, buffer, sizeof(buffer)-1) < 0 || - !imap_ok(imap_commands, buffer)) - { - return ERROR; - } - - imap_commands++; - - return SUCCESS; -} - -/* fetches the specified part of a message, which can be alot of - * if you use peek the \Seen flag is not set */ -gchar *imap_fetch (gint socket, gint mesgnum, gchar *part, gint *seen) -{ - /* fetches the specified part of the mesg. */ - gchar *mesg = NULL; - gchar buffer[512], *index; - gchar flags[128], size[16], temp[64]; - gint i, n, msgsize = 1000; - - if (mesgnum < 0) - return (gchar *)NULL; - - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d FETCH %d (FLAGS %s)\r\n", imap_commands, mesgnum, part); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send(socket, buffer, strlen(buffer), 0) < 0) - { - return (gchar *)NULL; - } - - - memset(buffer, 0, sizeof(buffer)); - n = recvline(socket, buffer, sizeof(buffer)-1); - - if (buffer[0] != '*' && imap_ok(imap_commands, buffer)) - { - memset(buffer, 0, sizeof(buffer)); - n = recvline(socket, buffer, sizeof(buffer)-1); - } - - if (buffer[0] == '*') - /*if (imap_ok(imap_commands, buffer))*/ - { - index = strstrcase(buffer, "FLAGS"); - if (index == NULL) /* hmm */ - { - fprintf(stderr, _("IMAP server replied using unknown tokens.\n")); - return (gchar *)NULL; - } - else - { -#ifdef IMAP_LOGGING - fprintf(stderr, "received: %s", buffer); -#endif - /* skip to the FLAGS token */ - for ( ; *index && *index != '('; index++); - index++; - - i = 0; - memset(flags, 0, sizeof(flags)); - while (*index != ')' && i < sizeof(flags)-1) - { - flags[i] = *index; - index++; - i++; - } - flags[i] = '\0'; - - /* skip to the next significant token */ - for (index++; *index && *index != '{'; index++); - index++; - - i = 0; - memset(size, 0, sizeof(size)); - while (*index != '}' && i < sizeof(size)-1) - { - size[i] = *index; - index++; - i++; - } - size[i] = '\0'; - msgsize = atoi(size); - } - } - else - { - g_snprintf(temp, sizeof(temp)-1, "A%.5d", imap_commands); - if (strstr(buffer, temp)) /* this means there's no such message */ - { - fprintf(stderr, _("IMAP responded with \"no such message\".\n")); - return (gchar *)NULL; - } - } - - - mesg = g_malloc0(msgsize + 50); /* just to be safe */ - n = recvline(socket, buffer, sizeof(buffer)-1); - - while (!(n <= 0) && !imap_ok(imap_commands, buffer)) - { - strip(buffer, '\r'); /* strip all the \r's */ - strcat(mesg, buffer); - memset(buffer, 0, sizeof(buffer)); - n = recvline(socket, buffer, sizeof(buffer)-1); - } - - if (mesg) - mesg[strlen(mesg)-3] = '\0'; /* strip the ending ) */ - - if (seen != NULL) - { - if (strstrcase(flags, "\\Seen")) - *seen = 1; - else - *seen = 0; - } - - imap_commands++; - - return (gchar*)mesg; -} - -gboolean imap_delete(const ImapAccount_t *imap, GList *sorted) -{ - GList *p = sorted; - gchar buffer[256]; - gchar temp[16]; - gint ret; - - do - { - gint id = GPOINTER_TO_INT(p->data); - g_snprintf(buffer, sizeof(buffer)-1, "A%.5d STORE %d +FLAGS (\\Deleted)\r\n", imap_commands, id); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - if (send(imap->socket, buffer, strlen(buffer), 0) < 0) - { - return FALSE; - } - g_snprintf(temp, sizeof(temp)-1, "A%.5d", imap_commands); - - memset(buffer, 0, sizeof(buffer)); - ret = recvline(imap->socket, buffer, sizeof(buffer)-1); - while (ret > 0) - { - if (find_string(buffer, temp) >= 0) - break; - - memset(buffer, 0, sizeof(buffer)); - ret = recvline(imap->socket, buffer, sizeof(buffer)-1); - } - - if (!imap_ok(imap_commands, buffer)) - { - return FALSE; - } - imap_commands++; - } while ((p = g_list_next(p))); - - g_snprintf(buffer, 255, "A%.5d EXPUNGE\r\n", imap_commands); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - if (send(imap->socket, buffer, strlen(buffer), 0) < 0) - { - return FALSE; - } - - g_snprintf (temp, 15, "A%.5d", imap_commands); - - memset(buffer, 0, sizeof(buffer)); - ret = recvline(imap->socket, buffer, sizeof(buffer)-1); - while (ret > 0) - { - if (find_string(buffer, temp) >= 0) - break; - - memset(buffer, 0, sizeof(buffer)); - ret = recvline(imap->socket, buffer, sizeof(buffer)-1); - } - - if (!imap_ok(imap_commands, buffer)) - { - return FALSE; - } - - imap_commands++; - - return TRUE; -} - -gint imap_connect (Server *server) -{ - /* connects to the server and returns the socket or -1 on error */ - gchar buffer[512]; - gint sock; - - if (!Resolve(server)) - return -1; - - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock < 0) - return -1; - - server->sin.sin_family = AF_INET; - server->sin.sin_port = htons(server->port); - -#ifdef IMAP_LOGGING - fprintf(stderr, _("Connecting to IMAP server (%s)..."), server->ip); -#endif - if (connect_timeo(sock, (struct sockaddr*)&server->sin, sizeof(server->sin), timeout) < 0) - { - fprintf(stderr, _("failed.\n")); - close(sock); - return -1; - } - fprintf(stderr, _("success.\n")); - - { - /* read the connect responce */ - memset(buffer, 0, sizeof(buffer)); - recvline_timeo(sock, buffer, sizeof(buffer)-1, timeout); - } - - return sock; -} - -gint imap_add_part(gchar *c) -{ - gchar name[64], value[64]; - gchar temp[64]; - gchar *start = c; - struct mime_part *part; - - part = g_malloc0(sizeof(struct mime_part)); - - c += imap_get_string (c, part->type, sizeof(part->type)-1, "text"); - c += imap_get_string (c, part->subtype, sizeof(part->subtype)-1, "plain"); - - /* seek to the beginning of the parameter... */ - for ( ; *c && *c == ' '; c++); - - if (*c) - { - gchar *p = part->parameter; - if (*c == '(') - { - c++; - while (*c && *c != ')') - { - c += imap_get_string (c, name, sizeof(name)-1, ""); - c += imap_get_string (c, value, sizeof(value)-1, ""); - /* don't buffer overrun */ - g_snprintf(p, sizeof(part->parameter)-1, "%s=\"%s\"; ", name, value); - p += strlen(p); - - while (*c && *c == ' ') /* skip any spaces */ - c++; - } - } - else - { - c += imap_get_string (c, name, sizeof(name)-1, ""); - strcpy(value, name); - *p++ = '\0'; - } - - c++; /* skip over the ')' belonging to the parameter values */ - if (*c) - { - /* ignore id and description */ - c += imap_get_string (c, temp, sizeof(temp)-1, ""); - c += imap_get_string (c, temp, sizeof(temp)-1, ""); - - /* encoding */ - c += imap_get_string (c, part->encoding, sizeof(part->encoding)-1, ""); - - /* size */ - c += imap_get_number (c, &part->len); - - /* skip the optional info */ - c += imap_skip_section(c); - - part->pos = 0; /* isn't useful in imap */ -#ifdef IMAP_LOGGING - fprintf(stderr, "type = %s/%s\n", part->type, part->subtype); - fprintf(stderr, "encoding = %s\n", part->encoding); - fprintf(stderr, "param = %s\n", part->parameter); -#endif - mime_parts = g_list_append (mime_parts, part); - - return (c - start); - } - } - return -1; -} - -gint imap_parts (gint socket, gint mesg_num) -{ - GList *tmp; - gchar *buffer = NULL, *c; - gint res = 1, cnt; - - tmp = mime_parts; - while (tmp != NULL) - { - g_free(tmp->data); - tmp = tmp->next; - } - - if (mime_parts != NULL) - { - g_list_free(mime_parts); - mime_parts = NULL; - } - - buffer = g_malloc0(sizeof(gchar)*2048); - - g_snprintf(buffer, 2047, "A%.5d FETCH %d (BODYSTRUCTURE)\r\n", imap_commands, mesg_num); -#ifdef IMAP_LOGGING - fprintf(stderr, "%s", buffer); -#endif - - if (send(socket, buffer, strlen(buffer), 0) < 0) - { - g_free(buffer); - return 0; - } - - /* get the structure of the body */ - memset (buffer, 0, sizeof(gchar)*2048); - recvline (socket, buffer, sizeof(gchar)*2048); -#ifdef IMAP_LOGGING - fprintf(stderr, "received: %s", buffer); -#endif - - c = buffer; - /* skip to the BODYSTRUCTURE */ - c = strstr(c, "BODYSTRUCTURE"); - if (c == NULL) - return 0; - - c += strlen("BODYSTRUCTURE"); - if (*c) - { - /* looks good so far, skip to the parts */ - for ( ; *c && *c != '('; c++); - - if (*c && *(c+1) == '(') - { - c++; -#ifdef IMAP_LOGGING - fprintf(stderr, "message is multipart\n"); -#endif - /* multipart */ - while (*c == '(') - { - cnt = imap_skip_section(c); - if (cnt > 1) - { - c[cnt-1] = '\0'; - cnt = imap_add_part(c); - if (cnt == -1) - { - res = 0; - break; - } - c += cnt; - } - else - { - res = 0; - break; - } - /* skip to the next mime part */ - for ( ; *c && *c == ' '; c++); - } - } - else - if (*c) - { - /* one part */ - cnt = imap_add_part(c); - res = res != -1; - } - /* just forget the rest, who cares?? */ - } - - g_free(buffer); - - return res; -} - -gint imap_get_string (gchar *index, gchar *dest, gint destlen, gchar *def) -{ - /* gets a string ("data" or NIL) , if NIL it copies def instead */ - gint i; - gchar *start = index; - - while (*index && *index == ' ') /* skip white space */ - index++; - - if (strncmp(index, "NIL", 3)) - { - /* progress to the first quote (we should already be there but just in case) */ - while (*index && *index != '"') - index++; - - index++; - - i = 0; - while (*index && *index != '"') - { - if (i < destlen-1) - { - dest[i] = *index; - i++; - } - index++; - } - dest[i] = '\0'; - } - else - { - /* if there were no data we just copy def */ - index += 3; - strncpy (dest, def, destlen); - } - - return index - start + 1; -} - -gint imap_get_number (gchar *index, gint *dest) -{ - /* gets a number */ - gchar number[32]; - gchar *start = index; - gint i; - - /* skip white space **/ - while (*index == ' ') - index++; - - i = 0; - while (*index != ' ' && i < sizeof(number)-1) - { - number[i] = *index; - index++; - i++; - } - number[i] = '\0'; - - *dest = atoi(number); - - return index - start; -} - -gint imap_skip_section(gchar *index) -{ - gint depth = 1; - gchar *start = index; - - while (depth != 0 && *index) - { - if (*index == '(') - depth++; - else if ( *index == ')' ) - depth--; - index++; - } - - return index - start; -} - diff --git a/camel/providers/imap/imap.h b/camel/providers/imap/imap.h deleted file mode 100644 index 3884651c42..0000000000 --- a/camel/providers/imap/imap.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Spruce - * Copyright (C) 1999-2000 Jeffrey Stedfast - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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. -*/ - -#ifndef __IMAP_H__ -#define __IMAP_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include <gtk/gtk.h> -#undef MIN -#undef MAX -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include "parse.h" -#include "server.h" -#include "mime.h" -#include "cram-md5.h" - -struct imap_account -{ - Server server; - gchar *username; - gchar *password; - gint socket; -}; - -gint imap_ok (gint tag, gchar *line); - -gint imap_login_cram_md5(gint socket, gchar *username, gchar *password); - -gint imap_login (gint socket, gchar *username, gchar *password); - -GList *imap_list (gint socket, gchar *namespace); - -gint imap_select_mailbox (gint socket, gchar *mailbox, gchar *namespace); - -gint imap_logout (gint socket); - -gint imap_mailbox_create (gint socket, gchar *mailbox); - -gint imap_mailbox_delete (gint socket, gchar *mailbox); - -gchar *imap_fetch (gint socket, gint mesgnum, gchar *part, gint *seen); - -gboolean imap_delete (const ImapAccount_t *imap, GList *sorted); - -gint imap_connect(Server *server); - -gint imap_add_part(gchar *c); - -gint imap_parts (gint socket, gint mesg_num); - -gint imap_get_string (gchar *index, gchar *dest, gint destlen, gchar *def); - -gint imap_get_number (gchar *index, gint *dest); - -gint imap_skip_section(gchar *index); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif - diff --git a/camel/providers/imap/libcamelimap.urls b/camel/providers/imap/libcamelimap.urls deleted file mode 100644 index c301c0ffac..0000000000 --- a/camel/providers/imap/libcamelimap.urls +++ /dev/null @@ -1 +0,0 @@ -imap |