Split store and local folder management out from shell backend.

This commit is contained in:
Matthew Barnes
2009-06-24 00:40:49 -04:00
parent ce7537b495
commit 174c942e09
35 changed files with 321 additions and 1087 deletions

View File

@ -52,6 +52,8 @@ libevolution_module_mail_la_SOURCES = \
e-mail-label-manager.h \
e-mail-label-tree-view.c \
e-mail-label-tree-view.h \
e-mail-local.c \
e-mail-local.h \
e-mail-reader.c \
e-mail-reader.h \
e-mail-reader-utils.c \
@ -74,6 +76,8 @@ libevolution_module_mail_la_SOURCES = \
e-mail-shell-view-actions.h \
e-mail-shell-view-private.c \
e-mail-shell-view-private.h \
e-mail-store.c \
e-mail-store.h \
e-searching-tokenizer.c \
e-searching-tokenizer.h \
em-account-editor.c \

View File

@ -148,9 +148,7 @@ static void
action_mail_copy_cb (GtkAction *action,
EMailReader *reader)
{
EShellBackend *shell_backend;
MessageList *message_list;
EMFolderTreeModel *model;
CamelFolder *folder;
GtkWidget *folder_tree;
GtkWidget *dialog;
@ -158,11 +156,8 @@ action_mail_copy_cb (GtkAction *action,
const gchar *uri;
message_list = e_mail_reader_get_message_list (reader);
shell_backend = e_mail_reader_get_shell_backend (reader);
model = e_mail_shell_backend_get_folder_tree_model (
E_MAIL_SHELL_BACKEND (shell_backend));
folder_tree = em_folder_tree_new_with_model (model);
folder_tree = em_folder_tree_new ();
selected = message_list_get_selected (message_list);
folder = message_list->folder;
@ -558,9 +553,7 @@ static void
action_mail_move_cb (GtkAction *action,
EMailReader *reader)
{
EShellBackend *shell_backend;
MessageList *message_list;
EMFolderTreeModel *model;
CamelFolder *folder;
GtkWidget *folder_tree;
GtkWidget *dialog;
@ -568,11 +561,8 @@ action_mail_move_cb (GtkAction *action,
const gchar *uri;
message_list = e_mail_reader_get_message_list (reader);
shell_backend = e_mail_reader_get_shell_backend (reader);
model = e_mail_shell_backend_get_folder_tree_model (
E_MAIL_SHELL_BACKEND (shell_backend));
folder_tree = em_folder_tree_new_with_model (model);
folder_tree = em_folder_tree_new ();
selected = message_list_get_selected (message_list);
folder = message_list->folder;

View File

@ -44,12 +44,12 @@
#include "e-attachment-handler-mail.h"
#include "e-mail-browser.h"
#include "e-mail-reader.h"
#include "e-mail-store.h"
#include "em-account-prefs.h"
#include "em-composer-prefs.h"
#include "em-composer-utils.h"
#include "em-config.h"
#include "em-event.h"
#include "em-folder-tree-model.h"
#include "em-folder-utils.h"
#include "em-format-hook.h"
#include "em-format-html-display.h"
@ -58,8 +58,6 @@
#include "em-network-prefs.h"
#include "em-utils.h"
#include "mail-config.h"
#include "mail-folder-cache.h"
#include "mail-mt.h"
#include "mail-ops.h"
#include "mail-send-recv.h"
#include "mail-session.h"
@ -72,35 +70,7 @@
#define BACKEND_NAME "mail"
typedef struct _StoreInfo StoreInfo;
/* XXX Temporary */
CamelStore *vfolder_store;
struct _StoreInfo {
CamelStore *store;
gint ref_count;
gchar *name;
/* Keep a reference to these so they remain around for the session. */
CamelFolder *vtrash;
CamelFolder *vjunk;
/* Initialization callback. */
void (*done) (CamelStore *store,
CamelFolderInfo *info,
gpointer user_data);
gpointer done_user_data;
guint removed : 1;
};
struct _EMailShellBackendPrivate {
GHashTable *store_hash;
MailAsyncEvent *async_event;
EMFolderTreeModel *folder_tree_model;
CamelStore *local_store;
gint mail_sync_in_progress;
guint mail_sync_timeout_source_id;
};
@ -111,20 +81,6 @@ const gchar *x_mailer = "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT;
static gpointer parent_class;
static GType mail_shell_backend_type;
/* The array elements correspond to EMailFolderType. */
static struct {
const gchar *name;
gchar *uri;
CamelFolder *folder;
} default_local_folders[] = {
{ N_("Inbox") },
{ N_("Drafts") },
{ N_("Outbox") },
{ N_("Sent") },
{ N_("Templates") },
{ "Inbox" } /* "always local" inbox */
};
/* XXX So many things need the shell backend that it's
* just easier for now to make it globally available.
* We should fix this, though. */
@ -132,148 +88,6 @@ EMailShellBackend *global_mail_shell_backend = NULL;
extern gint camel_application_is_exiting;
static StoreInfo *
store_info_new (CamelStore *store,
const gchar *name)
{
CamelService *service;
StoreInfo *si;
g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
service = CAMEL_SERVICE (store);
si = g_slice_new0 (StoreInfo);
si->ref_count = 1;
if (name == NULL)
si->name = camel_service_get_name (service, TRUE);
else
si->name = g_strdup (name);
si->store = store;
camel_object_ref (store);
/* If these are vfolders then they need to be opened now,
* otherwise they won't keep track of all folders. */
if (store->flags & CAMEL_STORE_VTRASH)
si->vtrash = camel_store_get_trash (store, NULL);
if (store->flags & CAMEL_STORE_VJUNK)
si->vjunk = camel_store_get_junk (store, NULL);
return si;
}
static StoreInfo *
store_info_ref (StoreInfo *si)
{
g_return_val_if_fail (si != NULL, si);
g_return_val_if_fail (si->ref_count > 0, si);
g_atomic_int_add (&si->ref_count, 1);
return si;
}
static void
store_info_unref (StoreInfo *si)
{
g_return_if_fail (si != NULL);
g_return_if_fail (si->ref_count > 0);
if (g_atomic_int_exchange_and_add (&si->ref_count, -1) > 1)
return;
if (si->vtrash != NULL)
camel_object_unref (si->vtrash);
if (si->vjunk != NULL)
camel_object_unref (si->vjunk);
camel_object_unref (si->store);
g_free (si->name);
g_slice_free (StoreInfo, si);
}
static void
store_hash_free (StoreInfo *si)
{
si->removed = 1;
store_info_unref (si);
}
static gboolean
mail_shell_backend_add_store_done (CamelStore *store,
CamelFolderInfo *info,
gpointer user_data)
{
StoreInfo *si = user_data;
if (si->done != NULL)
si->done (store, info, si);
if (!si->removed) {
/* Let the counters know about the already-opened
* junk and trash folders. */
if (si->vtrash != NULL)
mail_note_folder (si->vtrash);
if (si->vjunk != NULL)
mail_note_folder (si->vjunk);
}
store_info_unref (si);
return TRUE;
}
static void
mail_shell_backend_add_store (EMailShellBackend *mail_shell_backend,
CamelStore *store,
const gchar *name,
void (*done) (CamelStore *store,
CamelFolderInfo *info,
gpointer user_data))
{
EMFolderTreeModel *folder_tree_model;
GHashTable *store_hash;
StoreInfo *si;
store_hash = mail_shell_backend->priv->store_hash;
folder_tree_model = mail_shell_backend->priv->folder_tree_model;
si = store_info_new (store, name);
si->done = done;
g_hash_table_insert (store_hash, store, si);
em_folder_tree_model_add_store (folder_tree_model, store, si->name);
mail_note_store (
mail_shell_backend, store, NULL,
mail_shell_backend_add_store_done, store_info_ref (si));
}
static void
mail_shell_backend_add_local_store_done (CamelStore *store,
CamelFolderInfo *info,
gpointer unused)
{
gint ii;
for (ii = 0; ii < G_N_ELEMENTS (default_local_folders); ii++) {
if (default_local_folders[ii].folder != NULL)
mail_note_folder (default_local_folders[ii].folder);
}
}
static void
mail_shell_backend_add_local_store (EMailShellBackend *mail_shell_backend,
CamelStore *local_store,
const gchar *name)
{
mail_shell_backend_add_store (
mail_shell_backend, local_store, name,
mail_shell_backend_add_local_store_done);
}
static void
mail_shell_backend_init_hooks (void)
{
@ -308,109 +122,6 @@ mail_shell_backend_init_importers (void)
e_import_class_add_importer (import_class, importer, NULL, NULL);
}
static void
mail_shell_backend_init_local_store (EShellBackend *shell_backend)
{
EMailShellBackendPrivate *priv;
CamelException ex;
CamelService *service;
CamelURL *url;
MailAsyncEvent *async_event;
const gchar *data_dir;
gchar *temp;
gint ii;
priv = E_MAIL_SHELL_BACKEND_GET_PRIVATE (shell_backend);
camel_exception_init (&ex);
async_event = priv->async_event;
data_dir = e_shell_backend_get_data_dir (shell_backend);
url = camel_url_new ("mbox:", NULL);
temp = g_build_filename (data_dir, "local", NULL);
camel_url_set_path (url, temp);
g_free (temp);
temp = camel_url_to_string (url, 0);
service = camel_session_get_service (
session, temp, CAMEL_PROVIDER_STORE, &ex);
g_free (temp);
if (service == NULL)
goto fail;
for (ii = 0; ii < G_N_ELEMENTS (default_local_folders); ii++) {
/* FIXME Should this URI be account relative? */
camel_url_set_fragment (url, default_local_folders[ii].name);
default_local_folders[ii].uri = camel_url_to_string (url, 0);
default_local_folders[ii].folder = camel_store_get_folder (
CAMEL_STORE (service), default_local_folders[ii].name,
CAMEL_STORE_FOLDER_CREATE, &ex);
camel_exception_clear (&ex);
}
camel_url_free (url);
camel_object_ref (service);
g_object_ref (shell_backend);
mail_async_event_emit (
async_event, MAIL_ASYNC_GUI,
(MailAsyncFunc) mail_shell_backend_add_local_store,
shell_backend, service, _("On This Computer"));
priv->local_store = CAMEL_STORE (service);
return;
fail:
g_warning ("Could not initialize local store/folder: %s", ex.desc);
camel_exception_clear (&ex);
camel_url_free (url);
}
static void
mail_shell_backend_load_accounts (EShellBackend *shell_backend)
{
EAccountList *account_list;
EIterator *iter;
account_list = e_get_account_list ();
for (iter = e_list_get_iterator ((EList *) account_list);
e_iterator_is_valid (iter); e_iterator_next (iter)) {
EAccountService *service;
EAccount *account;
const gchar *name;
const gchar *url;
account = (EAccount *) e_iterator_get (iter);
service = account->source;
name = account->name;
url = service->url;
if (!account->enabled)
continue;
if (url == NULL || *url == '\0')
continue;
/* HACK: mbox URL's are handled by the local store setup
* above. Any that come through as account sources
* are really movemail sources! */
if (g_str_has_prefix (url, "mbox:"))
continue;
e_mail_shell_backend_load_store_by_uri (
E_MAIL_SHELL_BACKEND (shell_backend), url, name);
}
g_object_unref (iter);
}
static void
mail_shell_backend_mail_icon_cb (EShellWindow *shell_window,
const gchar *icon_name)
@ -577,9 +288,8 @@ mail_shell_backend_mail_sync (EMailShellBackend *mail_shell_backend)
if (session == NULL || !camel_session_is_online (session))
goto exit;
e_mail_shell_backend_stores_foreach (
mail_shell_backend, (GHFunc)
mail_shell_backend_sync_store_cb,
e_mail_store_foreach (
(GHFunc) mail_shell_backend_sync_store_cb,
mail_shell_backend);
exit:
@ -741,9 +451,8 @@ mail_shell_backend_prepare_for_offline_cb (EShell *shell,
camel_session_set_network_state (session, FALSE);
}
e_mail_shell_backend_stores_foreach (
mail_shell_backend, (GHFunc)
mail_shell_store_prepare_for_offline_cb, activity);
e_mail_store_foreach (
(GHFunc) mail_shell_store_prepare_for_offline_cb, activity);
}
/* Helper for mail_shell_backend_prepare_for_online_cb() */
@ -766,9 +475,8 @@ mail_shell_backend_prepare_for_online_cb (EShell *shell,
{
camel_session_set_online (session, TRUE);
e_mail_shell_backend_stores_foreach (
mail_shell_backend, (GHFunc)
mail_shell_store_prepare_for_online_cb, activity);
e_mail_store_foreach (
(GHFunc) mail_shell_store_prepare_for_online_cb, activity);
}
static void
@ -857,49 +565,13 @@ mail_shell_backend_window_created_cb (EShell *shell,
}
}
static void
mail_shell_backend_dispose (GObject *object)
{
EMailShellBackendPrivate *priv;
priv = E_MAIL_SHELL_BACKEND_GET_PRIVATE (object);
g_hash_table_remove_all (priv->store_hash);
if (priv->folder_tree_model != NULL) {
g_object_unref (priv->folder_tree_model);
priv->folder_tree_model = NULL;
}
if (priv->local_store != NULL) {
camel_object_unref (priv->local_store);
priv->local_store = NULL;
}
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
mail_shell_backend_finalize (GObject *object)
{
EMailShellBackendPrivate *priv;
priv = E_MAIL_SHELL_BACKEND_GET_PRIVATE (object);
g_hash_table_destroy (priv->store_hash);
mail_async_event_destroy (priv->async_event);
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
mail_shell_backend_constructed (GObject *object)
{
EMailShellBackendPrivate *priv;
EShell *shell;
EShellBackend *shell_backend;
const gchar *data_dir;
priv = E_MAIL_SHELL_BACKEND_GET_PRIVATE (object);
@ -917,16 +589,6 @@ mail_shell_backend_constructed (GObject *object)
/* XXX This never gets unreffed. */
global_mail_shell_backend = g_object_ref (shell_backend);
priv->store_hash = g_hash_table_new_full (
g_direct_hash, g_direct_equal,
(GDestroyNotify) NULL,
(GDestroyNotify) store_hash_free);
priv->async_event = mail_async_event_new ();
priv->folder_tree_model = em_folder_tree_model_new (
E_MAIL_SHELL_BACKEND (shell_backend));
g_signal_connect (
shell, "notify::online",
G_CALLBACK (mail_shell_backend_notify_online_cb),
@ -960,8 +622,8 @@ mail_shell_backend_constructed (GObject *object)
mail_config_init ();
mail_msg_init ();
mail_shell_backend_init_local_store (shell_backend);
mail_shell_backend_load_accounts (shell_backend);
data_dir = e_shell_backend_get_data_dir (shell_backend);
e_mail_store_init (data_dir);
/* Initialize settings before initializing preferences,
* since the preferences bind to the shell settings. */
@ -1009,8 +671,6 @@ mail_shell_backend_class_init (EMailShellBackendClass *class)
g_type_class_add_private (class, sizeof (EMailShellBackendPrivate));
object_class = G_OBJECT_CLASS (class);
object_class->dispose = mail_shell_backend_dispose;
object_class->finalize = mail_shell_backend_finalize;
object_class->constructed = mail_shell_backend_constructed;
shell_backend_class = E_SHELL_BACKEND_CLASS (class);
@ -1059,194 +719,6 @@ e_mail_shell_backend_register_type (GTypeModule *type_module)
"EMailShellBackend", &type_info, 0);
}
/******************************** Public API *********************************/
CamelFolder *
e_mail_shell_backend_get_folder (EMailShellBackend *mail_shell_backend,
EMailFolderType folder_type)
{
g_return_val_if_fail (
E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
return default_local_folders[folder_type].folder;
}
const gchar *
e_mail_shell_backend_get_folder_uri (EMailShellBackend *mail_shell_backend,
EMailFolderType folder_type)
{
g_return_val_if_fail (
E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
return default_local_folders[folder_type].uri;
}
EMFolderTreeModel *
e_mail_shell_backend_get_folder_tree_model (EMailShellBackend *mail_shell_backend)
{
g_return_val_if_fail (
E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
return mail_shell_backend->priv->folder_tree_model;
}
void
e_mail_shell_backend_add_store (EMailShellBackend *mail_shell_backend,
CamelStore *store,
const gchar *name)
{
g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
g_return_if_fail (CAMEL_IS_STORE (store));
g_return_if_fail (name != NULL);
mail_shell_backend_add_store (mail_shell_backend, store, name, NULL);
}
CamelStore *
e_mail_shell_backend_get_local_store (EMailShellBackend *mail_shell_backend)
{
g_return_val_if_fail (
E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
return mail_shell_backend->priv->local_store;
}
CamelStore *
e_mail_shell_backend_load_store_by_uri (EMailShellBackend *mail_shell_backend,
const gchar *uri,
const gchar *name)
{
CamelStore *store;
CamelProvider *provider;
CamelException ex;
g_return_val_if_fail (
E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
g_return_val_if_fail (uri != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
camel_exception_init (&ex);
/* Load the service, but don't connect. Check its provider,
* and if this belongs in the shell's folder list, add it. */
provider = camel_provider_get (uri, &ex);
if (provider == NULL)
goto fail;
if (!(provider->flags & CAMEL_PROVIDER_IS_STORAGE))
return NULL;
store = (CamelStore *) camel_session_get_service (
session, uri, CAMEL_PROVIDER_STORE, &ex);
if (store == NULL)
goto fail;
e_mail_shell_backend_add_store (mail_shell_backend, store, name);
camel_object_unref (store);
return store;
fail:
/* FIXME: Show an error dialog. */
g_warning (
"Couldn't get service: %s: %s", uri,
camel_exception_get_description (&ex));
camel_exception_clear (&ex);
return NULL;
}
/* Helper for e_mail_shell_backend_remove_store() */
static void
mail_shell_backend_remove_store_cb (CamelStore *store,
gpointer event_data,
gpointer user_data)
{
camel_service_disconnect (CAMEL_SERVICE (store), TRUE, NULL);
camel_object_unref (store);
}
void
e_mail_shell_backend_remove_store (EMailShellBackend *mail_shell_backend,
CamelStore *store)
{
GHashTable *store_hash;
MailAsyncEvent *async_event;
EMFolderTreeModel *folder_tree_model;
g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
g_return_if_fail (CAMEL_IS_STORE (store));
store_hash = mail_shell_backend->priv->store_hash;
async_event = mail_shell_backend->priv->async_event;
folder_tree_model = mail_shell_backend->priv->folder_tree_model;
/* Because the store hash holds a reference to each store used
* as a key in it, none of them will ever be gc'ed, meaning any
* call to camel_session_get_{service,store} with the same URL
* will always return the same object. So this works. */
if (g_hash_table_lookup (store_hash, store) == NULL)
return;
camel_object_ref (store);
g_hash_table_remove (store_hash, store);
mail_note_store_remove (store);
em_folder_tree_model_remove_store (folder_tree_model, store);
mail_async_event_emit (
async_event, MAIL_ASYNC_THREAD,
(MailAsyncFunc) mail_shell_backend_remove_store_cb,
store, NULL, NULL);
}
void
e_mail_shell_backend_remove_store_by_uri (EMailShellBackend *mail_shell_backend,
const gchar *uri)
{
CamelStore *store;
CamelProvider *provider;
g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
g_return_if_fail (uri != NULL);
provider = camel_provider_get (uri, NULL);
if (provider == NULL)
return;
if (!(provider->flags & CAMEL_PROVIDER_IS_STORAGE))
return;
store = (CamelStore *) camel_session_get_service (
session, uri, CAMEL_PROVIDER_STORE, NULL);
if (store != NULL) {
e_mail_shell_backend_remove_store (mail_shell_backend, store);
camel_object_unref (store);
}
}
void
e_mail_shell_backend_stores_foreach (EMailShellBackend *mail_shell_backend,
GHFunc func,
gpointer user_data)
{
GHashTable *store_hash;
GHashTableIter iter;
gpointer key, value;
g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
g_return_if_fail (func != NULL);
store_hash = mail_shell_backend->priv->store_hash;
g_hash_table_iter_init (&iter, store_hash);
while (g_hash_table_iter_next (&iter, &key, &value))
func (key, ((StoreInfo *) value)->name, user_data);
}
/******************* Code below here belongs elsewhere. *******************/
#include "filter/filter-option.h"

View File

@ -63,56 +63,16 @@ struct _EMailShellBackendClass {
EShellBackendClass parent_class;
};
typedef enum {
E_MAIL_FOLDER_INBOX,
E_MAIL_FOLDER_DRAFTS,
E_MAIL_FOLDER_OUTBOX,
E_MAIL_FOLDER_SENT,
E_MAIL_FOLDER_TEMPLATES,
E_MAIL_FOLDER_LOCAL_INBOX
} EMailFolderType;
struct _EMFolderTreeModel;
/* Globally available shell backend.
*
* XXX I don't like having this globally available but passing it around
* to all the various utilities that need to access the backend's data
* directory and local folders is too much of a pain for now. */
* directory is too much of a pain for now. */
extern EMailShellBackend *global_mail_shell_backend;
GType e_mail_shell_backend_get_type (void);
void e_mail_shell_backend_register_type
(GTypeModule *type_module);
CamelFolder * e_mail_shell_backend_get_folder
(EMailShellBackend *mail_shell_backend,
EMailFolderType folder_type);
const gchar * e_mail_shell_backend_get_folder_uri
(EMailShellBackend *mail_shell_backend,
EMailFolderType folder_type);
struct _EMFolderTreeModel *
e_mail_shell_backend_get_folder_tree_model
(EMailShellBackend *mail_shell_backend);
void e_mail_shell_backend_add_store
(EMailShellBackend *mail_shell_backend,
CamelStore *store,
const gchar *name);
CamelStore * e_mail_shell_backend_get_local_store
(EMailShellBackend *mail_shell_backend);
CamelStore * e_mail_shell_backend_load_store_by_uri
(EMailShellBackend *mail_shell_backend,
const gchar *uri,
const gchar *name);
void e_mail_shell_backend_remove_store
(EMailShellBackend *mail_shell_backend,
CamelStore *store);
void e_mail_shell_backend_remove_store_by_uri
(EMailShellBackend *mail_shell_backend,
const gchar *uri);
void e_mail_shell_backend_stores_foreach
(EMailShellBackend *mail_shell_backend,
GHFunc func,
gpointer user_data);
/* XXX Find a better place for this function. */
GSList * e_mail_labels_get_filter_options(void);

View File

@ -66,6 +66,7 @@
#include "e-mail-shell-backend.h"
#include "shell/e-shell-migrate.h"
#include "e-mail-store.h"
#include "mail-config.h"
#include "em-utils.h"
@ -2958,9 +2959,7 @@ migrate_to_db (EShellBackend *shell_backend)
CamelException ex;
camel_exception_init (&ex);
e_mail_shell_backend_load_store_by_uri (
E_MAIL_SHELL_BACKEND (shell_backend),
service->url, name);
e_mail_store_add_by_uri (service->url, name);
store = (CamelStore *) camel_session_get_service (CAMEL_SESSION (session), service->url, CAMEL_PROVIDER_STORE, &ex);
info = camel_store_get_folder_info (store, NULL, CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST|CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, &ex);

View File

@ -27,7 +27,8 @@
#include "em-utils.h"
#include "em-folder-utils.h"
#include "e-mail-shell-backend.h"
#include "e-mail-local.h"
#include "e-mail-store.h"
#define E_MAIL_SHELL_SIDEBAR_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
@ -52,7 +53,6 @@ mail_shell_sidebar_restore_state (EMailShellSidebar *mail_shell_sidebar)
{
EShellView *shell_view;
EShellSidebar *shell_sidebar;
EMFolderTreeModel *folder_tree_model;
EMFolderTree *folder_tree;
GtkTreeModel *tree_model;
GtkTreeView *tree_view;
@ -68,10 +68,9 @@ mail_shell_sidebar_restore_state (EMailShellSidebar *mail_shell_sidebar)
key_file = e_shell_view_get_state_key_file (shell_view);
folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
folder_tree_model = em_folder_tree_get_model (folder_tree);
tree_view = GTK_TREE_VIEW (folder_tree);
tree_model = GTK_TREE_MODEL (folder_tree_model);
tree_model = gtk_tree_view_get_model (tree_view);
/* Restore selected folder. */
@ -123,7 +122,7 @@ mail_shell_sidebar_restore_state (EMailShellSidebar *mail_shell_sidebar)
continue;
reference = em_folder_tree_model_lookup_uri (
folder_tree_model, uri);
EM_FOLDER_TREE_MODEL (tree_model), uri);
if (reference == NULL)
continue;
@ -410,14 +409,12 @@ mail_shell_sidebar_finalize (GObject *object)
static void
mail_shell_sidebar_constructed (GObject *object)
{
EMailShellBackend *mail_shell_backend;
EMailShellSidebar *mail_shell_sidebar;
EMFolderTreeModel *folder_tree_model;
EShellSidebar *shell_sidebar;
EShellBackend *shell_backend;
EShellView *shell_view;
GtkTreeSelection *selection;
GtkTreeView *tree_view;
GtkTreeModel *model;
GtkWidget *container;
GtkWidget *widget;
@ -426,14 +423,9 @@ mail_shell_sidebar_constructed (GObject *object)
shell_sidebar = E_SHELL_SIDEBAR (object);
shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
shell_backend = e_shell_view_get_shell_backend (shell_view);
mail_shell_backend = E_MAIL_SHELL_BACKEND (shell_backend);
mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (object);
folder_tree_model = e_mail_shell_backend_get_folder_tree_model (
mail_shell_backend);
/* Build sidebar widgets. */
container = GTK_WIDGET (object);
@ -449,7 +441,7 @@ mail_shell_sidebar_constructed (GObject *object)
container = widget;
widget = em_folder_tree_new_with_model (folder_tree_model);
widget = em_folder_tree_new ();
em_folder_tree_set_excluded (EM_FOLDER_TREE (widget), 0);
em_folder_tree_enable_drag_and_drop (EM_FOLDER_TREE (widget));
gtk_container_add (GTK_CONTAINER (container), widget);
@ -458,11 +450,14 @@ mail_shell_sidebar_constructed (GObject *object)
tree_view = GTK_TREE_VIEW (mail_shell_sidebar->priv->folder_tree);
selection = gtk_tree_view_get_selection (tree_view);
model = gtk_tree_view_get_model (tree_view);
if (em_folder_tree_model_get_selection (folder_tree_model) == NULL)
if (em_folder_tree_model_get_selection (
EM_FOLDER_TREE_MODEL (model)) == NULL)
mail_shell_sidebar_restore_state (mail_shell_sidebar);
em_folder_tree_model_set_selection (folder_tree_model, selection);
em_folder_tree_model_set_selection (
EM_FOLDER_TREE_MODEL (model), selection);
g_signal_connect_swapped (
tree_view, "row-collapsed",
@ -475,7 +470,7 @@ mail_shell_sidebar_constructed (GObject *object)
shell_sidebar);
g_signal_connect_swapped (
folder_tree_model, "loaded-row",
model, "loaded-row",
G_CALLBACK (mail_shell_sidebar_model_loaded_row_cb),
shell_sidebar);
@ -488,9 +483,7 @@ mail_shell_sidebar_constructed (GObject *object)
static guint32
mail_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
{
EMailShellBackend *mail_shell_backend;
EMailShellSidebar *mail_shell_sidebar;
EShellBackend *shell_backend;
EShellView *shell_view;
EMFolderTree *folder_tree;
GtkTreeSelection *selection;
@ -512,10 +505,8 @@ mail_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
guint32 state = 0;
shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
shell_backend = e_shell_view_get_shell_backend (shell_view);
mail_shell_backend = E_MAIL_SHELL_BACKEND (shell_backend);
local_store = e_mail_shell_backend_get_local_store (mail_shell_backend);
local_store = e_mail_local_get_store ();
mail_shell_sidebar = E_MAIL_SHELL_SIDEBAR (shell_sidebar);
folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);

View File

@ -49,14 +49,12 @@ static void
action_mail_account_disable_cb (GtkAction *action,
EMailShellView *mail_shell_view)
{
EMailShellBackend *mail_shell_backend;
EMailShellSidebar *mail_shell_sidebar;
EMFolderTree *folder_tree;
EAccountList *account_list;
EAccount *account;
gchar *folder_uri;
mail_shell_backend = mail_shell_view->priv->mail_shell_backend;
mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
@ -72,8 +70,7 @@ action_mail_account_disable_cb (GtkAction *action,
account->enabled = !account->enabled;
e_account_list_change (account_list, account);
e_mail_shell_backend_remove_store_by_uri (
mail_shell_backend, folder_uri);
e_mail_store_remove_by_uri (folder_uri);
if (account->parent_uid != NULL)
e_account_list_remove (account_list, account);
@ -94,8 +91,7 @@ action_mail_create_search_folder_cb (GtkAction *action,
static void
action_mail_download_foreach_cb (CamelService *service)
{
if (CAMEL_IS_DISCO_STORE (service) ||
CAMEL_IS_OFFLINE_STORE (service))
if (CAMEL_IS_DISCO_STORE (service) || CAMEL_IS_OFFLINE_STORE (service))
mail_store_prepare_offline (CAMEL_STORE (service));
}
@ -103,13 +99,7 @@ static void
action_mail_download_cb (GtkAction *action,
EMailShellView *mail_shell_view)
{
EMailShellBackend *mail_shell_backend;
mail_shell_backend = mail_shell_view->priv->mail_shell_backend;
e_mail_shell_backend_stores_foreach (
mail_shell_backend, (GHFunc)
action_mail_download_foreach_cb, NULL);
e_mail_store_foreach ((GHFunc) action_mail_download_foreach_cb, NULL);
}
static void
@ -139,7 +129,6 @@ action_mail_folder_copy_cb (GtkAction *action,
EMailShellSidebar *mail_shell_sidebar;
CamelFolderInfo *folder_info;
EMFolderTree *folder_tree;
EMFolderTreeModel *model;
mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
@ -147,8 +136,7 @@ action_mail_folder_copy_cb (GtkAction *action,
g_return_if_fail (folder_info != NULL);
/* XXX Leaking folder_info? */
model = em_folder_tree_get_model (folder_tree);
em_folder_utils_copy_folder (model, folder_info, FALSE);
em_folder_utils_copy_folder (folder_info, FALSE);
}
static void
@ -236,7 +224,6 @@ action_mail_folder_move_cb (GtkAction *action,
EMailShellSidebar *mail_shell_sidebar;
CamelFolderInfo *folder_info;
EMFolderTree *folder_tree;
EMFolderTreeModel *model;
mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
@ -244,8 +231,7 @@ action_mail_folder_move_cb (GtkAction *action,
g_return_if_fail (folder_info != NULL);
/* XXX Leaking folder_info? */
model = em_folder_tree_get_model (folder_tree);
em_folder_utils_copy_folder (model, folder_info, TRUE);
em_folder_utils_copy_folder (folder_info, TRUE);
}
static void

View File

@ -755,7 +755,6 @@ e_mail_shell_view_create_vfolder_from_selected (EMailShellView *mail_shell_view,
void
e_mail_shell_view_update_sidebar (EMailShellView *mail_shell_view)
{
EMailShellBackend *mail_shell_backend;
EMailShellContent *mail_shell_content;
EShellSidebar *shell_sidebar;
EShellView *shell_view;
@ -777,7 +776,6 @@ e_mail_shell_view_update_sidebar (EMailShellView *mail_shell_view)
g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
mail_shell_backend = mail_shell_view->priv->mail_shell_backend;
mail_shell_content = mail_shell_view->priv->mail_shell_content;
shell_view = E_SHELL_VIEW (mail_shell_view);
@ -788,7 +786,7 @@ e_mail_shell_view_update_sidebar (EMailShellView *mail_shell_view)
folder_uri = message_list->folder_uri;
folder = message_list->folder;
local_store = e_mail_shell_backend_get_local_store (mail_shell_backend);
local_store = e_mail_local_get_store ();
/* If no folder is selected, reset the sidebar banners
* to their default values and stop. */

View File

@ -41,7 +41,9 @@
#include "e-mail-label-dialog.h"
#include "e-mail-label-list-store.h"
#include "e-mail-local.h"
#include "e-mail-reader.h"
#include "e-mail-store.h"
#include "em-composer-utils.h"
#include "em-folder-properties.h"
#include "em-folder-selector.h"

View File

@ -58,6 +58,7 @@
#include "e-util/e-signature-utils.h"
#include "e-util/e-util-private.h"
#include "e-mail-local.h"
#include "em-config.h"
#include "em-folder-selection-button.h"
#include "em-account-editor.h"
@ -70,8 +71,6 @@
#include "mail-ops.h"
#include "mail-mt.h"
#include "e-mail-shell-backend.h"
#if defined (HAVE_NSS)
#include "smime/gui/e-cert-selector.h"
#endif
@ -469,13 +468,11 @@ default_folders_clicked (GtkButton *button, gpointer user_data)
EMAccountEditor *emae = user_data;
const gchar *uri;
uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS);
em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri);
emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae);
uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT);
em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri);
emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae);
}
@ -486,10 +483,8 @@ GtkWidget *em_account_editor_folder_selector_button_new (gchar *widget_name, gch
GtkWidget *
em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2)
{
EMFolderTreeModel *model;
model = e_mail_shell_backend_get_folder_tree_model (global_mail_shell_backend);
return (GtkWidget *)em_folder_selection_button_new(model, string1 ? string1 : _("Select Folder"), NULL);
return (GtkWidget *)em_folder_selection_button_new (
string1 ? string1 : _("Select Folder"), NULL);
}
GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2);
@ -497,7 +492,7 @@ GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gc
GtkWidget *
em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2)
{
return (GtkWidget *)gtk_combo_box_new();
return gtk_combo_box_new ();
}
GtkWidget *em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2);
@ -927,8 +922,7 @@ emae_account_folder(EMAccountEditor *emae, const gchar *name, gint item, gint de
} else {
const gchar *uri;
uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, deffolder);
uri = e_mail_local_get_folder_uri (deffolder);
em_folder_selection_button_set_selection(folder, uri);
}
@ -3018,21 +3012,17 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account
emae->do_signature = TRUE;
} else {
const gchar *uri;
/* TODO: have a get_default_account thing?? */
emae->account = e_account_new();
emae->account->enabled = TRUE;
uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
e_account_set_string (
emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, uri);
emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI,
e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS));
uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
e_account_set_string (
emae->account, E_ACCOUNT_SENT_FOLDER_URI, uri);
emae->account, E_ACCOUNT_SENT_FOLDER_URI,
e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT));
}
/* sort the providers, remote first */

View File

@ -36,9 +36,9 @@
#include "e-util/e-error.h"
#include "e-mail-store.h"
#include "em-config.h"
#include "em-account-editor.h"
#include "e-mail-shell-backend.h"
#define EM_ACCOUNT_PREFS_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
@ -59,9 +59,7 @@ account_prefs_enable_account_cb (EAccountTreeView *tree_view)
account = e_account_tree_view_get_selected (tree_view);
g_return_if_fail (account != NULL);
e_mail_shell_backend_load_store_by_uri (
global_mail_shell_backend,
account->source->url, account->name);
e_mail_store_add_by_uri (account->source->url, account->name);
}
static void
@ -94,8 +92,7 @@ account_prefs_disable_account_cb (EAccountTreeView *tree_view)
e_account_list_remove_account_proxies (account_list, account);
e_mail_shell_backend_remove_store_by_uri (
global_mail_shell_backend, account->source->url);
e_mail_store_remove_by_uri (account->source->url);
}
static void
@ -216,8 +213,7 @@ account_prefs_delete_account (EAccountManager *manager)
/* Remove the account from the folder tree. */
if (account->enabled && account->source && account->source->url)
e_mail_shell_backend_remove_store_by_uri (
global_mail_shell_backend, account->source->url);
e_mail_store_remove_by_uri (account->source->url);
/* Remove all the proxies the account has created. */
if (has_proxies)

View File

@ -41,6 +41,7 @@
#include "e-util/e-error.h"
#include "e-util/e-account-utils.h"
#include "e-mail-local.h"
#include "em-utils.h"
#include "em-composer-utils.h"
#include "composer/e-msg-composer.h"
@ -60,8 +61,6 @@
#include <camel/camel-nntp-address.h>
#include <camel/camel-vee-folder.h>
#include "e-mail-shell-backend.h"
#ifdef G_OS_WIN32
/* Undef the similar macro from pthread.h, it doesn't check if
* gmtime() returns NULL.
@ -448,7 +447,7 @@ em_utils_composer_send_cb (EMsgComposer *composer)
CamelMimeMessage *message;
CamelMessageInfo *info;
struct _send_data *send;
CamelFolder *mail_folder;
CamelFolder *folder;
EAccount *account;
table = e_msg_composer_get_header_table (composer);
@ -463,9 +462,8 @@ em_utils_composer_send_cb (EMsgComposer *composer)
if ((message = composer_get_message (composer, FALSE)) == NULL)
return;
mail_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
camel_object_ref (mail_folder);
folder = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
camel_object_ref (folder);
/* mail the message */
info = camel_message_info_new (NULL);
@ -482,9 +480,9 @@ em_utils_composer_send_cb (EMsgComposer *composer)
e_msg_composer_set_enable_autosave (composer, FALSE);
mail_append_mail (
mail_folder, message, info, composer_send_queued_cb, send);
folder, message, info, composer_send_queued_cb, send);
camel_object_unref (mail_folder);
camel_object_unref (folder);
camel_object_unref (message);
}
@ -594,11 +592,10 @@ em_utils_composer_save_draft_cb (EMsgComposer *composer)
* get destroyed while we're in mail_msg_wait() a little lower
* down, waiting for the folder to open */
local_drafts_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_drafts_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_drafts_folder =
e_mail_local_get_folder (E_MAIL_FOLDER_DRAFTS);
local_drafts_folder_uri =
e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS);
g_object_ref (composer);
msg = e_msg_composer_get_message_draft (composer);
@ -1521,9 +1518,8 @@ em_utils_send_receipt (CamelFolder *folder, CamelMimeMessage *message)
}
/* Send the receipt */
out_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
info = camel_message_info_new (NULL);
out_folder = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
mail_append_mail (out_folder, receipt, info, em_utils_receipt_done, NULL);
}
@ -1618,9 +1614,8 @@ em_utils_forward_message_raw (CamelFolder *folder, CamelMimeMessage *message, co
g_free (subject);
/* and send it */
out_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
info = camel_message_info_new (NULL);
out_folder = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
mail_append_mail (out_folder, forward, info, emu_forward_raw_done, NULL);
}
@ -2397,17 +2392,14 @@ em_utils_reply_to_message(CamelFolder *folder, const gchar *uid, CamelMimeMessag
}
static void
post_header_clicked_cb (EComposerPostHeader *header,
EMailShellBackend *mail_shell_backend)
post_header_clicked_cb (EComposerPostHeader *header)
{
EMFolderTreeModel *model;
GtkTreeSelection *selection;
GtkWidget *folder_tree;
GtkWidget *dialog;
GList *list;
model = e_mail_shell_backend_get_folder_tree_model (mail_shell_backend);
folder_tree = em_folder_tree_new_with_model (model);
folder_tree = em_folder_tree_new ();
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
@ -2498,6 +2490,5 @@ em_configure_new_composer (EMsgComposer *composer)
* the folder selector dialog. See the handler function. */
g_signal_connect (
header, "clicked",
G_CALLBACK (post_header_clicked_cb),
global_mail_shell_backend);
G_CALLBACK (post_header_clicked_cb), NULL);
}

