TnyList *store_accounts;
TnyList *transport_accounts;
TnyList *store_accounts_outboxes;
+
+ /* Matches transport accounts and outbox folder */
+ GHashTable *outbox_of_transport;
};
#define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
priv->session = NULL;
priv->device = NULL;
+ priv->outbox_of_transport =
+ g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ NULL);
+
/* An in-memory store of passwords,
* for passwords that are not remembered in the configuration,
* so they need to be asked for from the user once in each session:
priv->account_settings_dialog_hash = NULL;
}
+ if (priv->outbox_of_transport) {
+ g_hash_table_destroy (priv->outbox_of_transport);
+ priv->outbox_of_transport = NULL;
+ }
+
+
/* Disconnect VFS signals */
volume_monitor = gnome_vfs_get_volume_monitor ();
if (g_signal_handler_is_connected (volume_monitor,
local_account = modest_tny_account_store_get_local_folders_account (MODEST_TNY_ACCOUNT_STORE (self));
modest_tny_local_folders_account_add_folder_to_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account),
per_account_outbox);
+ /* Add the pair to the hash table */
+ g_hash_table_insert (priv->outbox_of_transport,
+ transport_account,
+ per_account_outbox);
+
+ /* Notify that the local folders account chaned */
+ if (notify)
+ g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account);
+
g_object_unref (local_account);
g_object_unref (per_account_outbox);
/* If there was any problem creating the account, for example,
with the configuration system this could not exist */
if (transport_account) {
+ TnyAccount *local_account = NULL;
+ TnyFolder *outbox = NULL;
+ ModestTnyAccountStorePrivate *priv = NULL;
+
+ /* Remove the OUTBOX of the account from the global outbox */
+ priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+ outbox = g_hash_table_lookup (priv->outbox_of_transport, transport_account);
+
+ if (TNY_IS_FOLDER (outbox)) {
+ local_account = modest_tny_account_store_get_local_folders_account (self);
+ modest_tny_local_folders_account_remove_folder_from_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account),
+ outbox);
+ g_hash_table_remove (priv->outbox_of_transport, transport_account);
+
+ /* Notify the change in the local account */
+ g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account);
+ g_object_unref (local_account);
+ } else {
+ g_warning ("Removing a transport account that has no outbox");
+ }
+
/* Notify the observers */
g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], 0, transport_account);
g_object_unref (transport_account);
/* Add outbox to the global OUTBOX folder */
tny_merge_folder_add_folder (priv->outbox_folder, per_account_outbox);
}
+
+void
+modest_tny_local_folders_account_remove_folder_from_outbox (ModestTnyLocalFoldersAccount *self,
+ TnyFolder *per_account_outbox)
+{
+ ModestTnyLocalFoldersAccountPrivate *priv;
+ TnyList *merged_folders = NULL;
+
+ g_return_if_fail (MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (self));
+ g_return_if_fail (TNY_IS_FOLDER (per_account_outbox));
+
+ priv = TNY_LOCAL_FOLDERS_ACCOUNT_GET_PRIVATE (self);
+
+ /* Remove outbox from the global OUTBOX folder */
+ tny_merge_folder_remove_folder (priv->outbox_folder, per_account_outbox);
+
+ /* If there is no folder in the outbox the delete it */
+ merged_folders = tny_simple_list_new ();
+ tny_merge_folder_get_folders (priv->outbox_folder, merged_folders);
+ if (tny_list_get_length (merged_folders) == 0) {
+ g_object_unref (priv->outbox_folder);
+ priv->outbox_folder = NULL;
+ }
+ g_object_unref (merged_folders);
+}
static void
-on_account_changed (TnyAccountStore *account_store, TnyAccount *tny_account,
+on_account_changed (TnyAccountStore *account_store,
+ TnyAccount *tny_account,
gpointer user_data)
{
/* do nothing */
+ ModestFolderViewPrivate *priv;
+ GtkTreeModel *sort_model, *filter_model;
+
+ /* Ignore transport account insertions, we're not showing them
+ in the folder view */
+ if (TNY_IS_TRANSPORT_ACCOUNT (tny_account))
+ return;
+
+ priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
+
+ /* Get the inner model */
+ filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+ sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+
+ /* Remove the account from the model */
+ tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
+ G_OBJECT (tny_account));
+
+ /* Insert the account in the model */
+ tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
+ G_OBJECT (tny_account));
}