Require (again) a Horde_Mime_Part object when creating
authorMichael M Slusarz <slusarz@curecanti.org>
Wed, 12 Nov 2008 21:39:51 +0000 (14:39 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Wed, 12 Nov 2008 21:39:51 +0000 (14:39 -0700)
Bite the bullet and required the Horde_Mime_Part object when creating a
Horde_Mime_Viewer instance. Especially for embedded parts, or for
multiparts that may have to recursively look through the subparts, the
information stored in the MIME part may be needed for things like
determining whether a driver can display a part with the given mode.

framework/Mime/lib/Horde/Mime/Viewer.php
framework/Mime/lib/Horde/Mime/Viewer/Driver.php
framework/Mime/lib/Horde/Mime/Viewer/report.php

index 9eec888..b2d5bae 100644 (file)
@@ -36,18 +36,25 @@ class Horde_Mime_Viewer
      * Attempts to return a concrete Horde_Mime_Viewer_* object based on the
      * MIME type.
      *
-     * @param string $mime_type  The MIME type.
+     * @param Horde_Mime_Part &$mime_part  Reference to an object with the
+     *                                     information to be rendered.
+     * @param string $mime_type            The MIME type (overrides the value
+     *                                     in the MIME part).
      *
      * @return Horde_Mime_Viewer  The Horde_Mime_Viewer object, or false on
      *                            error.
      */
-    static final public function factory($mime_type)
+    static final public function factory(&$mime_part, $mime_type = null)
     {
+        if (is_null($mime_type)) {
+            $mime_type = $mime_part->getType();
+        }
+
         /* Spawn the relevant driver, and return it (or false on failure). */
         if (($ob = self::_getDriver($mime_type, $GLOBALS['registry']->getApp())) &&
             self::_resolveDriver($ob['driver'], $ob['app']) &&
             class_exists($ob['class'])) {
-            return new $ob['class'](self::$_config['mime_drivers'][$ob['app']][$ob['driver']]);
+            return new $ob['class']($mime_part, self::$_config['mime_drivers'][$ob['app']][$ob['driver']]);
         }
 
         return false;
index 2214005..dc46921 100644 (file)
@@ -49,10 +49,14 @@ class Horde_Mime_Viewer_Driver
     /**
      * Constructor.
      *
-     * @param array $conf  Configuration specific to the driver.
+     * @param Horde_Mime_Part &$mime_part  Reference to an object with the
+     *                                     information to be rendered.
+     * @param array $conf                  Configuration specific to the
+     *                                     driver.
      */
-    function __construct($conf = array())
+    function __construct(&$mime_part, $conf = array())
     {
+        $this->_mimepart = $mime_part;
         $this->_conf = $conf;
     }
 
index 85c6956..2393f9e 100644 (file)
 class Horde_Mime_Viewer_report extends Horde_Mime_Viewer_Driver
 {
     /**
-     * Can this driver render various views?
+     * Can this driver render the the data?
      *
-     * @var boolean
+     * @param string $mode  The mode.  Either 'full', 'inline', or 'info'.
+     *
+     * @return boolean  True if the driver can render the data for the given
+     *                  view.
      */
-    protected $_capability = array(
-        'embedded' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true,
-    );
+    public function canRender($mode)
+    {
+        $viewer = $this->_getViewer();
+        return $viewer ? $viewer->canRender($mode) : false;
+    }
+
+    /**
+     * Does this MIME part possibly contain embedded MIME parts?
+     *
+     * @return boolean  True if this driver supports parsing embedded MIME
+     *                  parts.
+     */
+    public function embeddedMimeParts()
+    {
+        $viewer = $this->_getViewer();
+        return $viewer ? $viewer->embeddedMimeParts() : false;
+    }
 
     /**
      * Return the full rendered version of the Horde_Mime_Part object.
@@ -48,24 +62,31 @@ class Horde_Mime_Viewer_report extends Horde_Mime_Viewer_Driver
     /**
      * Return an HTML rendered version of the part.
      *
-     * @param boolean
+     * @param boolean  Viewing inline?
      *
      * @return array  See Horde_Mime_Viewer_Driver::render().
      */
     protected function _toHTML($inline)
     {
+        $viewer = $this->_getViewer();
+        return $viewer
+            ? $viewer->render($inline ? 'inline' : 'full')
+            : false;
+    }
+
+    /**
+     * Return the underlying MIME Viewer for this part.
+     *
+     * @return mixed  A Horde_Mime_Viewer object, or false if not found.
+     */
+    protected function _getViewer()
+    {
         if (!($type = $this->_mimepart->getContentTypeParameter('report-type'))) {
-            return array();
+            return false;
         }
 
-        $viewer = Horde_Mime_Viewer::factory('message/' . String::lower($type));
-        if (!$viewer) {
-            return array();
-        }
-        $viewer->setMIMEPart($this->_mimepart);
+        $viewer = Horde_Mime_Viewer::factory($this->_mimepart, 'message/' . String::lower($type));
         $viewer->setParams($this->_params);
-
-        /* Render using the loaded Horde_Mime_Viewer object. */
-        return $viewer->render($inline ? 'inline' : 'full');
+        return $viewer;
     }
 }