<?php

/**
 * Model of an Attachment
 */
class MimeMailParser_attachment
{
  /**
   * @var $filename Filename
   */
  public $filename;

  /**
   * @var $content_type Mime Type
   */
  public $content_type;

  /**
   * @var $content File Content
   */
  protected $content;

  /**
   * @var $extension Filename extension
   */
  protected $extension;

  /**
   * @var $content_disposition Content-Disposition (attachment or inline)
   */
  public $content_disposition;

  /**
   * @var $headers An Array of the attachment headers
   */
  public $headers;
  protected $stream;

  public function __construct($filename, $content_type, $stream, $content_disposition = 'attachment', $headers = array())
  {
    $this->filename = $filename;
    $this->content_type = $content_type;
    $this->stream = $stream;
    $this->content = null;
    $this->content_disposition = $content_disposition;
    $this->headers = $headers;
  }

  /**
   * retrieve the attachment filename
   * @return String
   */
  public function getFilename()
  {
    return $this->filename;
  }

  /**
   * Retrieve the Attachment Content-Type
   * @return String
   */
  public function getContentType()
  {
    return $this->content_type;
  }

  /**
   * Retrieve the Attachment Content-Disposition
   * @return String
   */
  public function getContentDisposition()
  {
    return $this->content_disposition;
  }

  /**
   * Retrieve the Attachment Headers
   * @return String
   */
  public function getHeaders()
  {
    return $this->headers;
  }

  /**
   * Retrieve the file extension
   * @return String
   */
  public function getFileExtension()
  {
    if (!$this->extension)
    {
      $ext = substr(strrchr($this->filename, '.'), 1);
      if ($ext == 'gz')
      {
        // special case, tar.gz
        // todo: other special cases?
        $ext = preg_match("/\.tar\.gz$/i", $ext) ? 'tar.gz' : 'gz';
      }
      $this->extension = $ext;
    }
    return $this->extension;
  }

  /**
   * Read the contents a few bytes at a time until completed
   * Once read to completion, it always returns false
   * @return String
   * @param $bytes Int[optional]
   */
  public function read($bytes = 2082)
  {
    return feof($this->stream) ? false : fread($this->stream, $bytes);
  }

  /**
   * Retrieve the file content in one go
   * Once you retreive the content you cannot use MimeMailParser_attachment::read()
   * @return String
   */
  public function getContent()
  {
    if ($this->content === null)
    {
      fseek($this->stream, 0);
      while (($buf = $this->read()) !== false)
      {
        $this->content .= $buf;
      }
    }
    return $this->content;
  }

  /**
   * Allow the properties 
   * 	MimeMailParser_attachment::$name,
   * 	MimeMailParser_attachment::$extension 
   * to be retrieved as public properties
   * @param $name Object
   */
  public function __get($name)
  {
    if ($name == 'content')
    {
      return $this->getContent();
    }
    else if ($name == 'extension')
    {
      return $this->getFileExtension();
    }
    return null;
  }
}