blob: 405daa23461e6e7f49e6da42ba4dbf84ee8a7dc4 [file] [log] [blame]
<?php
/**
* File containing the ezcMailFilePart class
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Mail
* @version //autogen//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Mail part for all forms of binary data.
*
* @todo MimeType recognition
*
* @property string $fileName
* The name of the file which is to be attached to the email.
* @property string $mimeType
* The mimetype of the file.
* @property string $contentType
* The content type of the file.
* Possible values are: CONTENT_TYPE_IMAGE, CONTENT_TYPE_VIDEO and
* CONTENT_TYPE_APPLICATION.
* @property string $dispositionType
* If the file should be shown inline in the mail or as an
* attachment. Possible values are: DISPLAY_ATTACHMENT and
* DISPLAY_INLINE.
* @property int $contentId
* The ID of this part. Used for internal links within an email.
* Setting this also sets the header Content-ID.
*
* @package Mail
* @version //autogen//
*/
abstract class ezcMailFilePart extends ezcMailPart
{
/**
* Image content type. Use this if the contents of the file is an image.
*/
const CONTENT_TYPE_IMAGE = "image";
/**
* Video content type. Use this if the contents of the file is a video.
*/
const CONTENT_TYPE_VIDEO = "video";
/**
* Audio content type. Use this if the contents of the file is an audio.
*/
const CONTENT_TYPE_AUDIO = "audio";
/**
* Application content type. Use this if the file non of the other
* content types match.
*/
const CONTENT_TYPE_APPLICATION = "application";
/**
* Use DISPLAY_ATTACHMENT if you want the file to be displayed as an
* attachment to the recipients of the mail.
*/
const DISPLAY_ATTACHMENT = "attachment";
/**
* Use DISPLAY_INLINE if you want the file to be displayed inline in the
* mail to the recipients.
*/
const DISPLAY_INLINE = "inline";
/**
* Constructs a new attachment with $fileName.
*
* @param string $fileName
*/
public function __construct( $fileName )
{
parent::__construct();
// initialize properties that may be touched automatically
// this is to avoid notices
$this->properties['contentType'] = null;
$this->properties['mimeType'] = null;
$this->properties['dispositionType'] = null;
$this->properties['contentId'] = null;
$this->fileName = $fileName;
}
/**
* Sets the property $name to $value.
*
* @throws ezcBasePropertyNotFoundException
* if the property does not exist.
* @param string $name
* @param mixed $value
* @ignore
*/
public function __set( $name, $value )
{
switch ( $name )
{
case 'fileName':
$this->properties['fileName'] = $value;
break;
case 'mimeType':
$this->properties['mimeType'] = $value;
break;
case 'contentType':
$this->properties['contentType'] = $value;
break;
case 'dispositionType':
$this->properties['dispositionType'] = $value;
break;
case 'contentId':
$this->properties['contentId'] = $value;
$this->setHeader( 'Content-ID', '<' . $value . '>' );
break;
default:
return parent::__set( $name, $value );
break;
}
}
/**
* Returns the value of property $value.
*
* @throws ezcBasePropertyNotFoundException
* if the property does not exist.
* @param string $name
* @return mixed
* @ignore
*/
public function __get( $name )
{
switch ( $name )
{
case 'fileName':
case 'mimeType':
case 'contentType':
case 'dispositionType':
case 'contentId':
return $this->properties[$name];
break;
default:
return parent::__get( $name );
break;
}
}
/**
* Returns true if the property $name is set, otherwise false.
*
* @param string $name
* @return bool
* @ignore
*/
public function __isset( $name )
{
switch ( $name )
{
case 'fileName':
case 'mimeType':
case 'contentType':
case 'dispositionType':
case 'contentId':
return isset( $this->properties[$name] );
default:
return parent::__isset( $name );
}
}
/**
* Sets the Content-Type header.
*
* Based on the contentType, mimeType and fileName.
*/
private function setHeaderContentType()
{
$fileName = basename( $this->fileName );
if ( $this->contentDisposition !== null && $this->contentDisposition->fileName !== null )
{
$fileName = $this->contentDisposition->fileName;
}
$this->setHeader( 'Content-Type',
$this->contentType . '/' . $this->mimeType . '; ' . 'name="' . $fileName . '"' );
}
/**
* Sets the Content-Disposition header based on the properties $dispositionType and $fileName.
*
* Does not set the fileNameCharSet and fileNameLanguage properties of the
* Content-Disposition header. For this purpose set directly
* $this->contentDisposition with an object of class ezcMailContentDispositionHeader.
*/
private function setHeaderContentDisposition()
{
if ( !isset( $this->dispositionType ) )
{
$this->dispositionType = self::DISPLAY_ATTACHMENT;
}
if ( $this->contentDisposition == null )
{
$this->contentDisposition = new ezcMailContentDispositionHeader();
// modified for issue #14025: set the file name and disposition
// only if the contentDisposition was null (to not overwrite
// the value set by the user)
$this->contentDisposition->disposition = $this->dispositionType;
$this->contentDisposition->fileName = basename( $this->fileName );
}
}
/**
* Override of the generate() method from ezcMailPart. Used to set headers before
* generating the part.
*
* @return string
*/
public function generate()
{
$this->setHeaderContentType();
$this->setHeader( 'Content-Transfer-Encoding', 'base64' );
$this->setHeaderContentDisposition();
return parent::generate();
}
}
?>