implemented. The routines in this file will be called by providers to
authorbertrand <Bertrand.Guiheneuf@aful.org>
Wed, 15 Dec 1999 23:48:23 +0000 (23:48 +0000)
committerBertrand Guiheneuf <bertrand@src.gnome.org>
Wed, 15 Dec 1999 23:48:23 +0000 (23:48 +0000)
1999-12-16  bertrand  <Bertrand.Guiheneuf@aful.org>

* camel/camel-folder-utils.c (camel_aml_expunge_messages):
implemented. The routines in this file will be
called by providers to handle the list of
message already standing in memory.

1999-12-15  bertrand  <Bertrand.Guiheneuf@aful.org>

* camel/camel-folder-utils.c:
* camel/camel-folder-utils.h:
New files, misc utilities for the
folder providers. Includes active message
list utilities.

* camel/camel-folder.c (_has_message_number_capability):
(camel_folder_has_message_number_capability):
Added this to know if a folder provides
number-based message access.

* camel/camel-folder.c (_get_message_count):
added warning when called directly.
(_append_message): ditto
(_open_async):  ditto
(_close_async):  ditto
(_delete_messages): ditto
(_expunge):  ditto
(_get_message_by_number):  ditto
(_get_message_uid):  ditto
(_get_message_uid_by_number):  ditto
(_get_message_by_uid):  ditto
(_get_uid_list):  ditto

camel/Makefile.am
camel/camel-folder-utils.c [new file with mode: 0644]
camel/camel-folder-utils.h [new file with mode: 0644]
camel/camel-folder.c
camel/camel-folder.h

index 8e74253..c359645 100644 (file)
@@ -40,6 +40,7 @@ libcamel_la_SOURCES =                                 \
        camel-stream-data-wrapper.c             \
        camel-folder.c                          \
        camel-folder-summary.c                  \
+       camel-folder-utils.c                    \
        camel-medium.c                          \
        camel-marshal-utils.c                   \
        camel-mime-body-part.c                  \
@@ -78,6 +79,7 @@ libcamelinclude_HEADERS =                     \
        camel-stream-data-wrapper.h             \
        camel-folder.h                          \
        camel-folder-summary.h                  \
+       camel-folder-utils.h                    \
        camel-mime-body-part.h                  \
        camel-marshal-utils.h                   \
        camel-medium.h                          \
diff --git a/camel/camel-folder-utils.c b/camel/camel-folder-utils.c
new file mode 100644 (file)
index 0000000..e845913
--- /dev/null
@@ -0,0 +1,101 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-folder-utils : Utility for camel folders */
+
+
+/* 
+ *
+ * Author : 
+ *  Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org>
+ *
+ * Copyright 1999, 2000 HelixCode (http://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 "camel-folder-utils.h"
+#include "camel-mime-message.h"
+
+
+
+/*  Active Message List utilities */
+
+/* */
+gint
+camel_mime_message_number_cmp (gconstpointer a, gconstpointer b)
+{
+       CamelMimeMessage *m_a = CAMEL_MIME_MESSAGE (a);
+       CamelMimeMessage *m_b = CAMEL_MIME_MESSAGE (b);
+
+       return (m_a->message_number - (m_b->message_number));
+}
+
+
+/**
+ * camel_aml_expunge_messages: Expunge the message marked as deleted in an Active Message List
+ * @aml: active message list
+ * @folder: folder object
+ * 
+ * Expunge the message flagged as "DELETED" in an active message list. 
+ * The messages are not freed nor really expunged on the disk, they
+ * are just removed from the active message list and marked as 
+ * "EXPUNGED". The list of the message which have been expunged is
+ * return in a GList which must be freed by the caller. 
+ * To be really expunged the providers must provide or call
+ * folder specific methods.
+ * 
+ * Return value: the list of expunged messages.
+ **/
+GList *
+camel_aml_expunge_messages (GList *aml, 
+                           CamelFolder *folder)
+{
+       CamelMimeMessage *message;
+       GList *message_node;
+       GList *next_message_node;
+       guint nb_expunged = 0;  
+       GList *expunged_messages;
+       
+       message_node = folder->message_list;
+
+       /* look in folder message list which messages
+        * need to be expunged  */
+       while ( message_node) {
+               message = CAMEL_MIME_MESSAGE (message_node->data);
+
+               /* we may free message_node so get the next node now */
+               next_message_node = message_node->next;
+
+               if (message) {                  
+                       if (camel_mime_message_get_flag (message, "DELETED")) {
+                               
+                               /* remove the message from active message list */
+                               g_list_remove_link (folder->message_list, message_node);
+                               g_list_free_1 (message_node);
+                               camel_mime_message_set_flag (message, "EXPUNGED", TRUE);
+                               expunged_messages = g_list_prepend (expunged_messages, message);
+                               
+                       } 
+               }
+               else {
+                       CAMEL_LOG_WARNING ("CamelFolder::expunge warning message_node contains no message\n");
+               }
+               message_node = next_message_node;
+               CAMEL_LOG_FULL_DEBUG ("CamelFolder::expunge, examined message node %p\n", message_node);
+       }
+       
+       return expunged_messages;
+}
diff --git a/camel/camel-folder-utils.h b/camel/camel-folder-utils.h
new file mode 100644 (file)
index 0000000..9b00ab0
--- /dev/null
@@ -0,0 +1,44 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-folder-utils : Utility for camel folders */
+
+
+/* 
+ *
+ * Author : 
+ *  Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org>
+ *
+ * Copyright 1999, 2000 HelixCode (http://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_MIME_PART_UTILS_H
+#define CAMEL_MIME_PART_UTILS_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus }*/
+
+#include "camel-folder.h"
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /*  CAMEL_MIME_PART_UTILS_H  */
+
index 84dc229..37796c3 100644 (file)
@@ -85,6 +85,7 @@ static CamelFolder *_get_parent_folder (CamelFolder *folder, CamelException *ex)
 static CamelStore * _get_parent_store  (CamelFolder *folder, CamelException *ex);
 
 