View File

@ -37,8 +37,6 @@
#include "libedataserver/e-sexp.h"
#include "e-util/e-error.h"
#include "e-mail-shell-backend.h"
#define d(x)
static gboolean validate(FilterElement *fe);
@ -249,7 +247,6 @@ static GtkWidget *
get_widget(FilterElement *fe)
{
EMFilterFolderElement *ff = (EMFilterFolderElement *)fe;
EMFolderTreeModel *model;
GtkWidget *button;
gchar *uri;
@ -257,9 +254,11 @@ get_widget(FilterElement *fe)
uri = ff->uri;
else
uri = em_uri_to_camel (ff->uri);
model = e_mail_shell_backend_get_folder_tree_model (global_mail_shell_backend);
button = em_folder_selection_button_new (model, _("Select Folder"), NULL);
em_folder_selection_button_set_selection(EM_FOLDER_SELECTION_BUTTON(button), uri);
button = em_folder_selection_button_new (_("Select Folder"), NULL);
em_folder_selection_button_set_selection(
EM_FOLDER_SELECTION_BUTTON (button), uri);
if (!ff->store_camel_uri)
g_free(uri);

View File

@ -39,13 +39,12 @@
#include "em-folder-properties.h"
#include "em-config.h"
#include "e-mail-local.h"
#include "mail-ops.h"
#include "mail-mt.h"
#include "mail-vfolder.h"
#include "mail-config.h"
#include "e-mail-shell-backend.h"
struct _prop_data {
gpointer object;
CamelArgV *argv;
@ -299,7 +298,6 @@ emfp_dialog_got_folder_quota (CamelFolder *folder,
gint32 count, i,deleted;
EMConfig *ec;
EMConfigTargetFolder *target;
EShellBackend *shell_backend;
EShellWindow *shell_window;
EShellView *shell_view;
CamelArgGetV *arggetv;
@ -315,11 +313,9 @@ emfp_dialog_got_folder_quota (CamelFolder *folder,
store = folder->parent_store;
shell_view = E_SHELL_VIEW (data);
shell_backend = e_shell_view_get_shell_backend (shell_view);
shell_window = e_shell_view_get_shell_window (shell_view);
local_store = e_mail_shell_backend_get_local_store (
E_MAIL_SHELL_BACKEND (shell_backend));
local_store = e_mail_local_get_store ();
prop_data = g_malloc0 (sizeof (*prop_data));
prop_data->object = folder;

View File

@ -40,8 +40,6 @@
((obj), EM_TYPE_FOLDER_SELECTION_BUTTON, EMFolderSelectionButtonPrivate))
struct _EMFolderSelectionButtonPrivate {
gpointer model; /* weak pointer */
GtkWidget *icon;
GtkWidget *label;
@ -57,7 +55,6 @@ struct _EMFolderSelectionButtonPrivate {
enum {
PROP_0,
PROP_CAPTION,
PROP_MODEL,
PROP_MULTISELECT,
PROP_TITLE
};
@ -113,18 +110,6 @@ folder_selection_button_set_contents (EMFolderSelectionButton *button)
g_free (folder_name);
}
static void
folder_selection_button_set_model (EMFolderSelectionButton *button,
EMFolderTreeModel *model)
{
g_return_if_fail (button->priv->model == NULL);
button->priv->model = model;
g_object_add_weak_pointer (
G_OBJECT (model), &button->priv->model);
}
static void
folder_selection_button_set_property (GObject *object,
guint property_id,
@ -138,12 +123,6 @@ folder_selection_button_set_property (GObject *object,
g_value_get_string (value));
return;
case PROP_MODEL:
folder_selection_button_set_model (
EM_FOLDER_SELECTION_BUTTON (object),
g_value_get_object (value));
return;
case PROP_MULTISELECT:
em_folder_selection_button_set_multiselect (
EM_FOLDER_SELECTION_BUTTON (object),
@ -174,13 +153,6 @@ folder_selection_button_get_property (GObject *object,
EM_FOLDER_SELECTION_BUTTON (object)));
return;
case PROP_MODEL:
g_value_set_object (
value,
em_folder_selection_button_get_model (
EM_FOLDER_SELECTION_BUTTON (object)));
return;
case PROP_MULTISELECT:
g_value_set_boolean (
value,
@ -199,23 +171,6 @@ folder_selection_button_get_property (GObject *object,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
folder_selection_button_dispose (GObject *object)
{
EMFolderSelectionButtonPrivate *priv;
priv = EM_FOLDER_SELECTION_BUTTON_GET_PRIVATE (object);
if (priv->model != NULL) {
g_object_remove_weak_pointer (
G_OBJECT (priv->model), &priv->model);
priv->model = NULL;
}
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
folder_selection_button_finalize (GObject *object)
{
@ -256,7 +211,7 @@ folder_selection_button_clicked (GtkButton *button)
priv = EM_FOLDER_SELECTION_BUTTON_GET_PRIVATE (button);
emft = (EMFolderTree *) em_folder_tree_new_with_model (priv->model);
emft = (EMFolderTree *) em_folder_tree_new ();
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (emft));
if (priv->multiple_select)
@ -318,7 +273,6 @@ folder_selection_button_class_init (EMFolderSelectionButtonClass *class)
object_class = G_OBJECT_CLASS (class);
object_class->set_property = folder_selection_button_set_property;
object_class->get_property = folder_selection_button_get_property;
object_class->dispose = folder_selection_button_dispose;
object_class->finalize = folder_selection_button_finalize;
gtk_object_class = GTK_OBJECT_CLASS (class);
@ -338,17 +292,6 @@ folder_selection_button_class_init (EMFolderSelectionButtonClass *class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
PROP_MODEL,
g_param_spec_object (
"model",
NULL,
NULL,
EM_TYPE_FOLDER_TREE_MODEL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
PROP_MULTISELECT,
@ -436,24 +379,12 @@ em_folder_selection_button_get_type (void)
}
GtkWidget *
em_folder_selection_button_new (EMFolderTreeModel *model,
const gchar *title,
em_folder_selection_button_new (const gchar *title,
const gchar *caption)
{
g_return_val_if_fail (EM_IS_FOLDER_TREE_MODEL (model), NULL);
return g_object_new (
EM_TYPE_FOLDER_SELECTION_BUTTON,
"model", model, "title", title,
"caption", caption, NULL);
}
EMFolderTreeModel *
em_folder_selection_button_get_model (EMFolderSelectionButton *button)
{
g_return_val_if_fail (EM_IS_FOLDER_SELECTION_BUTTON (button), NULL);
return button->priv->model;
"title", title, "caption", caption, NULL);
}
const gchar *

View File

@ -26,8 +26,6 @@
#include <gtk/gtk.h>
#include <mail/em-folder-tree-model.h>
/* Standard GObject macros */
#define EM_TYPE_FOLDER_SELECTION_BUTTON \
(em_folder_selection_button_get_type ())
@ -68,12 +66,8 @@ struct _EMFolderSelectionButtonClass {
GType em_folder_selection_button_get_type (void);
GtkWidget * em_folder_selection_button_new
(EMFolderTreeModel *model,
const gchar *title,
(const gchar *title,
const gchar *caption);
EMFolderTreeModel *
em_folder_selection_button_get_model
(EMFolderSelectionButton *button);
const gchar * em_folder_selection_button_get_caption
(EMFolderSelectionButton *button);
void em_folder_selection_button_set_caption

View File

@ -36,8 +36,7 @@
/* TODO: rmeove this file, it could just go on em-folder-selection or em-utils */
void
em_select_folder (EMFolderTreeModel *model,
const gchar *title,
em_select_folder (const gchar *title,
const gchar *oklabel,
const gchar *default_uri,
EMFTExcludeFunc exclude,
@ -47,11 +46,10 @@ em_select_folder (EMFolderTreeModel *model,
GtkWidget *dialog;
EMFolderTree *emft;
g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model));
g_return_if_fail (done != NULL);
/* XXX Do we leak this reference? */
emft = (EMFolderTree *) em_folder_tree_new_with_model (model);
emft = (EMFolderTree *) em_folder_tree_new ();
if (exclude)
em_folder_tree_set_excluded_func (emft, exclude, user_data);

View File

@ -24,12 +24,11 @@
#ifndef EM_FOLDER_SELECTION_H
#define EM_FOLDER_SELECTION_H
#include <mail/em-folder-tree-model.h>
#include <glib.h>
G_BEGIN_DECLS
void em_select_folder (EMFolderTreeModel *model,
const gchar *title,
void em_select_folder (const gchar *title,
const gchar *oklabel,
const gchar *default_uri,
EMFTExcludeFunc exclude,

View File

@ -56,10 +56,10 @@ static void
folder_selector_destroy (GtkObject *object)
{
EMFolderSelector *emfs = EM_FOLDER_SELECTOR (object);
EMFolderTreeModel *model;
GtkTreeModel *model;
if (emfs->created_id != 0) {
model = em_folder_tree_get_model (emfs->emft);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (emfs->emft));
g_signal_handler_disconnect (model, emfs->created_id);
emfs->created_id = 0;
}

View File

@ -52,7 +52,7 @@
#include <camel/camel-folder.h>
#include <camel/camel-vee-store.h>
#include "e-mail-shell-backend.h"
#include "e-mail-local.h"
#define d(x)
@ -61,8 +61,6 @@
((obj), EM_TYPE_FOLDER_TREE_MODEL, EMFolderTreeModelPrivate))
struct _EMFolderTreeModelPrivate {
gpointer shell_backend; /* weak pointer */
/* This is set by EMailShellSidebar. It allows new EMFolderTree
* instances to initialize their selection and expanded states to
* mimic the sidebar. */
@ -85,7 +83,6 @@ struct _EMFolderTreeModelPrivate {
enum {
PROP_0,
PROP_SHELL_BACKEND,
PROP_SELECTION
};
@ -243,19 +240,6 @@ folder_tree_model_selection_finalized_cb (EMFolderTreeModel *model)
g_object_notify (G_OBJECT (model), "selection");
}
static void
folder_tree_model_set_shell_backend (EMFolderTreeModel *model,
EShellBackend *shell_backend)
{
g_return_if_fail (model->priv->shell_backend == NULL);
model->priv->shell_backend = shell_backend;
g_object_add_weak_pointer (
G_OBJECT (shell_backend),
&model->priv->shell_backend);
}
static void
folder_tree_model_set_property (GObject *object,
guint property_id,
@ -263,12 +247,6 @@ folder_tree_model_set_property (GObject *object,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_SHELL_BACKEND:
folder_tree_model_set_shell_backend (
EM_FOLDER_TREE_MODEL (object),
g_value_get_object (value));
return;
case PROP_SELECTION:
em_folder_tree_model_set_selection (
EM_FOLDER_TREE_MODEL (object),
@ -286,13 +264,6 @@ folder_tree_model_get_property (GObject *object,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_SHELL_BACKEND:
g_value_set_object (
value,
em_folder_tree_model_get_mail_shell_backend (
EM_FOLDER_TREE_MODEL (object)));
return;
case PROP_SELECTION:
g_value_set_object (
value,
@ -311,12 +282,6 @@ folder_tree_model_dispose (GObject *object)
priv = EM_FOLDER_TREE_MODEL_GET_PRIVATE (object);
if (priv->shell_backend != NULL) {
g_object_remove_weak_pointer (
G_OBJECT (priv->shell_backend), &priv->shell_backend);
priv->shell_backend = NULL;
}
if (priv->selection != NULL) {
g_object_weak_unref (
G_OBJECT (priv->selection), (GWeakNotify)
@ -362,17 +327,6 @@ folder_tree_model_class_init (EMFolderTreeModelClass *class)
object_class->dispose = folder_tree_model_dispose;
object_class->finalize = folder_tree_model_finalize;
g_object_class_install_property (
object_class,
PROP_SHELL_BACKEND,
g_param_spec_object (
"shell-backend",
_("Shell Backend"),
NULL,
E_TYPE_SHELL_BACKEND,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (
object_class,
PROP_SELECTION,
@ -500,22 +454,20 @@ em_folder_tree_model_get_type (void)
}
EMFolderTreeModel *
em_folder_tree_model_new (EMailShellBackend *mail_shell_backend)
em_folder_tree_model_new (void)
{
g_return_val_if_fail (
E_IS_MAIL_SHELL_BACKEND (mail_shell_backend), NULL);
return g_object_new (
EM_TYPE_FOLDER_TREE_MODEL,
"shell-backend", mail_shell_backend, NULL);
return g_object_new (EM_TYPE_FOLDER_TREE_MODEL, NULL);
}
EMailShellBackend *
em_folder_tree_model_get_mail_shell_backend (EMFolderTreeModel *model)
EMFolderTreeModel *
em_folder_tree_model_get_default (void)
{
g_return_val_if_fail (EM_IS_FOLDER_TREE_MODEL (model), NULL);
static EMFolderTreeModel *default_folder_tree_model;
return model->priv->shell_backend;
if (G_UNLIKELY (default_folder_tree_model == NULL))
default_folder_tree_model = em_folder_tree_model_new ();
return default_folder_tree_model;
}
GtkTreeSelection *
@ -559,8 +511,6 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model,
CamelFolderInfo *fi,
gint fully_loaded)
{
EShellBackend *shell_backend;
EMailShellBackend *mail_shell_backend;
GtkTreeRowReference *uri_row, *path_row;
GtkTreeStore *tree_store;
guint unread;
@ -581,8 +531,6 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model,
return;
tree_store = GTK_TREE_STORE (model);
shell_backend = model->priv->shell_backend;
mail_shell_backend = E_MAIL_SHELL_BACKEND (shell_backend);
if (!fully_loaded)
load = fi->child == NULL && !(fi->flags & (CAMEL_FOLDER_NOCHILDREN | CAMEL_FOLDER_NOINFERIORS));
@ -605,10 +553,8 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model,
CamelFolder *local_drafts;
CamelFolder *local_outbox;
local_drafts = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_outbox = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_drafts = e_mail_local_get_folder (E_MAIL_FOLDER_DRAFTS);
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
if (folder == local_outbox) {
gint total;
@ -641,7 +587,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model,
/* TODO: maybe this should be handled by mail_get_folderinfo (except em-folder-tree doesn't use it, duh) */
flags = fi->flags;
name = fi->name;
if (si->store == e_mail_shell_backend_get_local_store (mail_shell_backend)) {
if (si->store == e_mail_local_get_store ()) {
if (!strcmp(fi->full_name, "Drafts")) {
name = _("Drafts");
is_drafts = TRUE;

View File

@ -26,7 +26,6 @@
#include <gtk/gtk.h>
#include <camel/camel-store.h>
#include <libedataserver/e-account-list.h>
#include <mail/e-mail-shell-backend.h>
/* Standard GObject macros */
#define EM_TYPE_FOLDER_TREE_MODEL \
@ -111,10 +110,9 @@ struct _EMFolderTreeModelClass {
GType em_folder_tree_model_get_type (void);
EMFolderTreeModel *
em_folder_tree_model_new(EMailShellBackend *mail_shell_backend);
EMailShellBackend *
em_folder_tree_model_get_mail_shell_backend
(EMFolderTreeModel *model);
em_folder_tree_model_new (void);
EMFolderTreeModel *
em_folder_tree_model_get_default(void);
GtkTreeSelection *
em_folder_tree_model_get_selection
(EMFolderTreeModel *model);

View File

@ -73,7 +73,7 @@
#include "em-folder-properties.h"
#include "em-event.h"
#include "e-mail-shell-backend.h"
#include "e-mail-local.h"
#define d(x)
@ -89,8 +89,6 @@ struct _selected_uri {
};
struct _EMFolderTreePrivate {
EMFolderTreeModel *model;
GSList *select_uris; /* selected_uri structures of each path pending selection. */
GHashTable *select_uris_table; /*Removed as they're encountered, so use this to find uri's not presnet but selected */
@ -200,12 +198,11 @@ emft_get_folder_info__exec (struct _EMFolderTreeGetFolderInfo *m)
static void
emft_get_folder_info__done (struct _EMFolderTreeGetFolderInfo *m)
{
EMFolderTreePrivate *priv = m->emft->priv;
struct _EMFolderTreeModelStoreInfo *si;
GtkTreeIter root, iter, titer;
CamelFolderInfo *fi;
GtkTreeView *tree_view;
GtkTreeStore *model;
GtkTreeModel *model;
GtkTreePath *path;
gboolean is_store;
@ -216,21 +213,24 @@ emft_get_folder_info__done (struct _EMFolderTreeGetFolderInfo *m)
if (!gtk_tree_row_reference_valid (m->root))
return;
si = em_folder_tree_model_lookup_store_info (priv->model, m->store);
tree_view = GTK_TREE_VIEW (m->emft);
model = gtk_tree_view_get_model (tree_view);
si = em_folder_tree_model_lookup_store_info (
EM_FOLDER_TREE_MODEL (model), m->store);
if (si == NULL) {
/* store has been removed in the interim - do nothing */
return;
}
tree_view = GTK_TREE_VIEW (m->emft);
model = (GtkTreeStore *) gtk_tree_view_get_model (tree_view);
path = gtk_tree_row_reference_get_path (m->root);
gtk_tree_model_get_iter ((GtkTreeModel *) model, &root, path);
gtk_tree_model_get_iter (model, &root, path);
/* if we had an error, then we need to re-set the load subdirs state and collapse the node */
if (!m->fi && camel_exception_is_set(&m->base.ex)) {
gtk_tree_store_set(model, &root, COL_BOOL_LOAD_SUBDIRS, TRUE, -1);
gtk_tree_store_set(
GTK_TREE_STORE (model), &root,
COL_BOOL_LOAD_SUBDIRS, TRUE, -1);
gtk_tree_view_collapse_row (tree_view, path);
gtk_tree_path_free (path);
return;
@ -239,16 +239,14 @@ emft_get_folder_info__done (struct _EMFolderTreeGetFolderInfo *m)
gtk_tree_path_free (path);
/* make sure we still need to load the tree subfolders... */
gtk_tree_model_get ((GtkTreeModel *) model, &root,
COL_BOOL_IS_STORE, &is_store,
-1);
gtk_tree_model_get (model, &root, COL_BOOL_IS_STORE, &is_store, -1);
/* get the first child (which will be a dummy node) */
gtk_tree_model_iter_children ((GtkTreeModel *) model, &iter, &root);
gtk_tree_model_iter_children (model, &iter, &root);
/* Traverse to the last valid iter */
titer = iter;
while (gtk_tree_model_iter_next((GtkTreeModel *) model, &iter))
while (gtk_tree_model_iter_next (model, &iter))
titer = iter; /* Preserve the last valid iter */
iter = titer;
@ -264,10 +262,10 @@ emft_get_folder_info__done (struct _EMFolderTreeGetFolderInfo *m)
if (fi == NULL) {
/* no children afterall... remove the "Loading..." placeholder node */
gtk_tree_store_remove (model, &iter);
gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
if (is_store) {
path = gtk_tree_model_get_path ((GtkTreeModel *) model, &root);
path = gtk_tree_model_get_path (model, &root);
gtk_tree_view_collapse_row (tree_view, path);
gtk_tree_path_free (path);
return;
@ -279,14 +277,18 @@ emft_get_folder_info__done (struct _EMFolderTreeGetFolderInfo *m)
gboolean known = g_hash_table_lookup (si->full_hash, fi->full_name) != NULL;
if (!known)
em_folder_tree_model_set_folder_info (priv->model, &iter, si, fi, fully_loaded);
em_folder_tree_model_set_folder_info (
EM_FOLDER_TREE_MODEL (model),
&iter, si, fi, fully_loaded);
if ((fi = fi->next) != NULL && !known)
gtk_tree_store_append (model, &iter, &root);
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &root);
} while (fi != NULL);
}
gtk_tree_store_set (model, &root, COL_BOOL_LOAD_SUBDIRS, FALSE, -1);
gtk_tree_store_set (
GTK_TREE_STORE (model), &root,
COL_BOOL_LOAD_SUBDIRS, FALSE, -1);
}
static void
@ -447,11 +449,14 @@ static void
em_folder_tree_destroy (GtkObject *object)
{
EMFolderTreePrivate *priv;
GtkTreeModel *model;
priv = EM_FOLDER_TREE_GET_PRIVATE (object);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (object));
if (priv->loaded_row_id != 0) {
g_signal_handler_disconnect (priv->model, priv->loaded_row_id);
g_signal_handler_disconnect (model, priv->loaded_row_id);
priv->loaded_row_id = 0;
}
@ -468,8 +473,6 @@ em_folder_tree_destroy (GtkObject *object)
priv->autoexpand_id = 0;
}
priv->model = NULL;
/* Chain up to parent's destroy() method. */
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
@ -720,12 +723,16 @@ folder_tree_init (EMFolderTree *emft)
{
GtkTreeSelection *selection;
GHashTable *select_uris_table;
EMFolderTreeModel *model;
select_uris_table = g_hash_table_new (g_str_hash, g_str_equal);
emft->priv = EM_FOLDER_TREE_GET_PRIVATE (emft);
emft->priv->select_uris_table = select_uris_table;
model = em_folder_tree_model_get_default ();
gtk_tree_view_set_model (GTK_TREE_VIEW (emft), GTK_TREE_MODEL (model));
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (emft));
g_signal_connect_swapped (
@ -878,7 +885,7 @@ render_icon (GtkTreeViewColumn *column,
}
static GtkTreeView *
folder_tree_new (EMFolderTree *emft, EMFolderTreeModel *model)
folder_tree_new (EMFolderTree *emft)
{
GtkTreeSelection *selection;
GtkTreeViewColumn *column;
@ -892,8 +899,6 @@ folder_tree_new (EMFolderTree *emft, EMFolderTreeModel *model)
/* FIXME[KILL-BONOBO] Gross hack */
tree = GTK_WIDGET (emft);
gtk_tree_view_set_model (
GTK_TREE_VIEW (tree), GTK_TREE_MODEL (model));
GTK_WIDGET_SET_FLAGS(tree, GTK_CAN_FOCUS);
column = gtk_tree_view_column_new ();
@ -950,18 +955,20 @@ folder_tree_copy_selection_cb (GtkTreeModel *model,
}
static void
folder_tree_copy_state (EMFolderTree *emft,
EMFolderTreeModel *model)
folder_tree_copy_state (EMFolderTree *emft)
{
GtkTreeSelection *selection;
GtkTreeView *tree_view;
GtkTreeModel *model;
selection = em_folder_tree_model_get_selection (model);
tree_view = GTK_TREE_VIEW (emft);
model = gtk_tree_view_get_model (tree_view);
selection = em_folder_tree_model_get_selection (
EM_FOLDER_TREE_MODEL (model));
if (selection == NULL)
return;
tree_view = gtk_tree_selection_get_tree_view (selection);
gtk_tree_view_map_expanded_rows (
tree_view, (GtkTreeViewMappingFunc)
folder_tree_copy_expanded_cb, emft);
@ -972,13 +979,10 @@ folder_tree_copy_state (EMFolderTree *emft,
}
static void
em_folder_tree_construct (EMFolderTree *emft, EMFolderTreeModel *model)
em_folder_tree_construct (EMFolderTree *emft)
{
EMFolderTreePrivate *priv = emft->priv;
priv->model = model;
folder_tree_new (emft, model);
folder_tree_copy_state (emft, model);
folder_tree_new (emft);
folder_tree_copy_state (emft);
gtk_widget_show (GTK_WIDGET (emft));
}
@ -1004,13 +1008,12 @@ emft_select_uri(EMFolderTree *emft, GtkTreePath *path, struct _selected_uri *u)
}
static void
emft_expand_node (EMFolderTreeModel *model, const gchar *key, EMFolderTree *emft)
emft_expand_node (const gchar *key, EMFolderTree *emft)
{
EMFolderTreePrivate *priv = emft->priv;
struct _EMFolderTreeModelStoreInfo *si;
EMailShellBackend *mail_shell_backend;
GtkTreeRowReference *row;
GtkTreeView *tree_view;
GtkTreeModel *model;
GtkTreePath *path;
EAccount *account;
CamelStore *store;
@ -1029,7 +1032,7 @@ emft_expand_node (EMFolderTreeModel *model, const gchar *key, EMFolderTree *emft
uid[n] = '\0';
tree_view = GTK_TREE_VIEW (emft);
mail_shell_backend = em_folder_tree_model_get_mail_shell_backend (model);
model = gtk_tree_view_get_model (tree_view);
if ((account = e_get_account_by_uid (uid)) && account->enabled) {
CamelException ex;
@ -1046,7 +1049,7 @@ emft_expand_node (EMFolderTreeModel *model, const gchar *key, EMFolderTree *emft
camel_object_ref (store);
} else if (!strcmp (uid, "local")) {
if (!(store = e_mail_shell_backend_get_local_store (mail_shell_backend)))
if (!(store = e_mail_local_get_store ()))
return;
camel_object_ref (store);
@ -1054,7 +1057,8 @@ emft_expand_node (EMFolderTreeModel *model, const gchar *key, EMFolderTree *emft
return;
}
si = em_folder_tree_model_lookup_store_info (priv->model, store);
si = em_folder_tree_model_lookup_store_info (
EM_FOLDER_TREE_MODEL (model), store);
if (si == NULL) {
camel_object_unref (store);
return;
@ -1115,7 +1119,7 @@ emft_maybe_expand_row (EMFolderTreeModel *model, GtkTreePath *tree_path, GtkTree
gchar *c = strrchr (key, '/');
*c = '\0';
emft_expand_node (model, key, emft);
emft_expand_node (key, emft);
emft_select_uri(emft, tree_path, u);
}
@ -1125,17 +1129,23 @@ emft_maybe_expand_row (EMFolderTreeModel *model, GtkTreePath *tree_path, GtkTree
}
GtkWidget *
em_folder_tree_new_with_model (EMFolderTreeModel *model)
em_folder_tree_new (void)
{
EMFolderTree *emft;
GtkTreeModel *model;
AtkObject *a11y;
emft = g_object_new (EM_TYPE_FOLDER_TREE, NULL);
em_folder_tree_construct (emft, model);
g_object_ref (model);
em_folder_tree_construct (emft);
emft->priv->loading_row_id = g_signal_connect (model, "loading-row", G_CALLBACK (emft_maybe_expand_row), emft);
emft->priv->loaded_row_id = g_signal_connect (model, "loaded-row", G_CALLBACK (emft_maybe_expand_row), emft);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (emft));
emft->priv->loading_row_id = g_signal_connect (
model, "loading-row",
G_CALLBACK (emft_maybe_expand_row), emft);
emft->priv->loaded_row_id = g_signal_connect (
model, "loaded-row",
G_CALLBACK (emft_maybe_expand_row), emft);
a11y = gtk_widget_get_accessible (GTK_WIDGET (emft));
atk_object_set_name (a11y, _("Mail Folder Tree"));
@ -1168,6 +1178,7 @@ tree_drag_data_delete(GtkWidget *widget, GdkDragContext *context, EMFolderTree *
{
EMFolderTreePrivate *priv = emft->priv;
gchar *full_name = NULL;
GtkTreeModel *model;
GtkTreePath *src_path;
gboolean is_store;
CamelStore *store;
@ -1177,13 +1188,16 @@ tree_drag_data_delete(GtkWidget *widget, GdkDragContext *context, EMFolderTree *
if (!priv->drag_row || (src_path = gtk_tree_row_reference_get_path (priv->drag_row)))
return;
if (!gtk_tree_model_get_iter((GtkTreeModel *)priv->model, &iter, src_path))
model = gtk_tree_view_get_model (GTK_TREE_VIEW (emft));
if (!gtk_tree_model_get_iter (model, &iter, src_path))
goto fail;
gtk_tree_model_get((GtkTreeModel *)priv->model, &iter,
COL_POINTER_CAMEL_STORE, &store,
COL_STRING_FULL_NAME, &full_name,
COL_BOOL_IS_STORE, &is_store, -1);
gtk_tree_model_get (
model, &iter,
COL_POINTER_CAMEL_STORE, &store,
COL_STRING_FULL_NAME, &full_name,
COL_BOOL_IS_STORE, &is_store, -1);
if (is_store)
goto fail;
@ -1202,6 +1216,7 @@ tree_drag_data_get(GtkWidget *widget, GdkDragContext *context, GtkSelectionData
{
EMFolderTreePrivate *priv = emft->priv;
gchar *full_name = NULL, *uri = NULL;
GtkTreeModel *model;
GtkTreePath *src_path;
CamelFolder *folder;
CamelStore *store;
@ -1211,13 +1226,16 @@ tree_drag_data_get(GtkWidget *widget, GdkDragContext *context, GtkSelectionData
if (!priv->drag_row || !(src_path = gtk_tree_row_reference_get_path(priv->drag_row)))
return;
if (!gtk_tree_model_get_iter((GtkTreeModel *)priv->model, &iter, src_path))
model = gtk_tree_view_get_model (GTK_TREE_VIEW (emft));
if (!gtk_tree_model_get_iter (model, &iter, src_path))
goto fail;
gtk_tree_model_get((GtkTreeModel *)priv->model, &iter,
COL_POINTER_CAMEL_STORE, &store,
COL_STRING_FULL_NAME, &full_name,
COL_STRING_URI, &uri, -1);
gtk_tree_model_get (
model, &iter,
COL_POINTER_CAMEL_STORE, &store,
COL_STRING_FULL_NAME, &full_name,
COL_STRING_URI, &uri, -1);
/* make sure user isn't trying to drag on a placeholder row */
if (full_name == NULL)
@ -1417,8 +1435,8 @@ emft_drop_popup_free(EPopup *ep, GSList *items, gpointer data)
static void
tree_drag_data_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection, guint info, guint time, EMFolderTree *emft)
{
EMFolderTreePrivate *priv = emft->priv;
GtkTreeViewDropPosition pos;
GtkTreeModel *model;
GtkTreeView *tree_view;
GtkTreePath *dest_path;
struct _DragDataReceivedAsync *m;
@ -1429,6 +1447,7 @@ tree_drag_data_received(GtkWidget *widget, GdkDragContext *context, gint x, gint
gint i;
tree_view = GTK_TREE_VIEW (emft);
model = gtk_tree_view_get_model (tree_view);
if (!gtk_tree_view_get_dest_row_at_pos (tree_view, x, y, &dest_path, &pos))
return;
@ -1439,15 +1458,16 @@ tree_drag_data_received(GtkWidget *widget, GdkDragContext *context, gint x, gint
return;
}
if (!gtk_tree_model_get_iter((GtkTreeModel *)priv->model, &iter, dest_path)) {
if (!gtk_tree_model_get_iter (model, &iter, dest_path)) {
gtk_drag_finish(context, FALSE, FALSE, GDK_CURRENT_TIME);
return;
}
gtk_tree_model_get((GtkTreeModel *)priv->model, &iter,
COL_POINTER_CAMEL_STORE, &store,
COL_BOOL_IS_STORE, &is_store,
COL_STRING_FULL_NAME, &full_name, -1);
gtk_tree_model_get (
model, &iter,
COL_POINTER_CAMEL_STORE, &store,
COL_BOOL_IS_STORE, &is_store,
COL_STRING_FULL_NAME, &full_name, -1);
/* make sure user isn't try to drop on a placeholder row */
if (full_name == NULL && !is_store) {
@ -1508,26 +1528,29 @@ emft_drop_target(EMFolderTree *emft, GdkDragContext *context, GtkTreePath *path)
EMFolderTreePrivate *p = emft->priv;
gchar *full_name = NULL, *uri = NULL, *src_uri = NULL;
CamelStore *local, *sstore, *dstore;
EMailShellBackend *mail_shell_backend;
GdkAtom atom = GDK_NONE;
gboolean is_store;
GtkTreeModel *model;
GtkTreeIter iter;
GList *targets;
guint32 flags = 0;
model = gtk_tree_view_get_model (GTK_TREE_VIEW (emft));
/* This is a bit of a mess, but should handle all the cases properly */
if (!gtk_tree_model_get_iter((GtkTreeModel *)p->model, &iter, path))
if (!gtk_tree_model_get_iter (model, &iter, path))
return GDK_NONE;
gtk_tree_model_get((GtkTreeModel *)p->model, &iter, COL_BOOL_IS_STORE, &is_store,
COL_STRING_FULL_NAME, &full_name,
COL_UINT_FLAGS, &flags,
COL_POINTER_CAMEL_STORE, &dstore,
COL_STRING_URI, &uri, -1);
gtk_tree_model_get (
model, &iter,
COL_BOOL_IS_STORE, &is_store,
COL_STRING_FULL_NAME, &full_name,
COL_UINT_FLAGS, &flags,
COL_POINTER_CAMEL_STORE, &dstore,
COL_STRING_URI, &uri, -1);
mail_shell_backend = em_folder_tree_model_get_mail_shell_backend (p->model);
local = e_mail_shell_backend_get_local_store (mail_shell_backend);
local = e_mail_local_get_store ();
targets = context->targets;
@ -1569,10 +1592,11 @@ emft_drop_target(EMFolderTree *emft, GdkDragContext *context, GtkTreePath *path)
GtkTreePath *src_path = gtk_tree_row_reference_get_path(p->drag_row);
if (src_path) {
if (gtk_tree_model_get_iter((GtkTreeModel *)p->model, &iter, src_path))
gtk_tree_model_get((GtkTreeModel *)p->model, &iter,
COL_POINTER_CAMEL_STORE, &sstore,
COL_STRING_URI, &src_uri, -1);
if (gtk_tree_model_get_iter (model, &iter, src_path))
gtk_tree_model_get (
model, &iter,
COL_POINTER_CAMEL_STORE, &sstore,
COL_STRING_URI, &src_uri, -1);
/* can't dnd onto itself or below itself - bad things happen,
no point dragging to where we were either */
@ -1831,9 +1855,9 @@ static gboolean
tree_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time, EMFolderTree *emft)
{
EMFolderTreePrivate *priv = emft->priv;
GtkTreeModel *model = (GtkTreeModel *) priv->model;
GtkTreeViewDropPosition pos;
GtkTreeView *tree_view;
GtkTreeModel *model;
GdkDragAction action = 0;
GtkTreePath *path;
GtkTreeIter iter;
@ -1841,6 +1865,7 @@ tree_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, gu
gint i;
tree_view = GTK_TREE_VIEW (emft);
model = gtk_tree_view_get_model (tree_view);
if (!gtk_tree_view_get_dest_row_at_pos(tree_view, x, y, &path, &pos))
return FALSE;
@ -2076,7 +2101,7 @@ em_folder_tree_set_selected_list (EMFolderTree *emft, GList *list, gboolean expa
end = strrchr(expand_key, '/');
do {
emft_expand_node(priv->model, expand_key, emft);
emft_expand_node(expand_key, emft);
*end = 0;
end = strrchr(expand_key, '/');
} while (end);
@ -2392,14 +2417,6 @@ em_folder_tree_get_selected_folder_info (EMFolderTree *emft)
return fi;
}
EMFolderTreeModel *
em_folder_tree_get_model (EMFolderTree *emft)
{
g_return_val_if_fail (EM_IS_FOLDER_TREE (emft), NULL);
return emft->priv->model;
}
void
em_folder_tree_set_skip_double_click (EMFolderTree *emft, gboolean skip)
{

View File

@ -82,8 +82,8 @@ struct _EMFolderTreeClass {
void (*popup_event) (EMFolderTree *emft);
};
GType em_folder_tree_get_type (void);
GtkWidget *em_folder_tree_new_with_model (EMFolderTreeModel *model);
GType em_folder_tree_get_type (void);
GtkWidget * em_folder_tree_new (void);
void em_folder_tree_enable_drag_and_drop (EMFolderTree *emft);
@ -102,8 +102,6 @@ gchar *em_folder_tree_get_selected_path (EMFolderTree *emft);
CamelFolder *em_folder_tree_get_selected_folder (EMFolderTree *emft);
CamelFolderInfo *em_folder_tree_get_selected_folder_info (EMFolderTree *emft);
EMFolderTreeModel *em_folder_tree_get_model (EMFolderTree *emft);
gboolean em_folder_tree_create_folder (EMFolderTree *emft, const gchar *full_name, const gchar *uri);
void em_folder_tree_set_skip_double_click (EMFolderTree *emft, gboolean skip);

View File

@ -69,7 +69,8 @@
#include "em-folder-selection.h"
#include "em-folder-properties.h"
#include "e-mail-shell-backend.h"
#include "e-mail-local.h"
#include "e-mail-store.h"
#define d(x)
@ -281,7 +282,7 @@ emfu_copy_folder_selected (const gchar *uri, gpointer data)
camel_exception_init (&ex);
local_store = e_mail_shell_backend_get_local_store (global_mail_shell_backend);
local_store = e_mail_local_get_store ();
if (!(fromstore = camel_session_get_store (session, cfd->fi->uri, &ex))) {
e_error_run(NULL,
@ -355,13 +356,11 @@ emfu_copy_folder_exclude(EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter *i
/* FIXME: this interface references the folderinfo without copying it */
/* FIXME: these functions must be documented */
void
em_folder_utils_copy_folder (EMFolderTreeModel *model,
CamelFolderInfo *folderinfo,
em_folder_utils_copy_folder (CamelFolderInfo *folderinfo,
gint delete)
{
struct _copy_folder_data *cfd;
g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model));
g_return_if_fail (folderinfo != NULL);
cfd = g_malloc (sizeof (*cfd));
@ -369,7 +368,7 @@ em_folder_utils_copy_folder (EMFolderTreeModel *model,
cfd->delete = delete;
em_select_folder (
model, _("Select folder"),
_("Select folder"),
delete ? _("_Move") : _("C_opy"),
NULL, emfu_copy_folder_exclude,
emfu_copy_folder_selected, cfd);
@ -412,7 +411,7 @@ em_folder_utils_delete_folder (CamelFolder *folder)
GtkWidget *dialog;
gint flags = 0;
local_store = e_mail_shell_backend_get_local_store (global_mail_shell_backend);
local_store = e_mail_local_get_store ();
if (folder->parent_store == local_store && emfu_is_special_local_folder (folder->full_name)) {
dialog = e_error_new (NULL, "mail:no-delete-special-folder", folder->full_name, NULL);
@ -447,7 +446,7 @@ em_folder_utils_rename_folder (CamelFolder *folder)
gboolean done = FALSE;
gsize base_len;
local_store = e_mail_shell_backend_get_local_store (global_mail_shell_backend);
local_store = e_mail_local_get_store ();
/* don't allow user to rename one of the special local folders */
if (folder->parent_store == local_store && emfu_is_special_local_folder (folder->full_name)) {
@ -639,7 +638,7 @@ static void
emfu_popup_new_folder_response (EMFolderSelector *emfs, gint response, gpointer data)
{
EMFolderTreeModelStoreInfo *si;
EMFolderTreeModel *model;
GtkTreeModel *model;
const gchar *uri, *path;
CamelException ex;
CamelStore *store;
@ -663,8 +662,9 @@ emfu_popup_new_folder_response (EMFolderSelector *emfs, gint response, gpointer
return;
}
model = em_folder_tree_get_model (emfs->emft);
si = em_folder_tree_model_lookup_store_info (model, store);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (emfs->emft));
si = em_folder_tree_model_lookup_store_info (
EM_FOLDER_TREE_MODEL (model), store);
if (si == NULL) {
camel_object_unref (store);
g_return_if_reached();
@ -701,11 +701,9 @@ void
em_folder_utils_create_folder (CamelFolderInfo *folderinfo, EMFolderTree *emft, GtkWindow *parent)
{
EMFolderTree *folder_tree;
EMFolderTreeModel *model;
GtkWidget *dialog;
model = e_mail_shell_backend_get_folder_tree_model (global_mail_shell_backend);
folder_tree = (EMFolderTree *) em_folder_tree_new_with_model (model);
folder_tree = (EMFolderTree *) em_folder_tree_new ();
dialog = em_folder_selector_create_new (folder_tree, 0, _("Create Folder"), _("Specify where to create the folder:"));
if (folderinfo != NULL)

View File

@ -40,8 +40,7 @@ gint em_folder_utils_copy_folders (CamelStore *fromstore,
/* FIXME These API's are really busted. There is no consistency and
* most rely on the wrong data. */
void em_folder_utils_copy_folder (EMFolderTreeModel *model,
CamelFolderInfo *folderinfo,
void em_folder_utils_copy_folder (CamelFolderInfo *folderinfo,
gboolean delete);
void em_folder_utils_delete_folder (CamelFolder *folder);

View File

@ -72,13 +72,14 @@
#include "e-util/e-dialog-utils.h"
#include "e-util/e-error.h"
#include "widgets/misc/e-alert-activity.h"
#include "widgets/misc/e-attachment.h"
#include "em-utils.h"
#include "em-composer-utils.h"
#include "em-format-quote.h"
#include "em-account-editor.h"
#include "e-attachment.h"
#include "e-mail-local.h"
#include "e-mail-shell-backend.h"
static void emu_save_part_done (CamelMimePart *part, gchar *name, gint done, gpointer data);
@ -1382,8 +1383,8 @@ em_utils_folder_is_templates (CamelFolder *folder, const gchar *uri)
gint is = FALSE;
gchar *templates_uri;
local_templates_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_TEMPLATES);
local_templates_folder =
e_mail_local_get_folder (E_MAIL_FOLDER_TEMPLATES);
if (folder == local_templates_folder)
return TRUE;
@ -1433,8 +1434,8 @@ em_utils_folder_is_drafts(CamelFolder *folder, const gchar *uri)
gint is = FALSE;
gchar *drafts_uri;
local_drafts_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_drafts_folder =
e_mail_local_get_folder (E_MAIL_FOLDER_DRAFTS);
if (folder == local_drafts_folder)
return TRUE;
@ -1484,8 +1485,7 @@ em_utils_folder_is_sent(CamelFolder *folder, const gchar *uri)
gint is = FALSE;
gchar *sent_uri;
local_sent_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
local_sent_folder = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
if (folder == local_sent_folder)
return TRUE;
@ -1530,8 +1530,8 @@ em_utils_folder_is_outbox(CamelFolder *folder, const gchar *uri)
{
CamelFolder *local_outbox_folder;
local_outbox_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_outbox_folder =
e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
/* <Highlander>There can be only one.</Highlander> */
return folder == local_outbox_folder;

View File

@ -34,14 +34,13 @@
#include "camel/camel-url.h"
#include "em-vfolder-context.h"
#include "em-vfolder-rule.h"
#include "mail/e-mail-store.h"
#include "mail/em-utils.h"
#include "mail/em-folder-tree.h"
#include "mail/em-folder-selector.h"
#include "e-util/e-error.h"
#include "e-util/e-util-private.h"
#include "e-mail-shell-backend.h"
#define d(x)
static gint validate(FilterRule *);
@ -506,12 +505,10 @@ static void
source_add(GtkWidget *widget, struct _source_data *data)
{
EMFolderTree *emft;
EMFolderTreeModel *model;
GtkWidget *dialog;
model = e_mail_shell_backend_get_folder_tree_model (global_mail_shell_backend);
emft =(EMFolderTree *)em_folder_tree_new_with_model (model);
em_folder_tree_set_excluded(emft, EMFT_EXCLUDE_NOSELECT);
emft =(EMFolderTree *) em_folder_tree_new ();
em_folder_tree_set_excluded (emft, EMFT_EXCLUDE_NOSELECT);
dialog = em_folder_selector_new(emft, EM_FOLDER_SELECTOR_CAN_CREATE, _("Select Folder"), NULL, _("_Add"));
gtk_window_set_transient_for((GtkWindow *)dialog, (GtkWindow *)gtk_widget_get_toplevel(widget));

View File

@ -40,8 +40,11 @@
#include <camel/camel-exception.h>
#include "mail/e-mail-local.h"
#include "mail/e-mail-store.h"
#include "mail/e-mail-shell-backend.h"
#include "mail/em-folder-selection-button.h"
#include "mail/em-folder-tree-model.h"
#include "mail/mail-mt.h"
#include "mail-importer.h"
@ -72,21 +75,18 @@ static GtkWidget *
mbox_getwidget(EImport *ei, EImportTarget *target, EImportImporter *im)
{
GtkWidget *hbox, *w;
EMFolderTreeModel *model;
const gchar *local_inbox_folder_uri;
const gchar *local_inbox_uri;
local_inbox_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_INBOX);
model = e_mail_shell_backend_get_folder_tree_model (
global_mail_shell_backend);
local_inbox_uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_INBOX);
hbox = gtk_hbox_new(FALSE, 0);
w = gtk_label_new(_("Destination folder:"));
gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
w = em_folder_selection_button_new(model, _("Select folder"), _("Select folder to import into"));
em_folder_selection_button_set_selection((EMFolderSelectionButton *)w, local_inbox_folder_uri);
w = em_folder_selection_button_new(
_("Select folder"), _("Select folder to import into"));
em_folder_selection_button_set_selection((EMFolderSelectionButton *)w, local_inbox_uri);
g_signal_connect(w, "selected", G_CALLBACK(folder_selected), target);
gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);

View File

@ -48,6 +48,8 @@
#include "mail/mail-mt.h"
#include "mail/mail-tools.h"
#include "mail/e-mail-local.h"
#include "mail/e-mail-shell-backend.h"
#include "mail-importer.h"
@ -202,8 +204,7 @@ import_mbox_exec (struct _import_mbox_msg *m)
}
if (m->uri == NULL || m->uri[0] == 0)
folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_INBOX);
folder = e_mail_local_get_folder (E_MAIL_FOLDER_INBOX);
else
folder = mail_tool_uri_to_folder(m->uri, CAMEL_STORE_FOLDER_CREATE, &m->base.ex);

View File

@ -64,6 +64,7 @@
#include "mail-mt.h"
#include "mail-tools.h"
#include "e-mail-local.h"
#include "e-mail-shell-backend.h"
typedef struct {
@ -857,10 +858,10 @@ mail_config_uri_deleted (GCompareFunc uri_cmp, const gchar *uri)
const gchar *local_sent_folder_uri;
/* assumes these can't be removed ... */
local_drafts_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_sent_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
local_drafts_folder_uri =
e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS);
local_sent_folder_uri =
e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT);
account_list = e_get_account_list ();
iter = e_list_get_iterator ((EList *) account_list);

View File

@ -65,6 +65,9 @@
#include "em-event.h"
#include "e-mail-local.h"
#include "e-mail-store.h"
#define w(x)
#define d(x)
@ -109,8 +112,6 @@ struct _folder_update {
};
struct _store_info {
EMailShellBackend *mail_shell_backend;
GHashTable *folders; /* by full_name */
GHashTable *folders_uri; /* by uri */
@ -151,14 +152,14 @@ free_update(struct _folder_update *up)
}
static void
real_flush_updates (EMailShellBackend *mail_shell_backend)
real_flush_updates (void)
{
EShell *shell;
struct _EMFolderTreeModel *model;
EMFolderTreeModel *default_model;
struct _folder_update *up;
shell = e_shell_backend_get_shell (E_SHELL_BACKEND (mail_shell_backend));
model = e_mail_shell_backend_get_folder_tree_model (mail_shell_backend);
shell = e_shell_get_default ();
default_model = em_folder_tree_model_get_default ();
LOCK(info_lock);
while ((up = (struct _folder_update *)e_dlist_remhead(&updates))) {
@ -187,14 +188,17 @@ real_flush_updates (EMailShellBackend *mail_shell_backend)
}
/* update unread counts */
em_folder_tree_model_set_unread_count (model, up->store, up->full_name, up->unread);
em_folder_tree_model_set_unread_count (
default_model, up->store, up->full_name, up->unread);
if (up->uri) {
EMEvent *e = em_event_peek();
EMEventTargetFolder *t = em_event_target_new_folder(e, up->uri, up->new);
t->is_inbox = em_folder_tree_model_is_type_inbox (model, up->store, up->full_name);
t->name = em_folder_tree_model_get_folder_name (model, up->store, up->full_name);
t->is_inbox = em_folder_tree_model_is_type_inbox (
default_model, up->store, up->full_name);
t->name = em_folder_tree_model_get_folder_name (
default_model, up->store, up->full_name);
if (t->new > 0)
e_shell_event (
@ -233,13 +237,13 @@ real_flush_updates (EMailShellBackend *mail_shell_backend)
}
static void
flush_updates (EMailShellBackend *shell_backend)
flush_updates (void)
{
if (update_id == -1 && !e_dlist_empty(&updates))
update_id = mail_async_event_emit (
mail_async_event, MAIL_ASYNC_GUI,
(MailAsyncFunc) real_flush_updates,
shell_backend, NULL, NULL);
NULL, NULL, NULL);
}
static void
@ -252,7 +256,7 @@ unset_folder_info(struct _folder_info *mfi, gint delete, gint unsub)
if (mfi->folder) {
CamelFolder *folder = mfi->folder;
camel_object_unhook_event(folder, "folder_changed", folder_changed, mfi->store_info->mail_shell_backend);
camel_object_unhook_event(folder, "folder_changed", folder_changed, NULL);
camel_object_unhook_event(folder, "renamed", folder_renamed, NULL);
camel_object_unhook_event(folder, "finalize", folder_finalised, NULL);
}
@ -269,7 +273,7 @@ unset_folder_info(struct _folder_info *mfi, gint delete, gint unsub)
up->uri = g_strdup(mfi->uri);
e_dlist_addtail(&updates, (EDListNode *)up);
flush_updates(mfi->store_info->mail_shell_backend);
flush_updates();
}
}
@ -307,7 +311,6 @@ static void
update_1folder(struct _folder_info *mfi, gint new, CamelFolderInfo *info)
{
struct _folder_update *up;
EMailShellBackend *mail_shell_backend;
CamelFolder *folder;
CamelFolder *local_drafts;
CamelFolder *local_outbox;
@ -315,13 +318,9 @@ update_1folder(struct _folder_info *mfi, gint new, CamelFolderInfo *info)
gint unread = -1;
gint deleted;
mail_shell_backend = mfi->store_info->mail_shell_backend;
local_drafts = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_outbox = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_sent = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_SENT);
local_drafts = e_mail_local_get_folder (E_MAIL_FOLDER_DRAFTS);
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
local_sent = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
folder = mfi->folder;
if (folder) {
@ -366,7 +365,7 @@ update_1folder(struct _folder_info *mfi, gint new, CamelFolderInfo *info)
up->uri = g_strdup(mfi->uri);
camel_object_ref(up->store);
e_dlist_addtail(&updates, (EDListNode *)up);
flush_updates(mail_shell_backend);
flush_updates();
}
static void
@ -400,7 +399,7 @@ setup_folder(CamelFolderInfo *fi, struct _store_info *si)
up->add = TRUE;
e_dlist_addtail(&updates, (EDListNode *)up);
flush_updates(si->mail_shell_backend);
flush_updates();
}
}
@ -423,7 +422,6 @@ static void
folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
{
static time_t last_newmail = 0;
EMailShellBackend *mail_shell_backend = user_data;
CamelFolderChangeInfo *changes = event_data;
CamelFolder *folder = (CamelFolder *)o;
CamelFolder *local_drafts;
@ -439,12 +437,9 @@ folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
d(printf("folder '%s' changed\n", folder->full_name));
local_drafts = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_outbox = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_sent = e_mail_shell_backend_get_folder (
mail_shell_backend, E_MAIL_FOLDER_SENT);
local_drafts = e_mail_local_get_folder (E_MAIL_FOLDER_DRAFTS);
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
local_sent = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
if (!CAMEL_IS_VEE_FOLDER(folder)
&& folder != local_drafts
@ -541,7 +536,7 @@ void mail_note_folder(CamelFolder *folder)
UNLOCK(info_lock);
camel_object_hook_event(folder, "folder_changed", folder_changed, si->mail_shell_backend);
camel_object_hook_event(folder, "folder_changed", folder_changed, NULL);
camel_object_hook_event(folder, "renamed", folder_renamed, NULL);
camel_object_hook_event(folder, "finalize", folder_finalised, NULL);
}
@ -685,7 +680,7 @@ rename_folders(struct _store_info *si, const gchar *oldbase, const gchar *newbas
up->add = TRUE;
e_dlist_addtail(&updates, (EDListNode *)up);
flush_updates(si->mail_shell_backend);
flush_updates();
#if 0
if (fi->sibling)
rename_folders(si, oldbase, newbase, fi->sibling, folders);
@ -694,7 +689,7 @@ rename_folders(struct _store_info *si, const gchar *oldbase, const gchar *newbas
#endif
/* rename the meta-data we maintain ourselves */
shell_backend = E_SHELL_BACKEND (si->mail_shell_backend);
shell_backend = E_SHELL_BACKEND (global_mail_shell_backend);
config_dir = e_shell_backend_get_config_dir (shell_backend);
olduri = folder_to_url(si->store, old);
e_filename_make_safe(olduri);
@ -810,8 +805,6 @@ mail_note_store_remove(CamelStore *store)
if (si) {
g_hash_table_remove(stores, store);
g_object_unref(si->mail_shell_backend);
camel_object_unhook_event(store, "folder_opened", store_folder_opened, NULL);
camel_object_unhook_event(store, "folder_created", store_folder_created, NULL);
camel_object_unhook_event(store, "folder_deleted", store_folder_deleted, NULL);
@ -964,7 +957,7 @@ store_online_cb (CamelStore *store, gpointer data)
}
void
mail_note_store(EMailShellBackend *mail_shell_backend, CamelStore *store, CamelOperation *op,
mail_note_store(CamelStore *store, CamelOperation *op,
gboolean (*done)(CamelStore *store, CamelFolderInfo *info, gpointer data), gpointer data)
{
struct _store_info *si;
@ -973,7 +966,6 @@ mail_note_store(EMailShellBackend *mail_shell_backend, CamelStore *store, CamelO
guint timeout;
gint hook = 0;
g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
g_return_if_fail (CAMEL_IS_STORE(store));
g_return_if_fail (mail_in_main_thread());
@ -993,7 +985,6 @@ mail_note_store(EMailShellBackend *mail_shell_backend, CamelStore *store, CamelO
d(printf("Noting a new store: %p: %s\n", store, camel_url_to_string(((CamelService *)store)->url, 0)));
si = g_malloc0(sizeof(*si));
si->mail_shell_backend = g_object_ref (mail_shell_backend);
si->folders = g_hash_table_new(g_str_hash, g_str_equal);
si->folders_uri = g_hash_table_new(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->hash_folder_name,
CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name);

View File

@ -28,14 +28,12 @@
#include <camel/camel-store.h>
#include "e-mail-shell-backend.h"
/* 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_note_store (EMailShellBackend *mail_shell_backend, CamelStore *store, CamelOperation *op,
mail_note_store (CamelStore *store, CamelOperation *op,
gboolean (*done) (CamelStore *store, CamelFolderInfo *info, gpointer data),
gpointer data);

View File

@ -69,6 +69,7 @@
#include "mail-tools.h"
#include "mail-vfolder.h"
#include "e-mail-local.h"
#include "e-mail-shell-backend.h"
#define w(x)
@ -280,8 +281,7 @@ fetch_mail_exec (struct _fetch_mail_msg *m)
if (m->cancel)
camel_operation_register (m->cancel);
fm->destination = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_LOCAL_INBOX);
fm->destination = e_mail_local_get_folder (E_MAIL_FOLDER_LOCAL_INBOX);
if (fm->destination == NULL)
goto fail;
camel_object_ref (fm->destination);
@ -586,8 +586,7 @@ mail_send_message(CamelFolder *queue, const gchar *uid, const gchar *destination
}
if (!folder) {
folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
folder = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
camel_object_ref(folder);
}
@ -600,8 +599,7 @@ mail_send_message(CamelFolder *queue, const gchar *uid, const gchar *destination
if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_USER_CANCEL)
goto exit;
sent_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
sent_folder = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
if (folder != sent_folder) {
const gchar *name;
@ -703,8 +701,7 @@ send_queue_exec (struct _send_queue_msg *m)
d(printf("sending queue\n"));
sent_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
sent_folder = e_mail_local_get_folder (E_MAIL_FOLDER_SENT);
if (!(uids = camel_folder_get_uids (m->queue)))
return;

View File

@ -50,6 +50,7 @@
#include "e-util/e-account-utils.h"
#include "e-util/gconf-bridge.h"
#include "e-mail-local.h"
#include "e-mail-shell-backend.h"
#define d(x)
@ -164,8 +165,8 @@ setup_send_data(void)
g_str_hash, g_str_equal,
(GDestroyNotify) NULL,
(GDestroyNotify) free_folder_info);
data->inbox = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_LOCAL_INBOX);
data->inbox = e_mail_local_get_folder (
E_MAIL_FOLDER_LOCAL_INBOX);
camel_object_ref(data->inbox);
data->active = g_hash_table_new_full (
g_str_hash, g_str_equal,
@ -690,13 +691,12 @@ receive_done (const gchar *uri, gpointer data)
/* if we've been called to run again - run again */
if (info->type == SEND_SEND && info->state == SEND_ACTIVE && info->again) {
CamelFolder *local_outbox_folder;
CamelFolder *local_outbox;
local_outbox_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
info->again = 0;
mail_send_queue (local_outbox_folder,
mail_send_queue (local_outbox,
info->uri,
FILTER_SOURCE_OUTGOING,
info->cancel,
@ -908,7 +908,9 @@ receive_update_got_store (gchar *uri, CamelStore *store, gpointer data)
struct _send_info *info = data;
if (store) {
mail_note_store(global_mail_shell_backend, store, info->cancel, receive_update_got_folderinfo, info);
mail_note_store(
store, info->cancel,
receive_update_got_folderinfo, info);
} else {
receive_done("", info);
}
@ -917,7 +919,7 @@ receive_update_got_store (gchar *uri, CamelStore *store, gpointer data)
GtkWidget *
mail_send_receive (GtkWindow *parent)
{
CamelFolder *outbox_folder;
CamelFolder *local_outbox;
struct _send_data *data;
EAccountList *accounts;
EAccount *account;
@ -940,10 +942,9 @@ mail_send_receive (GtkWindow *parent)
accounts = e_get_account_list ();
outbox_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
data = build_dialog (
parent, accounts, outbox_folder, account->transport->url);
parent, accounts, local_outbox, account->transport->url);
scan = data->infos;
while (scan) {
struct _send_info *info = scan->data;
@ -959,7 +960,7 @@ mail_send_receive (GtkWindow *parent)
break;
case SEND_SEND:
/* todo, store the folder in info? */
mail_send_queue(outbox_folder, info->uri,
mail_send_queue(local_outbox, info->uri,
FILTER_SOURCE_OUTGOING,
info->cancel,
receive_get_folder, info,
@ -1129,7 +1130,7 @@ mail_receive_uri (const gchar *uri, gboolean keep_on_server)
{
struct _send_info *info;
struct _send_data *data;
CamelFolder *outbox_folder;
CamelFolder *local_outbox;
send_info_t type;
data = setup_send_data();
@ -1174,9 +1175,8 @@ mail_receive_uri (const gchar *uri, gboolean keep_on_server)
break;
case SEND_SEND:
/* todo, store the folder in info? */
outbox_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
mail_send_queue (outbox_folder, info->uri,
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
mail_send_queue (local_outbox, info->uri,
FILTER_SOURCE_OUTGOING,
info->cancel,
receive_get_folder, info,
@ -1194,7 +1194,7 @@ mail_receive_uri (const gchar *uri, gboolean keep_on_server)
void
mail_send (void)
{
CamelFolder *outbox_folder;
CamelFolder *local_outbox;
EAccountService *transport;
struct _send_info *info;
struct _send_data *data;
@ -1237,9 +1237,8 @@ mail_send (void)
g_hash_table_insert (data->active, (gpointer) SEND_URI_KEY, info);
/* todo, store the folder in info? */
outbox_folder = e_mail_shell_backend_get_folder (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
mail_send_queue (outbox_folder, info->uri,
local_outbox = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX);
mail_send_queue (local_outbox, info->uri,
FILTER_SOURCE_OUTGOING,
info->cancel,
receive_get_folder, info,

View File

@ -50,6 +50,8 @@
#include "mail-tools.h"
#include "mail-vfolder.h"
#include "e-mail-local.h"
#include "e-mail-store.h"
#include "e-mail-shell-backend.h"
#define d(x) /* (printf("%s:%s: ", G_STRLOC, G_STRFUNC), (x))*/
@ -339,26 +341,23 @@ uri_is_ignore(CamelStore *store, const gchar *uri)
EAccountList *accounts;
EAccount *account;
EIterator *iter;
const gchar *local_drafts_folder_uri;
const gchar *local_outbox_folder_uri;
const gchar *local_sent_folder_uri;
const gchar *local_drafts_uri;
const gchar *local_outbox_uri;
const gchar *local_sent_uri;
gint found = FALSE;
local_drafts_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS);
local_outbox_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX);
local_sent_folder_uri = e_mail_shell_backend_get_folder_uri (
global_mail_shell_backend, E_MAIL_FOLDER_SENT);
local_drafts_uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS);
local_outbox_uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_OUTBOX);
local_sent_uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT);
d(printf("checking '%s' against:\n %s\n %s\n %s\n", uri,
local_outbox_folder_uri,
local_sent_folder_uri,
local_drafts_folder_uri));
local_outbox_uri,
local_sent_uri,
local_drafts_uri));
found = camel_store_folder_uri_equal(store, local_outbox_folder_uri, uri)
|| camel_store_folder_uri_equal(store, local_sent_folder_uri, uri)
|| camel_store_folder_uri_equal(store, local_drafts_folder_uri, uri);
found = camel_store_folder_uri_equal(store, local_outbox_uri, uri)
|| camel_store_folder_uri_equal(store, local_sent_uri, uri)
|| camel_store_folder_uri_equal(store, local_drafts_uri, uri);
if (found)
return found;
@ -987,8 +986,7 @@ vfolder_load_storage(void)
g_signal_connect(context, "rule_removed", G_CALLBACK(context_rule_removed), context);
/* load store to mail component */
e_mail_shell_backend_load_store_by_uri (
global_mail_shell_backend, storeuri, _("Search Folders"));
e_mail_store_add_by_uri (storeuri, _("Search Folders"));
/* and setup the rules we have */
rule = NULL;