X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-account.c;h=94e18a5f8daf73647828ca0c87556106408f7cf7;hb=fc96f72a62af755e7832031864cb935270706023;hp=15b79c95f495bc4d3d2ed11ec3a9f9f1245fc7e1;hpb=ab00ec05f653b2f10b7907f1655b707c937bfaea;p=modest diff --git a/src/modest-tny-account.c b/src/modest-tny-account.c index 15b79c9..94e18a5 100644 --- a/src/modest-tny-account.c +++ b/src/modest-tny-account.c @@ -33,7 +33,10 @@ #include #include #include - +#include +#include +#include +#include /* for now, ignore the account ===> the special folders are the same, * local folders for all accounts @@ -51,9 +54,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; @@ -62,7 +65,7 @@ modest_tny_account_get_special_folder (TnyAccount *account, folders = TNY_LIST (tny_simple_list_new ()); /* no need to do this _async, as these are local folders */ - tny_folder_store_get_folders (TNY_FOLDER_STORE (account), + tny_folder_store_get_folders (TNY_FOLDER_STORE (local_account), folders, NULL, NULL); iter = tny_list_create_iterator (folders); @@ -73,10 +76,196 @@ modest_tny_account_get_special_folder (TnyAccount *account, special_folder = folder; break; } + g_object_unref (G_OBJECT(folder)); tny_iterator_next (iter); } g_object_unref (G_OBJECT (folders)); g_object_unref (G_OBJECT (iter)); + g_object_unref (G_OBJECT (local_account)); return special_folder; } + + +/** + * modest_tny_account_new_from_server_account: + * @account_mgr: a valid account mgr instance + * @account_name: the server account name for which to create a corresponding tny account + * @type: the type of account to create (TNY_ACCOUNT_TYPE_STORE or TNY_ACCOUNT_TYPE_TRANSPORT) + * + * get a tnyaccount corresponding to the server_accounts (store or transport) for this account. + * NOTE: this function does not set the camel session or the get/forget password functions + * + * Returns: a new TnyAccount or NULL in case of error. + */ +static TnyAccount* +modest_tny_account_new_from_server_account (ModestAccountMgr *account_mgr, + ModestServerAccountData *account_data) +{ + TnyAccount *tny_account; + + 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: + tny_account = TNY_ACCOUNT(tny_camel_transport_account_new ()); break; + case MODEST_PROTOCOL_STORE_POP: + tny_account = TNY_ACCOUNT(tny_camel_pop_store_account_new ()); break; + case MODEST_PROTOCOL_STORE_IMAP: + tny_account = TNY_ACCOUNT(tny_camel_imap_store_account_new ()); break; + case MODEST_PROTOCOL_STORE_MAILDIR: + case MODEST_PROTOCOL_STORE_MBOX: + tny_account = TNY_ACCOUNT(tny_camel_store_account_new()); break; + default: + g_return_val_if_reached (NULL); + } + if (!tny_account) { + g_printerr ("modest: could not create tny account for '%s'\n", + account_data->account_name); + return NULL; + } + tny_account_set_id (tny_account, account_data->account_name); + + /* 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 { + if (account_data->options) { + GSList *options = account_data->options; + while (options) { + tny_camel_account_add_option (TNY_CAMEL_ACCOUNT (tny_account), + options->data); + options = g_slist_next (options); + } + } + if (account_data->username) + tny_account_set_user (tny_account, account_data->username); + if (account_data->hostname) + tny_account_set_hostname (tny_account, account_data->hostname); + } + return tny_account; +} + + +/* 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, + 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); + return NULL; + } + + if (type == TNY_ACCOUNT_TYPE_STORE && account_data->store_account) + server_data = account_data->store_account; + else if (type == TNY_ACCOUNT_TYPE_TRANSPORT && account_data->transport_account) + server_data = account_data->transport_account; + if (!server_data) { + g_printerr ("modest: no %s account defined for '%s'\n", + type == TNY_ACCOUNT_TYPE_STORE ? "store" : "transport", + account_data->display_name); + modest_account_mgr_free_account_data (account_mgr, account_data); + return NULL; + } + + tny_account = modest_tny_account_new_from_server_account (account_mgr, server_data); + if (!tny_account) { + g_printerr ("modest: failed to create tny account for %s (%s)\n", + account_data->account_name, server_data->account_name); + modest_account_mgr_free_account_data (account_mgr, account_data); + 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); +} +