[evolution] Add documentation to clarify mail-folder-cache functionality
- From: Jonathon Jongsma <jjongsma src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [evolution] Add documentation to clarify mail-folder-cache functionality
- Date: Tue, 15 Dec 2009 20:25:00 +0000 (UTC)
commit 9c4f98e915d3f2848b9acc5e089bf3fc56ae2b0f
Author: Jonathon Jongsma <jonathon quotidian org>
Date: Thu Dec 10 17:06:30 2009 -0600
Add documentation to clarify mail-folder-cache functionality
Added a bunch of gtk-doc documentation as well as a variety of small comments in
the code. Also added documentation and renamed a couple of mail_vfolder_*
functions that are only used by mail-folder-cache to make things a lot more
understandable.
https://bugzilla.gnome.org/show_bug.cgi?id=604627
mail/mail-folder-cache.c | 42 +++++++++++++++++++++++-----
mail/mail-folder-cache.h | 37 +++++++++++-------------
mail/mail-vfolder.c | 68 +++++++++++++++++++++++++++++++++++++++++++--
mail/mail-vfolder.h | 4 +-
4 files changed, 119 insertions(+), 32 deletions(-)
---
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index 2bba248..39ef7d2 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -36,6 +36,7 @@
#include <time.h>
#include <glib.h>
+#include <glib-object.h>
#include <glib/gstdio.h>
#include <glib/gi18n.h>
@@ -47,7 +48,6 @@
#include <camel/camel-disco-store.h>
#include <libedataserver/e-data-server-util.h>
-#include "e-util/e-util.h"
#include "shell/e-shell.h"
#include "mail-mt.h"
@@ -66,7 +66,6 @@
#include "em-utils.h"
#include "e-mail-local.h"
-#include "e-mail-store.h"
#define w(x)
#define d(x)
@@ -80,12 +79,15 @@ G_DEFINE_TYPE (MailFolderCache, mail_folder_cache, G_TYPE_OBJECT)
struct _MailFolderCachePrivate
{
+ /* source id for the ping timeout callback */
guint ping_id;
/* Store to storeinfo table, active stores */
GHashTable *stores;
+ /* mutex to protect access to the stores hash */
GMutex *stores_mutex;
/* List of folder changes to be executed in gui thread */
GQueue updates;
+ /* event id for the async event of flushing all pending updates */
gint update_id;
/* hack for people who LIKE to have unsent count */
gint count_sent;
@@ -173,13 +175,14 @@ real_flush_updates (gpointer o, gpointer event_data, gpointer data)
g_mutex_unlock (self->priv->stores_mutex);
if (up->remove) {
+ /* XXX: what's going on here? */
if (up->delete) {
mail_vfolder_delete_uri(up->store, up->uri);
mail_filter_delete_uri(up->store, up->uri);
mail_config_uri_deleted(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(up->store))->compare_folder_name, up->uri);
} else
- mail_vfolder_add_uri(up->store, up->uri, TRUE);
+ mail_vfolder_notify_uri_unavailable (up->store, up->uri);
} else {
/* We can tell the vfolder code though */
if (up->olduri && up->add) {
@@ -191,7 +194,7 @@ real_flush_updates (gpointer o, gpointer event_data, gpointer data)
}
if (!up->olduri && up->add)
- mail_vfolder_add_uri(up->store, up->uri, FALSE);
+ mail_vfolder_notify_uri_available (up->store, up->uri);
}
/* update unread counts */
@@ -533,6 +536,13 @@ folder_renamed(CamelObject *o, gpointer event_data, gpointer user_data)
/* Dont do anything, do it from the store rename event? */
}
+/**
+ * mail_folder_cache_note_folder:
+ *
+ * When a folder has been opened, notify it for watching. The folder must have
+ * already been created on the store (which has already been noted) before the
+ * folder can be opened
+ */
void mail_folder_cache_note_folder(MailFolderCache *self, CamelFolder *folder)
{
CamelStore *store = folder->parent_store;
@@ -815,6 +825,11 @@ free_folder_info_hash(gchar *path, struct _folder_info *mfi, gpointer data)
free_folder_info(mfi);
}
+/**
+ * mail_folder_cache_note_store_remove:
+ *
+ * Notify the cache that the specified @store can be removed from the cache
+ */
void
mail_folder_cache_note_store_remove(MailFolderCache *self, CamelStore *store)
{
@@ -987,9 +1002,16 @@ store_online_cb (CamelStore *store, gpointer data)
g_mutex_unlock (ud->cache->priv->stores_mutex);
}
+/**
+ * mail_folder_cache_note_store:
+ *
+ * Add a store whose folders should appear in the shell The folders are scanned
+ * from the store, and/or added at runtime via the folder_created event. The
+ * @done function returns if we can free folder info.
+ */
void
mail_folder_cache_note_store(MailFolderCache *self, CamelStore *store, CamelOperation *op,
- NoteDoneFunc done, gpointer data)
+ NoteDoneFunc done, gpointer data)
{
struct _store_info *si;
struct _update_data *ud;
@@ -1078,8 +1100,14 @@ static void storeinfo_find_folder_info(CamelStore *store, struct _store_info *si
}
}
-/* returns TRUE if the uri is available, folderp is set to a
- reffed folder if the folder has also already been opened */
+/**
+ * mail_folder_cache_get_folder_from_uri:
+ *
+ * Gets the #CamelFolder for the supplied @uri.
+ *
+ * Return value: TRUE if the uri is available, folderp is set to a reffed folder if
+ * the folder has also already been opened
+ */
gboolean
mail_folder_cache_get_folder_from_uri(MailFolderCache *self, const gchar *uri, CamelFolder **folderp)
{
diff --git a/mail/mail-folder-cache.h b/mail/mail-folder-cache.h
index 762152f..8a7b82e 100644
--- a/mail/mail-folder-cache.h
+++ b/mail/mail-folder-cache.h
@@ -23,8 +23,6 @@
*
*/
-/* mail-folder-cache.h: Stores information about open folders */
-
#ifndef _MAIL_FOLDER_CACHE_H
#define _MAIL_FOLDER_CACHE_H
@@ -33,7 +31,10 @@
G_BEGIN_DECLS
-/* Stores information about open folders */
+/**
+ * SECTION: mail-folder-cache
+ * @short_description: Stores information about open folders
+ **/
#define MAIL_TYPE_FOLDER_CACHE mail_folder_cache_get_type()
#define MAIL_FOLDER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAIL_TYPE_FOLDER_CACHE, MailFolderCache))
@@ -46,6 +47,12 @@ typedef struct _MailFolderCache MailFolderCache;
typedef struct _MailFolderCacheClass MailFolderCacheClass;
typedef struct _MailFolderCachePrivate MailFolderCachePrivate;
+/**
+ * MailFolderCache:
+ *
+ * Contains only private data that should be read and manipulated using the
+ * functions below.
+ */
struct _MailFolderCache
{
GObject parent;
@@ -64,26 +71,16 @@ MailFolderCache *mail_folder_cache_new (void);
MailFolderCache *mail_folder_cache_get_default (void);
+/**
+ * NoteDoneFunc:
+ *
+ * The signature of a function to be registered as a callback for
+ * mail_folder_cache_note_store()
+ */
typedef gboolean (*NoteDoneFunc)(CamelStore *store, CamelFolderInfo *info, gpointer data);
-/* Add a store whose folders should appear in the shell
- The folders are scanned from the store, and/or added at
- runtime via the folder_created event.
- The 'done' function returns if we can free folder info. */
-void mail_folder_cache_note_store (MailFolderCache *self,
- CamelStore *store, CamelOperation *op,
- NoteDoneFunc func, gpointer data);
-
-/* de-note a store */
+void mail_folder_cache_note_store (MailFolderCache *self, CamelStore *store, CamelOperation *op, NoteDoneFunc done, gpointer data);
void mail_folder_cache_note_store_remove (MailFolderCache *self, CamelStore *store);
-
-/* When a folder has been opened, notify it for watching.
- The folder must have already been created on the store (which has already been noted)
- before the folder can be opened
- */
void mail_folder_cache_note_folder (MailFolderCache *self, CamelFolder *folder);
-
-/* Returns true if a folder is available (yet), and also sets *folderp (if supplied)
- to a (referenced) copy of the folder if it has already been opened */
gboolean mail_folder_cache_get_folder_from_uri (MailFolderCache *self, const gchar *uri, CamelFolder **folderp);
gboolean mail_folder_cache_get_folder_info_flags (MailFolderCache *self, CamelFolder *folder, gint *flags);
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index f58886b..9380922 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -425,8 +425,24 @@ uri_is_spethal(CamelStore *store, const gchar *uri)
return res;
}
-/* called when a new uri becomes (un)available */
-void
+/**
+ * mail_vfolder_add_uri:
+ *
+ * @store: a #CamelStore containing the uri
+ * @curi: an email uri to be added/removed
+ * @remove: Whether the uri should be removed or added
+ *
+ * Called when a new uri becomes (un)available. If @store is not a
+ * CamelVeeStore, the uri is added/removed from the list of cached source
+ * folders. Then each vfolder rule is checked to see if the specified uri
+ * matches a source of the rule. It builds a list of vfolders that use (or
+ * would use) the specified uri as a source. It then adds (or removes) this uri
+ * to (from) those vfolders via camel_vee_folder_add/remove_folder() but does
+ * not modify the actual filters or write changes to disk.
+ *
+ * NOTE: This function must be called from the main thread.
+ */
+static void
mail_vfolder_add_uri(CamelStore *store, const gchar *curi, gint remove)
{
EFilterRule *rule;
@@ -525,7 +541,53 @@ done:
g_free(uri);
}
-/* called when a uri is deleted from a store */
+/**
+ * mail_vfolder_uri_available:
+ * @store: a #CamelStore containing the uri
+ * @uri: uri of a folder that became available
+ *
+ * Adds @uri to the list of folders searched if any vfolder source matches the
+ * uri. This function has a transient effect and does not permanently modify
+ * the vfolder filter rules on disk.
+ */
+void
+mail_vfolder_notify_uri_available (CamelStore *store, const gchar *uri)
+{
+ mail_vfolder_add_uri (store, uri, FALSE);
+}
+
+/**
+ * mail_vfolder_uri_available:
+ * @store: a #CamelStore containing the uri
+ * @uri: uri of a folder that became unavailable
+ *
+ * Removes @uri from the list of folders searched if any vfolder source matches the
+ * uri. This function has a transient effect and does not permanently modify
+ * the vfolder filter rules on disk.
+ */
+void
+mail_vfolder_notify_uri_unavailable (CamelStore *store, const gchar *uri)
+{
+ mail_vfolder_add_uri (store, uri, TRUE);
+}
+
+/**
+ * mail_vfolder_delete_uri:
+ *
+ * @store: a #CamelStore containing the uri
+ * @curi: an email uri that has been deleted
+ *
+ * Looks through all vfolder rules to see if @curi is listed as a source for any
+ * vfolder rules. If the uri is found in the source for any rule, it is removed
+ * and the user is alerted to the fact that the vfolder rules have been updated.
+ * The new vfolder rules are written to disk.
+ *
+ * XXX: It doesn't appear that the changes to the vfolder rules are sent down to
+ * the camel level, however. So the actual vfolders will not change behavior
+ * until evolution is restarted (?)
+ *
+ * NOTE: This function must be called from the main thread.
+ */
void
mail_vfolder_delete_uri(CamelStore *store, const gchar *curi)
{
diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h
index 725f7ec..8e44ec4 100644
--- a/mail/mail-vfolder.h
+++ b/mail/mail-vfolder.h
@@ -44,8 +44,8 @@ void vfolder_gui_add_from_address (CamelInternetAddress *addr, gint flags, const
GList * mail_vfolder_get_sources_local (void);
GList * mail_vfolder_get_sources_remote (void);
-/* add a uri that is now (un)available to vfolders in a transient manner */
-void mail_vfolder_add_uri(CamelStore *store, const gchar *uri, gint remove);
+void mail_vfolder_notify_uri_available(CamelStore *store, const gchar *uri);
+void mail_vfolder_notify_uri_unavailable(CamelStore *store, const gchar *uri);
/* note that a folder has changed name (uri) */
void mail_vfolder_rename_uri(CamelStore *store, const gchar *from, const gchar *to);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]