From 928a2cc8708a85a7fbcceb4d77e163835b158934 Mon Sep 17 00:00:00 2001 From: hiro Date: Mon, 28 Nov 2005 05:43:35 +0000 Subject: reverted linebreak conversion. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@783 ee746299-78ed-0310-b773-934348b2243d --- libsylph/pop.c | 10 ++++++++-- libsylph/recv.c | 47 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 13 deletions(-) (limited to 'libsylph') diff --git a/libsylph/pop.c b/libsylph/pop.c index ec703191..b61eb377 100644 --- a/libsylph/pop.c +++ b/libsylph/pop.c @@ -549,9 +549,15 @@ static gint pop3_write_msg_to_file(const gchar *file, FILE *src_fp, guint len) gint len; len = strlen(buf); - if (len > 0) + if (len > 0) { last_ch = buf[len - 1]; - else + if (last_ch == '\n' && len > 1 && + buf[len - 2] == '\r') { + buf[len - 2] = '\n'; + buf[len - 1] = '\0'; + } else if (last_ch == '\r') + buf[len - 1] = '\0'; + } else last_ch = '\0'; if ((last_ch == '\0' || last_ch == '\n') && diff --git a/libsylph/recv.c b/libsylph/recv.c index 55890df5..47222709 100644 --- a/libsylph/recv.c +++ b/libsylph/recv.c @@ -166,6 +166,12 @@ gint recv_write(SockInfo *sock, FILE *fp) } p = buf; + + if (len > 1 && buf[len - 1] == '\n' && buf[len - 2] == '\r') { + buf[len - 2] = '\n'; + buf[len - 1] = '\0'; + } + if (buf[0] == '.' && buf[1] == '.') p++; else if (!strncmp(buf, ">From ", 6)) @@ -185,27 +191,46 @@ gint recv_write(SockInfo *sock, FILE *fp) gint recv_bytes_write(SockInfo *sock, glong size, FILE *fp) { - gchar buf[BUFFSIZE]; - glong count = 0; + gchar *buf; + gchar *prev, *cur; if (size == 0) return 0; - do { - gint read_count, to_read; + buf = recv_bytes(sock, size); + if (!buf) + return -2; - to_read = MIN(sizeof(buf), size - count); - read_count = sock_read(sock, buf, to_read); - if (read_count <= 0) - return -2; + /* +------------------+----------------+--------------------------+ * + * ^buf ^prev ^cur buf+size-1^ */ + + prev = buf; + while ((cur = memchr(prev, '\r', size - (prev - buf))) != NULL) { + if (cur == buf + size - 1) break; - if (fp && fwrite(buf, read_count, 1, fp) < 1) { + if (fp && (fwrite(prev, sizeof(gchar), cur - prev, fp) == EOF || + fwrite("\n", sizeof(gchar), 1, fp) == EOF)) { perror("fwrite"); g_warning(_("Can't write to file.\n")); fp = NULL; } - count += read_count; - } while (count < size); + + if (*(cur + 1) == '\n') + prev = cur + 2; + else + prev = cur + 1; + + if (prev - buf >= size) break; + } + + if (prev - buf < size && fp && + fwrite(buf, sizeof(gchar), size - (prev - buf), fp) == EOF) { + perror("fwrite"); + g_warning(_("Can't write to file.\n")); + fp = NULL; + } + + g_free(buf); if (!fp) return -1; -- cgit v1.2.3