diff options
author | Dan Winship <danw@src.gnome.org> | 2000-03-28 09:57:59 +0800 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2000-03-28 09:57:59 +0800 |
commit | 15287c0ce663905936d69acd7874d9efea5cb285 (patch) | |
tree | c418ab9d8e63befcfa50fcff326494a96fb2f201 /camel/providers/pop3/camel-pop3-folder.c | |
parent | 03bcc319cfa2f92e86da72d0bd9f6040f4800aa0 (diff) | |
download | gsoc2013-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.c | 80 |
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; |