+static gboolean _has_message_number_capability (CamelFolder *folder, CamelException *ex);
 static CamelMimeMessage *_get_message_by_number (CamelFolder *folder, 
                                                 gint number, 
                                                 CamelException *ex);
@@ -145,6 +146,7 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class)
        camel_folder_class->get_mode = _get_mode;
        camel_folder_class->list_subfolders = _list_subfolders;
        camel_folder_class->expunge = _expunge;
+       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->get_message_count = _get_message_count;
        camel_folder_class->append_message = _append_message;
@@ -281,12 +283,12 @@ _open_async (CamelFolder *folder,
             gpointer user_data, 
             CamelException *ex)
 {
-       CAMEL_LOG_WARNING ("CamelFolder::open_async method must be overloaded\n");
+       CAMEL_LOG_WARNING ("Calling CamelFolder::open_async directly. "
+                          "Should be overloaded\n");
 }
 
 
 
-
 /**
  * camel_folder_open: Open a folder
  * @folder: The folder object
@@ -295,7 +297,7 @@ _open_async (CamelFolder *folder,
  * @user_data: data to pass to the callback 
  * @ex: exception object
  *
- * Open a folder in a given mode. When the opration is over
+ * Open a folder in a given mode. When the operation is over
  * the callback is called and the client program can determine
  * if the operation suceeded by examining the exception. 
  * 
@@ -353,7 +355,8 @@ _close_async (CamelFolder *folder,
              gpointer user_data, 
              CamelException *ex)
 {      
-       CAMEL_LOG_WARNING ("CamelFolder::close_async method must be overloaded\n");
+       CAMEL_LOG_WARNING ("Calling CamelFolder::close_async directly. "
+                          "Should be overloaded\n");
 }
 
 /**
@@ -420,7 +423,12 @@ _set_name (CamelFolder *folder,
  * camel_folder_set_name:set the (short) name of the folder
  * @folder: folder
  * @name: new name of the folder
- * ex);
+ * @ex: exception object
+ **/
+void
+camel_folder_set_name (CamelFolder *folder, const gchar *name, CamelException *ex)
+{
+       CF_CLASS(folder)->set_name (folder, name, ex);
 }
 
 
@@ -791,6 +799,8 @@ gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelExcept
 static gboolean 
 _delete_messages (CamelFolder *folder, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::delete_messages directly. "
+                          "Should be overloaded\n");
        return TRUE;
 }
 
