comparison src/lib-mail/message-send.c @ 991:21788a1e9e39 HEAD

Partial fetches are working fast again - faster than ever actually.
author Timo Sirainen <tss@iki.fi>
date Tue, 21 Jan 2003 07:37:35 +0200
parents 8028c4dcf38f
children e0dbaabbc22b
comparison
equal deleted inserted replaced
990:9c8df18fb2a9 991:21788a1e9e39
5 #include "ostream.h" 5 #include "ostream.h"
6 #include "message-parser.h" 6 #include "message-parser.h"
7 #include "message-send.h" 7 #include "message-send.h"
8 #include "message-size.h" 8 #include "message-size.h"
9 9
10 int message_send(struct ostream *output, struct istream *input, 10 off_t message_send(struct ostream *output, struct istream *input,
11 const struct message_size *msg_size, 11 const struct message_size *msg_size,
12 uoff_t virtual_skip, uoff_t max_virtual_size) 12 uoff_t virtual_skip, uoff_t max_virtual_size)
13 { 13 {
14 const unsigned char *msg; 14 const unsigned char *msg;
15 uoff_t old_limit, limit; 15 uoff_t old_limit, limit;
16 size_t i, size; 16 size_t i, size;
17 int cr_skipped, add_cr, ret; 17 off_t ret;
18 int cr_skipped, add_cr;
18 19
19 if (msg_size->physical_size == 0 || 20 if (msg_size->physical_size == 0 ||
20 virtual_skip >= msg_size->virtual_size) 21 virtual_skip >= msg_size->virtual_size)
21 return TRUE; 22 return 0;
22 23
23 if (max_virtual_size > msg_size->virtual_size - virtual_skip) 24 if (max_virtual_size > msg_size->virtual_size - virtual_skip)
24 max_virtual_size = msg_size->virtual_size - virtual_skip; 25 max_virtual_size = msg_size->virtual_size - virtual_skip;
25 26
26 if (msg_size->physical_size == msg_size->virtual_size) { 27 if (msg_size->physical_size == msg_size->virtual_size) {
37 } 38 }
38 39
39 message_skip_virtual(input, virtual_skip, NULL, &cr_skipped); 40 message_skip_virtual(input, virtual_skip, NULL, &cr_skipped);
40 41
41 /* go through the message data and insert CRs where needed. */ 42 /* go through the message data and insert CRs where needed. */
43 ret = 0;
42 while (max_virtual_size > 0 && 44 while (max_virtual_size > 0 &&
43 i_stream_read_data(input, &msg, &size, 0) > 0) { 45 i_stream_read_data(input, &msg, &size, 0) > 0) {
44 add_cr = FALSE; 46 add_cr = FALSE;
45 for (i = 0; i < size && max_virtual_size > 0; i++) { 47 for (i = 0; i < size && max_virtual_size > 0; i++) {
46 max_virtual_size--; 48 max_virtual_size--;
53 break; 55 break;
54 } 56 }
55 } 57 }
56 } 58 }
57 59
60 ret += i;
58 if (o_stream_send(output, msg, i) < 0) 61 if (o_stream_send(output, msg, i) < 0)
59 return FALSE; 62 return -1;
60 63
61 if (add_cr) { 64 if (add_cr) {
65 ret++;
62 if (o_stream_send(output, "\r", 1) < 0) 66 if (o_stream_send(output, "\r", 1) < 0)
63 return FALSE; 67 return -1;
64 cr_skipped = TRUE; 68 cr_skipped = TRUE;
65 } else { 69 } else {
66 cr_skipped = i > 0 && msg[i-1] == '\r'; 70 cr_skipped = i > 0 && msg[i-1] == '\r';
67 } 71 }
68 72
69 i_stream_skip(input, i); 73 i_stream_skip(input, i);
70 } 74 }
71 75
72 return TRUE; 76 return ret;
73 } 77 }