| | |
| | | +-----------------------------------------------------------------------+ |
| | | | program/include/rcube_mime_struct.php | |
| | | | | |
| | | | This file is part of the RoundCube Webmail client | |
| | | | Copyright (C) 2005-2010, RoundCube Dev. - Switzerland | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | PURPOSE: | |
| | |
| | | |
| | | */ |
| | | |
| | | |
| | | /** |
| | | * Helper class to process IMAP's BODYSTRUCTURE string |
| | | * |
| | | * @package Mail |
| | | * @author Aleksander Machniak <alec@alec.pl> |
| | | */ |
| | | class rcube_mime_struct |
| | | { |
| | | private $structure; |
| | |
| | | $line = substr($str, 1, strlen($str) - 2); |
| | | $line = str_replace(')(', ') (', $line); |
| | | |
| | | $struct = self::parseBSString($line); |
| | | $struct = rcube_imap_generic::tokenizeResponse($line); |
| | | if (!is_array($struct[0]) && (strcasecmp($struct[0], 'message') == 0) |
| | | && (strcasecmp($struct[1], 'rfc822') == 0)) { |
| | | $struct = array($struct); |
| | |
| | | else if ($part_a[0]) |
| | | return $part_a[0]; |
| | | } |
| | | |
| | | |
| | | return 'other'; |
| | | } |
| | | |
| | |
| | | if (!is_array($part_a[0])) |
| | | return $part_a[5]; |
| | | } |
| | | |
| | | |
| | | return ''; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | return ''; |
| | | } |
| | | |
| | |
| | | return $a; |
| | | } |
| | | } |
| | | |
| | | private function closingParenPos($str, $start) |
| | | { |
| | | $level = 0; |
| | | $len = strlen($str); |
| | | $in_quote = 0; |
| | | |
| | | for ($i=$start; $i<$len; $i++) { |
| | | if ($str[$i] == '"' && $str[$i-1] != "\\") { |
| | | $in_quote = ($in_quote + 1) % 2; |
| | | } |
| | | if (!$in_quote) { |
| | | if ($str[$i] == '(') |
| | | $level++; |
| | | else if (($level > 0) && ($str[$i] == ')')) |
| | | $level--; |
| | | else if (($level == 0) && ($str[$i] == ')')) |
| | | return $i; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * Parses IMAP's BODYSTRUCTURE string into array |
| | | */ |
| | | private function parseBSString($str) |
| | | { |
| | | $id = 0; |
| | | $a = array(); |
| | | $len = strlen($str); |
| | | $in_quote = 0; |
| | | |
| | | for ($i=0; $i<$len; $i++) { |
| | | if ($str[$i] == '"') { |
| | | $in_quote = ($in_quote + 1) % 2; |
| | | } else if (!$in_quote) { |
| | | // space means new element |
| | | if ($str[$i] == ' ') { |
| | | $id++; |
| | | // skip additional spaces |
| | | while ($str[$i+1] == ' ') |
| | | $i++; |
| | | // new part |
| | | } else if ($str[$i] == '(') { |
| | | $i++; |
| | | $endPos = self::closingParenPos($str, $i); |
| | | $partLen = $endPos - $i; |
| | | if ($partLen < 0) |
| | | break; |
| | | $part = substr($str, $i, $partLen); |
| | | $a[$id] = self::parseBSString($part); // send part string |
| | | $i = $endPos; |
| | | } else |
| | | $a[$id] .= $str[$i]; //add to current element in array |
| | | } else if ($in_quote) { |
| | | if ($str[$i] == "\\") { |
| | | $i++; // escape backslashes |
| | | if ($str[$i] == '"' || $str[$i] == "\\") |
| | | $a[$id] .= $str[$i]; |
| | | } |
| | | else |
| | | $a[$id] .= $str[$i]; //add to current element in array |
| | | } |
| | | } |
| | | |
| | | reset($a); |
| | | return $a; |
| | | } |
| | | |
| | | |
| | | } |