@@ -910,6 +920,8 @@ camel_folder_get_mode (CamelFolder *folder, CamelException *ex)
 static GList *
 _list_subfolders (CamelFolder *folder, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::list_subfolders directly. "
+                          "Should be overloaded\n");
        return NULL;
 }
 
@@ -934,18 +946,11 @@ camel_folder_list_subfolders (CamelFolder *folder, CamelException *ex)
 static void
 _expunge (CamelFolder *folder, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::expunge directly. "
+                          "Should be overloaded\n");
 
 }
 
-/* util func. Should not stay here */
-gint
-camel_mime_message_number_cmp (gconstpointer a, gconstpointer b)
-{
-       CamelMimeMessage *m_a = CAMEL_MIME_MESSAGE (a);
-       CamelMimeMessage *m_b = CAMEL_MIME_MESSAGE (b);
-
-       return (m_a->message_number - (m_b->message_number));
-}
 
 /**
  * camel_folder_expunge: physically delete messages marked as "DELETED"
@@ -953,23 +958,20 @@ camel_mime_message_number_cmp (gconstpointer a, gconstpointer b)
  * 
  * Delete messages which have been marked as  "DELETED"
  * 
- * 
- * Return value: list of expunged message objects.
  **/
-GList *
-camel_folder_expunge (CamelFolder *folder, gboolean want_list, CamelException *ex)
+void
+camel_folder_expunge (CamelFolder *folder,  CamelException *ex)
 {
-       GList *expunged_list = NULL;
        CamelMimeMessage *message;
        GList *message_node;
        GList *next_message_node;
        guint nb_expunged = 0;
 
        
-       /* sort message list by ascending message number */
+       /* sort message list by ascending message number
        if (folder->message_list)
                folder->message_list = g_list_sort (folder->message_list, camel_mime_message_number_cmp);
-
+       */
        /* call provider method, 
         *  PROVIDERS MUST SET THE EXPUNGED FLAGS TO TRUE
         * when they expunge a message of the active message list */
@@ -988,8 +990,7 @@ camel_folder_expunge (CamelFolder *folder, gboolean want_list, CamelException *e
                if (message) {
                        CAMEL_LOG_FULL_DEBUG ("CamelFolder::expunge, examining message %d\n", message->message_number);
                        if (message->expunged) {
-                               if (want_list) 
-                                       expunged_list = g_list_append (expunged_list, message);
+                               
                                /* remove the message from active message list */
                                g_list_remove_link (folder->message_list, message_node);
                                g_list_free_1 (message_node);
@@ -1009,14 +1010,46 @@ camel_folder_expunge (CamelFolder *folder, gboolean want_list, CamelException *e
                CAMEL_LOG_FULL_DEBUG ("CamelFolder::expunge, examined message node %p\n", message_node);
        }
        
-       return expunged_list;
 }
 
 
+static gboolean 
+_has_message_number_capability (CamelFolder *folder, CamelException *ex)
+{
+       CAMEL_LOG_WARNING ("Calling CamelFolder::has_message_number_capability directly. "
+                          "Should be overloaded\n");
+       return FALSE;
+
+}
+
+
+/**
+ * camel_folder_has_message_number_capability: tests if the message can be numbered within the folder
+ * @folder: folder to test
+ * 
+ * Test if the message in this folder can be
+ * obtained via the get_by_number method. 
+ * Usually, when the folder has the UID 
+ * capability, messages should be referred to
+ * by their UID rather than by their number
+ * as the UID is more reliable. 
+ * 
+ * Return value: TRUE if the folder supports message numbering, FALSE otherwise.
+ **/
+gboolean 
+camel_folder_has_message_number_capability (CamelFolder *folder, CamelException *ex)
+{      
+       return CF_CLASS(folder)->has_message_number_capability (folder, ex);
+}
+
+
+
 
 static CamelMimeMessage *
 _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_by_number directly. "
+                          "Should be overloaded\n");
        return NULL;
 }
 
@@ -1024,7 +1057,7 @@ _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex)
 
 
 /**
- * _get_message: return the message corresponding to that number in the folder
+ * camel_folder_get_message_by_number: return the message corresponding to that number in the folder
  * @folder: a CamelFolder object
  * @number: the number of the message within the folder.
  * 
@@ -1041,7 +1074,7 @@ camel_folder_get_message_by_number (CamelFolder *folder, gint number, CamelExcep
        GList *message_node;
        
        message_node = folder->message_list;
-       CAMEL_LOG_FULL_DEBUG ("CamelFolder::get_message Looking for message nummber %d\n", number);
+       CAMEL_LOG_FULL_DEBUG ("CamelFolder::get_message Looking for message number %d\n", number);
        /* look in folder message list if the 
         * if the message has not already been retreived */
        while ((!new_message) && message_node) {
@@ -1080,6 +1113,8 @@ camel_folder_get_message_by_number (CamelFolder *folder, gint number, CamelExcep
 static gint
 _get_message_count (CamelFolder *folder, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_count directly. "
+                          "Should be overloaded\n");
        return -1;
 }
 
@@ -1103,7 +1138,10 @@ camel_folder_get_message_count (CamelFolder *folder, CamelException *ex)
 static gint
 _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::append_message directly. "
+                          "Should be overloaded\n");
        return -1;
