Zend Framework - Zend_Mail
Current view: /usr/local/lib/zend/trunk/incubator/library/Zend/Mail/Storage/Maildir.php
Date: Tue Feb 6 18:30:06 CET 2007 Executable lines: 77
Code covered: 93.51% Executed lines: 72
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                 : /**                                                                                                                     
      22                 :  * Zend_Mail_Storage_Abstract                                                                                           
      23                 :  */                                                                                                                     
      24                 : require_once 'Zend/Mail/Storage/Abstract.php';                                                                          
      25                 :                                                                                                                         
      26                 : /**                                                                                                                     
      27                 :  * Zend_Mail_Message                                                                                                    
      28                 :  */                                                                                                                     
      29                 : require_once 'Zend/Mail/Message.php';                                                                                   
      30                 :                                                                                                                         
      31                 : /**                                                                                                                     
      32                 :  * Zend_Mail_Storage_Exception                                                                                          
      33                 :  */                                                                                                                     
      34                 : require_once 'Zend/Mail/Storage/Exception.php';                                                                         
      35                 :                                                                                                                         
      36                 :                                                                                                                         
      37                 : /**                                                                                                                     
      38                 :  * @package    Zend_Mail                                                                                                
      39                 :  * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)                                 
      40                 :  * @license    http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0                         
      41                 :  */                                                                                                                     
      42                 : class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract                                                      
      43                 : {                                                                                                                       
      44                 :     private $_files = array();                                                                                          
      45                 :     private static $_knownFlags = array('P' => 'Passed',                                                                
      46                 :                                'R' => 'Replied',                                                                        
      47                 :                                'S' => 'Seen',                                                                           
      48                 :                                'T' => 'Trashed',                                                                        
      49                 :                                'D' => 'Draft',                                                                          
      50                 :                                'F' => 'Flagged');                                                                       
      51                 :                                                                                                                         
      52                 :     /**                                                                                                                 
      53                 :      * Count messages all messages in current box                                                                       
      54                 :      * Flags are not supported (exceptions is thrown)                                                                   
      55                 :      *                                                                                                                  
      56                 :      * @param  int $flags           filter by flags                                                                     
      57                 :      * @throws Zend_Mail_Storage_Exception                                                                              
      58                 :      * @return int                  number of messages                                                                  
      59                 :      */                                                                                                                 
      60                 :     public function countMessages($flags = null)                                                                        
      61                 :     {                                                                                                                   
      62               2 :         return count($this->_files);                                                                                    
      63                 :     }                                                                                                                   
      64                 :                                                                                                                         
      65                 :                                                                                                                         
      66                 :     /**                                                                                                                 
      67                 :      * Get a list of messages with number and size                                                                      
      68                 :      *                                                                                                                  
      69                 :      * @param  int        $id  number of message                                                                        
      70                 :      * @return int|array      size of given message of list with all messages as array(num => size)                     
      71                 :      */                                                                                                                 
      72                 :     public function getSize($id = null)                                                                                 
      73                 :     {                                                                                                                   
      74                 :                                                                                                                         
      75               4 :         if($id !== null) {                                                                                              
      76               2 :             if(!isset($this->_files[$id - 1])) {                                                                        
      77               1 :                 throw new Zend_Mail_Storage_Exception('id does not exist');                                             
      78                 :              }                                                                                                          
      79               1 :             return filesize($this->_files[$id - 1]['filename']);                                                        
      80                 :         }                                                                                                               
      81                 :                                                                                                                         
      82               2 :         $result = array();                                                                                              
      83               2 :         foreach($this->_files as $num => $pos) {                                                                        
      84               2 :             $result[$num + 1] = filesize($this->_files[$num]['filename']);                                              
      85               2 :         }                                                                                                               
      86                 :                                                                                                                         
      87               2 :         return $result;                                                                                                 
      88                 :     }                                                                                                                   
      89                 :                                                                                                                         
      90                 :                                                                                                                         
      91                 :                                                                                                                         
      92                 :     /**                                                                                                                 
      93                 :      * Get a message with headers and body                                                                              
      94                 :      *                                                                                                                  
      95                 :      * @param  int $id            number of message                                                                     
      96                 :      * @return Zend_Mail_Message                                                                                        
      97                 :      */                                                                                                                 
      98                 :     public function getMessage($id)                                                                                     
      99                 :     {                                                                                                                   
     100               5 :         return new Zend_Mail_Message(array('handler' => $this, 'id' => $id, 'headers' => $this->getRaw($id, 'header')));
     101                 :     }                                                                                                                   
     102                 :                                                                                                                         
     103                 :     public function getRaw($id, $part)                                                                                  
     104                 :     {                                                                                                                   
     105               5 :         if(!isset($this->_files[$id - 1])) {                                                                            
     106               1 :             throw new Zend_Mail_Storage_Exception('id does not exist');                                                 
     107                 :         }                                                                                                               
     108                 :                                                                                                                         
     109               4 :         $fh = fopen($this->_files[$id - 1]['filename'], 'r');                                                           
     110               4 :         $content = null;                                                                                                
     111                 :                                                                                                                         
     112                 :         // TODO: indexes for header and content should be changed to negative numbers                                   
     113                 :         switch($part) {                                                                                                 
     114               4 :             case 'header':                                                                                              
     115               4 :                 $content = '';                                                                                          
     116               4 :                 while (!feof($fh)) {                                                                                    
     117               4 :                     $line = fgets($fh);                                                                                 
     118               4 :                     if (!trim($line)) {                                                                                 
     119               4 :                         break;                                                                                          
     120                 :                     }                                                                                                   
     121               4 :                     $content .= $line;                                                                                  
     122               4 :                 }                                                                                                       
     123               4 :                 break;                                                                                                  
     124               1 :             case 'content':                                                                                             
     125               1 :                 $content = '';                                                                                          
     126               1 :                 while (!feof($fh)) {                                                                                    
     127               1 :                     $line = fgets($fh);                                                                                 
     128               1 :                     if(!trim($line)) {                                                                                  
     129               1 :                         break;                                                                                          
     130                 :                     }                                                                                                   
     131               1 :                 }                                                                                                       
     132               1 :                 $content = stream_get_contents($fh);                                                                    
     133               1 :                 break;                                                                                                  
     134               0 :             default:                                                                                                    
     135                 :                 // fall through                                                                                         
     136               0 :         }                                                                                                               
     137                 :                                                                                                                         
     138               4 :         fclose($fh);                                                                                                    
     139               4 :         if($content !== null) {                                                                                         
     140               4 :             return $content;                                                                                            
     141                 :         }                                                                                                               
     142                 :                                                                                                                         
     143                 :         // TODO: check for number or mime type                                                                          
     144               0 :         throw new Zend_Mail_Storage_Exception('part not found');                                                        
     145                 :     }                                                                                                                   
     146                 :                                                                                                                         
     147                 :     /**                                                                                                                 
     148                 :      * Create instance with parameters                                                                                  
     149                 :      * Supported parameters are:                                                                                        
     150                 :      *   - filename filename of mbox file                                                                               
     151                 :      *                                                                                                                  
     152                 :      * @param  $params              array mail reader specific parameters                                               
     153                 :      * @throws Zend_Mail_Storage_Exception                                                                              
     154                 :      */                                                                                                                 
     155                 :     public function __construct($params)                                                                                
     156                 :     {                                                                                                                   
     157              16 :         if (!isset($params['dirname']) || !is_dir($params['dirname'])) {                                                
     158               1 :             throw new Zend_Mail_Storage_Exception('no valid dirname given in params');                                  
     159                 :         }                                                                                                               
     160                 :                                                                                                                         
     161              15 :         if(!$this->_isMaildir($params['dirname'])) {                                                                    
     162               1 :             throw new Zend_Mail_Storage_Exception('invalid maildir given');                                             
     163                 :         }                                                                                                               
     164                 :                                                                                                                         
     165              14 :         $this->_has['top'] = true;                                                                                      
     166              14 :         $this->_openMaildir($params['dirname']);                                                                        
     167              14 :     }                                                                                                                   
     168                 :                                                                                                                         
     169                 :     /**                                                                                                                 
     170                 :      * check if a given dir is a valid maildir                                                                          
     171                 :      *                                                                                                                  
     172                 :      * @param string $dirname name of dir                                                                               
     173                 :      * @return bool dir is valid maildir                                                                                
     174                 :      */                                                                                                                 
     175                 :     protected function _isMaildir($dirname)                                                                             
     176                 :     {                                                                                                                   
     177              27 :         return is_dir($dirname . '/cur');                                                                               
     178                 :     }                                                                                                                   
     179                 :                                                                                                                         
     180                 :     /**                                                                                                                 
     181                 :      * open given dir as current maildir                                                                                
     182                 :      *                                                                                                                  
     183                 :      * @param string $dirname name of maildir                                                                           
     184                 :      * @throws Zend_Mail_Storage_Exception                                                                              
     185                 :      */                                                                                                                 
     186                 :     protected function _openMaildir($dirname)                                                                           
     187                 :     {                                                                                                                   
     188              26 :         if($this->_files) {                                                                                             
     189               5 :             $this->close();                                                                                             
     190               5 :         }                                                                                                               
     191                 :                                                                                                                         
     192              26 :         $dh = @opendir($dirname . '/cur/');                                                                             
     193              26 :         if(!$dh) {                                                                                                      
     194               2 :             throw new Zend_Mail_Storage_Exception('cannot open maildir');                                               
     195                 :         }                                                                                                               
     196              25 :         while(($entry = readdir($dh)) !== false) {                                                                      
     197              25 :             if($entry[0] == '.' || !is_file($dirname . '/cur/' . $entry)) {                                             
     198              25 :                 continue;                                                                                               
     199                 :             }                                                                                                           
     200              25 :             list($uniq, $info) = explode(':', $entry, 2);                                                               
     201              25 :             list($version, $flags) = explode(',', $info, 2);                                                            
     202              25 :             if($version != 2) {                                                                                         
     203               0 :                 $flags = '';                                                                                            
     204               0 :             } else {                                                                                                    
     205              25 :                 $named_flags = array();                                                                                 
     206              25 :                 $length = strlen($flags);                                                                               
     207              25 :                 for($i = 0; $i < $length; ++$i) {                                                                       
     208              25 :                     $flag = $flags[$i];                                                                                 
     209              25 :                     $named_flags[$flag] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : '';            
     210              25 :                 }                                                                                                       
     211                 :             }                                                                                                           
     212                 :                                                                                                                         
     213              25 :             $this->_files[] = array('uniq'     => $uniq,                                                                
     214              25 :                                     'flags'    => $named_flags,                                                         
     215              25 :                                     'filename' => $dirname . '/cur/' . $entry);                                         
     216              25 :         }                                                                                                               
     217              25 :         closedir($dh);                                                                                                  
     218              25 :     }                                                                                                                   
     219                 :                                                                                                                         
     220                 :                                                                                                                         
     221                 :     /**                                                                                                                 
     222                 :      * Close resource for mail lib. If you need to control, when the resource                                           
     223                 :      * is closed. Otherwise the destructor would call this.                                                             
     224                 :      *                                                                                                                  
     225                 :      * @return void                                                                                                     
     226                 :      */                                                                                                                 
     227                 :     public function close()                                                                                             
     228                 :     {                                                                                                                   
     229              24 :         $this->_files = array();                                                                                        
     230              24 :     }                                                                                                                   
     231                 :                                                                                                                         
     232                 :                                                                                                                         
     233                 :     /**                                                                                                                 
     234                 :      * Waste some CPU cycles doing nothing.                                                                             
     235                 :      *                                                                                                                  
     236                 :      * @return void                                                                                                     
     237                 :      */                                                                                                                 
     238                 :     public function noop()                                                                                              
     239                 :     {                                                                                                                   
     240               1 :         return true;                                                                                                    
     241                 :     }                                                                                                                   
     242                 :                                                                                                                         
     243                 :                                                                                                                         
     244                 :     /**                                                                                                                 
     245                 :      * stub for not supported message deletion                                                                          
     246                 :      */                                                                                                                 
     247                 :     public function removeMessage($id)                                                                                  
     248                 :     {                                                                                                                   
     249               1 :         throw new Zend_Mail_Storage_Exception('maildir is (currently) read-only');                                      
     250                 :     }                                                                                                                   
     251                 :                                                                                                                         
     252                 : }                                                                                                                       
     253                 : 

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