mailer: fix the creation of new accounts

This commit is contained in:
Pierre Pronchery 2024-09-17 01:11:48 +02:00
parent 5df17d2378
commit 3b4b4ac58f

View File

@ -2091,6 +2091,7 @@ typedef struct _AccountData
{ {
Mailer * mailer; Mailer * mailer;
char * title; char * title;
AccountConfig * config;
AccountIdentity identity; AccountIdentity identity;
unsigned int available; unsigned int available;
Account * account; Account * account;
@ -2101,7 +2102,10 @@ typedef struct _AccountData
/* functions */ /* functions */
static GtkWidget * _assistant_account_select(AccountData * ad); static GtkWidget * _assistant_account_select(AccountData * ad);
static GtkWidget * _assistant_account_config(AccountConfig * config); static GtkWidget * _assistant_account_settings(AccountConfig * config);
static AccountConfig * _assistant_account_config_copy(
AccountConfig const * config);
static void _assistant_account_config_free(AccountConfig * config);
#if !GTK_CHECK_VERSION(2, 10, 0) #if !GTK_CHECK_VERSION(2, 10, 0)
# include "gtkassistant.c" # include "gtkassistant.c"
@ -2215,7 +2219,7 @@ static void _on_assistant_apply(gpointer data)
} }
/* on_assistant_prepare */ /* on_assistant_prepare */
static GtkWidget * _account_display(Account * account); static GtkWidget * _account_display(AccountData * ad);
static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page, static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
gpointer data) gpointer data)
@ -2246,15 +2250,20 @@ static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
ad->settings = _assistant_account_select(ad); ad->settings = _assistant_account_select(ad);
} }
else else
ad->settings = _assistant_account_config( {
ad->config = _assistant_account_config_copy(
account_get_config(ad->account)); account_get_config(ad->account));
/* FIXME ad->config may be NULL */
assert(ad->config != NULL);
ad->settings = _assistant_account_settings(ad->config);
}
gtk_container_add(GTK_CONTAINER(page), ad->settings); gtk_container_add(GTK_CONTAINER(page), ad->settings);
gtk_widget_show_all(ad->settings); gtk_widget_show_all(ad->settings);
} }
else if(i == 2) else if(i == 2)
{ {
gtk_container_remove(GTK_CONTAINER(page), ad->confirm); gtk_container_remove(GTK_CONTAINER(page), ad->confirm);
ad->confirm = _account_display(ad->account); ad->confirm = _account_display(ad);
gtk_container_add(GTK_CONTAINER(page), ad->confirm); gtk_container_add(GTK_CONTAINER(page), ad->confirm);
} }
old = i; old = i;
@ -2363,7 +2372,7 @@ static void _account_add_label(GtkWidget * box, PangoFontDescription * desc,
gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0);
} }
/* _assistant_account_config */ /* _assistant_account_settings */
static GtkWidget * _update_string(AccountConfig * config, static GtkWidget * _update_string(AccountConfig * config,
PangoFontDescription * desc, GtkSizeGroup * group); PangoFontDescription * desc, GtkSizeGroup * group);
static GtkWidget * _update_password(AccountConfig * config, static GtkWidget * _update_password(AccountConfig * config,
@ -2374,7 +2383,7 @@ static GtkWidget * _update_uint16(AccountConfig * config,
PangoFontDescription * desc, GtkSizeGroup * group); PangoFontDescription * desc, GtkSizeGroup * group);
static GtkWidget * _update_boolean(AccountConfig * config); static GtkWidget * _update_boolean(AccountConfig * config);
static GtkWidget * _assistant_account_config(AccountConfig * config) static GtkWidget * _assistant_account_settings(AccountConfig * config)
{ {
GtkWidget * vbox; GtkWidget * vbox;
GtkSizeGroup * group; GtkSizeGroup * group;
@ -2560,9 +2569,9 @@ static GtkWidget * _display_uint16(AccountConfig * config,
PangoFontDescription * desc, GtkSizeGroup * group); PangoFontDescription * desc, GtkSizeGroup * group);
static GtkWidget * _display_boolean(AccountConfig * config, static GtkWidget * _display_boolean(AccountConfig * config,
PangoFontDescription * desc, GtkSizeGroup * group); PangoFontDescription * desc, GtkSizeGroup * group);
static GtkWidget * _account_display(Account * account) static GtkWidget * _account_display(AccountData * ad)
{ {
AccountConfig * config; Account * account = ad->account;
AccountConfig p; AccountConfig p;
GtkWidget * vbox; GtkWidget * vbox;
GtkSizeGroup * group; GtkSizeGroup * group;
@ -2570,7 +2579,6 @@ static GtkWidget * _account_display(Account * account)
GtkWidget * widget; GtkWidget * widget;
unsigned int i; unsigned int i;
config = account_get_config(account);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@ -2581,27 +2589,27 @@ static GtkWidget * _account_display(Account * account)
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
widget = _display_string(&p, desc, group); widget = _display_string(&p, desc, group);
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
for(i = 0; config[i].type != ACT_NONE; i++) for(i = 0; ad->config[i].type != ACT_NONE; i++)
{ {
switch(config[i].type) switch(ad->config[i].type)
{ {
case ACT_STRING: case ACT_STRING:
widget = _display_string(&config[i], desc, widget = _display_string(&ad->config[i], desc,
group); group);
break; break;
case ACT_PASSWORD: case ACT_PASSWORD:
widget = _display_password(&config[i], desc, widget = _display_password(&ad->config[i], desc,
group); group);
break; break;
case ACT_FILE: case ACT_FILE:
widget = _display_file(&config[i], desc, group); widget = _display_file(&ad->config[i], desc, group);
break; break;
case ACT_UINT16: case ACT_UINT16:
widget = _display_uint16(&config[i], desc, widget = _display_uint16(&ad->config[i], desc,
group); group);
break; break;
case ACT_BOOLEAN: case ACT_BOOLEAN:
widget = _display_boolean(&config[i], desc, widget = _display_boolean(&ad->config[i], desc,
group); group);
break; break;
case ACT_SEPARATOR: case ACT_SEPARATOR:
@ -2741,6 +2749,81 @@ static void _on_preferences_account_toggle(GtkCellRendererToggle * renderer,
!gtk_cell_renderer_toggle_get_active(renderer), -1); !gtk_cell_renderer_toggle_get_active(renderer), -1);
} }
static AccountConfig * _assistant_account_config_copy(
AccountConfig const * config)
{
AccountConfig * ret = NULL;
AccountConfig * p;
size_t i;
if(config == NULL)
return NULL;
for(i = 0;; i++)
{
if((p = realloc(ret, sizeof(*ret) * (i + 2))) == NULL)
{
_assistant_account_config_free(ret);
return NULL;
}
ret = p;
ret[i] = config[i];
ret[i + 1].type = ACT_NONE;
ret[i + 1].value = NULL;
switch(ret[i].type)
{
case ACT_BOOLEAN:
case ACT_NONE:
case ACT_SEPARATOR:
case ACT_UINT16:
break;
case ACT_STRING:
case ACT_PASSWORD:
case ACT_FILE:
if(ret[i].value != NULL)
{
ret[i].value = strdup(ret[i].value);
if(ret[i].value == NULL)
{
_assistant_account_config_free(
ret);
return NULL;
}
}
break;
default:
assert(0);
break;
}
if(config[i].type == ACT_NONE)
break;
}
return ret;
}
static void _assistant_account_config_free(AccountConfig * config)
{
size_t i;
for(i = 0; config[i].type != ACT_NONE; i++)
switch(config[i].type)
{
case ACT_BOOLEAN:
case ACT_NONE:
case ACT_SEPARATOR:
case ACT_UINT16:
break;
case ACT_STRING:
case ACT_PASSWORD:
case ACT_FILE:
free(config[i].value);
break;
default:
assert(0);
break;
}
free(config);
}
/* _on_preferences_account_edit */ /* _on_preferences_account_edit */
static GtkWidget * _account_edit(Mailer * mailer, Account * account); static GtkWidget * _account_edit(Mailer * mailer, Account * account);
static gboolean _account_edit_on_closex(GtkWidget * widget, GdkEvent * event, static gboolean _account_edit_on_closex(GtkWidget * widget, GdkEvent * event,
@ -2878,7 +2961,7 @@ static GtkWidget * _account_edit(Mailer * mailer, Account * account)
_("Account"))); _("Account")));
/* settings tab */ /* settings tab */
/* FIXME this affects the account directly (eg cancel does not work) */ /* FIXME this affects the account directly (eg cancel does not work) */
widget = _assistant_account_config(account_get_config(account)); widget = _assistant_account_settings(account_get_config(account));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), widget, gtk_label_new( gtk_notebook_append_page(GTK_NOTEBOOK(notebook), widget, gtk_label_new(
_("Settings"))); _("Settings")));
gtk_box_pack_start(GTK_BOX(content), notebook, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(content), notebook, TRUE, TRUE, 0);