summaryrefslogtreecommitdiff
path: root/program/lib
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2008-09-16 08:49:28 +0000
committeralecpl <alec@alec.pl>2008-09-16 08:49:28 +0000
commit81b573d98ae143bd11b37ff2027bfad78e2d460c (patch)
tree11975b2cfc8fc6affdb5e1ecf92728fd66b536ab /program/lib
parentcf507b27accdfc1b6fde138e2f7fadf010c8a43c (diff)
- Reduced memory footprint when forwarding attachments (#1485345)
- Fixed endless loop in iil_C_HandlePartBody() - rcube_message::get_part_content() speed up using 3rd argument of rcube_imap::get_message_part()
Diffstat (limited to 'program/lib')
-rw-r--r--program/lib/imap.inc66
1 files changed, 44 insertions, 22 deletions
diff --git a/program/lib/imap.inc b/program/lib/imap.inc
index eb30d42c5..17197d872 100644
--- a/program/lib/imap.inc
+++ b/program/lib/imap.inc
@@ -65,6 +65,7 @@
- RFC3501 [7.1] don't call CAPABILITY if was returned in server
optional resposne in iil_Connect(), added iil_C_GetCapability()
- remove 'undisclosed-recipients' string from 'To' header
+ - iil_C_HandlePartBody(): added 6th argument and fixed endless loop
********************************************************/
@@ -2353,19 +2354,19 @@ function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
return $result;
}
-function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
+function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode, $file=NULL) {
/* modes:
- 1: return string
+ 1: return string (or write to $file pointer)
2: print
- 3: base64 and print
+ 3: base64 and print (or write to $file pointer)
*/
$fp = $conn->fp;
$result = false;
if (($part == 0) || empty($part)) {
- $part = 'TEXT';
+ $part = 'TEXT';
}
-
+
if (iil_C_Select($conn, $mailbox)) {
$reply_key = '* ' . $id;
@@ -2399,8 +2400,11 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
if ($mode == 2) {
echo $result;
} else if ($mode == 3) {
- echo base64_decode($result);
- }
+ if ($file)
+ fwrite($file, base64_decode($result));
+ else
+ echo base64_decode($result);
+ }
} else if ($line[$len-1] == '}') {
//multi-line request, find sizes of content and receive that many bytes
$from = strpos($line, '{') + 1;
@@ -2408,34 +2412,47 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
$len = $to - $from;
$sizeStr = substr($line, $from, $len);
$bytes = (int)$sizeStr;
- $received = 0;
- while ($received < $bytes) {
- $remaining = $bytes - $received;
- $line = iil_ReadLine($fp, 1024);
+ while ($bytes > 0) {
+ $line = iil_ReadLine($fp, 1024);
$len = strlen($line);
- if ($len > $remaining) {
- $line = substr($line, 0, $remaining);
+ if ($len > $bytes) {
+ $line = substr($line, 0, $bytes);
}
- $received += strlen($line);
+ $bytes -= strlen($line);
+
if ($mode == 1) {
- $result .= rtrim($line, "\t\r\n\0\x0B") . "\n";
+ if ($file)
+ fwrite($file, rtrim($line, "\t\r\n\0\x0B") . "\n");
+ else
+ $result .= rtrim($line, "\t\r\n\0\x0B") . "\n";
} else if ($mode == 2) {
echo rtrim($line, "\t\r\n\0\x0B") . "\n";
} else if ($mode == 3) {
- echo base64_decode($line);
- }
+ if ($file)
+ fwrite($file, base64_decode($line));
+ else
+ echo base64_decode($line);
+ }
}
}
- // read in anything up until 'til last line
+ // read in anything up until last line
do {
$line = iil_ReadLine($fp, 1024);
} while (!iil_StartsWith($line, $key));
+ if ($mode == 3 && $file) {
+ return true;
+ }
+
if ($result) {
$result = rtrim($result, "\t\r\n\0\x0B");
- return $result; // substr($result, 0, strlen($result)-1);
+ if ($file) {
+ fwrite($file, $result);
+ return true;
+ }
+ return $result; // substr($result, 0, strlen($result)-1);
}
return false;
@@ -2444,13 +2461,18 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
}
if ($mode==1) {
+ if ($file) {
+ fwrite($file, $result);
+ return true;
+ }
return $result;
}
- return $received;
+
+ return false;
}
-function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part) {
- return iil_C_HandlePartBody($conn, $mailbox, $id, $part, 1);
+function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part, $file=NULL) {
+ return iil_C_HandlePartBody($conn, $mailbox, $id, $part, 1, $file);
}
function iil_C_PrintPartBody(&$conn, $mailbox, $id, $part) {