1 : <?php
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 : require_once 'Zend/Mail/Storage/Folder.php';
24 :
25 :
26 :
27 :
28 : require_once 'Zend/Mail/Storage/Folder/Interface.php';
29 :
30 :
31 :
32 :
33 : require_once 'Zend/Mail/Storage/Mbox.php';
34 :
35 :
36 :
37 :
38 : require_once 'Zend/Mail/Storage/Exception.php';
39 :
40 :
41 :
42 :
43 :
44 :
45 : class Zend_Mail_Storage_Folder_Mbox extends Zend_Mail_Storage_Mbox implements Zend_Mail_Storage_Folder_Interface
46 : {
47 :
48 :
49 :
50 : protected $_rootFolder;
51 :
52 :
53 :
54 :
55 : protected $_rootdir;
56 :
57 :
58 :
59 :
60 : protected $_currentFolder;
61 :
62 :
63 :
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 :
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 :
92 :
93 :
94 :
95 :
96 :
97 :
98 :
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 :
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) ) {
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 :
135 :
136 :
137 :
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 :
163 :
164 :
165 :
166 :
167 :
168 :
169 : public function selectFolder($globalName)
170 : {
171 :
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 :
177 :
178 3 : if(!$this->getFolders($this->_currentFolder)->isSelectable()) {
179 1 : throw new Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable");
180 : }
181 :
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 :
190 :
191 :
192 :
193 :
194 : public function getCurrentFolder()
195 : {
196 1 : return $this->_currentFolder;
197 : }
198 :
199 :
200 :
201 :
202 :
203 :
204 :
205 :
206 : public function __sleep()
207 : {
208 0 : return array_merge(parent::__sleep(), array('_currentFolder', '_rootFolder', '_rootdir'));
209 : }
210 :
211 :
212 :
213 :
214 :
215 :
216 : public function __wakeup()
217 : {
218 :
219 0 : parent::__wakeup();
220 0 : }
221 : }
222 :
|