aboutsummaryrefslogtreecommitdiff
path: root/libsylph
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2008-09-17 01:52:42 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2008-09-17 01:52:42 +0000
commit82849c6daf5e071c7511f8d8553bc42a099c70e5 (patch)
treec92b04f99f7d871fb4b957740bb933763a099ddc /libsylph
parent7b7ba149faae102d7b4621f8bb4d17f93d38b01b (diff)
implemented remote POP3 mailbox.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2031 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'libsylph')
-rw-r--r--libsylph/pop.c127
-rw-r--r--libsylph/pop.h1
-rw-r--r--libsylph/session.c19
3 files changed, 84 insertions, 63 deletions
diff --git a/libsylph/pop.c b/libsylph/pop.c
index 195c0ed3..872cfc01 100644
--- a/libsylph/pop.c
+++ b/libsylph/pop.c
@@ -40,39 +40,39 @@
#include "utils.h"
#include "recv.h"
-static gint pop3_greeting_recv (Pop3Session *session,
- const gchar *msg);
-static gint pop3_getauth_user_send (Pop3Session *session);
-static gint pop3_getauth_pass_send (Pop3Session *session);
-static gint pop3_getauth_apop_send (Pop3Session *session);
+gint pop3_greeting_recv (Pop3Session *session,
+ const gchar *msg);
+gint pop3_getauth_user_send (Pop3Session *session);
+gint pop3_getauth_pass_send (Pop3Session *session);
+gint pop3_getauth_apop_send (Pop3Session *session);
#if USE_SSL
-static gint pop3_stls_send (Pop3Session *session);
-static gint pop3_stls_recv (Pop3Session *session);
+gint pop3_stls_send (Pop3Session *session);
+gint pop3_stls_recv (Pop3Session *session);
#endif
-static gint pop3_getrange_stat_send (Pop3Session *session);
-static gint pop3_getrange_stat_recv (Pop3Session *session,
- const gchar *msg);
-static gint pop3_getrange_last_send (Pop3Session *session);
-static gint pop3_getrange_last_recv (Pop3Session *session,
- const gchar *msg);
-static gint pop3_getrange_uidl_send (Pop3Session *session);
-static gint pop3_getrange_uidl_recv (Pop3Session *session,
- const gchar *data,
- guint len);
-static gint pop3_getsize_list_send (Pop3Session *session);
-static gint pop3_getsize_list_recv (Pop3Session *session,
- const gchar *data,
- guint len);
-static gint pop3_retr_send (Pop3Session *session);
-static gint pop3_retr_recv (Pop3Session *session,
- FILE *fp,
- guint len);
-static gint pop3_delete_send (Pop3Session *session);
-static gint pop3_delete_recv (Pop3Session *session);
-static gint pop3_logout_send (Pop3Session *session);
-
-static void pop3_gen_send (Pop3Session *session,
- const gchar *format, ...);
+gint pop3_getrange_stat_send (Pop3Session *session);
+gint pop3_getrange_stat_recv (Pop3Session *session,
+ const gchar *msg);
+gint pop3_getrange_last_send (Pop3Session *session);
+gint pop3_getrange_last_recv (Pop3Session *session,
+ const gchar *msg);
+gint pop3_getrange_uidl_send (Pop3Session *session);
+gint pop3_getrange_uidl_recv (Pop3Session *session,
+ const gchar *data,
+ guint len);
+gint pop3_getsize_list_send (Pop3Session *session);
+gint pop3_getsize_list_recv (Pop3Session *session,
+ const gchar *data,
+ guint len);
+gint pop3_retr_send (Pop3Session *session);
+gint pop3_retr_recv (Pop3Session *session,
+ FILE *fp,
+ guint len);
+gint pop3_delete_send (Pop3Session *session);
+gint pop3_delete_recv (Pop3Session *session);
+gint pop3_logout_send (Pop3Session *session);
+
+void pop3_gen_send (Pop3Session *session,
+ const gchar *format, ...);
static void pop3_session_destroy (Session *session);
@@ -81,8 +81,9 @@ static gint pop3_write_msg_to_file (const gchar *file,
guint len);
static Pop3State pop3_lookup_next (Pop3Session *session);
-static Pop3ErrorValue pop3_ok (Pop3Session *session,
- const gchar *msg);
+
+Pop3ErrorValue pop3_ok (Pop3Session *session,
+ const gchar *msg);
static gint pop3_session_recv_msg (Session *session,
const gchar *msg);
@@ -95,7 +96,7 @@ static gint pop3_session_recv_data_as_file_finished
guint len);
-static gint pop3_greeting_recv(Pop3Session *session, const gchar *msg)
+gint pop3_greeting_recv(Pop3Session *session, const gchar *msg)
{
session->state = POP3_GREETING;
@@ -104,14 +105,14 @@ static gint pop3_greeting_recv(Pop3Session *session, const gchar *msg)
}
#if USE_SSL
-static gint pop3_stls_send(Pop3Session *session)
+gint pop3_stls_send(Pop3Session *session)
{
session->state = POP3_STLS;
pop3_gen_send(session, "STLS");
return PS_SUCCESS;
}
-static gint pop3_stls_recv(Pop3Session *session)
+gint pop3_stls_recv(Pop3Session *session)
{
if (session_start_tls(SESSION(session)) < 0) {
session->error_val = PS_SOCKET;
@@ -121,7 +122,7 @@ static gint pop3_stls_recv(Pop3Session *session)
}
#endif /* USE_SSL */
-static gint pop3_getauth_user_send(Pop3Session *session)
+gint pop3_getauth_user_send(Pop3Session *session)
{
g_return_val_if_fail(session->user != NULL, -1);
@@ -130,7 +131,7 @@ static gint pop3_getauth_user_send(Pop3Session *session)
return PS_SUCCESS;
}
-static gint pop3_getauth_pass_send(Pop3Session *session)
+gint pop3_getauth_pass_send(Pop3Session *session)
{
g_return_val_if_fail(session->pass != NULL, -1);
@@ -139,7 +140,7 @@ static gint pop3_getauth_pass_send(Pop3Session *session)
return PS_SUCCESS;
}
-static gint pop3_getauth_apop_send(Pop3Session *session)
+gint pop3_getauth_apop_send(Pop3Session *session)
{
gchar *start, *end;
gchar *apop_str;
@@ -185,14 +186,14 @@ static gint pop3_getauth_apop_send(Pop3Session *session)
return PS_SUCCESS;
}
-static gint pop3_getrange_stat_send(Pop3Session *session)
+gint pop3_getrange_stat_send(Pop3Session *session)
{
session->state = POP3_GETRANGE_STAT;
pop3_gen_send(session, "STAT");
return PS_SUCCESS;
}
-static gint pop3_getrange_stat_recv(Pop3Session *session, const gchar *msg)
+gint pop3_getrange_stat_recv(Pop3Session *session, const gchar *msg)
{
if (sscanf(msg, "%d %lld", &session->count, &session->total_bytes) != 2) {
log_warning(_("POP3 protocol error\n"));
@@ -210,14 +211,14 @@ static gint pop3_getrange_stat_recv(Pop3Session *session, const gchar *msg)
return PS_SUCCESS;
}
-static gint pop3_getrange_last_send(Pop3Session *session)
+gint pop3_getrange_last_send(Pop3Session *session)
{
session->state = POP3_GETRANGE_LAST;
pop3_gen_send(session, "LAST");
return PS_SUCCESS;
}
-static gint pop3_getrange_last_recv(Pop3Session *session, const gchar *msg)
+gint pop3_getrange_last_recv(Pop3Session *session, const gchar *msg)
{
gint last;
@@ -236,15 +237,14 @@ static gint pop3_getrange_last_recv(Pop3Session *session, const gchar *msg)
return PS_SUCCESS;
}
-static gint pop3_getrange_uidl_send(Pop3Session *session)
+gint pop3_getrange_uidl_send(Pop3Session *session)
{
session->state = POP3_GETRANGE_UIDL;
pop3_gen_send(session, "UIDL");
return PS_SUCCESS;
}
-static gint pop3_getrange_uidl_recv(Pop3Session *session, const gchar *data,
- guint len)
+gint pop3_getrange_uidl_recv(Pop3Session *session, const gchar *data, guint len)
{
gchar id[IDLEN + 1];
gchar buf[POPBUFSIZE];
@@ -291,15 +291,14 @@ static gint pop3_getrange_uidl_recv(Pop3Session *session, const gchar *data,
return PS_SUCCESS;
}
-static gint pop3_getsize_list_send(Pop3Session *session)
+gint pop3_getsize_list_send(Pop3Session *session)
{
session->state = POP3_GETSIZE_LIST;
pop3_gen_send(session, "LIST");
return PS_SUCCESS;
}
-static gint pop3_getsize_list_recv(Pop3Session *session, const gchar *data,
- guint len)
+gint pop3_getsize_list_recv(Pop3Session *session, const gchar *data, guint len)
{
gchar buf[POPBUFSIZE];
gint buf_len;
@@ -332,14 +331,14 @@ static gint pop3_getsize_list_recv(Pop3Session *session, const gchar *data,
return PS_SUCCESS;
}
-static gint pop3_retr_send(Pop3Session *session)
+gint pop3_retr_send(Pop3Session *session)
{
session->state = POP3_RETR;
pop3_gen_send(session, "RETR %d", session->cur_msg);
return PS_SUCCESS;
}
-static gint pop3_retr_recv(Pop3Session *session, FILE *fp, guint len)
+gint pop3_retr_recv(Pop3Session *session, FILE *fp, guint len)
{
gchar *file;
gint drop_ok;
@@ -372,28 +371,28 @@ static gint pop3_retr_recv(Pop3Session *session, FILE *fp, guint len)
return PS_SUCCESS;
}
-static gint pop3_delete_send(Pop3Session *session)
+gint pop3_delete_send(Pop3Session *session)
{
session->state = POP3_DELETE;
pop3_gen_send(session, "DELE %d", session->cur_msg);
return PS_SUCCESS;
}
-static gint pop3_delete_recv(Pop3Session *session)
+gint pop3_delete_recv(Pop3Session *session)
{
session->msg[session->cur_msg].recv_time = RECV_TIME_DELETE;
session->msg[session->cur_msg].deleted = TRUE;
return PS_SUCCESS;
}
-static gint pop3_logout_send(Pop3Session *session)
+gint pop3_logout_send(Pop3Session *session)
{
session->state = POP3_LOGOUT;
pop3_gen_send(session, "QUIT");
return PS_SUCCESS;
}
-static void pop3_gen_send(Pop3Session *session, const gchar *format, ...)
+void pop3_gen_send(Pop3Session *session, const gchar *format, ...)
{
gchar buf[POPBUFSIZE + 1];
va_list args;
@@ -437,6 +436,22 @@ Session *pop3_session_new(PrefsAccount *account)
session->error_val = PS_SUCCESS;
session->error_msg = NULL;
+ session->user = g_strdup(account->userid);
+ session->pass = account->passwd ? g_strdup(account->passwd) :
+ account->tmp_pass ? g_strdup(account->tmp_pass) : NULL;
+
+ SESSION(session)->server = g_strdup(account->recv_server);
+
+#if USE_SSL
+ SESSION(session)->port = account->set_popport ?
+ account->popport : account->ssl_pop == SSL_TUNNEL ? 995 : 110;
+ SESSION(session)->ssl_type = account->ssl_pop;
+ if (account->ssl_pop != SSL_NONE)
+ SESSION(session)->nonblocking = account->use_nonblocking_ssl;
+#else
+ SESSION(session)->port = account->set_popport ? account->popport : 110;
+#endif
+
return SESSION(session);
}
@@ -657,7 +672,7 @@ static Pop3State pop3_lookup_next(Pop3Session *session)
return POP3_RETR;
}
-static Pop3ErrorValue pop3_ok(Pop3Session *session, const gchar *msg)
+Pop3ErrorValue pop3_ok(Pop3Session *session, const gchar *msg)
{
Pop3ErrorValue ok;
diff --git a/libsylph/pop.h b/libsylph/pop.h
index ee2e983e..c3e67e89 100644
--- a/libsylph/pop.h
+++ b/libsylph/pop.h
@@ -149,6 +149,7 @@ struct _Pop3Session
#define IDLEN POPBUFSIZE
Session *pop3_session_new (PrefsAccount *account);
+
GHashTable *pop3_get_uidl_table (PrefsAccount *account);
gint pop3_write_uidl_list (Pop3Session *session);
diff --git a/libsylph/session.c b/libsylph/session.c
index 01962b11..762c00b1 100644
--- a/libsylph/session.c
+++ b/libsylph/session.c
@@ -119,10 +119,20 @@ void session_init(Session *session)
gint session_connect(Session *session, const gchar *server, gushort port)
{
-#ifdef G_OS_UNIX
- session->server = g_strdup(server);
+#ifndef G_OS_UNIX
+ SockInfo *sock;
+#endif
+ g_return_val_if_fail(session != NULL, -1);
+ g_return_val_if_fail(server != NULL, -1);
+ g_return_val_if_fail(port > 0, -1);
+
+ if (session->server && session->server != server) {
+ g_free(session->server);
+ session->server = g_strdup(server);
+ }
session->port = port;
+#ifdef G_OS_UNIX
session->conn_id = sock_connect_async(server, port, session_connect_cb,
session);
if (session->conn_id < 0) {
@@ -133,11 +143,6 @@ gint session_connect(Session *session, const gchar *server, gushort port)
return 0;
#else
- SockInfo *sock;
-
- session->server = g_strdup(server);
- session->port = port;
-
sock = sock_connect(server, port);
if (sock == NULL) {
g_warning("can't connect to server.");