Skip to content

Commit

Permalink
Simplify message data handling when building MIME message.
Browse files Browse the repository at this point in the history
Use Horde_Stream, only convert in one place, reduce memory usage.

Conflicts:
	framework/ActiveSync/lib/Horde/ActiveSync/Imap/Adapter.php
  • Loading branch information
mrubinsk committed Oct 1, 2013
1 parent 37e50eb commit 5033ceb
Showing 1 changed file with 34 additions and 50 deletions.
84 changes: 34 additions & 50 deletions framework/ActiveSync/lib/Horde/ActiveSync/Imap/Adapter.php
Expand Up @@ -882,13 +882,11 @@ protected function _buildMailMessage(
$eas_message->importance = $this->_getEASImportance($priority);

// Get the body data and ensure we have something to send.
$message_body_data = $imap_message->getMessageBodyData($options);
$message_body_data = $this->_validateMessageBodyData($imap_message->getMessageBodyData($options));

if ($version == Horde_ActiveSync::VERSION_TWOFIVE) {
$eas_message->body = $this->_validateUtf8(
$message_body_data['plain']['body'],
$message_body_data['plain']['charset']
);
$eas_message->bodysize = Horde_String::length($eas_message->body);
$eas_message->body = $message_body_data['plain']['body']->stream;
$eas_message->bodysize = $message_body_data['plain']['body']->length(true);
$eas_message->bodytruncated = $message_body_data['plain']['truncated'];
$eas_message->attachments = $imap_message->getAttachments($version);
} else {
Expand Down Expand Up @@ -917,24 +915,11 @@ protected function _buildMailMessage(
$mime = new Horde_Mime_Part();
$mime->setType('multipart/alternative');

// We will need the eol filter to work around PHP bug 65776.
stream_filter_register('horde_eol', 'Horde_Stream_Filter_Eol');

// Populate the text/plain part if we have one.
if (!empty($message_body_data['plain'])) {
$plain_mime = new Horde_Mime_Part();
$plain_mime->setType('text/plain');
$message_body_data['plain']['body'] = $this->_validateUtf8(
$message_body_data['plain']['body'],
$message_body_data['plain']['charset']
);

// PHP Bug 65776
$stream = new Horde_Stream();
$stream->add($message_body_data['plain']['body']);
stream_filter_append($stream->stream, 'horde_eol', STREAM_FILTER_READ, array('eol' => $stream->getEOL()));
$plain_mime->setContents($stream->stream);
fclose($stream->stream);
$plain_mime->setContents($message_body_data['plain']['body']->stream, array('usestream' => true));
$plain_mime->setCharset('UTF-8');
$mime->addPart($plain_mime);
}
Expand All @@ -943,17 +928,7 @@ protected function _buildMailMessage(
if (!empty($message_body_data['html'])) {
$html_mime = new Horde_Mime_Part();
$html_mime->setType('text/html');
$message_body_data['html']['body'] = $this->_validateUtf8(
$message_body_data['html']['body'],
$message_body_data['html']['charset']
);

// PHP Bug 65776
$stream = new Horde_Stream();
$stream->add($message_body_data['html']['body']);
stream_filter_append($stream->stream, 'horde_eol', STREAM_FILTER_READ, array('eol' => $stream->getEOL()));
$html_mime->setContents($stream->stream);
fclose($stream->stream);
$html_mime->setContents($message_body_data['html']['body']->stream, array('usestream' => true));
$html_mime->setCharset('UTF-8');
$mime->addPart($html_mime);
}
Expand Down Expand Up @@ -1014,31 +989,23 @@ protected function _buildMailMessage(
$message_body_data['html'] = array(
'body' => $message_body_data['plain']['body'],
'estimated_size' => $message_body_data['plain']['size'],
'truncated' => $message_body_data['plain']['truncated'],
'charset' => $message_body_data['plain']['charset']
'truncated' => $message_body_data['plain']['truncated']
);
} else {
$airsync_body->type = Horde_ActiveSync::BODYPREF_TYPE_HTML;
}
$airsync_body->estimateddatasize = $message_body_data['html']['estimated_size'];
$airsync_body->truncated = $message_body_data['html']['truncated'];
$airsync_body->data = $this->_validateUtf8(
$message_body_data['html']['body'],
$message_body_data['html']['charset']
);
$airsync_body->data = $message_body_data['html']['body']->stream;
$eas_message->airsyncbasebody = $airsync_body;
$eas_message->airsyncbaseattachments = $imap_message->getAttachments($version);
} elseif (isset($options['bodyprefs'][Horde_ActiveSync::BODYPREF_TYPE_PLAIN])) {

// Non MIME encoded plaintext
$this->_logger->info('Sending PLAINTEXT Message.');
$message_body_data['plain']['body'] = $this->_validateUtf8(
$message_body_data['plain']['body'],
$message_body_data['plain']['charset']
);
$airsync_body->estimateddatasize = $message_body_data['plain']['size'];
$airsync_body->truncated = $message_body_data['plain']['truncated'];
$airsync_body->data = $message_body_data['plain']['body'];
$airsync_body->data = $message_body_data['plain']['body']->stream;
$airsync_body->type = Horde_ActiveSync::BODYPREF_TYPE_PLAIN;
$eas_message->airsyncbasebody = $airsync_body;
$eas_message->airsyncbaseattachments = $imap_message->getAttachments($version);
Expand All @@ -1047,14 +1014,8 @@ protected function _buildMailMessage(

// Preview?
if ($version >= Horde_ActiveSync::VERSION_FOURTEEN && !empty($options['bodyprefs']['preview'])) {
$eas_message->airsyncbasebody->preview = Horde_String::substr(
$message_body_data['plain']['body'],
0,
$options['bodyprefs']['preview'],
$message_body_data['plain']['charset']);
$eas_message->airsyncbasebody->preview = $this->_validateUtf8(
$eas_message->airsyncbasebody->preview,
$message_body_data['plain']['charset']);
$eas_message->airsyncbasebody->preview =
$message_body_data['plain']['body']->getString(0, $options['bodyprefs']['preview']);
}

// Check for special message types.
Expand Down Expand Up @@ -1545,4 +1506,27 @@ protected function _validateUtf8($data, $from_charset)
return $text;
}

protected function _validateMessageBodyData($data)
{
//We will need the eol filter to work around PHP bug 65776.
stream_filter_register('horde_eol', 'Horde_Stream_Filter_Eol');

if (!empty($data['plain'])) {
$stream = new Horde_Stream_Temp(array('max_memory' => 1048576));
$filter_h = stream_filter_append($stream->stream, 'horde_eol', STREAM_FILTER_WRITE);
$stream->add($this->_validateUtf8($data['plain']['body'], $data['plain']['charset']), true);
stream_filter_remove($filter_h);
$data['plain']['body'] = $stream;
}
if (!empty($data['html'])) {
$stream = new Horde_Stream_Temp(array('max_memory' => 1048576));
$filter_h = stream_filter_append($stream->stream, 'horde_eol', STREAM_FILTER_WRITE);
$stream->add($this->_validateUtf8($data['html']['body'], $data['html']['charset']), true);
stream_filter_remove($filter_h);
$data['html']['body'] = $stream;
}

return $data;
}

}

0 comments on commit 5033ceb

Please sign in to comment.