aboutsummaryrefslogtreecommitdiff
path: root/libsylph/session.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-11-22 07:21:07 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-11-22 07:21:07 +0000
commitf83afc56908b487f1d0d87d563eabf68c01b411c (patch)
treea7614bea8301779382a5c52eb15ad988191c1356 /libsylph/session.c
parent6e181791b71430f018d8a78fd943b825349f1128 (diff)
reduced memory usage on SMTP session.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@771 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'libsylph/session.c')
-rw-r--r--libsylph/session.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/libsylph/session.c b/libsylph/session.c
index 2560c014..7fcc744c 100644
--- a/libsylph/session.c
+++ b/libsylph/session.c
@@ -87,8 +87,8 @@ void session_init(Session *session)
session->write_buf_p = NULL;
session->write_buf_len = 0;
- session->write_data = NULL;
- session->write_data_p = NULL;
+ session->write_data_fp = NULL;
+ session->write_data_pos = 0;
session->write_data_len = 0;
session->timeout_tag = 0;
@@ -377,18 +377,18 @@ static gboolean session_recv_msg_idle_cb(gpointer data)
return FALSE;
}
-gint session_send_data(Session *session, const guchar *data, guint size)
+gint session_send_data(Session *session, FILE *data_fp, guint size)
{
gboolean ret;
- g_return_val_if_fail(session->write_data == NULL, -1);
- g_return_val_if_fail(data != NULL, -1);
+ g_return_val_if_fail(session->write_data_fp == NULL, -1);
+ g_return_val_if_fail(data_fp != NULL, -1);
g_return_val_if_fail(size != 0, -1);
session->state = SESSION_SEND;
- session->write_data = data;
- session->write_data_p = session->write_data;
+ session->write_data_fp = data_fp;
+ session->write_data_pos = 0;
session->write_data_len = size;
g_get_current_time(&session->tv_prev);
@@ -673,19 +673,23 @@ static gint session_write_buf(Session *session)
static gint session_write_data(Session *session)
{
+ gchar buf[SESSION_BUFFSIZE];
gint write_len;
gint to_write_len;
- g_return_val_if_fail(session->write_data != NULL, -1);
- g_return_val_if_fail(session->write_data_p != NULL, -1);
+ g_return_val_if_fail(session->write_data_fp != NULL, -1);
+ g_return_val_if_fail(session->write_data_pos >= 0, -1);
g_return_val_if_fail(session->write_data_len > 0, -1);
- to_write_len = session->write_data_len -
- (session->write_data_p - session->write_data);
+ to_write_len = session->write_data_len - session->write_data_pos;
to_write_len = MIN(to_write_len, SESSION_BUFFSIZE);
+ if (fread(buf, to_write_len, 1, session->write_data_fp) < 1) {
+ g_warning("session_write_data: reading data from file failed\n");
+ session->state = SESSION_ERROR;
+ return -1;
+ }
- write_len = sock_write(session->sock, (gchar *)session->write_data_p,
- to_write_len);
+ write_len = sock_write(session->sock, buf, to_write_len);
if (write_len < 0) {
switch (errno) {
@@ -700,14 +704,21 @@ static gint session_write_data(Session *session)
}
/* incomplete write */
- if (session->write_data_p - session->write_data + write_len <
- session->write_data_len) {
- session->write_data_p += write_len;
+ if (session->write_data_pos + write_len < session->write_data_len) {
+ session->write_data_pos += write_len;
+ if (write_len < to_write_len) {
+ if (fseek(session->write_data_fp,
+ session->write_data_pos, SEEK_SET) < 0) {
+ g_warning("session_write_data: file seek failed\n");
+ session->state = SESSION_ERROR;
+ return -1;
+ }
+ }
return 1;
}
- session->write_data = NULL;
- session->write_data_p = NULL;
+ session->write_data_fp = NULL;
+ session->write_data_pos = 0;
session->write_data_len = 0;
return 0;
@@ -750,8 +761,8 @@ static gboolean session_write_data_cb(SockInfo *source,
gint ret;
g_return_val_if_fail(condition == G_IO_OUT, FALSE);
- g_return_val_if_fail(session->write_data != NULL, FALSE);
- g_return_val_if_fail(session->write_data_p != NULL, FALSE);
+ g_return_val_if_fail(session->write_data_fp != NULL, FALSE);
+ g_return_val_if_fail(session->write_data_pos >= 0, FALSE);
g_return_val_if_fail(session->write_data_len > 0, FALSE);
write_data_len = session->write_data_len;
@@ -771,8 +782,7 @@ static gboolean session_write_data_cb(SockInfo *source,
session_set_timeout(session, session->timeout_interval);
session->send_data_progressive_notify
(session,
- session->write_data_p - session->write_data,
- write_data_len,
+ session->write_data_pos, write_data_len,
session->send_data_progressive_notify_data);
g_get_current_time(&session->tv_prev);
}