OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 // Used for holding error code and error message for failed OS system calls. | 6 // Used for holding error code and error message for failed OS system calls. |
7 class _OSStatus { | 7 class _OSStatus { |
8 int _errorCode; | 8 int _errorCode; |
9 String _errorMessage; | 9 String _errorMessage; |
10 } | 10 } |
11 | 11 |
12 | 12 |
13 class _Directory implements Directory { | 13 class _Directory implements Directory { |
14 static final kCreateRequest = 0; | 14 static final kCreateRequest = 0; |
15 static final kDeleteRequest = 1; | 15 static final kDeleteRequest = 1; |
16 static final kExistsRequest = 2; | 16 static final kExistsRequest = 2; |
17 static final kCreateTempRequest = 3; | 17 static final kCreateTempRequest = 3; |
18 static final kListRequest = 4; | 18 static final kListRequest = 4; |
19 | 19 |
20 _Directory(String this._path); | 20 _Directory(String this._path); |
21 | 21 |
22 static String _createTemp(String template, | 22 static String _createTemp(String template, |
23 _OSStatus status) native "Directory_CreateTemp"; | 23 _OSStatus status) native "Directory_CreateTemp"; |
24 static int _exists(String path) native "Directory_Exists"; | 24 static int _exists(String path) native "Directory_Exists"; |
25 static bool _create(String path) native "Directory_Create"; | 25 static bool _create(String path) native "Directory_Create"; |
26 static bool _delete(String path, bool recursive) native "Directory_Delete"; | 26 static bool _delete(String path, bool recursive) native "Directory_Delete"; |
27 static SendPort _newServicePort() native "Directory_NewServicePort"; | 27 static SendPort _newServicePort() native "Directory_NewServicePort"; |
28 | 28 |
29 void exists() { | 29 void exists(void callback(bool exists)) { |
30 if (_directoryService == null) { | 30 if (_directoryService == null) { |
31 _directoryService = _newServicePort(); | 31 _directoryService = _newServicePort(); |
32 } | 32 } |
33 List request = new List(2); | 33 List request = new List(2); |
34 request[0] = kExistsRequest; | 34 request[0] = kExistsRequest; |
35 request[1] = _path; | 35 request[1] = _path; |
36 _directoryService.call(request).receive((result, replyTo) { | 36 _directoryService.call(request).receive((result, replyTo) { |
37 var handler = | |
38 (_existsHandler != null) ? _existsHandler : (result) => null; | |
39 if (result < 0) { | 37 if (result < 0) { |
40 if (_errorHandler != null) { | 38 if (_onError != null) { |
41 _errorHandler("Diretory exists test failed: $_path"); | 39 _onError("Diretory exists test failed: $_path"); |
42 } | 40 } |
43 } else { | 41 } else { |
44 handler(result == 1); | 42 callback(result == 1); |
45 } | 43 } |
46 }); | 44 }); |
47 } | 45 } |
48 | 46 |
49 bool existsSync() { | 47 bool existsSync() { |
50 int exists = _exists(_path); | 48 int exists = _exists(_path); |
51 if (exists < 0) { | 49 if (exists < 0) { |
52 throw new DirectoryException("Diretory exists test failed: $_path"); | 50 throw new DirectoryException("Diretory exists test failed: $_path"); |
53 } | 51 } |
54 return (exists == 1); | 52 return (exists == 1); |
55 } | 53 } |
56 | 54 |
57 void create() { | 55 void create(void callback()) { |
58 if (_directoryService == null) { | 56 if (_directoryService == null) { |
59 _directoryService = _newServicePort(); | 57 _directoryService = _newServicePort(); |
60 } | 58 } |
61 List request = new List(2); | 59 List request = new List(2); |
62 request[0] = kCreateRequest; | 60 request[0] = kCreateRequest; |
63 request[1] = _path; | 61 request[1] = _path; |
64 _directoryService.call(request).receive((result, replyTo) { | 62 _directoryService.call(request).receive((result, replyTo) { |
65 if (result) { | 63 if (result) { |
66 if (_createHandler != null) _createHandler(); | 64 callback(); |
67 } else if (_errorHandler != null) { | 65 } else if (_onError != null) { |
68 _errorHandler("Directory creation failed: $_path"); | 66 _onError("Directory creation failed: $_path"); |
69 } | 67 } |
70 }); | 68 }); |
71 } | 69 } |
72 | 70 |
73 void createSync() { | 71 void createSync() { |
74 if (!_create(_path)) { | 72 if (!_create(_path)) { |
75 throw new DirectoryException("Directory creation failed: $_path"); | 73 throw new DirectoryException("Directory creation failed: $_path"); |
76 } | 74 } |
77 } | 75 } |
78 | 76 |
79 void createTemp() { | 77 void createTemp(void callback()) { |
80 if (_directoryService == null) { | 78 if (_directoryService == null) { |
81 _directoryService = _newServicePort(); | 79 _directoryService = _newServicePort(); |
82 } | 80 } |
83 List request = new List(2); | 81 List request = new List(2); |
84 request[0] = kCreateTempRequest; | 82 request[0] = kCreateTempRequest; |
85 request[1] = _path; | 83 request[1] = _path; |
86 _directoryService.call(request).receive((result, replyTo) { | 84 _directoryService.call(request).receive((result, replyTo) { |
87 if (result is !List) { | 85 if (result is !List) { |
88 _path = result; | 86 _path = result; |
89 if (_createTempHandler != null) _createTempHandler(); | 87 callback(); |
90 } else if (_errorHandler != null) { | 88 } else if (_onError != null) { |
91 _errorHandler("Could not create temporary directory [$_path]: " + | 89 _onError("Could not create temporary directory [$_path]: " + |
92 "${result[1]}"); | 90 "${result[1]}"); |
93 } | 91 } |
94 }); | 92 }); |
95 } | 93 } |
96 | 94 |
97 void createTempSync() { | 95 void createTempSync() { |
98 var status = new _OSStatus(); | 96 var status = new _OSStatus(); |
99 var result = _createTemp(path, status); | 97 var result = _createTemp(path, status); |
100 if (result != null) { | 98 if (result != null) { |
101 _path = result; | 99 _path = result; |
102 } else { | 100 } else { |
103 throw new DirectoryException( | 101 throw new DirectoryException( |
104 "Could not create temporary directory [$_path]: " + | 102 "Could not create temporary directory [$_path]: " + |
105 "${status._errorMessage}", | 103 "${status._errorMessage}", |
106 status._errorCode); | 104 status._errorCode); |
107 } | 105 } |
108 } | 106 } |
109 | 107 |
110 void delete([bool recursive = false]) { | 108 void _deleteHelper(bool recursive, String errorMsg, void callback()) { |
111 if (_directoryService == null) { | 109 if (_directoryService == null) { |
112 _directoryService = _newServicePort(); | 110 _directoryService = _newServicePort(); |
113 } | 111 } |
114 List request = new List(3); | 112 List request = new List(3); |
115 request[0] = kDeleteRequest; | 113 request[0] = kDeleteRequest; |
116 request[1] = _path; | 114 request[1] = _path; |
117 request[2] = recursive; | 115 request[2] = recursive; |
118 _directoryService.call(request).receive((result, replyTo) { | 116 _directoryService.call(request).receive((result, replyTo) { |
119 if (result) { | 117 if (result) { |
120 if (_deleteHandler != null) _deleteHandler(); | 118 callback(); |
121 } else if (_errorHandler != null) { | 119 } else if (_onError != null) { |
122 if (recursive) { | 120 _onError("${errorMsg}: $_path"); |
123 _errorHandler("Recursive directory deletion failed: $_path"); | |
124 } else { | |
125 _errorHandler("Non-recursive directory deletion failed: $_path"); | |
126 } | |
127 } | 121 } |
128 }); | 122 }); |
129 } | 123 } |
130 | 124 |
131 void deleteSync([bool recursive = false]) { | 125 void delete(void callback()) { |
| 126 _deleteHelper(false, "Directory deletion failed", callback); |
| 127 } |
| 128 |
| 129 void deleteRecursively(void callback()) { |
| 130 _deleteHelper(true, "Recursive directory deletion failed", callback); |
| 131 } |
| 132 |
| 133 void deleteSync() { |
| 134 bool recursive = false; |
132 if (!_delete(_path, recursive)) { | 135 if (!_delete(_path, recursive)) { |
133 throw new DirectoryException("Directory deletion failed: $_path"); | 136 throw new DirectoryException("Directory deletion failed: $_path"); |
134 } | 137 } |
135 } | 138 } |
136 | 139 |
| 140 void deleteRecursivelySync() { |
| 141 bool recursive = true; |
| 142 if (!_delete(_path, recursive)) { |
| 143 throw new DirectoryException( |
| 144 "Recursive directory deletion failed: $_path"); |
| 145 } |
| 146 } |
| 147 |
137 void list([bool recursive = false]) { | 148 void list([bool recursive = false]) { |
138 final int kListDirectory = 0; | 149 final int kListDirectory = 0; |
139 final int kListFile = 1; | 150 final int kListFile = 1; |
140 final int kListError = 2; | 151 final int kListError = 2; |
141 final int kListDone = 3; | 152 final int kListDone = 3; |
142 | 153 |
143 List request = new List(3); | 154 List request = new List(3); |
144 request[0] = kListRequest; | 155 request[0] = kListRequest; |
145 request[1] = _path; | 156 request[1] = _path; |
146 request[2] = recursive; | 157 request[2] = recursive; |
147 ReceivePort responsePort = new ReceivePort(); | 158 ReceivePort responsePort = new ReceivePort(); |
148 // Use a separate directory service port for each listing as | 159 // Use a separate directory service port for each listing as |
149 // listing operations on the same directory can run in parallel. | 160 // listing operations on the same directory can run in parallel. |
150 _newServicePort().send(request, responsePort.toSendPort()); | 161 _newServicePort().send(request, responsePort.toSendPort()); |
151 responsePort.receive((message, replyTo) { | 162 responsePort.receive((message, replyTo) { |
152 if (message is !List || message[0] is !int) { | 163 if (message is !List || message[0] is !int) { |
153 responsePort.close(); | 164 responsePort.close(); |
154 if (_errorHandler != null) _errorHandler("Internal error"); | 165 if (_onError != null) _onError("Internal error"); |
155 return; | 166 return; |
156 } | 167 } |
157 switch (message[0]) { | 168 switch (message[0]) { |
158 case kListDirectory: | 169 case kListDirectory: |
159 if (_dirHandler != null) _dirHandler(message[1]); | 170 if (_onDir != null) _onDir(message[1]); |
160 break; | 171 break; |
161 case kListFile: | 172 case kListFile: |
162 if (_fileHandler != null) _fileHandler(message[1]); | 173 if (_onFile != null) _onFile(message[1]); |
163 break; | 174 break; |
164 case kListError: | 175 case kListError: |
165 if (_errorHandler != null) _errorHandler(message[1]); | 176 if (_onError != null) _onError(message[1]); |
166 break; | 177 break; |
167 case kListDone: | 178 case kListDone: |
168 responsePort.close(); | 179 responsePort.close(); |
169 if (_doneHandler != null) _doneHandler(message[1]); | 180 if (_onDone != null) _onDone(message[1]); |
170 break; | 181 break; |
171 } | 182 } |
172 }); | 183 }); |
173 } | 184 } |
174 | 185 |
175 void set dirHandler(void dirHandler(String dir)) { | 186 void set onDir(void onDir(String dir)) { |
176 _dirHandler = dirHandler; | 187 _onDir = onDir; |
177 } | 188 } |
178 | 189 |
179 void set fileHandler(void fileHandler(String file)) { | 190 void set onFile(void onFile(String file)) { |
180 _fileHandler = fileHandler; | 191 _onFile = onFile; |
181 } | 192 } |
182 | 193 |
183 void set doneHandler(void doneHandler(bool completed)) { | 194 void set onDone(void onDone(bool completed)) { |
184 _doneHandler = doneHandler; | 195 _onDone = onDone; |
185 } | 196 } |
186 | 197 |
187 void set existsHandler(void existsHandler(bool exists)) { | 198 void set onError(void onError(String error)) { |
188 _existsHandler = existsHandler; | 199 _onError = onError; |
189 } | |
190 | |
191 void set createHandler(void createHandler()) { | |
192 _createHandler = createHandler; | |
193 } | |
194 | |
195 void set createTempHandler(void createTempHandler()) { | |
196 _createTempHandler = createTempHandler; | |
197 } | |
198 | |
199 void set deleteHandler(void deleteHandler()) { | |
200 _deleteHandler = deleteHandler; | |
201 } | |
202 | |
203 void set errorHandler(void errorHandler(String error)) { | |
204 _errorHandler = errorHandler; | |
205 } | 200 } |
206 | 201 |
207 void _closePort(ReceivePort port) { | 202 void _closePort(ReceivePort port) { |
208 if (port !== null) { | 203 if (port !== null) { |
209 port.close(); | 204 port.close(); |
210 } | 205 } |
211 } | 206 } |
212 | 207 |
213 String get path() { return _path; } | 208 String get path() { return _path; } |
214 | 209 |
215 var _dirHandler; | 210 var _onDir; |
216 var _fileHandler; | 211 var _onFile; |
217 var _doneHandler; | 212 var _onDone; |
218 var _existsHandler; | 213 var _onError; |
219 var _createHandler; | |
220 var _createTempHandler; | |
221 var _deleteHandler; | |
222 var _errorHandler; | |
223 | 214 |
224 String _path; | 215 String _path; |
225 SendPort _directoryService; | 216 SendPort _directoryService; |
226 } | 217 } |
OLD | NEW |