+/** The application should call this when the user changes should be saved.
+ */
+gboolean
+modest_connection_specific_smtp_window_save_server_accounts (ModestConnectionSpecificSmtpWindow *self)
+{
+ ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
+ ModestConnectionSpecificSmtpWindowPrivate *priv =
+ CONNECTION_SPECIFIC_SMTP_WINDOW_GET_PRIVATE (self);
+
+
+ /* Get the first iter in the list */
+ GtkTreeIter iter;
+ gboolean valid = gtk_tree_model_get_iter_first (priv->model, &iter);
+
+ /* Walk through the list, reading each row */
+ while (valid) {
+ gchar *id = NULL;
+ gchar *connection_name = NULL;
+ gchar *server_account_name = NULL;
+ gchar *server_name = NULL;
+ ModestServerAccountSettings *server_settings = NULL;
+
+ gtk_tree_model_get (priv->model, &iter,
+ MODEL_COL_ID, &id,
+ MODEL_COL_NAME, &connection_name,
+ MODEL_COL_SERVER_NAME, &server_name,
+ MODEL_COL_SERVER_ACCOUNT_NAME, &server_account_name,
+ MODEL_COL_SERVER_ACCOUNT_SETTINGS, &server_settings,
+ -1);
+
+ gboolean success = TRUE;
+ if (id && server_settings) { /* The presence of data suggests that there is something to save. */
+ if (!server_account_name) {
+ /* Add a new server account, building a (non-human-visible) name: */
+ gchar *name_start = g_strdup_printf("specific_%s", connection_name);
+ server_account_name = modest_account_mgr_get_unused_account_name (
+ priv->account_manager, name_start, TRUE /* server account. */);
+ g_assert (server_account_name);
+ g_free (name_start);
+
+ modest_server_account_settings_set_account_name (server_settings, server_account_name);
+ success = modest_account_mgr_save_server_settings (mgr, server_settings);
+ if (success) {
+ TnyAccount *account = TNY_ACCOUNT (modest_tny_account_store_new_connection_specific_transport_account
+ (modest_runtime_get_account_store (),
+ server_account_name));
+ if (account)
+ g_object_unref (account);
+ }
+
+ /* associate the specific server account with this connection for this account: */
+ success = success && modest_account_mgr_set_connection_specific_smtp (
+ priv->account_manager, id, server_account_name);
+
+ /* Save the new name in the treemodel, so it can be edited again later: */
+ gtk_list_store_set (GTK_LIST_STORE (priv->model), &iter,
+ MODEL_COL_SERVER_ACCOUNT_NAME, server_account_name, -1);
+
+ } else {
+ modest_account_mgr_save_server_settings (mgr, server_settings);
+ }
+ } else if (id && server_name &&
+ !strcmp (server_name, _("mcen_ia_optionalsmtp_notdefined"))) {
+ modest_account_mgr_remove_connection_specific_smtp (priv->account_manager,
+ id);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model), &iter,
+ MODEL_COL_SERVER_ACCOUNT_NAME, NULL, -1);
+ }
+
+ g_free (connection_name);
+ g_free (id);
+ g_free (server_account_name);
+ g_free (server_name);
+
+ if (!success)
+ return FALSE;
+
+ /* Get next row: */
+ valid = gtk_tree_model_iter_next (priv->model, &iter);
+ }
+
+ update_model_server_names (self);
+
+ return TRUE;
+}
+
+void update_model_server_names (ModestConnectionSpecificSmtpWindow *self)
+{
+ ModestConnectionSpecificSmtpWindowPrivate *priv = CONNECTION_SPECIFIC_SMTP_WINDOW_GET_PRIVATE (self);
+
+ GtkTreeIter iter;
+ gboolean valid = gtk_tree_model_get_iter_first (priv->model, &iter);
+ while (valid) {
+
+ gchar *server_account_name = NULL;
+ ModestServerAccountSettings *server_settings = NULL;
+ gtk_tree_model_get (priv->model, &iter,
+ MODEL_COL_SERVER_ACCOUNT_NAME, &server_account_name,
+ MODEL_COL_SERVER_ACCOUNT_SETTINGS, &server_settings,
+ -1);
+ if (server_settings && modest_server_account_settings_get_hostname (server_settings)
+ && (modest_server_account_settings_get_hostname (server_settings) [0] != '\0')) {
+ gtk_list_store_set (GTK_LIST_STORE (priv->model), &iter,
+ MODEL_COL_SERVER_NAME, modest_server_account_settings_get_hostname (server_settings),
+ -1);
+ } else if (server_account_name) {
+
+ /* Get the server hostname and show it in the treemodel: */
+ gchar *hostname = modest_account_mgr_get_server_account_hostname (priv->account_manager,
+ server_account_name);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model), &iter,
+ MODEL_COL_SERVER_NAME, hostname,
+ -1);
+ g_free (hostname);
+ } else {
+ gtk_list_store_set (GTK_LIST_STORE (priv->model), &iter,
+ MODEL_COL_SERVER_NAME, _("mcen_ia_optionalsmtp_notdefined"),
+ -1);
+ }
+
+ /* Get next row: */
+ valid = gtk_tree_model_iter_next (priv->model, &iter);
+ }
+}
+
+static gboolean
+on_key_pressed (GtkWidget *self,
+ GdkEventKey *event,
+ gpointer user_data)
+{
+ if (event->keyval == GDK_Escape) {
+ /* Simulate a press on Cancel to close the dialog */
+ on_button_cancel (NULL, self);
+ }
+
+ return FALSE;
+}