+
 }
 
 
@@ -1187,6 +1225,8 @@ camel_folder_has_uid_capability (CamelFolder *folder, CamelException *ex)
 static const gchar *
 _get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_uid directly. "
+                          "Should be overloaded\n");
        return NULL;
 }
 
@@ -1215,6 +1255,8 @@ camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, Ca
 static const gchar *
 _get_message_uid_by_number (CamelFolder *folder, gint message_number, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_uid_by_number directly. "
+                          "Should be overloaded\n");
        return NULL;
 }
 
@@ -1241,6 +1283,8 @@ camel_folder_get_message_uid_by_number (CamelFolder *folder, gint message_number
 static CamelMimeMessage *
 _get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_by_uid directly. "
+                          "Should be overloaded\n");
        return NULL;
 }
 
@@ -1266,6 +1310,8 @@ camel_folder_get_message_by_uid  (CamelFolder *folder, const gchar *uid, CamelEx
 static GList *
 _get_uid_list  (CamelFolder *folder, CamelException *ex)
 {
+       CAMEL_LOG_WARNING ("Calling CamelFolder::get_uid_list directly. "
+                          "Should be overloaded\n");
        return NULL;
 }
 
index c4ddf71..0146ae6 100644 (file)
@@ -168,10 +168,12 @@ typedef struct {
        void  (*expunge)  (CamelFolder *folder, 
                           CamelException *ex);
 
+       gboolean (*has_message_number_capability) (CamelFolder *folder, CamelException *ex);
+
        CamelMimeMessage * (*get_message_by_number) (CamelFolder *folder, 
                                                     gint number, 
                                                     CamelException *ex);
-
+       
        gint   (*get_message_count)   (CamelFolder *folder, 
                                       CamelException *ex);
 
@@ -187,6 +189,8 @@ typedef struct {
                                   CamelFolder *dest_folder, 
                                   CamelException *ex);
        
+       gboolean (*has_uid_capability) (CamelFolder *folder);
+
        const gchar * (*get_message_uid)  (CamelFolder *folder, 
                                           CamelMimeMessage *message, 
                                           CamelException *ex);
@@ -239,7 +243,7 @@ GList *camel_folder_list_subfolders (CamelFolder *folder, CamelException *ex);
 /* delete operations */
 gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelException *ex);
 gboolean camel_folder_delete_messages (CamelFolder *folder, CamelException *ex);
-GList *camel_folder_expunge (CamelFolder *folder, gboolean want_list, CamelException *ex);
+void camel_folder_expunge (CamelFolder *folder, CamelException *ex);
 
 
 /* folder name manipulation operations */
@@ -272,6 +276,7 @@ CamelFolderSummary *camel_folder_get_summary (CamelFolder *folder, CamelExceptio
 
 
 /* number based access operations */
+gboolean camel_folder_has_message_number_capability (CamelFolder *folder, CamelException *ex);
 CamelMimeMessage *camel_folder_get_message_by_number (CamelFolder *folder, 
                                                      gint number, CamelException *ex);
 gint camel_folder_get_message_count (CamelFolder *folder, CamelException *ex);