diff options
author | alecpl <alec@alec.pl> | 2008-09-16 08:49:28 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2008-09-16 08:49:28 +0000 |
commit | 81b573d98ae143bd11b37ff2027bfad78e2d460c (patch) | |
tree | 11975b2cfc8fc6affdb5e1ecf92728fd66b536ab /program/lib | |
parent | cf507b27accdfc1b6fde138e2f7fadf010c8a43c (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.inc | 66 |
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) { |