Вход Регистрация
Файл: contao-3.5.8/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/ParameterizedHeader.php
Строк: 244
<?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 '(?:[x21x23-x27x2Ax2Bx2Dx2Ex30-x39x41-x5Ax5E-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($nameSwift_Mime_HeaderEncoder $encoderSwift_Encoder $paramEncoder nullSwift_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("rn"$value) : array($value);

        
// Need to add indices
        
if (count($valueLines) > 1) {
            
$paramLines = array();
            foreach (
$valueLines as $i => $line) {
                
$paramLines[] = $name.'*'.$i.
                    
$this->_getEndOfParameterValue($linetrue$i == 0);
            }

            return 
implode(";rn "$paramLines);
        } else {
            return 
$name.$this->_getEndOfParameterValue(
                
$valueLines[0], $encodedtrue
                
);
        }
    }

    
/**
     * 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;
    }
}
Онлайн: 1
Реклама