New account fixes

This commit is contained in:
Pierre Pronchery 2006-11-03 07:46:13 +00:00
parent 505e924882
commit 1dfbec90b0
2 changed files with 81 additions and 26 deletions

View File

@ -7,6 +7,7 @@
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#include "mailer.h"
#include "account/account.h"
#include "../config.h"
@ -29,15 +30,14 @@ Account * account_new(char const * type, char const * name)
if((account = malloc(sizeof(*account))) == NULL)
return NULL;
memset(account, 0, sizeof(*account));
if((account->name = strdup(name)) == NULL
|| (filename = malloc(strlen(PLUGINDIR) + strlen(type)
+ strlen("/account/.so") + 1)) == NULL)
+ strlen(name) + 6)) == NULL)
{
account_delete(account);
return NULL;
}
sprintf(filename, "%s/account/%s.so", PLUGINDIR, type);
sprintf(filename, "%s/%s/%s.so", PLUGINDIR, type, name);
if((account->handle = dlopen(filename, RTLD_NOW)) == NULL
|| (account->plugin = dlsym(account->handle,
"account_plugin")) == NULL)
@ -48,20 +48,33 @@ Account * account_new(char const * type, char const * name)
return NULL;
}
free(filename);
account->title = NULL;
return account;
}
void account_delete(Account * account)
{
/* FIXME free config values */
free(account->name);
free(account->title);
if(account->handle != NULL)
dlclose(account->handle);
if(account->name != NULL)
free(account->name);
free(account);
}
/* accessors */
int account_set_title(Account * account, char const * title)
{
if(account->title != NULL)
free(account->title);
if((account->title = strdup(title != NULL ? title : "")) == NULL)
return mailer_error(NULL, "strdup", 1);
return 0;
}
/* useful */
AccountFolder ** account_folders(Account * account)
{

View File

@ -25,6 +25,11 @@ static char const * _authors[] =
/* FIXME */
static char const _license[] = "GPLv2";
const char * title[3] =
{
"Account type", "Account settings", "Account confirmation"
};
/* callbacks */
/* window */
@ -53,6 +58,14 @@ void on_file_quit(GtkWidget * widget, gpointer data)
/* edit menu */
typedef enum _AccountColumn
{
AC_DATA,
AC_ENABLED,
AC_TITLE,
AC_TYPE
} AccountColumn;
#define AC_LAST AC_TYPE
static void _preferences_set(Mailer * mailer);
static gboolean _on_preferences_closex(GtkWidget * widget, GdkEvent * event,
gpointer data);
@ -73,8 +86,8 @@ void on_edit_preferences(GtkWidget * widget, gpointer data)
return;
}
mailer->pr_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(mailer->pr_window), 300, 200);
gtk_container_set_border_width(GTK_CONTAINER(mailer->pr_window), 4);
gtk_window_set_resizable(GTK_WINDOW(mailer->pr_window), FALSE);
gtk_window_set_title(GTK_WINDOW(mailer->pr_window),
"Mailer preferences");
gtk_window_set_transient_for(GTK_WINDOW(mailer->pr_window), GTK_WINDOW(
@ -88,16 +101,28 @@ void on_edit_preferences(GtkWidget * widget, gpointer data)
gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(widget),
GTK_SHADOW_IN);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
store = gtk_list_store_new(1, G_TYPE_STRING);
store = gtk_list_store_new(AC_LAST+1, G_TYPE_POINTER, G_TYPE_BOOLEAN,
G_TYPE_STRING, G_TYPE_STRING);
mailer->pr_accounts = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
store));
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mailer->pr_accounts),
FALSE);
TRUE);
gtk_tree_view_append_column(GTK_TREE_VIEW(mailer->pr_accounts),
gtk_tree_view_column_new_with_attributes("Account name",
gtk_cell_renderer_text_new(), "text", 0, NULL));
gtk_tree_view_column_new_with_attributes("Enabled",
gtk_cell_renderer_toggle_new(), "active",
AC_ENABLED, NULL));
gtk_tree_view_append_column(GTK_TREE_VIEW(mailer->pr_accounts),
gtk_tree_view_column_new_with_attributes("Name",
gtk_cell_renderer_text_new(), "text", AC_TITLE,
NULL));
gtk_tree_view_append_column(GTK_TREE_VIEW(mailer->pr_accounts),
gtk_tree_view_column_new_with_attributes("Type",
gtk_cell_renderer_text_new(), "text", AC_TYPE,
NULL));
gtk_container_add(GTK_CONTAINER(widget), mailer->pr_accounts);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
vbox3 = gtk_vbox_new(FALSE, 4);
@ -129,7 +154,7 @@ void on_edit_preferences(GtkWidget * widget, gpointer data)
hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_label_new("Messages font:");
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
widget = gtk_font_button_new();
gtk_size_group_add_widget(group, widget);
gtk_font_button_set_use_font(GTK_FONT_BUTTON(widget), TRUE);
@ -274,6 +299,7 @@ typedef struct _AccountData
{
Mailer * mailer;
unsigned int available;
Account * account;
GtkWidget * settings;
GtkWidget * confirm;
} AccountData;
@ -328,6 +354,7 @@ void on_account_new(GtkWidget * widget, gpointer data)
}
ad->mailer = mailer;
ad->available = 0;
ad->account = NULL;
assistant = gtk_assistant_new();
g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(
_on_assistant_cancel), ad);
@ -356,8 +383,7 @@ void on_account_new(GtkWidget * widget, gpointer data)
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
gtk_widget_show_all(vbox);
gtk_assistant_append_page(GTK_ASSISTANT(assistant), vbox);
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox,
"Account type");
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox, title[0]);
gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), vbox,
GTK_ASSISTANT_PAGE_INTRO);
gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant), vbox, TRUE);
@ -366,8 +392,7 @@ void on_account_new(GtkWidget * widget, gpointer data)
ad->settings = vbox;
gtk_widget_show(vbox);
gtk_assistant_append_page(GTK_ASSISTANT(assistant), vbox);
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox,
"Account settings");
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox, title[1]);
gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), vbox,
GTK_ASSISTANT_PAGE_CONTENT);
gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant), vbox, TRUE);
@ -376,8 +401,7 @@ void on_account_new(GtkWidget * widget, gpointer data)
ad->confirm = vbox;
gtk_widget_show(vbox);
gtk_assistant_append_page(GTK_ASSISTANT(assistant), vbox);
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox,
"Account confirmation");
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox, title[2]);
gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), vbox,
GTK_ASSISTANT_PAGE_CONFIRM);
gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant), vbox, TRUE);
@ -548,6 +572,8 @@ static void _on_assistant_close(GtkWidget * widget, gpointer data)
{
AccountData * ad = data;
if(ad->account != NULL)
account_delete(ad->account);
free(ad);
gtk_widget_destroy(widget);
}
@ -560,7 +586,16 @@ static void _on_assistant_apply(GtkWidget * widget, gpointer data)
model = gtk_tree_view_get_model(GTK_TREE_VIEW(ad->mailer->pr_accounts));
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, "account", -1);
#ifdef DEBUG
fprintf(stderr, "AC_DATA %p, AC_ENABLED 1, AC_TITLE %s, AC_TYPE %s\n",
ad->account, ad->account->title,
ad->account->plugin->type);
#endif
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
AC_DATA, ad->account, AC_ENABLED, 1,
AC_TITLE, ad->account->title,
AC_TYPE, ad->account->plugin->type, -1);
ad->account = NULL;
}
static GtkWidget * _account_config_update(AccountConfig * config);
@ -569,26 +604,33 @@ static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
gpointer data)
{
AccountData * ad = data;
/* FIXME should be defined in just one place */
const char * title[3] = { "Account type", "Account settings",
"Account confirmation" };
unsigned int i;
AccountConfig * config;
Account * ac;
i = gtk_assistant_get_current_page(GTK_ASSISTANT(widget));
gtk_window_set_title(GTK_WINDOW(widget), title[i]);
if(i == 1)
{
gtk_container_remove(GTK_CONTAINER(page), ad->settings);
config = ad->mailer->available[ad->available].plugin->config;
ad->settings = _account_config_update(config);
if(ad->account != NULL)
account_delete(ad->account);
ac = &ad->mailer->available[ad->available];
if((ad->account = account_new("account", ac->name)) == NULL)
ad->settings = gtk_label_new("Could not load plug-in");
else
{
ad->settings = _account_config_update(
ad->account->plugin->config);
/* FIXME implement proper configuration pages */
account_set_title(ad->account, ac->title);
}
gtk_container_add(GTK_CONTAINER(page), ad->settings);
}
else if(i == 2)
{
gtk_container_remove(GTK_CONTAINER(page), ad->confirm);
config = ad->mailer->available[ad->available].plugin->config;
ad->confirm = _account_config_display(config);
ad->confirm = _account_config_display(
ad->account->plugin->config);
gtk_container_add(GTK_CONTAINER(page), ad->confirm);
}
}