X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-account.c;h=eee8fa1d89dd0ee92e8265d1444e56b826b2986c;hb=976c05744180efac28a9dc421acefcff18659d67;hp=6b38518bcb4e6cbf68fc77d8030b37baa6c33b60;hpb=ecfab159b04553dfa45f3f2cf2771a72264433f6;p=modest diff --git a/src/modest-tny-account.c b/src/modest-tny-account.c index 6b38518..eee8fa1 100644 --- a/src/modest-tny-account.c +++ b/src/modest-tny-account.c @@ -37,6 +37,7 @@ #include #include #include +#include /* for now, ignore the account ===> the special folders are the same, * local folders for all accounts @@ -54,9 +55,9 @@ modest_tny_account_get_special_folder (TnyAccount *account, g_return_val_if_fail (account, NULL); g_return_val_if_fail (0 <= special_type && special_type < TNY_FOLDER_TYPE_NUM, NULL); - - local_account = modest_tny_account_store_get_local_folders_account - (modest_runtime_get_account_store()); + + local_account = modest_tny_account_store_get_tny_account_by_id (modest_runtime_get_account_store(), + MODEST_LOCAL_FOLDERS_ACCOUNT_ID); if (!local_account) { g_printerr ("modest: cannot get local account\n"); return NULL; @@ -81,6 +82,7 @@ modest_tny_account_get_special_folder (TnyAccount *account, } g_object_unref (G_OBJECT (folders)); g_object_unref (G_OBJECT (iter)); + g_object_unref (G_OBJECT (local_account)); return special_folder; } @@ -105,14 +107,14 @@ modest_tny_account_new_from_server_account (ModestAccountMgr *account_mgr, g_return_val_if_fail (account_mgr, NULL); g_return_val_if_fail (account_data, NULL); - + /* sanity checks */ if (account_data->proto == MODEST_PROTOCOL_UNKNOWN) { g_printerr ("modest: '%s' does not provide a protocol\n", account_data->account_name); return NULL; } - + switch (account_data->proto) { case MODEST_PROTOCOL_TRANSPORT_SENDMAIL: case MODEST_PROTOCOL_TRANSPORT_SMTP: @@ -134,20 +136,9 @@ modest_tny_account_new_from_server_account (ModestAccountMgr *account_mgr, } tny_account_set_id (tny_account, account_data->account_name); - /* - * FIXME --> bug in tinymail - */ - if (account_data->proto == MODEST_PROTOCOL_TRANSPORT_SENDMAIL || - account_data->proto == MODEST_PROTOCOL_TRANSPORT_SMTP) { - g_printerr ("modest: BUG: cannot create transports accounts... stay tuned\n"); - g_object_unref (G_OBJECT(tny_account)); - return NULL; - } - /* Proto */ tny_account_set_proto (tny_account, modest_protocol_info_get_protocol_name(account_data->proto)); - if (account_data->uri) tny_account_set_url_string (TNY_ACCOUNT(tny_account), account_data->uri); else { @@ -168,14 +159,32 @@ modest_tny_account_new_from_server_account (ModestAccountMgr *account_mgr, } +/* we need these dummy functions, or tinymail will complain */ +static gchar* +get_pass_dummy (TnyAccount *account, const gchar *prompt, gboolean *cancel) +{ + return NULL; +} +static void +forget_pass_dummy (TnyAccount *account) +{ + /* intentionally left blank */ +} + TnyAccount* modest_tny_account_new_from_account (ModestAccountMgr *account_mgr, const gchar *account_name, - TnyAccountType type) + TnyAccountType type, + TnySessionCamel *session, + TnyGetPassFunc get_pass_func, + TnyForgetPassFunc forget_pass_func) { TnyAccount *tny_account = NULL; ModestAccountData *account_data = NULL; ModestServerAccountData *server_data = NULL; - + + g_return_val_if_fail (account_mgr, NULL); + g_return_val_if_fail (account_name, NULL); + account_data = modest_account_mgr_get_account_data (account_mgr, account_name); if (!account_data) { g_printerr ("modest: cannot get account data for account %s\n", account_name); @@ -202,12 +211,170 @@ modest_tny_account_new_from_account (ModestAccountMgr *account_mgr, const gchar return NULL; } + tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account), session); + tny_account_set_forget_pass_func (tny_account, + forget_pass_func ? forget_pass_func : forget_pass_dummy); + tny_account_set_pass_func (tny_account, + get_pass_func ? get_pass_func: get_pass_dummy); + /* this name is what shows up in the folder view -- so for some POP/IMAP/... server * account, we set its name to the acount of which it is part */ if (account_data->display_name) tny_account_set_name (tny_account, account_data->display_name); + g_object_set_data_full (G_OBJECT(tny_account), "modest_account", + (gpointer*) g_strdup (account_name), g_free); + modest_account_mgr_free_account_data (account_mgr, account_data); return tny_account; } + +TnyAccount* +modest_tny_account_new_for_local_folders (ModestAccountMgr *account_mgr, TnySessionCamel *session) +{ + TnyStoreAccount *tny_account; + CamelURL *url; + gchar *maildir, *url_string; + + g_return_val_if_fail (account_mgr, NULL); + + tny_account = tny_camel_store_account_new (); + if (!tny_account) { + g_printerr ("modest: cannot create account for local folders"); + return NULL; + } + tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account), session); + + maildir = modest_local_folder_info_get_maildir_path (); + url = camel_url_new ("maildir:", NULL); + camel_url_set_path (url, maildir); + /* Needed by tinymail's DBC assertions */ + camel_url_set_host (url, "localhost"); + url_string = camel_url_to_string (url, 0); + + tny_account_set_url_string (TNY_ACCOUNT(tny_account), url_string); + + tny_account_set_name (TNY_ACCOUNT(tny_account), MODEST_LOCAL_FOLDERS_DEFAULT_DISPLAY_NAME); + tny_account_set_id (TNY_ACCOUNT(tny_account), MODEST_LOCAL_FOLDERS_ACCOUNT_ID); + tny_account_set_forget_pass_func (TNY_ACCOUNT(tny_account), forget_pass_dummy); + tny_account_set_pass_func (TNY_ACCOUNT(tny_account), get_pass_dummy); + + g_object_set_data (G_OBJECT(tny_account), "modest_account", + (gpointer*)MODEST_LOCAL_FOLDERS_ACCOUNT_ID); + + camel_url_free (url); + g_free (maildir); + g_free (url_string); + + return TNY_ACCOUNT(tny_account); +} + +typedef gint (*TnyStatsFunc) (TnyFolderStats *stats); + +typedef struct _RecurseFoldersHelper { + TnyStatsFunc function; + guint sum; + guint folders; +} RecurseFoldersHelper; + +static void +recurse_folders (TnyFolderStore *store, + TnyFolderStoreQuery *query, + RecurseFoldersHelper *helper) +{ + TnyIterator *iter; + TnyList *folders = tny_simple_list_new (); + + tny_folder_store_get_folders (store, folders, query, NULL); + iter = tny_list_create_iterator (folders); + + helper->folders += tny_list_get_length (folders); + + while (!tny_iterator_is_done (iter)) + { + TnyFolderStats *stats; + TnyFolder *folder; + + folder = TNY_FOLDER (tny_iterator_get_current (iter)); + stats = tny_folder_get_stats (folder); + + if (helper->function) + helper->sum += helper->function (stats); + + recurse_folders (TNY_FOLDER_STORE (folder), query, helper); + + g_object_unref (folder); + g_object_unref (stats); + tny_iterator_next (iter); + } + g_object_unref (G_OBJECT (iter)); + g_object_unref (G_OBJECT (folders)); +} + +gint +modest_tny_account_get_folder_count (TnyAccount *self) +{ + RecurseFoldersHelper *helper; + gint retval; + + g_return_val_if_fail (TNY_IS_ACCOUNT (self), -1); + + /* Create helper */ + helper = g_malloc0 (sizeof (RecurseFoldersHelper)); + helper->function = NULL; + helper->sum = 0; + helper->folders = 0; + + recurse_folders (TNY_FOLDER_STORE (self), NULL, helper); + + retval = helper->folders; + + g_free (helper); + + return retval; +} + +gint +modest_tny_account_get_message_count (TnyAccount *self) +{ + RecurseFoldersHelper *helper; + gint retval; + + g_return_val_if_fail (TNY_IS_ACCOUNT (self), -1); + + /* Create helper */ + helper = g_malloc0 (sizeof (RecurseFoldersHelper)); + helper->function = (TnyStatsFunc) tny_folder_stats_get_all_count; + helper->sum = 0; + + recurse_folders (TNY_FOLDER_STORE (self), NULL, helper); + + retval = helper->sum; + + g_free (helper); + + return retval; +} + +gint +modest_tny_account_get_local_size (TnyAccount *self) +{ + RecurseFoldersHelper *helper; + gint retval; + + g_return_val_if_fail (TNY_IS_ACCOUNT (self), -1); + + /* Create helper */ + helper = g_malloc0 (sizeof (RecurseFoldersHelper)); + helper->function = (TnyStatsFunc) tny_folder_stats_get_local_size; + helper->sum = 0; + + recurse_folders (TNY_FOLDER_STORE (self), NULL, helper); + + retval = helper->sum; + + g_free (helper); + + return retval; +}