- Fix getting message part data from structure, fixes r5363

pull/1/head
alecpl 13 years ago
parent 2db2ef3ec9
commit 8a6503a23c

@ -2376,14 +2376,16 @@ class rcube_imap
*/ */
function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL, $skip_charset_conv=false) function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL, $skip_charset_conv=false)
{ {
// get part encoding if not provided // get part data if not provided
if (!is_object($o_part)) { if (!is_object($o_part)) {
$structure = $this->conn->getStructure($this->mailbox, $uid, true); $structure = $this->conn->getStructure($this->mailbox, $uid, true);
$part_data = rcube_imap_generic::getStructurePartData($structure, $part);
$o_part = new rcube_message_part; $o_part = new rcube_message_part;
$o_part->ctype_primary = strtolower(rcube_imap_generic::getStructurePartType($structure, $part)); $o_part->ctype_primary = $part_data['type'];
$o_part->encoding = strtolower(rcube_imap_generic::getStructurePartEncoding($structure, $part)); $o_part->encoding = $part_data['encoding'];
$o_part->charset = rcube_imap_generic::getStructurePartCharset($structure, $part); $o_part->charset = $part_data['charset'];
$o_part->size = $part_data['size'];
} }
if ($o_part && $o_part->size) { if ($o_part && $o_part->size) {

@ -3176,47 +3176,48 @@ class rcube_imap_generic
return false; return false;
} }
static function getStructurePartType($structure, $part) /**
* Returns data of a message part according to specified structure.
*
* @param array $structure Message structure (getStructure() result)
* @param string $part Message part identifier
*
* @return array Part data as hash array (type, encoding, charset, size)
*/
static function getStructurePartData($structure, $part)
{ {
$part_a = self::getStructurePartArray($structure, $part); $part_a = self::getStructurePartArray($structure, $part);
if (!empty($part_a)) { $data = array();
if (is_array($part_a[0]))
return 'multipart';
else if ($part_a[0])
return $part_a[0];
}
return 'other'; if (empty($part_a)) {
return $data;
} }
static function getStructurePartEncoding($structure, $part) // content-type
{ if (is_array($part_a[0])) {
$part_a = self::getStructurePartArray($structure, $part); $data['type'] = 'multipart';
if ($part_a) {
if (!is_array($part_a[0]))
return $part_a[5];
} }
else {
$data['type'] = strtolower($part_a[0]);
return ''; // encoding
} $data['encoding'] = strtolower($part_a[5]);
static function getStructurePartCharset($structure, $part) // charset
{
$part_a = self::getStructurePartArray($structure, $part);
if ($part_a) {
if (is_array($part_a[0]))
return '';
else {
if (is_array($part_a[2])) { if (is_array($part_a[2])) {
$name = ''; while (list($key, $val) = each($part_a[2])) {
while (list($key, $val) = each($part_a[2])) if (strcasecmp($val, 'charset') == 0) {
if (strcasecmp($val, 'charset') == 0) $data['charset'] = $part_a[2][$key+1];
return $part_a[2][$key+1]; break;
} }
} }
} }
}
// size
$data['size'] = intval($part_a[6]);
return ''; return $data;
} }
static function getStructurePartArray($a, $part) static function getStructurePartArray($a, $part)
@ -3249,7 +3250,6 @@ class rcube_imap_generic
} }
} }
/** /**
* Creates next command identifier (tag) * Creates next command identifier (tag)
* *

Loading…
Cancel
Save