PageRenderTime 60ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/library/Zend/Mail/Storage/Folder/Mbox.php

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