alecpl
2011-10-26 8a6503a23c48470f4bc98a21bde61490e0836bda
- Fix getting message part data from structure, fixes r5363 


2 files modified
80 ■■■■ changed files
program/include/rcube_imap.php 10 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap_generic.php 70 ●●●● patch | view | raw | blame | history
program/include/rcube_imap.php
@@ -2376,14 +2376,16 @@
     */
    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)) {
            $structure = $this->conn->getStructure($this->mailbox, $uid, true);
            $part_data = rcube_imap_generic::getStructurePartData($structure, $part);
            $o_part = new rcube_message_part;
            $o_part->ctype_primary = strtolower(rcube_imap_generic::getStructurePartType($structure, $part));
            $o_part->encoding      = strtolower(rcube_imap_generic::getStructurePartEncoding($structure, $part));
            $o_part->charset       = rcube_imap_generic::getStructurePartCharset($structure, $part);
            $o_part->ctype_primary = $part_data['type'];
            $o_part->encoding      = $part_data['encoding'];
            $o_part->charset       = $part_data['charset'];
            $o_part->size          = $part_data['size'];
        }
        if ($o_part && $o_part->size) {
program/include/rcube_imap_generic.php
@@ -3176,47 +3176,48 @@
        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);
        if (!empty($part_a)) {
            if (is_array($part_a[0]))
                return 'multipart';
            else if ($part_a[0])
                return $part_a[0];
        }
        $data   = array();
        return 'other';
    }
        if (empty($part_a)) {
            return $data;
        }
    static function getStructurePartEncoding($structure, $part)
    {
        $part_a = self::getStructurePartArray($structure, $part);
        if ($part_a) {
            if (!is_array($part_a[0]))
                return $part_a[5];
        }
        // content-type
        if (is_array($part_a[0])) {
            $data['type'] = 'multipart';
        }
        else {
            $data['type'] = strtolower($part_a[0]);
        return '';
    }
            // encoding
            $data['encoding'] = strtolower($part_a[5]);
    static function getStructurePartCharset($structure, $part)
    {
        $part_a = self::getStructurePartArray($structure, $part);
        if ($part_a) {
            if (is_array($part_a[0]))
                return '';
            else {
                if (is_array($part_a[2])) {
                    $name = '';
                    while (list($key, $val) = each($part_a[2]))
                        if (strcasecmp($val, 'charset') == 0)
                            return $part_a[2][$key+1];
                }
            }
        }
            // charset
            if (is_array($part_a[2])) {
               while (list($key, $val) = each($part_a[2])) {
                    if (strcasecmp($val, 'charset') == 0) {
                        $data['charset'] = $part_a[2][$key+1];
                        break;
                    }
                }
            }
        }
        return '';
        // size
        $data['size'] = intval($part_a[6]);
        return $data;
    }
    static function getStructurePartArray($a, $part)
@@ -3248,7 +3249,6 @@
            return $a;
        }
    }
    /**
     * Creates next command identifier (tag)