Zend Framework - Zend_Mail
Current view: /usr/local/lib/zend/trunk/incubator/library/Zend/Mail/Storage/Folder/Maildir.php
Date: Tue Feb 6 18:30:06 CET 2007 Executable lines: 80
Code covered: 72.50% Executed lines: 58
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_Maildir                                                                                             
      32                 :  */                                                                                                                      
      33                 : require_once 'Zend/Mail/Storage/Maildir.php';                                                                            
      34                 :                                                                                                                          
      35                 : /**                                                                                                                      
      36                 :  * @package    Zend_Mail                                                                                                 
      37                 :  * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)                                  
      38                 :  * @license    http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0                          
      39                 :  */                                                                                                                      
      40                 : class Zend_Mail_Storage_Folder_Maildir extends Zend_Mail_Storage_Maildir implements Zend_Mail_Storage_Folder_Interface   
      41                 : {                                                                                                                        
      42                 :     /**                                                                                                                  
      43                 :      * Zend_Mail_Storage_Folder root folder for folder structure                                                         
      44                 :      */                                                                                                                  
      45                 :     protected $_rootFolder;                                                                                              
      46                 :                                                                                                                          
      47                 :     /**                                                                                                                  
      48                 :      * rootdir of folder structure                                                                                       
      49                 :      */                                                                                                                  
      50                 :     protected $_rootdir;                                                                                                 
      51                 :                                                                                                                          
      52                 :     /**                                                                                                                  
      53                 :      * name of current folder                                                                                            
      54                 :      */                                                                                                                  
      55                 :     protected $_currentFolder;                                                                                           
      56                 :                                                                                                                          
      57                 :     /**                                                                                                                  
      58                 :      * delim char for subfolders                                                                                         
      59                 :      */                                                                                                                  
      60                 :     protected $_delim;                                                                                                   
      61                 :                                                                                                                          
      62                 :     /**                                                                                                                  
      63                 :      * Create instance with parameters                                                                                   
      64                 :      * Supported parameters are:                                                                                         
      65                 :      *   - rootdir rootdir of maildir structure                                                                          
      66                 :      *   - dirname alias for rootdir                                                                                     
      67                 :      *   - delim   delim char for folder structur, default is '.'                                                        
      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              14 :         if(isset($params['dirname']) && !isset($params['rootdir'])) {                                                    
      76               0 :             $params['rootdir'] = $params['dirname'];                                                                     
      77               0 :         }                                                                                                                
      78                 :                                                                                                                          
      79              14 :         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              12 :         $this->_rootdir = rtrim($params['rootdir'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;                          
      84                 :                                                                                                                          
      85              12 :         $this->_delim = isset($params['delim']) ? $params['delim'] : '.';                                                
      86                 :                                                                                                                          
      87              12 :         $this->_buildFolderTree();                                                                                       
      88              12 :         $this->selectFolder(!empty($params['folder']) ? $params['folder'] : 'INBOX');                                    
      89              11 :         $this->_has['top'] = true;                                                                                       
      90              11 :     }                                                                                                                    
      91                 :                                                                                                                          
      92                 :     /**                                                                                                                  
      93                 :      * find all subfolders and mbox files for folder structure                                                           
      94                 :      *                                                                                                                   
      95                 :      * Result is save in Zend_Mail_Storage_Folder instances with the root in $this->_rootFolder.                         
      96                 :      * $parentFolder and $parentGlobalName are only used internally for recursion.                                       
      97                 :      *                                                                                                                   
      98                 :      */                                                                                                                  
      99                 :     private function _buildFolderTree()                                                                                  
     100                 :     {                                                                                                                    
     101              12 :         $this->_rootFolder = new Zend_Mail_Storage_Folder('/', '/', false);                                              
     102              12 :         $this->_rootFolder->INBOX = new Zend_Mail_Storage_Folder('INBOX', 'INBOX', true);                                
     103                 :                                                                                                                          
     104              12 :         $dh = @opendir($this->_rootdir);                                                                                 
     105              12 :         if(!$dh) {                                                                                                       
     106               0 :             throw new Zend_Mail_Storage_Exception("can't read folders in maildir");                                      
     107                 :         }                                                                                                                
     108              12 :         $dirs = array();                                                                                                 
     109              12 :         while(($entry = readdir($dh)) !== false) {                                                                       
     110                 :             // maildir++ defines folders must start with .                                                               
     111              12 :             if($entry[0] != '.' || $entry == '.' || $entry == '..') {                                                    
     112              12 :                 continue;                                                                                                
     113                 :             }                                                                                                            
     114              12 :             if($this->_isMaildir($this->_rootdir . $entry)) {                                                            
     115              12 :                 $dirs[] = $entry;                                                                                        
     116              12 :             }                                                                                                            
     117              12 :         }                                                                                                                
     118              12 :         closedir($dh);                                                                                                   
     119                 :                                                                                                                          
     120              12 :         sort($dirs);                                                                                                     
     121              12 :         $stack = array(null);                                                                                            
     122              12 :         $folderStack = array(null);                                                                                      
     123              12 :         $parentFolder = $this->_rootFolder;                                                                              
     124              12 :         $parent = '.';                                                                                                   
     125                 :                                                                                                                          
     126              12 :         foreach($dirs as $dir) {                                                                                         
     127                 :             do {                                                                                                         
     128              12 :                 if(strpos($dir, $parent) === 0) {                                                                        
     129              12 :                     $local = substr($dir, strlen($parent));                                                              
     130              12 :                     if(strpos($local, $this->_delim) !== false) {                                                        
     131               0 :                         throw new Zend_Mail_Storage_Exception('error while reading maildir');                            
     132                 :                     }                                                                                                    
     133              12 :                     array_push($stack, $parent);                                                                         
     134              12 :                     $parent = $dir . $this->_delim;                                                                      
     135              12 :                     $folder = new Zend_Mail_Storage_Folder($local, substr($dir, 1), true);                               
     136              12 :                     $parentFolder->$local = $folder;                                                                     
     137              12 :                     array_push($folderStack, $parentFolder);                                                             
     138              12 :                     $parentFolder = $folder;                                                                             
     139              12 :                     break;                                                                                               
     140               0 :                 } else if($stack) {                                                                                      
     141               0 :                     $parent = array_pop($stack);                                                                         
     142               0 :                     $parentFolder = array_pop($folderStack);                                                             
     143               0 :                 }                                                                                                        
     144               0 :             } while($stack);                                                                                             
     145              12 :             if(!$stack) {                                                                                                
     146               0 :                 throw new Zend_Mail_Storage_Exception('error while reading maildir');                                    
     147                 :             }                                                                                                            
     148              12 :         }                                                                                                                
     149              12 :     }                                                                                                                    
     150                 :                                                                                                                          
     151                 :     /**                                                                                                                  
     152                 :      * get root folder or given folder                                                                                   
     153                 :      *                                                                                                                   
     154                 :      * @param string $rootFolder get folder structure for given folder, else root                                        
     155                 :      * @return Zend_Mail_Storage_Folder root or wanted folder                                                            
     156                 :      */                                                                                                                  
     157                 :     public function getFolders($rootFolder = null)                                                                       
     158                 :     {                                                                                                                    
     159               7 :         if(!$rootFolder) {                                                                                               
     160               5 :             return $this->_rootFolder;                                                                                   
     161                 :         }                                                                                                                
     162                 :                                                                                                                          
     163                 :         // rootdir is same as INBOX in maildir                                                                           
     164               2 :         if(strpos($rootFolder, 'INBOX') === 0) {                                                                         
     165               0 :             $rootFolder = substr($rootFolder, 6);                                                                        
     166               0 :         }                                                                                                                
     167               2 :         $currentFolder = $this->_rootFolder;                                                                             
     168               2 :         $subname = trim($rootFolder, $this->_delim);                                                                     
     169               2 :         while($currentFolder) {                                                                                          
     170               2 :             @list($entry, $subname) = @explode($this->_delim, $subname, 2);                                              
     171               2 :             $currentFolder = $currentFolder->$entry;                                                                     
     172               0 :             if(!$subname) {                                                                                              
     173               0 :                 break;                                                                                                   
     174                 :             }                                                                                                            
     175               0 :         }                                                                                                                
     176                 :                                                                                                                          
     177               0 :         if($currentFolder->getGlobalName() != rtrim($rootFolder, $this->_delim)) {                                       
     178               0 :             throw new Zend_Mail_Storage_Exception("folder $rootFolder not found");                                       
     179                 :         }                                                                                                                
     180               0 :         return $currentFolder;                                                                                           
     181                 :     }                                                                                                                    
     182                 :                                                                                                                          
     183                 :     /**                                                                                                                  
     184                 :      * select given folder                                                                                               
     185                 :      *                                                                                                                   
     186                 :      * folder must be selectable!                                                                                        
     187                 :      *                                                                                                                   
     188                 :      * @param Zend_Mail_Storage_Folder|string global name of folder or instance for subfolder                            
     189                 :      * @throws Zend_Mail_Storage_Exception                                                                               
     190                 :      */                                                                                                                  
     191                 :     public function selectFolder($globalName)                                                                            
     192                 :     {                                                                                                                    
     193                 :         // TODO: check $globalName for ..! could be user submitted data                                                  
     194              12 :         $this->_currentFolder = (string)$globalName;                                                                     
     195                 :         // rootdir is same as INBOX in maildir                                                                           
     196              12 :         if(strpos($this->_currentFolder, 'INBOX') === 0) {                                                               
     197              11 :             $this->_currentFolder = substr($this->_currentFolder, 6);                                                    
     198              11 :         }                                                                                                                
     199                 :         try {                                                                                                            
     200              12 :             $this->_openMaildir($this->_currentFolder ? $this->_rootdir . '.' . $this->_currentFolder : $this->_rootdir);
     201              12 :         } catch(Zend_Mail_Storage_Exception $e) {                                                                        
     202                 :             // check what went wrong                                                                                     
     203                 :             // if folder does not exist getFolders() throws an exception                                                 
     204               2 :             if(!$this->getFolders($this->_currentFolder)->isSelectable()) {                                              
     205               0 :                 throw new Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable");                      
     206                 :             }                                                                                                            
     207                 :             // seems like file has vanished; rebuilding folder tree - but it's still an exception                        
     208               0 :             $this->_buildFolderTree($this->_rootdir);                                                                    
     209               0 :             throw new Zend_Mail_Storage_Exception('seems like the mbox file has vanished, I\'ve rebuild the ' .          
     210               0 :                                                          'folder tree, search for an other folder and try again');       
     211                 :         }                                                                                                                
     212              11 :     }                                                                                                                    
     213                 :                                                                                                                          
     214                 :     /**                                                                                                                  
     215                 :      * get Zend_Mail_Storage_Folder instance for current folder                                                          
     216                 :      *                                                                                                                   
     217                 :      * @return Zend_Mail_Storage_Folder instance of current folder                                                       
     218                 :      * @throws Zend_Mail_Storage_Exception                                                                               
     219                 :      */                                                                                                                  
     220                 :     public function getCurrentFolder()                                                                                   
     221                 :     {                                                                                                                    
     222               1 :         return $this->_currentFolder;                                                                                    
     223                 :     }                                                                                                                    
     224                 : }                                                                                                                        
     225                 : 

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