aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/pop3/camel-pop3-folder.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2000-03-28 09:57:59 +0800
committerDan Winship <danw@src.gnome.org>2000-03-28 09:57:59 +0800
commit15287c0ce663905936d69acd7874d9efea5cb285 (patch)
treec418ab9d8e63befcfa50fcff326494a96fb2f201 /camel/providers/pop3/camel-pop3-folder.c
parent03bcc319cfa2f92e86da72d0bd9f6040f4800aa0 (diff)
downloadgsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.tar
gsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.tar.gz
gsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.tar.bz2
gsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.tar.lz
gsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.tar.xz
gsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.tar.zst
gsoc2013-evolution-15287c0ce663905936d69acd7874d9efea5cb285.zip
add delete_message_by_{number,uid}.
* camel-folder.[ch]: add delete_message_by_{number,uid}. * providers/pop3/camel-pop3-folder.[ch]: implement delete_message_by_uid. Add a close method to do expunging of deleted messages if requested. * providers/pop3/camel-pop3-store.[ch]: support for CamelPop3Folder::close. (You have to close the connection in order to expunge the folder, thus the store may be connected in the CamelService::is_connected sense when it is not actually connected to the server.) Also some bugfixes. svn path=/trunk/; revision=2203
Diffstat (limited to 'camel/providers/pop3/camel-pop3-folder.c')
-rw-r--r--camel/providers/pop3/camel-pop3-folder.c80
1 files changed, 78 insertions, 2 deletions
diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c
index ad856cc2be..0b2ccb030b 100644
--- a/camel/providers/pop3/camel-pop3-folder.c
+++ b/camel/providers/pop3/camel-pop3-folder.c
@@ -32,11 +32,19 @@
#include <stdlib.h>
#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (GTK_OBJECT (o)->klass))
+static CamelFolderClass *parent_class;
+static void pop3_open (CamelFolder *folder, CamelFolderOpenMode mode,
+ CamelException *ex);
+static void pop3_close (CamelFolder *folder, gboolean expunge,
+ CamelException *ex);
+static gboolean delete_messages (CamelFolder *folder, CamelException *ex);
static gboolean has_message_number_capability (CamelFolder *folder);
static CamelMimeMessage *get_message_by_number (CamelFolder *folder,
gint number,
CamelException *ex);
+static void delete_message_by_number (CamelFolder *folder, gint number,
+ CamelException *ex);
static gint get_message_count (CamelFolder *folder, CamelException *ex);
@@ -45,12 +53,19 @@ camel_pop3_folder_class_init (CamelPop3FolderClass *camel_pop3_folder_class)
{
CamelFolderClass *camel_folder_class =
CAMEL_FOLDER_CLASS (camel_pop3_folder_class);
-
+
+ parent_class = gtk_type_class (camel_folder_get_type ());
+
/* virtual method overload */
+ camel_folder_class->open = pop3_open;
+ camel_folder_class->close = pop3_close;
+ camel_folder_class->delete_messages = delete_messages;
camel_folder_class->has_message_number_capability =
has_message_number_capability;
camel_folder_class->get_message_by_number =
get_message_by_number;
+ camel_folder_class->delete_message_by_number =
+ delete_message_by_number;
camel_folder_class->get_message_count =
get_message_count;
}
@@ -109,6 +124,50 @@ CamelFolder *camel_pop3_folder_new (CamelStore *parent, CamelException *ex)
return folder;
}
+static void
+pop3_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex)
+{
+ camel_pop3_store_open (CAMEL_POP3_STORE (folder->parent_store), ex);
+ if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE)
+ parent_class->open (folder, mode, ex);
+}
+
+static void
+pop3_close (CamelFolder *folder, gboolean expunge, CamelException *ex)
+{
+ camel_pop3_store_close (CAMEL_POP3_STORE (folder->parent_store),
+ expunge, ex);
+ if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE)
+ parent_class->close (folder, expunge, ex);
+}
+
+static gboolean
+delete_messages (CamelFolder *folder, CamelException *ex)
+{
+ int msgs;
+ gboolean status;
+
+ msgs = get_message_count (folder, ex);
+ if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
+ return FALSE;
+
+ status = TRUE;
+ for (; msgs > 0; msgs--) {
+ status = status &&
+ (camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store),
+ NULL, "DELE %d", msgs) ==
+ CAMEL_POP3_OK);
+ }
+
+ if (!status) {
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
+ "Unable to delete all messages.");
+ }
+
+ return status;
+}
+
+
static gboolean
has_message_number_capability (CamelFolder *folder)
{
@@ -155,8 +214,25 @@ get_message_by_number (CamelFolder *folder, gint number, CamelException *ex)
return msg;
}
+static void
+delete_message_by_number (CamelFolder *folder, gint number, CamelException *ex)
+{
+ int status;
+ char *resp;
+
+ status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store),
+ &resp, "DELE %d", number);
+ if (status != CAMEL_POP3_OK) {
+ camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
+ "Unable to delete message %d%s%s",
+ number, resp ? ": " : "",
+ resp ? resp : "");
+ }
+ g_free (resp);
+}
-static gint get_message_count (CamelFolder *folder, CamelException *ex)
+static gint
+get_message_count (CamelFolder *folder, CamelException *ex)
{
int status, count;
char *result;