Zend Framework - Zend_Mail
Current view: /usr/local/lib/zend/trunk/incubator/library/Zend/Mail/Storage/Folder/Mbox.php
Date: Tue Feb 6 18:30:06 CET 2007 Executable lines: 58
Code covered: 84.48% Executed lines: 49
Legend: executed not executed dead code


       1                 : <?php                                                                                                             
       2                 : /**                                                                                                               
       3                 :  * Zend Framework                                                                                                 
       4                 :  *                                                                                                                
       5                 :  * LICENSE                                                                                                        
       6                 :  *                                                                                                                
       7                 :  * This source file is subject to version 1.0 of the Zend Framework                                               
       8                 :  * license, that is bundled with this package in the file LICENSE, and                                            
       9                 :  * is available through the world-wide-web at the following URL:                                                  
      10                 :  * http://www.zend.com/license/framework/1_0.txt. If you did not receive                                          
      11                 :  * a copy of the Zend Framework license and are unable to obtain it                                               
      12                 :  * through the world-wide-web, please send a note to license@zend.com                                             
      13                 :  * so we can mail you a copy immediately.                                                                         
      14                 :  *                                                                                                                
      15                 :  * @package    Zend_Mail                                                                                          
      16                 :  * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)                           
      17                 :  * @license    http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0                   
      18                 :  */                                                                                                               
      19                 :                                                                                                                   
      20                 : /**                                                                                                               
      21                 :  * Zend_Mail_Storage_Folder                                                                                       
      22                 :  */                                                                                                               
      23                 : require_once 'Zend/Mail/Storage/Folder.php';                                                                      
      24                 :                                                                                                                   
      25                 : /**                                                                                                               
      26                 :  * Zend_Mail_Storage_Folder_Interface                                                                             
      27                 :  */                                                                                                               
      28                 : require_once 'Zend/Mail/Storage/Folder/Interface.php';                                                            
      29                 :                                                                                                                   
      30                 : /**                                                                                                               
      31                 :  * Zend_Mail_Storage_Mbox                                                                                         
      32                 :  */                                                                                                               
      33                 : require_once 'Zend/Mail/Storage/Mbox.php';                                                                        
      34                 :                                                                                                                   
      35                 : /**                                                                                                               
      36                 :  * Zend_Mail_Storage_Exception                                                                                    
      37                 :  */                                                                                                               
      38                 : require_once 'Zend/Mail/Storage/Exception.php';                                                                   
      39                 :                                                                                                                   
      40                 : /**                                                                                                               
      41                 :  * @package    Zend_Mail                                                                                          
      42                 :  * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)                           
      43                 :  * @license    http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0                   
      44                 :  */                                                                                                               
      45                 : class Zend_Mail_Storage_Folder_Mbox extends Zend_Mail_Storage_Mbox implements Zend_Mail_Storage_Folder_Interface  
      46                 : {                                                                                                                 
      47                 :     /**                                                                                                           
      48                 :      * Zend_Mail_Storage_Folder root folder for folder structure                                                  
      49                 :      */                                                                                                           
      50                 :     protected $_rootFolder;                                                                                       
      51                 :                                                                                                                   
      52                 :     /**                                                                                                           
      53                 :      * rootdir of folder structure                                                                                
      54                 :      */                                                                                                           
      55                 :     protected $_rootdir;                                                                                          
      56                 :                                                                                                                   
      57                 :     /**                                                                                                           
      58                 :      * name of current folder                                                                                     
      59                 :      */                                                                                                           
      60                 :     protected $_currentFolder;                                                                                    
      61                 :                                                                                                                   
      62                 :     /**                                                                                                           
      63                 :      * Create instance with parameters                                                                            
      64                 :      * Disallowed parameters are:                                                                                 
      65                 :      *   - filename use Zend_Mail_Storage_Mbox for a single file                                                  
      66                 :      * Supported parameters are:                                                                                  
      67                 :      *   - rootdir rootdir of mbox structure                                                                      
      68                 :      *   - folder intial selected folder, default is 'INBOX'                                                      
      69                 :      *                                                                                                            
      70                 :      * @param  $params              array mail reader specific parameters                                         
      71                 :      * @throws Zend_Mail_Storage_Exception                                                                        
      72                 :      */                                                                                                           
      73                 :     public function __construct($params)                                                                          
      74                 :     {                                                                                                             
      75              16 :         if(isset($params['filename'])) {                                                                          
      76               1 :             throw new Zend_Mail_Storage_Exception('use Zend_Mail_Storage_Mbox for a single file');                
      77                 :         }                                                                                                         
      78                 :                                                                                                                   
      79              15 :         if(!isset($params['rootdir']) || !is_dir($params['rootdir'])) {                                           
      80               2 :             throw new Zend_Mail_Storage_Exception('no valid rootdir given in params');                            
      81                 :         }                                                                                                         
      82                 :                                                                                                                   
      83              13 :         $this->_rootdir = rtrim($params['rootdir'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;                   
      84                 :                                                                                                                   
      85              13 :         $this->_buildFolderTree($this->_rootdir);                                                                 
      86              13 :         $this->selectFolder(!empty($params['folder']) ? $params['folder'] : 'INBOX');                             
      87              12 :         $this->_has['top'] = true;                                                                                
      88              12 :     }                                                                                                             
      89                 :                                                                                                                   
      90                 :     /**                                                                                                           
      91                 :      * find all subfolders and mbox files for folder structure                                                    
      92                 :      *                                                                                                            
      93                 :      * Result is save in Zend_Mail_Storage_Folder instances with the root in $this->_rootFolder.                  
      94                 :      * $parentFolder and $parentGlobalName are only used internally for recursion.                                
      95                 :      *                                                                                                            
      96                 :      * @param string $currentDir call with root dir, also used for recursion.                                     
      97                 :      * @param Zend_Mail_Storage_Folder|null $parentFolder used for recursion                                      
      98                 :      * @param string $parentGlobalName used for rescursion                                                        
      99                 :      */                                                                                                           
     100                 :     private function _buildFolderTree($currentDir, $parentFolder = null, $parentGlobalName = '')                  
     101                 :     {                                                                                                             
     102              13 :         if(!$parentFolder) {                                                                                      
     103              13 :             $this->_rootFolder = new Zend_Mail_Storage_Folder('/', '/', false);                                   
     104              13 :             $parentFolder = $this->_rootFolder;                                                                   
     105              13 :         }                                                                                                         
     106                 :                                                                                                                   
     107              13 :         $dh = @opendir($currentDir);                                                                              
     108              13 :         if(!$dh) {                                                                                                
     109               0 :             throw new Zend_Mail_Storage_Exception("can't read dir $currentDir");                                  
     110                 :         }                                                                                                         
     111              13 :         while(($entry = readdir($dh)) !== false) {                                                                
     112                 :             // ignore hidden files for mbox                                                                       
     113              13 :             if($entry[0] == '.') {                                                                                
     114              13 :                 continue;                                                                                         
     115                 :             }                                                                                                     
     116              13 :             $absoluteEntry = $currentDir . $entry;                                                                
     117              13 :             $globalName = $parentGlobalName . DIRECTORY_SEPARATOR . $entry;                                       
     118              13 :             if(is_file($absoluteEntry) && $this->_isMboxFile($absoluteEntry)) {                                   
     119              13 :                 $parentFolder->$entry = new Zend_Mail_Storage_Folder($entry, $globalName);                        
     120              13 :                 continue;                                                                                         
     121                 :             }                                                                                                     
     122              13 :             if(!is_dir($absoluteEntry) /* || $entry == '.' || $entry == '..' */) {                                
     123              13 :                 continue;                                                                                         
     124                 :             }                                                                                                     
     125              13 :             $folder = new Zend_Mail_Storage_Folder($entry, $globalName, false);                                   
     126              13 :             $parentFolder->$entry = $folder;                                                                      
     127              13 :             $this->_buildFolderTree($absoluteEntry . DIRECTORY_SEPARATOR, $folder, $globalName);                  
     128              13 :         }                                                                                                         
     129                 :                                                                                                                   
     130              13 :         closedir($dh);                                                                                            
     131              13 :     }                                                                                                             
     132                 :                                                                                                                   
     133                 :     /**                                                                                                           
     134                 :      * get root folder or given folder                                                                            
     135                 :      *                                                                                                            
     136                 :      * @param string $rootFolder get folder structure for given folder, else root                                 
     137                 :      * @return Zend_Mail_Storage_Folder root or wanted folder                                                     
     138                 :      */                                                                                                           
     139                 :     public function getFolders($rootFolder = null)                                                                
     140                 :     {                                                                                                             
     141               8 :         if(!$rootFolder) {                                                                                        
     142               5 :             return $this->_rootFolder;                                                                            
     143                 :         }                                                                                                         
     144                 :                                                                                                                   
     145               3 :         $currentFolder = $this->_rootFolder;                                                                      
     146               3 :         $subname = trim($rootFolder, DIRECTORY_SEPARATOR);                                                        
     147               3 :         while($currentFolder) {                                                                                   
     148               3 :             @list($entry, $subname) = @explode('/', $subname, 2);                                                 
     149               3 :             $currentFolder = $currentFolder->$entry;                                                              
     150               1 :             if(!$subname) {                                                                                       
     151               1 :                 break;                                                                                            
     152                 :             }                                                                                                     
     153               0 :         }                                                                                                         
     154                 :                                                                                                                   
     155               1 :         if($currentFolder->getGlobalName() != rtrim($rootFolder, DIRECTORY_SEPARATOR)) {                          
     156               0 :             throw new Zend_Mail_Storage_Exception("folder $rootFolder not found");                                
     157                 :         }                                                                                                         
     158               1 :         return $currentFolder;                                                                                    
     159                 :     }                                                                                                             
     160                 :                                                                                                                   
     161                 :     /**                                                                                                           
     162                 :      * select given folder                                                                                        
     163                 :      *                                                                                                            
     164                 :      * folder must be selectable!                                                                                 
     165                 :      *                                                                                                            
     166                 :      * @param Zend_Mail_Storage_Folder|string global name of folder or instance for subfolder                     
     167                 :      * @throws Zend_Mail_Storage_Exception                                                                        
     168                 :      */                                                                                                           
     169                 :     public function selectFolder($globalName)                                                                     
     170                 :     {                                                                                                             
     171                 :         // TODO: check $globalName for ..! could be user submitted data                                           
     172              13 :         $this->_currentFolder = (string)$globalName;                                                              
     173                 :         try {                                                                                                     
     174              13 :             $this->_openMboxFile($this->_rootdir . $this->_currentFolder);                                        
     175              13 :         } catch(Zend_Mail_Storage_Exception $e) {                                                                 
     176                 :             // check what went wrong                                                                              
     177                 :             // if folder does not exist getFolders() throws an exception                                          
     178               3 :             if(!$this->getFolders($this->_currentFolder)->isSelectable()) {                                       
     179               1 :                 throw new Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable");               
     180                 :             }                                                                                                     
     181                 :             // seems like file has vanished; rebuilding folder tree - but it's still an exception                 
     182               0 :             $this->_buildFolderTree($this->_rootdir);                                                             
     183               0 :             throw new Zend_Mail_Storage_Exception('seems like the mbox file has vanished, I\'ve rebuild the ' .   
     184               0 :                                                          'folder tree, search for an other folder and try again');
     185                 :         }                                                                                                         
     186              12 :     }                                                                                                             
     187                 :                                                                                                                   
     188                 :     /**                                                                                                           
     189                 :      * get Zend_Mail_Storage_Folder instance for current folder                                                   
     190                 :      *                                                                                                            
     191                 :      * @return Zend_Mail_Storage_Folder instance of current folder                                                
     192                 :      * @throws Zend_Mail_Storage_Exception                                                                        
     193                 :      */                                                                                                           
     194                 :     public function getCurrentFolder()                                                                            
     195                 :     {                                                                                                             
     196               1 :         return $this->_currentFolder;                                                                             
     197                 :     }                                                                                                             
     198                 :                                                                                                                   
     199                 :     /**                                                                                                           
     200                 :      * magic method for serialize()                                                                               
     201                 :      *                                                                                                            
     202                 :      * with this method you can cache the mbox class                                                              
     203                 :      *                                                                                                            
     204                 :      * @return array name of variables                                                                            
     205                 :      */                                                                                                           
     206                 :     public function __sleep()                                                                                     
     207                 :     {                                                                                                             
     208               0 :         return array_merge(parent::__sleep(), array('_currentFolder', '_rootFolder', '_rootdir'));                
     209                 :     }                                                                                                             
     210                 :                                                                                                                   
     211                 :     /**                                                                                                           
     212                 :      * magic method for unserialize()                                                                             
     213                 :      *                                                                                                            
     214                 :      * with this method you can cache the mbox class                                                              
     215                 :      */                                                                                                           
     216                 :     public function __wakeup()                                                                                    
     217                 :     {                                                                                                             
     218                 :         // if cache is stall selectFolder() rebuilds the tree on error                                            
     219               0 :         parent::__wakeup();                                                                                       
     220               0 :     }                                                                                                             
     221                 : }                                                                                                                 
     222                 : 

Generated by: PHPUnit 3.0.0 and Xdebug 2.0.0RC2-dev.