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(void callback(bool exists)) { | 29 void 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; |
37 if (result < 0) { | 39 if (result < 0) { |
38 if (_onError != null) { | 40 if (_errorHandler != null) { |
39 _onError("Diretory exists test failed: $_path"); | 41 _errorHandler("Diretory exists test failed: $_path"); |
40 } | 42 } |
41 } else { | 43 } else { |
42 callback(result == 1); | 44 handler(result == 1); |
43 } | 45 } |
44 }); | 46 }); |
45 } | 47 } |
46 | 48 |
47 bool existsSync() { | 49 bool existsSync() { |
48 int exists = _exists(_path); | 50 int exists = _exists(_path); |
49 if (exists < 0) { | 51 if (exists < 0) { |
50 throw new DirectoryException("Diretory exists test failed: $_path"); | 52 throw new DirectoryException("Diretory exists test failed: $_path"); |
51 } | 53 } |
52 return (exists == 1); | 54 return (exists == 1); |
53 } | 55 } |
54 | 56 |
55 void create(void callback()) { | 57 void create() { |
56 if (_directoryService == null) { | 58 if (_directoryService == null) { |
57 _directoryService = _newServicePort(); | 59 _directoryService = _newServicePort(); |
58 } | 60 } |
59 List request = new List(2); | 61 List request = new List(2); |
60 request[0] = kCreateRequest; | 62 request[0] = kCreateRequest; |
61 request[1] = _path; | 63 request[1] = _path; |
62 _directoryService.call(request).receive((result, replyTo) { | 64 _directoryService.call(request).receive((result, replyTo) { |
63 if (result) { | 65 if (result) { |
64 callback(); | 66 if (_createHandler != null) _createHandler(); |
65 } else if (_onError != null) { | 67 } else if (_errorHandler != null) { |
66 _onError("Directory creation failed: $_path"); | 68 _errorHandler("Directory creation failed: $_path"); |
67 } | 69 } |
68 }); | 70 }); |
69 } | 71 } |
70 | 72 |
71 void createSync() { | 73 void createSync() { |
72 if (!_create(_path)) { | 74 if (!_create(_path)) { |
73 throw new DirectoryException("Directory creation failed: $_path"); | 75 throw new DirectoryException("Directory creation failed: $_path"); |
74 } | 76 } |
75 } | 77 } |
76 | 78 |
77 void createTemp(void callback()) { | 79 void createTemp() { |
78 if (_directoryService == null) { | 80 if (_directoryService == null) { |
79 _directoryService = _newServicePort(); | 81 _directoryService = _newServicePort(); |
80 } | 82 } |
81 List request = new List(2); | 83 List request = new List(2); |
82 request[0] = kCreateTempRequest; | 84 request[0] = kCreateTempRequest; |
83 request[1] = _path; | 85 request[1] = _path; |
84 _directoryService.call(request).receive((result, replyTo) { | 86 _directoryService.call(request).receive((result, replyTo) { |
85 if (result is !List) { | 87 if (result is !List) { |
86 _path = result; | 88 _path = result; |
87 callback(); | 89 if (_createTempHandler != null) _createTempHandler(); |
88 } else if (_onError != null) { | 90 } else if (_errorHandler != null) { |
89 _onError("Could not create temporary directory [$_path]: " + | 91 _errorHandler("Could not create temporary directory [$_path]: " + |
90 "${result[1]}"); | 92 "${result[1]}"); |
91 } | 93 } |
92 }); | 94 }); |
93 } | 95 } |
94 | 96 |
95 void createTempSync() { | 97 void createTempSync() { |
96 var status = new _OSStatus(); | 98 var status = new _OSStatus(); |
97 var result = _createTemp(path, status); | 99 var result = _createTemp(path, status); |
98 if (result != null) { | 100 if (result != null) { |
99 _path = result; | 101 _path = result; |
100 } else { | 102 } else { |
101 throw new DirectoryException( | 103 throw new DirectoryException( |
102 "Could not create temporary directory [$_path]: " + | 104 "Could not create temporary directory [$_path]: " + |
103 "${status._errorMessage}", | 105 "${status._errorMessage}", |
104 status._errorCode); | 106 status._errorCode); |
105 } | 107 } |
106 } | 108 } |
107 | 109 |
108 void _deleteHelper(bool recursive, String errorMsg, void callback()) { | 110 void delete([bool recursive = false]) { |
109 if (_directoryService == null) { | 111 if (_directoryService == null) { |
110 _directoryService = _newServicePort(); | 112 _directoryService = _newServicePort(); |
111 } | 113 } |
112 List request = new List(3); | 114 List request = new List(3); |
113 request[0] = kDeleteRequest; | 115 request[0] = kDeleteRequest; |
114 request[1] = _path; | 116 request[1] = _path; |
115 request[2] = recursive; | 117 request[2] = recursive; |
116 _directoryService.call(request).receive((result, replyTo) { | 118 _directoryService.call(request).receive((result, replyTo) { |
117 if (result) { | 119 if (result) { |
118 callback(); | 120 if (_deleteHandler != null) _deleteHandler(); |
119 } else if (_onError != null) { | 121 } else if (_errorHandler != null) { |
120 _onError("${errorMsg}: $_path"); | 122 if (recursive) { |
| 123 _errorHandler("Recursive directory deletion failed: $_path"); |
| 124 } else { |
| 125 _errorHandler("Non-recursive directory deletion failed: $_path"); |
| 126 } |
121 } | 127 } |
122 }); | 128 }); |
123 } | 129 } |
124 | 130 |
125 void delete(void callback()) { | 131 void deleteSync([bool recursive = false]) { |
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; | |
135 if (!_delete(_path, recursive)) { | 132 if (!_delete(_path, recursive)) { |
136 throw new DirectoryException("Directory deletion failed: $_path"); | 133 throw new DirectoryException("Directory deletion failed: $_path"); |
137 } | 134 } |
138 } | 135 } |
139 | 136 |
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 | |
148 void list([bool recursive = false]) { | 137 void list([bool recursive = false]) { |
149 final int kListDirectory = 0; | 138 final int kListDirectory = 0; |
150 final int kListFile = 1; | 139 final int kListFile = 1; |
151 final int kListError = 2; | 140 final int kListError = 2; |
152 final int kListDone = 3; | 141 final int kListDone = 3; |
153 | 142 |
154 List request = new List(3); | 143 List request = new List(3); |
155 request[0] = kListRequest; | 144 request[0] = kListRequest; |
156 request[1] = _path; | 145 request[1] = _path; |
157 request[2] = recursive; | 146 request[2] = recursive; |
158 ReceivePort responsePort = new ReceivePort(); | 147 ReceivePort responsePort = new ReceivePort(); |
159 // Use a separate directory service port for each listing as | 148 // Use a separate directory service port for each listing as |
160 // listing operations on the same directory can run in parallel. | 149 // listing operations on the same directory can run in parallel. |
161 _newServicePort().send(request, responsePort.toSendPort()); | 150 _newServicePort().send(request, responsePort.toSendPort()); |
162 responsePort.receive((message, replyTo) { | 151 responsePort.receive((message, replyTo) { |
163 if (message is !List || message[0] is !int) { | 152 if (message is !List || message[0] is !int) { |
164 responsePort.close(); | 153 responsePort.close(); |
165 if (_onError != null) _onError("Internal error"); | 154 if (_errorHandler != null) _errorHandler("Internal error"); |
166 return; | 155 return; |
167 } | 156 } |
168 switch (message[0]) { | 157 switch (message[0]) { |
169 case kListDirectory: | 158 case kListDirectory: |
170 if (_onDir != null) _onDir(message[1]); | 159 if (_dirHandler != null) _dirHandler(message[1]); |
171 break; | 160 break; |
172 case kListFile: | 161 case kListFile: |
173 if (_onFile != null) _onFile(message[1]); | 162 if (_fileHandler != null) _fileHandler(message[1]); |
174 break; | 163 break; |
175 case kListError: | 164 case kListError: |
176 if (_onError != null) _onError(message[1]); | 165 if (_errorHandler != null) _errorHandler(message[1]); |
177 break; | 166 break; |
178 case kListDone: | 167 case kListDone: |
179 responsePort.close(); | 168 responsePort.close(); |
180 if (_onDone != null) _onDone(message[1]); | 169 if (_doneHandler != null) _doneHandler(message[1]); |
181 break; | 170 break; |
182 } | 171 } |
183 }); | 172 }); |
184 } | 173 } |
185 | 174 |
186 void set onDir(void onDir(String dir)) { | 175 void set dirHandler(void dirHandler(String dir)) { |
187 _onDir = onDir; | 176 _dirHandler = dirHandler; |
188 } | 177 } |
189 | 178 |
190 void set onFile(void onFile(String file)) { | 179 void set fileHandler(void fileHandler(String file)) { |
191 _onFile = onFile; | 180 _fileHandler = fileHandler; |
192 } | 181 } |
193 | 182 |
194 void set onDone(void onDone(bool completed)) { | 183 void set doneHandler(void doneHandler(bool completed)) { |
195 _onDone = onDone; | 184 _doneHandler = doneHandler; |
196 } | 185 } |
197 | 186 |
198 void set onError(void onError(String error)) { | 187 void set existsHandler(void existsHandler(bool exists)) { |
199 _onError = onError; | 188 _existsHandler = existsHandler; |
| 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; |
200 } | 205 } |
201 | 206 |
202 void _closePort(ReceivePort port) { | 207 void _closePort(ReceivePort port) { |
203 if (port !== null) { | 208 if (port !== null) { |
204 port.close(); | 209 port.close(); |
205 } | 210 } |
206 } | 211 } |
207 | 212 |
208 String get path() { return _path; } | 213 String get path() { return _path; } |
209 | 214 |
210 var _onDir; | 215 var _dirHandler; |
211 var _onFile; | 216 var _fileHandler; |
212 var _onDone; | 217 var _doneHandler; |
213 var _onError; | 218 var _existsHandler; |
| 219 var _createHandler; |
| 220 var _createTempHandler; |
| 221 var _deleteHandler; |
| 222 var _errorHandler; |
214 | 223 |
215 String _path; | 224 String _path; |
216 SendPort _directoryService; | 225 SendPort _directoryService; |
217 } | 226 } |
OLD | NEW |