mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
7.2 KiB
258 lines
7.2 KiB
<?php |
|
|
|
/* |
|
* This file is part of SwiftMailer. |
|
* (c) 2004-2009 Chris Corbyn |
|
* |
|
* For the full copyright and license information, please view the LICENSE |
|
* file that was distributed with this source code. |
|
*/ |
|
|
|
/** |
|
* An abstract base MIME Header. |
|
* |
|
* @author Chris Corbyn |
|
*/ |
|
class Swift_Mime_Headers_ParameterizedHeader extends Swift_Mime_Headers_UnstructuredHeader implements Swift_Mime_ParameterizedHeader |
|
{ |
|
/** |
|
* RFC 2231's definition of a token. |
|
* |
|
* @var string |
|
*/ |
|
const TOKEN_REGEX = '(?:[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E]+)'; |
|
|
|
/** |
|
* The Encoder used to encode the parameters. |
|
* |
|
* @var Swift_Encoder |
|
*/ |
|
private $_paramEncoder; |
|
|
|
/** |
|
* The parameters as an associative array. |
|
* |
|
* @var string[] |
|
*/ |
|
private $_params = array(); |
|
|
|
/** |
|
* Creates a new ParameterizedHeader with $name. |
|
* |
|
* @param string $name |
|
* @param Swift_Mime_HeaderEncoder $encoder |
|
* @param Swift_Encoder $paramEncoder, optional |
|
* @param Swift_Mime_Grammar $grammar |
|
*/ |
|
public function __construct($name, Swift_Mime_HeaderEncoder $encoder, Swift_Encoder $paramEncoder = null, Swift_Mime_Grammar $grammar) |
|
{ |
|
parent::__construct($name, $encoder, $grammar); |
|
$this->_paramEncoder = $paramEncoder; |
|
} |
|
|
|
/** |
|
* Get the type of Header that this instance represents. |
|
* |
|
* @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX |
|
* @see TYPE_DATE, TYPE_ID, TYPE_PATH |
|
* |
|
* @return int |
|
*/ |
|
public function getFieldType() |
|
{ |
|
return self::TYPE_PARAMETERIZED; |
|
} |
|
|
|
/** |
|
* Set the character set used in this Header. |
|
* |
|
* @param string $charset |
|
*/ |
|
public function setCharset($charset) |
|
{ |
|
parent::setCharset($charset); |
|
if (isset($this->_paramEncoder)) { |
|
$this->_paramEncoder->charsetChanged($charset); |
|
} |
|
} |
|
|
|
/** |
|
* Set the value of $parameter. |
|
* |
|
* @param string $parameter |
|
* @param string $value |
|
*/ |
|
public function setParameter($parameter, $value) |
|
{ |
|
$this->setParameters(array_merge($this->getParameters(), array($parameter => $value))); |
|
} |
|
|
|
/** |
|
* Get the value of $parameter. |
|
* |
|
* @param string $parameter |
|
* |
|
* @return string |
|
*/ |
|
public function getParameter($parameter) |
|
{ |
|
$params = $this->getParameters(); |
|
|
|
return array_key_exists($parameter, $params) ? $params[$parameter] : null; |
|
} |
|
|
|
/** |
|
* Set an associative array of parameter names mapped to values. |
|
* |
|
* @param string[] $parameters |
|
*/ |
|
public function setParameters(array $parameters) |
|
{ |
|
$this->clearCachedValueIf($this->_params != $parameters); |
|
$this->_params = $parameters; |
|
} |
|
|
|
/** |
|
* Returns an associative array of parameter names mapped to values. |
|
* |
|
* @return string[] |
|
*/ |
|
public function getParameters() |
|
{ |
|
return $this->_params; |
|
} |
|
|
|
/** |
|
* Get the value of this header prepared for rendering. |
|
* |
|
* @return string |
|
*/ |
|
public function getFieldBody() //TODO: Check caching here |
|
{ |
|
$body = parent::getFieldBody(); |
|
foreach ($this->_params as $name => $value) { |
|
if (!is_null($value)) { |
|
// Add the parameter |
|
$body .= '; '.$this->_createParameter($name, $value); |
|
} |
|
} |
|
|
|
return $body; |
|
} |
|
|
|
/** |
|
* Generate a list of all tokens in the final header. |
|
* |
|
* This doesn't need to be overridden in theory, but it is for implementation |
|
* reasons to prevent potential breakage of attributes. |
|
* |
|
* @param string $string The string to tokenize |
|
* |
|
* @return array An array of tokens as strings |
|
*/ |
|
protected function toTokens($string = null) |
|
{ |
|
$tokens = parent::toTokens(parent::getFieldBody()); |
|
|
|
// Try creating any parameters |
|
foreach ($this->_params as $name => $value) { |
|
if (!is_null($value)) { |
|
// Add the semi-colon separator |
|
$tokens[count($tokens) - 1] .= ';'; |
|
$tokens = array_merge($tokens, $this->generateTokenLines( |
|
' '.$this->_createParameter($name, $value) |
|
)); |
|
} |
|
} |
|
|
|
return $tokens; |
|
} |
|
|
|
/** |
|
* Render a RFC 2047 compliant header parameter from the $name and $value. |
|
* |
|
* @param string $name |
|
* @param string $value |
|
* |
|
* @return string |
|
*/ |
|
private function _createParameter($name, $value) |
|
{ |
|
$origValue = $value; |
|
|
|
$encoded = false; |
|
// Allow room for parameter name, indices, "=" and DQUOTEs |
|
$maxValueLength = $this->getMaxLineLength() - strlen($name.'=*N"";') - 1; |
|
$firstLineOffset = 0; |
|
|
|
// If it's not already a valid parameter value... |
|
if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) { |
|
// TODO: text, or something else?? |
|
// ... and it's not ascii |
|
if (!preg_match('/^'.$this->getGrammar()->getDefinition('text').'*$/D', $value)) { |
|
$encoded = true; |
|
// Allow space for the indices, charset and language |
|
$maxValueLength = $this->getMaxLineLength() - strlen($name.'*N*="";') - 1; |
|
$firstLineOffset = strlen( |
|
$this->getCharset()."'".$this->getLanguage()."'" |
|
); |
|
} |
|
} |
|
|
|
// Encode if we need to |
|
if ($encoded || strlen($value) > $maxValueLength) { |
|
if (isset($this->_paramEncoder)) { |
|
$value = $this->_paramEncoder->encodeString( |
|
$origValue, $firstLineOffset, $maxValueLength, $this->getCharset() |
|
); |
|
} else { |
|
// We have to go against RFC 2183/2231 in some areas for interoperability |
|
$value = $this->getTokenAsEncodedWord($origValue); |
|
$encoded = false; |
|
} |
|
} |
|
|
|
$valueLines = isset($this->_paramEncoder) ? explode("\r\n", $value) : array($value); |
|
|
|
// Need to add indices |
|
if (count($valueLines) > 1) { |
|
$paramLines = array(); |
|
foreach ($valueLines as $i => $line) { |
|
$paramLines[] = $name.'*'.$i. |
|
$this->_getEndOfParameterValue($line, true, $i == 0); |
|
} |
|
|
|
return implode(";\r\n ", $paramLines); |
|
} else { |
|
return $name.$this->_getEndOfParameterValue( |
|
$valueLines[0], $encoded, true |
|
); |
|
} |
|
} |
|
|
|
/** |
|
* Returns the parameter value from the "=" and beyond. |
|
* |
|
* @param string $value to append |
|
* @param bool $encoded |
|
* @param bool $firstLine |
|
* |
|
* @return string |
|
*/ |
|
private function _getEndOfParameterValue($value, $encoded = false, $firstLine = false) |
|
{ |
|
if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) { |
|
$value = '"'.$value.'"'; |
|
} |
|
$prepend = '='; |
|
if ($encoded) { |
|
$prepend = '*='; |
|
if ($firstLine) { |
|
$prepend = '*='.$this->getCharset()."'".$this->getLanguage(). |
|
"'"; |
|
} |
|
} |
|
|
|
return $prepend.$value; |
|
} |
|
}
|
|
|