diff --git a/include/Mailer/account.h b/include/Mailer/account.h
index 41cb6a1..8194cc1 100644
--- a/include/Mailer/account.h
+++ b/include/Mailer/account.h
@@ -129,6 +129,8 @@ typedef const struct _AccountPluginDefinition
AccountConfig * (*get_config)(AccountPlugin * plugin);
char * (*get_source)(AccountPlugin * plugin, AccountFolder * folder,
AccountMessage * message);
+ int (*start)(AccountPlugin * plugin);
+ void (*stop)(AccountPlugin * plugin);
int (*refresh)(AccountPlugin * plugin, AccountFolder * folder,
AccountMessage * message);
} AccountPluginDefinition;
diff --git a/src/account.c b/src/account.c
index c345502..0acd3c1 100644
--- a/src/account.c
+++ b/src/account.c
@@ -358,6 +358,16 @@ int account_init(Account * account)
}
+/* account_quit */
+int account_quit(Account * account)
+{
+ /* FIXME untested */
+ account->definition->destroy(account->account);
+ account->account = NULL;
+ return 0;
+}
+
+
/* account_select */
GtkTextBuffer * account_select(Account * account, Folder * folder,
Message * message)
@@ -407,6 +417,27 @@ GtkTextBuffer * account_select_source(Account * account, Folder * folder,
}
+/* account_start */
+int account_start(Account * account)
+{
+#ifdef DEBUG
+ fprintf(stderr, "DEBUG: %s(%p)\n", __func__, (void *)account);
+#endif
+ if(account->definition->start == NULL)
+ return 0;
+ return account->definition->start(account->account);
+}
+
+
+/* account_stop */
+void account_stop(Account * account)
+{
+ if(account->definition->stop == NULL)
+ return;
+ account->definition->stop(account->account);
+}
+
+
/* private */
/* functions */
/* accessors */
diff --git a/src/account.h b/src/account.h
index 692cd52..79d950f 100644
--- a/src/account.h
+++ b/src/account.h
@@ -44,9 +44,13 @@ int account_set_name(Account * account, char const * name);
/* useful */
int account_config_load(Account * account, Config * config);
int account_config_save(Account * account, Config * config);
+
int account_init(Account * account);
int account_quit(Account * account);
+int account_start(Account * account);
+void account_stop(Account * account);
+
GtkTextBuffer * account_select(Account * account, Folder * folder,
Message * message);
GtkTextBuffer * account_select_source(Account * account, Folder * folder,
diff --git a/src/account/imap4.c b/src/account/imap4.c
index 5c0827a..4a7ee0d 100644
--- a/src/account/imap4.c
+++ b/src/account/imap4.c
@@ -188,6 +188,8 @@ AccountConfig const _imap4_config[I4CV_COUNT + 1] =
static IMAP4 * _imap4_init(AccountPluginHelper * helper);
static int _imap4_destroy(IMAP4 * imap4);
static AccountConfig * _imap4_get_config(IMAP4 * imap4);
+static int _imap4_start(IMAP4 * imap4);
+static void _imap4_stop(IMAP4 * imap4);
static int _imap4_refresh(IMAP4 * imap4, AccountFolder * folder,
AccountMessage * message);
@@ -197,7 +199,6 @@ static IMAP4Command * _imap4_command(IMAP4 * imap4, IMAP4Context context,
static int _imap4_lookup(IMAP4 * imap4, char const * hostname, uint16_t port,
struct sockaddr_in * sa);
static int _imap4_parse(IMAP4 * imap4);
-static void _imap4_reset(IMAP4 * imap4);
/* events */
static void _imap4_event_status(IMAP4 * imap4, AccountStatus status,
@@ -250,11 +251,15 @@ AccountPluginDefinition account_plugin =
_imap4_destroy,
_imap4_get_config,
NULL,
+ _imap4_start,
+ _imap4_stop,
_imap4_refresh
};
-/* private */
+/* protected */
+/* functions */
+/* plug-in */
/* imap4_init */
static IMAP4 * _imap4_init(AccountPluginHelper * helper)
{
@@ -284,7 +289,7 @@ static int _imap4_destroy(IMAP4 * imap4)
#endif
if(imap4 == NULL) /* XXX _imap4_destroy() may be called uninitialized */
return 0;
- _imap4_reset(imap4);
+ _imap4_stop(imap4);
#if 0 /* XXX do not free() */
_imap4_folder_delete(imap4, &imap4->folders);
#endif
@@ -300,6 +305,52 @@ static AccountConfig * _imap4_get_config(IMAP4 * imap4)
}
+/* imap4_start */
+static int _imap4_start(IMAP4 * imap4)
+{
+ if(imap4->fd >= 0)
+ /* already started */
+ return 0;
+ imap4->source = g_idle_add(_on_connect, imap4);
+ return 0;
+}
+
+
+/* imap4_stop */
+static void _imap4_stop(IMAP4 * imap4)
+{
+ size_t i;
+
+ if(imap4->ssl != NULL)
+ SSL_free(imap4->ssl);
+ imap4->ssl = NULL;
+ if(imap4->rd_source != 0)
+ g_source_remove(imap4->rd_source);
+ imap4->rd_source = 0;
+ if(imap4->wr_source != 0)
+ g_source_remove(imap4->wr_source);
+ imap4->wr_source = 0;
+ if(imap4->source != 0)
+ g_source_remove(imap4->source);
+ imap4->source = 0;
+ if(imap4->channel != NULL)
+ {
+ g_io_channel_shutdown(imap4->channel, TRUE, NULL);
+ g_io_channel_unref(imap4->channel);
+ imap4->fd = -1;
+ }
+ imap4->channel = NULL;
+ for(i = 0; i < imap4->queue_cnt; i++)
+ free(imap4->queue[i].buf);
+ free(imap4->queue);
+ imap4->queue = NULL;
+ imap4->queue_cnt = 0;
+ if(imap4->fd >= 0)
+ close(imap4->fd);
+ imap4->fd = -1;
+}
+
+
/* imap4_refresh */
static int _imap4_refresh(IMAP4 * imap4, AccountFolder * folder,
AccountMessage * message)
@@ -326,6 +377,8 @@ static int _imap4_refresh(IMAP4 * imap4, AccountFolder * folder,
}
+/* private */
+/* functions */
/* useful */
/* imap4_command */
static IMAP4Command * _imap4_command(IMAP4 * imap4, IMAP4Context context,
@@ -335,7 +388,8 @@ static IMAP4Command * _imap4_command(IMAP4 * imap4, IMAP4Context context,
size_t len;
#ifdef DEBUG
- fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, command);
+ fprintf(stderr, "DEBUG: %s(\"%s\", %p)\n", __func__, command,
+ (void *)imap4->channel);
#endif
/* abort if the command is invalid */
if(command == NULL || (len = strlen(command) + 6) == 0)
@@ -763,41 +817,6 @@ static int _context_status(IMAP4 * imap4, char const * answer)
}
-/* imap4_reset */
-static void _imap4_reset(IMAP4 * imap4)
-{
- size_t i;
-
- if(imap4->ssl != NULL)
- SSL_free(imap4->ssl);
- imap4->ssl = NULL;
- if(imap4->rd_source != 0)
- g_source_remove(imap4->rd_source);
- imap4->rd_source = 0;
- if(imap4->wr_source != 0)
- g_source_remove(imap4->wr_source);
- imap4->wr_source = 0;
- if(imap4->source != 0)
- g_source_remove(imap4->source);
- imap4->source = 0;
- if(imap4->channel != NULL)
- {
- g_io_channel_shutdown(imap4->channel, TRUE, NULL);
- g_io_channel_unref(imap4->channel);
- imap4->fd = -1;
- }
- imap4->channel = NULL;
- for(i = 0; i < imap4->queue_cnt; i++)
- free(imap4->queue[i].buf);
- free(imap4->queue);
- imap4->queue = NULL;
- imap4->queue_cnt = 0;
- if(imap4->fd >= 0)
- close(imap4->fd);
- imap4->fd = -1;
-}
-
-
/* imap4_event_status */
static void _imap4_event_status(IMAP4 * imap4, AccountStatus status,
char const * message)
@@ -994,8 +1013,9 @@ static gboolean _on_connect(gpointer data)
/* create the socket */
if((imap4->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
+ imap4->source = g_idle_add(_on_reset, imap4);
helper->error(helper->account, strerror(errno), 1);
- return _on_reset(imap4);
+ return FALSE;
}
if((res = fcntl(imap4->fd, F_GETFL)) >= 0
&& fcntl(imap4->fd, F_SETFL, res | O_NONBLOCK) == -1)
@@ -1067,7 +1087,7 @@ static gboolean _on_reset(gpointer data)
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
- _imap4_reset(imap4);
+ _imap4_stop(imap4);
imap4->source = g_timeout_add(3000, _on_connect, imap4);
return FALSE;
}
@@ -1122,11 +1142,10 @@ static gboolean _on_watch_can_connect(GIOChannel * source,
}
if(SSL_set_fd(imap4->ssl, imap4->fd) != 1)
{
- /* FIXME save the error to a buffer, free SSL, report */
- helper->error(helper->account, ERR_error_string(
- ERR_get_error(), buf), 1);
+ ERR_error_string(ERR_get_error(), buf);
SSL_free(imap4->ssl);
imap4->ssl = NULL;
+ helper->error(helper->account, buf, 1);
return FALSE;
}
SSL_set_connect_state(imap4->ssl);
@@ -1175,7 +1194,7 @@ static gboolean _on_watch_can_handshake(GIOChannel * source,
ERR_error_string(err, buf);
if(res == 0)
{
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
helper->error(helper->account, buf, 1);
return FALSE;
}
@@ -1187,7 +1206,7 @@ static gboolean _on_watch_can_handshake(GIOChannel * source,
_on_watch_can_handshake, imap4);
else
{
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
helper->error(helper->account, buf, 1);
return FALSE;
}
@@ -1246,17 +1265,17 @@ static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
case G_IO_STATUS_NORMAL:
break;
case G_IO_STATUS_ERROR:
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
helper->error(helper->account, error->message, 1);
return FALSE;
case G_IO_STATUS_EOF:
default:
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
return FALSE;
}
if(_imap4_parse(imap4) != 0)
{
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
return FALSE;
}
if(imap4->queue_cnt == 0)
@@ -1322,7 +1341,7 @@ static gboolean _on_watch_can_read_ssl(GIOChannel * source,
else
{
ERR_error_string(SSL_get_error(imap4->ssl, cnt), buf);
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
imap4->helper->error(imap4->helper->account, buf, 1);
}
return FALSE;
@@ -1334,7 +1353,7 @@ static gboolean _on_watch_can_read_ssl(GIOChannel * source,
imap4->rd_buf_cnt += cnt;
if(_imap4_parse(imap4) != 0)
{
- imap4->rd_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
return FALSE;
}
if(imap4->queue_cnt == 0)
@@ -1404,12 +1423,12 @@ static gboolean _on_watch_can_write(GIOChannel * source, GIOCondition condition,
case G_IO_STATUS_NORMAL:
break;
case G_IO_STATUS_ERROR:
- imap4->wr_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
helper->error(helper->account, error->message, 1);
return FALSE;
case G_IO_STATUS_EOF:
default:
- imap4->wr_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
return FALSE;
}
if(cmd->buf_cnt > 0)
@@ -1454,7 +1473,7 @@ static gboolean _on_watch_can_write_ssl(GIOChannel * source,
else
{
ERR_error_string(SSL_get_error(imap4->ssl, cnt), buf);
- imap4->wr_source = g_idle_add(_on_reset, imap4);
+ imap4->source = g_idle_add(_on_reset, imap4);
helper->error(helper->account, buf, 1);
}
return FALSE;
diff --git a/src/account/mbox.c b/src/account/mbox.c
index f6fe097..dc0bcd8 100644
--- a/src/account/mbox.c
+++ b/src/account/mbox.c
@@ -144,6 +144,8 @@ AccountPluginDefinition account_plugin =
_mbox_destroy,
_mbox_get_config,
_mbox_get_source,
+ NULL,
+ NULL,
_mbox_refresh
};
diff --git a/src/account/nntp.c b/src/account/nntp.c
index 6a56e3e..1c897b6 100644
--- a/src/account/nntp.c
+++ b/src/account/nntp.c
@@ -48,5 +48,7 @@ AccountPluginDefinition account_plugin =
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
NULL
};
diff --git a/src/account/pop3.c b/src/account/pop3.c
index 171f780..8dfe891 100644
--- a/src/account/pop3.c
+++ b/src/account/pop3.c
@@ -14,6 +14,7 @@
* along with this program. If not, see . */
/* FIXME:
* - really queue commands with callbacks
+ * - openssl should be more explicit when SSL_set_fd() is missing (no BIO)
* - support multiple connections? */
@@ -30,6 +31,7 @@
#include
#include
#include
+#include
#include
#include
#include "Mailer/account.h"
@@ -150,6 +152,8 @@ static AccountConfig _pop3_config[P3CV_COUNT + 1] =
static POP3 * _pop3_init(AccountPluginHelper * helper);
static int _pop3_destroy(POP3 * pop3);
static AccountConfig * _pop3_get_config(POP3 * pop3);
+static int _pop3_start(POP3 * pop3);
+static void _pop3_stop(POP3 * pop3);
static int _pop3_refresh(POP3 * pop3, AccountFolder * folder,
AccountMessage * message);
@@ -159,7 +163,6 @@ static POP3Command * _pop3_command(POP3 * pop3, POP3Context context,
static int _pop3_lookup(POP3 * pop3, char const * hostname, uint16_t port,
struct sockaddr_in * sa);
static int _pop3_parse(POP3 * pop3);
-static void _pop3_reset(POP3 * pop3);
/* events */
static void _pop3_event_status(POP3 * pop3, AccountStatus status,
@@ -203,12 +206,15 @@ AccountPluginDefinition account_plugin =
_pop3_destroy,
_pop3_get_config,
NULL,
+ _pop3_start,
+ _pop3_stop,
_pop3_refresh
};
-/* private */
+/* protected */
/* functions */
+/* plug-in */
/* pop3_init */
static POP3 * _pop3_init(AccountPluginHelper * helper)
{
@@ -243,7 +249,7 @@ static int _pop3_destroy(POP3 * pop3)
if(pop3 == NULL) /* XXX _pop3_destroy() may be called uninitialized */
return 0;
- _pop3_reset(pop3);
+ _pop3_stop(pop3);
free(pop3);
return 0;
}
@@ -256,6 +262,46 @@ static AccountConfig * _pop3_get_config(POP3 * pop3)
}
+/* pop3_start */
+static int _pop3_start(POP3 * pop3)
+{
+ if(pop3->fd >= 0)
+ /* already started */
+ return 0;
+ pop3->source = g_idle_add(_on_connect, pop3);
+ return 0;
+}
+
+
+/* pop3_stop */
+static void _pop3_stop(POP3 * pop3)
+{
+ size_t i;
+
+ if(pop3->ssl != NULL)
+ SSL_free(pop3->ssl);
+ pop3->ssl = NULL;
+ if(pop3->rd_source != 0)
+ g_source_remove(pop3->rd_source);
+ free(pop3->rd_buf);
+ if(pop3->wr_source != 0)
+ g_source_remove(pop3->wr_source);
+ if(pop3->source != 0)
+ g_source_remove(pop3->source);
+ if(pop3->channel != NULL)
+ {
+ g_io_channel_shutdown(pop3->channel, TRUE, NULL);
+ g_io_channel_unref(pop3->channel);
+ pop3->fd = -1;
+ }
+ for(i = 0; i < pop3->queue_cnt; i++)
+ free(pop3->queue[i].buf);
+ free(pop3->queue);
+ if(pop3->fd >= 0)
+ close(pop3->fd);
+}
+
+
/* pop3_refresh */
static int _pop3_refresh(POP3 * pop3, AccountFolder * folder,
AccountMessage * message)
@@ -273,6 +319,8 @@ static int _pop3_refresh(POP3 * pop3, AccountFolder * folder,
}
+/* private */
+/* functions */
/* useful */
/* pop3_command */
static POP3Command * _pop3_command(POP3 * pop3, POP3Context context,
@@ -506,35 +554,6 @@ static int _parse_context_transaction_retr(POP3 * pop3,
}
-/* pop3_reset */
-static void _pop3_reset(POP3 * pop3)
-{
- size_t i;
-
- if(pop3->ssl != NULL)
- SSL_free(pop3->ssl);
- pop3->ssl = NULL;
- if(pop3->rd_source != 0)
- g_source_remove(pop3->rd_source);
- free(pop3->rd_buf);
- if(pop3->wr_source != 0)
- g_source_remove(pop3->wr_source);
- if(pop3->source != 0)
- g_source_remove(pop3->source);
- if(pop3->channel != NULL)
- {
- g_io_channel_shutdown(pop3->channel, TRUE, NULL);
- g_io_channel_unref(pop3->channel);
- pop3->fd = -1;
- }
- for(i = 0; i < pop3->queue_cnt; i++)
- free(pop3->queue[i].buf);
- free(pop3->queue);
- if(pop3->fd >= 0)
- close(pop3->fd);
-}
-
-
/* pop3_event_status */
static void _pop3_event_status(POP3 * pop3, AccountStatus status,
char const * message)
@@ -621,7 +640,7 @@ static gboolean _on_connect(gpointer data)
/* get the hostname and port */
if((hostname = pop3->config[P3CV_HOSTNAME].value) == NULL)
{
- helper->error(NULL, "No hostname set", 1);
+ helper->error(helper->account, "No hostname set", 1);
return FALSE;
}
if((p = pop3->config[P3CV_PORT].value) == NULL)
@@ -630,18 +649,20 @@ static gboolean _on_connect(gpointer data)
/* lookup the address */
if(_pop3_lookup(pop3, hostname, port, &sa) != 0)
{
- helper->error(NULL, error_get(), 1);
+ helper->error(helper->account, error_get(), 1);
return FALSE;
}
/* create the socket */
if((pop3->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
- helper->error(NULL, strerror(errno), 1);
- return _on_reset(pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
+ helper->error(helper->account, strerror(errno), 1);
+ return FALSE;
}
if((res = fcntl(pop3->fd, F_GETFL)) >= 0
&& fcntl(pop3->fd, F_SETFL, res | O_NONBLOCK) == -1)
/* ignore this error */
+ /* FIXME report properly as a warning instead */
helper->error(NULL, strerror(errno), 1);
/* report the current status */
snprintf(buf, sizeof(buf), "Connecting to %s (%s:%u)", hostname,
@@ -654,8 +675,9 @@ static gboolean _on_connect(gpointer data)
{
snprintf(buf, sizeof(buf), "%s (%s)", "Connection failed",
strerror(errno));
- helper->error(NULL, buf, 1);
- return _on_reset(pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
+ helper->error(helper->account, buf, 1);
+ return FALSE;
}
pop3->wr_source = g_io_add_watch(pop3->channel, G_IO_OUT,
_on_watch_can_connect, pop3);
@@ -668,7 +690,7 @@ static int _connect_channel(POP3 * pop3)
GError * error = NULL;
#ifdef DEBUG
- fprintf(stderr, "DEBUG: %s()\n");
+ fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
/* prepare queue */
if((pop3->queue = malloc(sizeof(*pop3->queue))) == NULL)
@@ -705,7 +727,7 @@ static gboolean _on_reset(gpointer data)
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
- _pop3_reset(pop3);
+ _pop3_stop(pop3);
pop3->source = g_timeout_add(3000, _on_connect, pop3);
return FALSE;
}
@@ -735,7 +757,7 @@ static gboolean _on_watch_can_connect(GIOChannel * source,
{
snprintf(buf, sizeof(buf), "%s (%s)", "Connection failed",
strerror(res));
- helper->error(NULL, buf, 1);
+ helper->error(helper->account, buf, 1);
return FALSE;
}
/* XXX remember the address instead */
@@ -754,16 +776,16 @@ static gboolean _on_watch_can_connect(GIOChannel * source,
return FALSE;
if((pop3->ssl = SSL_new(ssl_ctx)) == NULL)
{
- helper->error(NULL, ERR_error_string(ERR_get_error(),
- buf), 1);
+ helper->error(helper->account, ERR_error_string(
+ ERR_get_error(), buf), 1);
return FALSE;
}
if(SSL_set_fd(pop3->ssl, pop3->fd) != 1)
{
- helper->error(NULL, ERR_error_string(ERR_get_error(),
- buf), 1);
+ ERR_error_string(ERR_get_error(), buf);
SSL_free(pop3->ssl);
pop3->ssl = NULL;
+ helper->error(helper->account, buf, 1);
return FALSE;
}
SSL_set_connect_state(pop3->ssl);
@@ -812,8 +834,9 @@ static gboolean _on_watch_can_handshake(GIOChannel * source,
ERR_error_string(err, buf);
if(res == 0)
{
+ pop3->source = g_idle_add(_on_reset, pop3);
helper->error(helper->account, buf, 1);
- return _on_reset(pop3);
+ return FALSE;
}
if(err == SSL_ERROR_WANT_WRITE)
pop3->wr_source = g_io_add_watch(pop3->channel, G_IO_OUT,
@@ -823,8 +846,9 @@ static gboolean _on_watch_can_handshake(GIOChannel * source,
_on_watch_can_handshake, pop3);
else
{
+ pop3->source = g_idle_add(_on_reset, pop3);
helper->error(helper->account, buf, 1);
- return _on_reset(pop3);
+ return FALSE;
}
return FALSE;
}
@@ -853,6 +877,7 @@ static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
gpointer data)
{
POP3 * pop3 = data;
+ AccountPluginHelper * helper = pop3->helper;
char * p;
gsize cnt = 0;
GError * error = NULL;
@@ -876,15 +901,17 @@ static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
case G_IO_STATUS_NORMAL:
break;
case G_IO_STATUS_ERROR:
- pop3->helper->error(NULL, error->message, 1);
+ pop3->source = g_idle_add(_on_reset, pop3);
+ helper->error(helper->account, error->message, 1);
+ return FALSE;
case G_IO_STATUS_EOF:
default:
- pop3->rd_source = g_idle_add(_on_reset, pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
return FALSE;
}
if(_pop3_parse(pop3) != 0)
{
- pop3->rd_source = g_idle_add(_on_reset, pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
return FALSE;
}
if(pop3->queue_cnt == 0)
@@ -948,8 +975,8 @@ static gboolean _on_watch_can_read_ssl(GIOChannel * source,
else
{
ERR_error_string(SSL_get_error(pop3->ssl, cnt), buf);
- pop3->helper->error(NULL, buf, 1);
- pop3->rd_source = g_idle_add(_on_reset, pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
+ pop3->helper->error(pop3->helper->account, buf, 1);
}
return FALSE;
}
@@ -960,7 +987,7 @@ static gboolean _on_watch_can_read_ssl(GIOChannel * source,
pop3->rd_buf_cnt += cnt;
if(_pop3_parse(pop3) != 0)
{
- pop3->rd_source = g_idle_add(_on_reset, pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
return FALSE;
}
if(pop3->queue_cnt == 0)
@@ -997,6 +1024,7 @@ static gboolean _on_watch_can_write(GIOChannel * source, GIOCondition condition,
gpointer data)
{
POP3 * pop3 = data;
+ AccountPluginHelper * helper = pop3->helper;
POP3Command * cmd = &pop3->queue[0];
gsize cnt = 0;
GError * error = NULL;
@@ -1029,10 +1057,12 @@ static gboolean _on_watch_can_write(GIOChannel * source, GIOCondition condition,
case G_IO_STATUS_NORMAL:
break;
case G_IO_STATUS_ERROR:
- pop3->helper->error(NULL, error->message, 1);
+ pop3->source = g_idle_add(_on_reset, pop3);
+ helper->error(helper->account, error->message, 1);
+ return FALSE;
case G_IO_STATUS_EOF:
default:
- pop3->wr_source = g_idle_add(_on_reset, pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
return FALSE;
}
if(cmd->buf_cnt > 0)
@@ -1051,6 +1081,7 @@ static gboolean _on_watch_can_write_ssl(GIOChannel * source,
GIOCondition condition, gpointer data)
{
POP3 * pop3 = data;
+ AccountPluginHelper * helper = pop3->helper;
POP3Command * cmd = &pop3->queue[0];
int cnt;
char * p;
@@ -1075,8 +1106,8 @@ static gboolean _on_watch_can_write_ssl(GIOChannel * source,
else
{
ERR_error_string(SSL_get_error(pop3->ssl, cnt), buf);
- pop3->helper->error(NULL, buf, 1);
- pop3->wr_source = g_idle_add(_on_reset, pop3);
+ pop3->source = g_idle_add(_on_reset, pop3);
+ helper->error(helper->account, buf, 1);
}
return FALSE;
}
diff --git a/src/account/rss.c b/src/account/rss.c
index 4d9fb46..f844888 100644
--- a/src/account/rss.c
+++ b/src/account/rss.c
@@ -44,5 +44,7 @@ AccountPluginDefinition account_plugin =
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
NULL
};
diff --git a/src/mailer.c b/src/mailer.c
index 2e8076f..3f21a1c 100644
--- a/src/mailer.c
+++ b/src/mailer.c
@@ -1074,6 +1074,8 @@ int mailer_account_add(Mailer * mailer, Account * account)
if(account_init(account) != 0)
return -mailer_error(mailer, account_get_title(account), 1);
mailer->account_cnt++;
+ /* XXX check (and report) errors */
+ account_start(account);
return 0;
}