MailFolderCache: Emit folder names instead of URIs in signals.
This commit is contained in:
committed by
Rodrigo Moya
parent
4129a7c9c5
commit
3b05e9099c
@ -330,20 +330,21 @@ mail_backend_quit_requested_cb (EShell *shell,
|
||||
static void
|
||||
mail_backend_folder_deleted_cb (MailFolderCache *folder_cache,
|
||||
CamelStore *store,
|
||||
const gchar *uri,
|
||||
const gchar *folder_name,
|
||||
EMailBackend *backend)
|
||||
{
|
||||
mail_filter_delete_uri (backend, store, uri);
|
||||
mail_filter_delete_folder (backend, store, folder_name);
|
||||
}
|
||||
|
||||
static void
|
||||
mail_backend_folder_renamed_cb (MailFolderCache *folder_cache,
|
||||
CamelStore *store,
|
||||
const gchar *old_uri,
|
||||
const gchar *new_uri,
|
||||
const gchar *old_folder_name,
|
||||
const gchar *new_folder_name,
|
||||
EMailBackend *backend)
|
||||
{
|
||||
mail_filter_rename_uri (backend, store, old_uri, new_uri);
|
||||
mail_filter_rename_folder (
|
||||
backend, store, old_folder_name, new_folder_name);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -404,20 +404,26 @@ filter_gui_add_from_message (EMailSession *session,
|
||||
}
|
||||
|
||||
void
|
||||
mail_filter_rename_uri (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *olduri,
|
||||
const gchar *newuri)
|
||||
mail_filter_rename_folder (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *old_folder_name,
|
||||
const gchar *new_folder_name)
|
||||
{
|
||||
EMFilterContext *fc;
|
||||
EMailSession *session;
|
||||
const gchar *config_dir;
|
||||
gchar *user, *system;
|
||||
GList *changed;
|
||||
gchar *eolduri, *enewuri;
|
||||
gchar *old_uri;
|
||||
gchar *new_uri;
|
||||
|
||||
eolduri = em_uri_from_camel (olduri);
|
||||
enewuri = em_uri_from_camel (newuri);
|
||||
g_return_if_fail (E_IS_MAIL_BACKEND (backend));
|
||||
g_return_if_fail (CAMEL_IS_STORE (store));
|
||||
g_return_if_fail (old_folder_name != NULL);
|
||||
g_return_if_fail (new_folder_name != NULL);
|
||||
|
||||
old_uri = e_mail_folder_uri_build (store, old_folder_name);
|
||||
new_uri = e_mail_folder_uri_build (store, new_folder_name);
|
||||
|
||||
session = e_mail_backend_get_session (backend);
|
||||
|
||||
@ -429,7 +435,7 @@ mail_filter_rename_uri (EMailBackend *backend,
|
||||
g_free (system);
|
||||
|
||||
changed = e_rule_context_rename_uri (
|
||||
(ERuleContext *)fc, eolduri, enewuri, g_str_equal);
|
||||
(ERuleContext *)fc, old_uri, new_uri, g_str_equal);
|
||||
if (changed) {
|
||||
if (e_rule_context_save ((ERuleContext *)fc, user) == -1)
|
||||
g_warning("Could not write out changed filter rules\n");
|
||||
@ -439,23 +445,27 @@ mail_filter_rename_uri (EMailBackend *backend,
|
||||
g_free (user);
|
||||
g_object_unref (fc);
|
||||
|
||||
g_free (enewuri);
|
||||
g_free (eolduri);
|
||||
g_free (old_uri);
|
||||
g_free (new_uri);
|
||||
}
|
||||
|
||||
void
|
||||
mail_filter_delete_uri (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *uri)
|
||||
mail_filter_delete_folder (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *folder_name)
|
||||
{
|
||||
EMFilterContext *fc;
|
||||
EMailSession *session;
|
||||
const gchar *config_dir;
|
||||
gchar *user, *system;
|
||||
GList *deleted;
|
||||
gchar *euri;
|
||||
gchar *uri;
|
||||
|
||||
euri = em_uri_from_camel (uri);
|
||||
g_return_if_fail (E_IS_MAIL_BACKEND (backend));
|
||||
g_return_if_fail (CAMEL_IS_STORE (store));
|
||||
g_return_if_fail (folder_name != NULL);
|
||||
|
||||
uri = e_mail_folder_uri_build (store, folder_name);
|
||||
|
||||
session = e_mail_backend_get_session (backend);
|
||||
|
||||
@ -466,7 +476,8 @@ mail_filter_delete_uri (EMailBackend *backend,
|
||||
e_rule_context_load ((ERuleContext *)fc, system, user);
|
||||
g_free (system);
|
||||
|
||||
deleted = e_rule_context_delete_uri ((ERuleContext *) fc, euri, g_str_equal);
|
||||
deleted = e_rule_context_delete_uri (
|
||||
(ERuleContext *) fc, uri, g_str_equal);
|
||||
if (deleted) {
|
||||
GString *s;
|
||||
guint s_count;
|
||||
@ -500,13 +511,12 @@ mail_filter_delete_uri (EMailBackend *backend,
|
||||
"for the deleted folder\n\"%s\".",
|
||||
"The following filter rules\n%s have been modified "
|
||||
"to account for the deleted folder\n\"%s\".",
|
||||
s_count), s->str, euri);
|
||||
s_count), s->str, folder_name);
|
||||
e_mail_backend_submit_alert (
|
||||
backend, "mail:filter-updated", info, NULL);
|
||||
g_string_free (s, TRUE);
|
||||
g_free (info);
|
||||
|
||||
d(printf("Folder delete/rename '%s' changed filters, resaving\n", euri));
|
||||
if (e_rule_context_save ((ERuleContext *) fc, user) == -1)
|
||||
g_warning ("Could not write out changed filter rules\n");
|
||||
e_rule_context_free_uri_list ((ERuleContext *) fc, deleted);
|
||||
@ -514,5 +524,5 @@ mail_filter_delete_uri (EMailBackend *backend,
|
||||
|
||||
g_free (user);
|
||||
g_object_unref (fc);
|
||||
g_free (euri);
|
||||
g_free (uri);
|
||||
}
|
||||
|
||||
@ -58,12 +58,12 @@ void filter_gui_add_from_message (EMailSession *session,
|
||||
|
||||
/* Also easiest place for these, we should really
|
||||
* share a global rule context for this stuff ... */
|
||||
void mail_filter_rename_uri (EMailBackend *backend,
|
||||
void mail_filter_rename_folder (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *olduri,
|
||||
const gchar *newuri);
|
||||
void mail_filter_delete_uri (EMailBackend *backend,
|
||||
const gchar *old_folder_name,
|
||||
const gchar *new_folder_name);
|
||||
void mail_filter_delete_folder (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *uri);
|
||||
const gchar *folder_name);
|
||||
|
||||
#endif /* MAIL_AUTOFILTER_H */
|
||||
|
||||
@ -290,7 +290,7 @@ mail_config_get_lookup_book_local_only (void)
|
||||
static void
|
||||
folder_deleted_cb (MailFolderCache *cache,
|
||||
CamelStore *store,
|
||||
const gchar *uri,
|
||||
const gchar *folder_name,
|
||||
gpointer user_data)
|
||||
{
|
||||
CamelStoreClass *class;
|
||||
@ -299,6 +299,7 @@ folder_deleted_cb (MailFolderCache *cache,
|
||||
const gchar *local_drafts_folder_uri;
|
||||
const gchar *local_sent_folder_uri;
|
||||
gboolean write_config = FALSE;
|
||||
gchar *uri;
|
||||
|
||||
class = CAMEL_STORE_GET_CLASS (store);
|
||||
|
||||
@ -308,6 +309,8 @@ folder_deleted_cb (MailFolderCache *cache,
|
||||
local_sent_folder_uri =
|
||||
e_mail_local_get_folder_uri (E_MAIL_LOCAL_FOLDER_SENT);
|
||||
|
||||
uri = e_mail_folder_uri_build (store, folder_name);
|
||||
|
||||
account_list = e_get_account_list ();
|
||||
iterator = e_list_get_iterator (E_LIST (account_list));
|
||||
|
||||
@ -337,6 +340,7 @@ folder_deleted_cb (MailFolderCache *cache,
|
||||
}
|
||||
|
||||
g_object_unref (iterator);
|
||||
g_free (uri);
|
||||
|
||||
/* nasty again */
|
||||
if (write_config)
|
||||
@ -346,8 +350,8 @@ folder_deleted_cb (MailFolderCache *cache,
|
||||
static void
|
||||
folder_renamed_cb (MailFolderCache *cache,
|
||||
CamelStore *store,
|
||||
const gchar *old_uri,
|
||||
const gchar *new_uri,
|
||||
const gchar *old_folder_name,
|
||||
const gchar *new_folder_name,
|
||||
gpointer user_data)
|
||||
{
|
||||
CamelStoreClass *class;
|
||||
@ -355,8 +359,8 @@ folder_renamed_cb (MailFolderCache *cache,
|
||||
EAccount *account;
|
||||
EIterator *iterator;
|
||||
gboolean write_config = FALSE;
|
||||
gchar *oldname;
|
||||
gchar *newname;
|
||||
gchar *old_uri;
|
||||
gchar *new_uri;
|
||||
gint i;
|
||||
|
||||
const gchar *cachenames[] = {
|
||||
@ -369,6 +373,9 @@ folder_renamed_cb (MailFolderCache *cache,
|
||||
|
||||
class = CAMEL_STORE_GET_CLASS (store);
|
||||
|
||||
old_uri = e_mail_folder_uri_build (store, old_folder_name);
|
||||
new_uri = e_mail_folder_uri_build (store, new_folder_name);
|
||||
|
||||
account_list = e_get_account_list ();
|
||||
iterator = e_list_get_iterator (E_LIST (account_list));
|
||||
|
||||
@ -398,6 +405,9 @@ folder_renamed_cb (MailFolderCache *cache,
|
||||
* not, doesn't matter */
|
||||
|
||||
for (i = 0; cachenames[i]; i++) {
|
||||
gchar *oldname;
|
||||
gchar *newname;
|
||||
|
||||
oldname = uri_to_evname (old_uri, cachenames[i]);
|
||||
newname = uri_to_evname (new_uri, cachenames[i]);
|
||||
g_rename (oldname, newname);
|
||||
@ -405,6 +415,9 @@ folder_renamed_cb (MailFolderCache *cache,
|
||||
g_free (newname);
|
||||
}
|
||||
|
||||
g_free (old_uri);
|
||||
g_free (new_uri);
|
||||
|
||||
/* nasty ... */
|
||||
if (write_config)
|
||||
mail_config_write ();
|
||||
|
||||
@ -158,16 +158,16 @@ flush_updates_idle_cb (MailFolderCache *self)
|
||||
|
||||
if (up->remove) {
|
||||
if (up->delete) {
|
||||
g_signal_emit (self, signals[FOLDER_DELETED], 0, up->store, up->uri);
|
||||
g_signal_emit (self, signals[FOLDER_DELETED], 0, up->store, up->full_name);
|
||||
} else
|
||||
g_signal_emit (self, signals[FOLDER_UNAVAILABLE], 0, up->store, up->uri);
|
||||
g_signal_emit (self, signals[FOLDER_UNAVAILABLE], 0, up->store, up->full_name);
|
||||
} else {
|
||||
if (up->olduri && up->add) {
|
||||
g_signal_emit (self, signals[FOLDER_RENAMED], 0, up->store, up->olduri, up->uri);
|
||||
if (up->oldfull && up->add) {
|
||||
g_signal_emit (self, signals[FOLDER_RENAMED], 0, up->store, up->oldfull, up->full_name);
|
||||
}
|
||||
|
||||
if (!up->olduri && up->add)
|
||||
g_signal_emit (self, signals[FOLDER_AVAILABLE], 0, up->store, up->uri);
|
||||
if (!up->oldfull && up->add)
|
||||
g_signal_emit (self, signals[FOLDER_AVAILABLE], 0, up->store, up->full_name);
|
||||
}
|
||||
|
||||
/* update unread counts */
|
||||
@ -884,7 +884,6 @@ struct _find_info {
|
||||
struct _folder_info *fi;
|
||||
};
|
||||
|
||||
/* look up on each storeinfo using proper hash function for that stores uri's */
|
||||
static void
|
||||
storeinfo_find_folder_info (CamelStore *store,
|
||||
struct _store_info *si,
|
||||
@ -941,73 +940,78 @@ mail_folder_cache_class_init (MailFolderCacheClass *class)
|
||||
/**
|
||||
* MailFolderCache::folder-available
|
||||
* @store: the #CamelStore containing the folder
|
||||
* @uri: the uri of the folder
|
||||
* @folder_name: the name of the folder
|
||||
*
|
||||
* Emitted when a folder becomes available
|
||||
**/
|
||||
signals[FOLDER_AVAILABLE] =
|
||||
g_signal_new ("folder-available",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING,
|
||||
G_TYPE_NONE, 2,
|
||||
CAMEL_TYPE_OBJECT, G_TYPE_STRING);
|
||||
signals[FOLDER_AVAILABLE] = g_signal_new (
|
||||
"folder-available",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING,
|
||||
G_TYPE_NONE, 2,
|
||||
CAMEL_TYPE_STORE,
|
||||
G_TYPE_STRING);
|
||||
|
||||
/**
|
||||
* MailFolderCache::folder-unavailable
|
||||
* @store: the #CamelStore containing the folder
|
||||
* @uri: the uri of the folder
|
||||
* @folder_name: the name of the folder
|
||||
*
|
||||
* Emitted when a folder becomes unavailable. This represents a
|
||||
* transient condition. See MailFolderCache::folder-deleted to be
|
||||
* notified when a folder is permanently removed.
|
||||
**/
|
||||
signals[FOLDER_UNAVAILABLE] =
|
||||
g_signal_new ("folder-unavailable",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING,
|
||||
G_TYPE_NONE, 2,
|
||||
CAMEL_TYPE_OBJECT, G_TYPE_STRING);
|
||||
signals[FOLDER_UNAVAILABLE] = g_signal_new (
|
||||
"folder-unavailable",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING,
|
||||
G_TYPE_NONE, 2,
|
||||
CAMEL_TYPE_STORE,
|
||||
G_TYPE_STRING);
|
||||
|
||||
/**
|
||||
* MailFolderCache::folder-deleted
|
||||
* @store: the #CamelStore containing the folder
|
||||
* @uri: the uri of the folder
|
||||
* @folder_name: the name of the folder
|
||||
*
|
||||
* Emitted when a folder is deleted
|
||||
**/
|
||||
signals[FOLDER_DELETED] =
|
||||
g_signal_new ("folder-deleted",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING,
|
||||
G_TYPE_NONE, 2,
|
||||
CAMEL_TYPE_OBJECT, G_TYPE_STRING);
|
||||
signals[FOLDER_DELETED] = g_signal_new (
|
||||
"folder-deleted",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING,
|
||||
G_TYPE_NONE, 2,
|
||||
CAMEL_TYPE_STORE,
|
||||
G_TYPE_STRING);
|
||||
|
||||
/**
|
||||
* MailFolderCache::folder-renamed
|
||||
* @store: the #CamelStore containing the folder
|
||||
* @old_uri: the old uri of the folder
|
||||
* @new_uri: the new uri of the folder
|
||||
* @old_folder_name: the old name of the folder
|
||||
* @new_folder_name: the new name of the folder
|
||||
*
|
||||
* Emitted when a folder is renamed
|
||||
**/
|
||||
signals[FOLDER_RENAMED] =
|
||||
g_signal_new ("folder-renamed",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING_STRING,
|
||||
G_TYPE_NONE, 3,
|
||||
CAMEL_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING);
|
||||
signals[FOLDER_RENAMED] = g_signal_new (
|
||||
"folder-renamed",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, /* struct offset */
|
||||
NULL, NULL, /* accumulator */
|
||||
e_marshal_VOID__OBJECT_STRING_STRING,
|
||||
G_TYPE_NONE, 3,
|
||||
CAMEL_TYPE_STORE,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_STRING);
|
||||
|
||||
/**
|
||||
* MailFolderCache::folder-unread-updated
|
||||
|
||||
@ -376,7 +376,7 @@ uri_is_ignore (EMailSession *session, const gchar *uri)
|
||||
/* XXX EIterator misuses const. */
|
||||
account = (EAccount *) e_iterator_get (iter);
|
||||
|
||||
if (account->sent_folder_uri != NULL)
|
||||
if (!found && account->sent_folder_uri != NULL)
|
||||
found = e_mail_folder_uri_equal (
|
||||
camel_session, uri,
|
||||
account->sent_folder_uri);
|
||||
@ -386,9 +386,6 @@ uri_is_ignore (EMailSession *session, const gchar *uri)
|
||||
camel_session, uri,
|
||||
account->drafts_folder_uri);
|
||||
|
||||
if (found)
|
||||
break;
|
||||
|
||||
e_iterator_next (iter);
|
||||
}
|
||||
|
||||
@ -399,61 +396,46 @@ uri_is_ignore (EMailSession *session, const gchar *uri)
|
||||
|
||||
/* so special we never use it */
|
||||
static gint
|
||||
uri_is_spethal (CamelStore *store, const gchar *uri)
|
||||
folder_is_spethal (CamelStore *store,
|
||||
const gchar *folder_name)
|
||||
{
|
||||
CamelURL *url;
|
||||
gint res;
|
||||
/* This is a bit of a hack, but really the only way it can be done
|
||||
* at the moment. */
|
||||
|
||||
/* This is a bit of a hack, but really the only way it can be done at the moment. */
|
||||
if (store->flags & CAMEL_STORE_VTRASH)
|
||||
if (g_strcmp0 (folder_name, CAMEL_VTRASH_NAME) == 0)
|
||||
return TRUE;
|
||||
|
||||
if ((store->flags & (CAMEL_STORE_VTRASH|CAMEL_STORE_VJUNK)) == 0)
|
||||
return FALSE;
|
||||
if (store->flags & CAMEL_STORE_VJUNK)
|
||||
if (g_strcmp0 (folder_name, CAMEL_VJUNK_NAME) == 0)
|
||||
return TRUE;
|
||||
|
||||
url = camel_url_new (uri, NULL);
|
||||
if (url == NULL)
|
||||
return TRUE;
|
||||
|
||||
/* don't use strcasecmp here */
|
||||
if (url->fragment) {
|
||||
res = (((store->flags & CAMEL_STORE_VTRASH)
|
||||
&& strcmp (url->fragment, CAMEL_VTRASH_NAME) == 0)
|
||||
|| ((store->flags & CAMEL_STORE_VJUNK)
|
||||
&& strcmp (url->fragment, CAMEL_VJUNK_NAME) == 0));
|
||||
} else {
|
||||
res = url->path
|
||||
&& (((store->flags & CAMEL_STORE_VTRASH)
|
||||
&& strcmp(url->path, "/" CAMEL_VTRASH_NAME) == 0)
|
||||
|| ((store->flags & CAMEL_STORE_VJUNK)
|
||||
&& strcmp(url->path, "/" CAMEL_VJUNK_NAME) == 0));
|
||||
}
|
||||
|
||||
camel_url_free (url);
|
||||
|
||||
return res;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* mail_vfolder_add_uri:
|
||||
* mail_vfolder_add_folder:
|
||||
* @session: an #EMailSession
|
||||
* @store: a #CamelStore containing the uri
|
||||
* @curi: an email uri to be added/removed
|
||||
* @remove: Whether the uri should be removed or added
|
||||
* @store: a #CamelStore
|
||||
* @folder: a folder name
|
||||
* @remove: whether the folder 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
|
||||
* Called when a new folder becomes (un)available. If @store is not a
|
||||
* CamelVeeStore, the folder is added/removed from the list of cached source
|
||||
* folders. Then each vfolder rule is checked to see if the specified folder
|
||||
* 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.
|
||||
* would use) the specified folder as a source. It then adds (or removes)
|
||||
* this folder 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 (EMailSession *session,
|
||||
CamelStore *store,
|
||||
const gchar *curi,
|
||||
gint remove)
|
||||
mail_vfolder_add_folder (EMailSession *session,
|
||||
CamelStore *store,
|
||||
const gchar *folder_name,
|
||||
gint remove)
|
||||
{
|
||||
EFilterRule *rule;
|
||||
const gchar *source;
|
||||
@ -467,31 +449,28 @@ mail_vfolder_add_uri (EMailSession *session,
|
||||
provider = camel_service_get_provider (CAMEL_SERVICE (store));
|
||||
remote = (provider->flags & CAMEL_PROVIDER_IS_REMOTE) != 0;
|
||||
|
||||
uri = em_uri_from_camel (curi);
|
||||
if (uri_is_spethal (store, curi)) {
|
||||
g_free (uri);
|
||||
if (folder_is_spethal (store, folder_name))
|
||||
return;
|
||||
}
|
||||
|
||||
g_return_if_fail (mail_in_main_thread ());
|
||||
|
||||
is_ignore = uri_is_ignore (session, curi);
|
||||
uri = e_mail_folder_uri_build (store, folder_name);
|
||||
|
||||
is_ignore = uri_is_ignore (session, uri);
|
||||
|
||||
G_LOCK (vfolder);
|
||||
|
||||
/* d(printf("%s uri to check: %s\n", remove?"Removing":"Adding", uri)); */
|
||||
|
||||
/* maintain the source folders lists for changed rules later on */
|
||||
if (CAMEL_IS_VEE_STORE (store)) {
|
||||
is_ignore = TRUE;
|
||||
} else if (remove) {
|
||||
if (remote) {
|
||||
if ((link = mv_find_folder (source_folders_remote, session, curi)) != NULL) {
|
||||
if ((link = mv_find_folder (source_folders_remote, session, uri)) != NULL) {
|
||||
g_free (link->data);
|
||||
source_folders_remote = g_list_remove_link (source_folders_remote, link);
|
||||
}
|
||||
} else {
|
||||
if ((link = mv_find_folder (source_folders_local, session, curi)) != NULL) {
|
||||
if ((link = mv_find_folder (source_folders_local, session, uri)) != NULL) {
|
||||
g_free (link->data);
|
||||
source_folders_local = g_list_remove_link (source_folders_local, link);
|
||||
}
|
||||
@ -499,11 +478,11 @@ mail_vfolder_add_uri (EMailSession *session,
|
||||
} else if (!is_ignore) {
|
||||
/* we ignore drafts/sent/outbox here */
|
||||
if (remote) {
|
||||
if (mv_find_folder (source_folders_remote, session, curi) == NULL)
|
||||
source_folders_remote = g_list_prepend (source_folders_remote, g_strdup (curi));
|
||||
if (mv_find_folder (source_folders_remote, session, uri) == NULL)
|
||||
source_folders_remote = g_list_prepend (source_folders_remote, g_strdup (uri));
|
||||
} else {
|
||||
if (mv_find_folder (source_folders_local, session, curi) == NULL)
|
||||
source_folders_local = g_list_prepend (source_folders_local, g_strdup (curi));
|
||||
if (mv_find_folder (source_folders_local, session, uri) == NULL)
|
||||
source_folders_local = g_list_prepend (source_folders_local, g_strdup (uri));
|
||||
}
|
||||
}
|
||||
|
||||
@ -530,11 +509,8 @@ mail_vfolder_add_uri (EMailSession *session,
|
||||
source = NULL;
|
||||
while (!found && (source = em_vfolder_rule_next_source (
|
||||
(EMVFolderRule *)rule, source))) {
|
||||
gchar *csource;
|
||||
csource = em_uri_to_camel (source);
|
||||
found = e_mail_folder_uri_equal (
|
||||
CAMEL_SESSION (session), curi, csource);
|
||||
g_free (csource);
|
||||
CAMEL_SESSION (session), uri, source);
|
||||
}
|
||||
|
||||
if (found) {
|
||||
@ -552,68 +528,33 @@ done:
|
||||
G_UNLOCK (vfolder);
|
||||
|
||||
if (folders != NULL)
|
||||
vfolder_adduri (session, curi, folders, remove);
|
||||
vfolder_adduri (session, uri, folders, remove);
|
||||
|
||||
g_free (uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* mail_vfolder_uri_available:
|
||||
* @session: an #EMailSession
|
||||
* @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.
|
||||
*/
|
||||
static void
|
||||
mail_vfolder_notify_uri_available (EMailSession *session,
|
||||
CamelStore *store,
|
||||
const gchar *uri)
|
||||
{
|
||||
mail_vfolder_add_uri (session, store, uri, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* mail_vfolder_uri_available:
|
||||
* @session: an #EMailSession
|
||||
* @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.
|
||||
*/
|
||||
static void
|
||||
mail_vfolder_notify_uri_unavailable (EMailSession *session,
|
||||
CamelStore *store,
|
||||
const gchar *uri)
|
||||
{
|
||||
mail_vfolder_add_uri (session, store, uri, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* mail_vfolder_delete_uri:
|
||||
* mail_vfolder_delete_folder:
|
||||
* @backend: an #EMailBackend
|
||||
* @store: a #CamelStore containing the uri
|
||||
* @curi: an email uri that has been deleted
|
||||
* @store: a #CamelStore
|
||||
* @folder_name: a folder name
|
||||
*
|
||||
* 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.
|
||||
* Looks through all vfolder rules to see if @folder_name is listed as a
|
||||
* source for any vfolder rules. If the folder 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 (?)
|
||||
* 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.
|
||||
*/
|
||||
static void
|
||||
mail_vfolder_delete_uri (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *curi)
|
||||
mail_vfolder_delete_folder (EMailBackend *backend,
|
||||
CamelStore *store,
|
||||
const gchar *folder_name)
|
||||
{
|
||||
EFilterRule *rule;
|
||||
EMailSession *session;
|
||||
@ -626,18 +567,17 @@ mail_vfolder_delete_uri (EMailBackend *backend,
|
||||
|
||||
g_return_if_fail (E_IS_MAIL_BACKEND (backend));
|
||||
g_return_if_fail (CAMEL_IS_STORE (store));
|
||||
g_return_if_fail (curi != NULL);
|
||||
g_return_if_fail (folder_name != NULL);
|
||||
|
||||
if (uri_is_spethal (store, curi))
|
||||
if (folder_is_spethal (store, folder_name))
|
||||
return;
|
||||
|
||||
uri = em_uri_from_camel (curi);
|
||||
|
||||
d(printf ("Deleting uri to check: %s\n", uri));
|
||||
|
||||
g_return_if_fail (mail_in_main_thread ());
|
||||
|
||||
session = e_mail_backend_get_session (backend);
|
||||
uri = e_mail_folder_uri_build (store, folder_name);
|
||||
|
||||
changed_count = 0;
|
||||
changed = g_string_new ("");
|
||||
@ -658,11 +598,9 @@ mail_vfolder_delete_uri (EMailBackend *backend,
|
||||
|
||||
source = NULL;
|
||||
while ((source = em_vfolder_rule_next_source ((EMVFolderRule *) rule, source))) {
|
||||
gchar *csource = em_uri_to_camel (source);
|
||||
|
||||
/* Remove all sources that match, ignore changed events though
|
||||
because the adduri call above does the work async */
|
||||
if (e_mail_folder_uri_equal (CAMEL_SESSION (session), curi, csource)) {
|
||||
if (e_mail_folder_uri_equal (CAMEL_SESSION (session), uri, source)) {
|
||||
vf = g_hash_table_lookup (vfolder_hash, rule->name);
|
||||
if (!vf) {
|
||||
g_warning ("vf is NULL for %s\n", rule->name);
|
||||
@ -686,17 +624,16 @@ mail_vfolder_delete_uri (EMailBackend *backend,
|
||||
changed_count++;
|
||||
source = NULL;
|
||||
}
|
||||
g_free (csource);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
if ((link = mv_find_folder (source_folders_remote, session, curi)) != NULL) {
|
||||
if ((link = mv_find_folder (source_folders_remote, session, uri)) != NULL) {
|
||||
g_free (link->data);
|
||||
source_folders_remote = g_list_remove_link (source_folders_remote, link);
|
||||
}
|
||||
|
||||
if ((link = mv_find_folder (source_folders_local, session, curi)) != NULL) {
|
||||
if ((link = mv_find_folder (source_folders_local, session, uri)) != NULL) {
|
||||
g_free (link->data);
|
||||
source_folders_local = g_list_remove_link (source_folders_local, link);
|
||||
}
|
||||
@ -735,26 +672,35 @@ done:
|
||||
|
||||
/* called when a uri is renamed in a store */
|
||||
static void
|
||||
mail_vfolder_rename_uri (CamelStore *store, const gchar *cfrom, const gchar *cto)
|
||||
mail_vfolder_rename_folder (CamelStore *store,
|
||||
const gchar *old_folder_name,
|
||||
const gchar *new_folder_name)
|
||||
{
|
||||
EFilterRule *rule;
|
||||
const gchar *source;
|
||||
CamelVeeFolder *vf;
|
||||
CamelSession *session;
|
||||
gint changed = 0;
|
||||
gchar *from, *to;
|
||||
gchar *old_uri;
|
||||
gchar *new_uri;
|
||||
|
||||
d(printf("vfolder rename uri: %s to %s\n", cfrom, cto));
|
||||
|
||||
if (context == NULL || uri_is_spethal (store, cfrom) || uri_is_spethal (store, cto))
|
||||
if (context == NULL)
|
||||
return;
|
||||
|
||||
if (folder_is_spethal (store, old_folder_name))
|
||||
return;
|
||||
|
||||
if (folder_is_spethal (store, new_folder_name))
|
||||
return;
|
||||
|
||||
g_return_if_fail (mail_in_main_thread ());
|
||||
|
||||
session = camel_service_get_session (CAMEL_SERVICE (store));
|
||||
|
||||
from = em_uri_from_camel (cfrom);
|
||||
to = em_uri_from_camel (cto);
|
||||
old_uri = e_mail_folder_uri_build (store, old_folder_name);
|
||||
new_uri = e_mail_folder_uri_build (store, new_folder_name);
|
||||
|
||||
G_LOCK (vfolder);
|
||||
|
||||
@ -763,11 +709,9 @@ mail_vfolder_rename_uri (CamelStore *store, const gchar *cfrom, const gchar *cto
|
||||
while ((rule = e_rule_context_next_rule ((ERuleContext *)context, rule, NULL))) {
|
||||
source = NULL;
|
||||
while ((source = em_vfolder_rule_next_source ((EMVFolderRule *)rule, source))) {
|
||||
gchar *csource = em_uri_to_camel (source);
|
||||
|
||||
/* Remove all sources that match, ignore changed events though
|
||||
because the adduri call above does the work async */
|
||||
if (e_mail_folder_uri_equal (session, cfrom, csource)) {
|
||||
if (e_mail_folder_uri_equal (session, old_uri, source)) {
|
||||
vf = g_hash_table_lookup (vfolder_hash, rule->name);
|
||||
if (!vf) {
|
||||
g_warning ("vf is NULL for %s\n", rule->name);
|
||||
@ -778,12 +722,11 @@ mail_vfolder_rename_uri (CamelStore *store, const gchar *cfrom, const gchar *cto
|
||||
G_SIGNAL_MATCH_DATA, 0, 0, NULL,
|
||||
rule_changed, vf);
|
||||
em_vfolder_rule_remove_source ((EMVFolderRule *)rule, source);
|
||||
em_vfolder_rule_add_source ((EMVFolderRule *)rule, to);
|
||||
em_vfolder_rule_add_source ((EMVFolderRule *)rule, new_uri);
|
||||
g_signal_connect(rule, "changed", G_CALLBACK(rule_changed), vf);
|
||||
changed++;
|
||||
source = NULL;
|
||||
}
|
||||
g_free (csource);
|
||||
}
|
||||
}
|
||||
|
||||
@ -800,8 +743,8 @@ mail_vfolder_rename_uri (CamelStore *store, const gchar *cfrom, const gchar *cto
|
||||
g_free (user);
|
||||
}
|
||||
|
||||
g_free (from);
|
||||
g_free (to);
|
||||
g_free (old_uri);
|
||||
g_free (new_uri);
|
||||
}
|
||||
|
||||
GList *
|
||||
@ -834,16 +777,17 @@ rule_add_sources (EMailSession *session,
|
||||
folder_cache = e_mail_session_get_folder_cache (session);
|
||||
|
||||
while (l) {
|
||||
gchar *curi = em_uri_to_camel (l->data);
|
||||
const gchar *uri = l->data;
|
||||
|
||||
if (mail_folder_cache_get_folder_from_uri (
|
||||
folder_cache, curi, &newfolder)) {
|
||||
folder_cache, uri, &newfolder)) {
|
||||
if (newfolder)
|
||||
sources_folder = g_list_append (sources_folder, newfolder);
|
||||
sources_folder = g_list_append (
|
||||
sources_folder, newfolder);
|
||||
else
|
||||
sources_uri = g_list_append (sources_uri, g_strdup (curi));
|
||||
sources_uri = g_list_append (
|
||||
sources_uri, g_strdup (uri));
|
||||
}
|
||||
g_free (curi);
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
@ -1059,38 +1003,38 @@ store_folder_renamed_cb (CamelStore *store,
|
||||
static void
|
||||
folder_available_cb (MailFolderCache *cache,
|
||||
CamelStore *store,
|
||||
const gchar *uri,
|
||||
const gchar *folder_name,
|
||||
EMailSession *session)
|
||||
{
|
||||
mail_vfolder_notify_uri_available (session, store, uri);
|
||||
mail_vfolder_add_folder (session, store, folder_name, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
folder_unavailable_cb (MailFolderCache *cache,
|
||||
CamelStore *store,
|
||||
const gchar *uri,
|
||||
const gchar *folder_name,
|
||||
EMailSession *session)
|
||||
{
|
||||
mail_vfolder_notify_uri_unavailable (session, store, uri);
|
||||
mail_vfolder_add_folder (session, store, folder_name, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
folder_deleted_cb (MailFolderCache *cache,
|
||||
CamelStore *store,
|
||||
const gchar *uri,
|
||||
const gchar *folder_name,
|
||||
EMailBackend *backend)
|
||||
{
|
||||
mail_vfolder_delete_uri (backend, store, uri);
|
||||
mail_vfolder_delete_folder (backend, store, folder_name);
|
||||
}
|
||||
|
||||
static void
|
||||
folder_renamed_cb (MailFolderCache *cache,
|
||||
CamelStore *store,
|
||||
const gchar *olduri,
|
||||
const gchar *newuri,
|
||||
const gchar *old_folder_name,
|
||||
const gchar *new_folder_name,
|
||||
gpointer user_data)
|
||||
{
|
||||
mail_vfolder_rename_uri (store, olduri, newuri);
|
||||
mail_vfolder_rename_folder (store, old_folder_name, new_folder_name);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user