Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(317)

Side by Side Diff: runtime/bin/directory.cc

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/bin/directory.h ('k') | runtime/bin/directory_android.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "bin/directory.h" 7 #include "bin/directory.h"
8 8
9 #include "bin/dartutils.h" 9 #include "bin/dartutils.h"
10 #include "bin/log.h" 10 #include "bin/log.h"
11 #include "include/dart_api.h" 11 #include "include/dart_api.h"
12 #include "platform/assert.h" 12 #include "platform/assert.h"
13 13
14 namespace dart { 14 namespace dart {
15 namespace bin { 15 namespace bin {
16 16
17 char* Directory::system_temp_path_override_ = NULL; 17 char* Directory::system_temp_path_override_ = NULL;
18 18
19 void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) { 19 void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) {
20 const char* current = Directory::Current(); 20 const char* current = Directory::Current();
21 if (current != NULL) { 21 if (current != NULL) {
22 Dart_SetReturnValue(args, DartUtils::NewString(current)); 22 Dart_SetReturnValue(args, DartUtils::NewString(current));
23 } else { 23 } else {
24 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 24 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
25 } 25 }
26 } 26 }
27 27
28
29 void FUNCTION_NAME(Directory_SetCurrent)(Dart_NativeArguments args) { 28 void FUNCTION_NAME(Directory_SetCurrent)(Dart_NativeArguments args) {
30 int argc = Dart_GetNativeArgumentCount(args); 29 int argc = Dart_GetNativeArgumentCount(args);
31 Dart_Handle path; 30 Dart_Handle path;
32 if (argc == 1) { 31 if (argc == 1) {
33 path = Dart_GetNativeArgument(args, 0); 32 path = Dart_GetNativeArgument(args, 0);
34 } 33 }
35 if ((argc != 1) || !Dart_IsString(path)) { 34 if ((argc != 1) || !Dart_IsString(path)) {
36 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError(NULL)); 35 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError(NULL));
37 } else { 36 } else {
38 if (Directory::SetCurrent(DartUtils::GetStringValue(path))) { 37 if (Directory::SetCurrent(DartUtils::GetStringValue(path))) {
39 Dart_SetReturnValue(args, Dart_True()); 38 Dart_SetReturnValue(args, Dart_True());
40 } else { 39 } else {
41 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 40 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
42 } 41 }
43 } 42 }
44 } 43 }
45 44
46
47 void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) { 45 void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) {
48 static const int kExists = 1; 46 static const int kExists = 1;
49 static const int kDoesNotExist = 0; 47 static const int kDoesNotExist = 0;
50 Dart_Handle path = Dart_GetNativeArgument(args, 0); 48 Dart_Handle path = Dart_GetNativeArgument(args, 0);
51 Directory::ExistsResult result = 49 Directory::ExistsResult result =
52 Directory::Exists(DartUtils::GetStringValue(path)); 50 Directory::Exists(DartUtils::GetStringValue(path));
53 if (result == Directory::EXISTS) { 51 if (result == Directory::EXISTS) {
54 Dart_SetReturnValue(args, Dart_NewInteger(kExists)); 52 Dart_SetReturnValue(args, Dart_NewInteger(kExists));
55 } else if (result == Directory::DOES_NOT_EXIST) { 53 } else if (result == Directory::DOES_NOT_EXIST) {
56 Dart_SetReturnValue(args, Dart_NewInteger(kDoesNotExist)); 54 Dart_SetReturnValue(args, Dart_NewInteger(kDoesNotExist));
57 } else { 55 } else {
58 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 56 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
59 } 57 }
60 } 58 }
61 59
62
63 void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) { 60 void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) {
64 Dart_Handle path = Dart_GetNativeArgument(args, 0); 61 Dart_Handle path = Dart_GetNativeArgument(args, 0);
65 if (Directory::Create(DartUtils::GetStringValue(path))) { 62 if (Directory::Create(DartUtils::GetStringValue(path))) {
66 Dart_SetReturnValue(args, Dart_True()); 63 Dart_SetReturnValue(args, Dart_True());
67 } else { 64 } else {
68 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 65 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
69 } 66 }
70 } 67 }
71 68
72
73 void FUNCTION_NAME(Directory_SystemTemp)(Dart_NativeArguments args) { 69 void FUNCTION_NAME(Directory_SystemTemp)(Dart_NativeArguments args) {
74 const char* result = Directory::SystemTemp(); 70 const char* result = Directory::SystemTemp();
75 Dart_SetReturnValue(args, DartUtils::NewString(result)); 71 Dart_SetReturnValue(args, DartUtils::NewString(result));
76 } 72 }
77 73
78
79 void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) { 74 void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) {
80 Dart_Handle path = Dart_GetNativeArgument(args, 0); 75 Dart_Handle path = Dart_GetNativeArgument(args, 0);
81 if (!Dart_IsString(path)) { 76 if (!Dart_IsString(path)) {
82 Dart_SetReturnValue( 77 Dart_SetReturnValue(
83 args, DartUtils::NewDartArgumentError( 78 args, DartUtils::NewDartArgumentError(
84 "Prefix argument of CreateSystemTempSync is not a String")); 79 "Prefix argument of CreateSystemTempSync is not a String"));
85 return; 80 return;
86 } 81 }
87 const char* result = Directory::CreateTemp(DartUtils::GetStringValue(path)); 82 const char* result = Directory::CreateTemp(DartUtils::GetStringValue(path));
88 if (result != NULL) { 83 if (result != NULL) {
89 Dart_SetReturnValue(args, DartUtils::NewString(result)); 84 Dart_SetReturnValue(args, DartUtils::NewString(result));
90 } else { 85 } else {
91 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 86 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
92 } 87 }
93 } 88 }
94 89
95
96 void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) { 90 void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) {
97 Dart_Handle path = Dart_GetNativeArgument(args, 0); 91 Dart_Handle path = Dart_GetNativeArgument(args, 0);
98 Dart_Handle recursive = Dart_GetNativeArgument(args, 1); 92 Dart_Handle recursive = Dart_GetNativeArgument(args, 1);
99 if (Directory::Delete(DartUtils::GetStringValue(path), 93 if (Directory::Delete(DartUtils::GetStringValue(path),
100 DartUtils::GetBooleanValue(recursive))) { 94 DartUtils::GetBooleanValue(recursive))) {
101 Dart_SetReturnValue(args, Dart_True()); 95 Dart_SetReturnValue(args, Dart_True());
102 } else { 96 } else {
103 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 97 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
104 } 98 }
105 } 99 }
106 100
107
108 void FUNCTION_NAME(Directory_Rename)(Dart_NativeArguments args) { 101 void FUNCTION_NAME(Directory_Rename)(Dart_NativeArguments args) {
109 Dart_Handle path = Dart_GetNativeArgument(args, 0); 102 Dart_Handle path = Dart_GetNativeArgument(args, 0);
110 Dart_Handle newPath = Dart_GetNativeArgument(args, 1); 103 Dart_Handle newPath = Dart_GetNativeArgument(args, 1);
111 if (Directory::Rename(DartUtils::GetStringValue(path), 104 if (Directory::Rename(DartUtils::GetStringValue(path),
112 DartUtils::GetStringValue(newPath))) { 105 DartUtils::GetStringValue(newPath))) {
113 Dart_SetReturnValue(args, Dart_True()); 106 Dart_SetReturnValue(args, Dart_True());
114 } else { 107 } else {
115 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 108 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
116 } 109 }
117 } 110 }
118 111
119
120 void FUNCTION_NAME(Directory_FillWithDirectoryListing)( 112 void FUNCTION_NAME(Directory_FillWithDirectoryListing)(
121 Dart_NativeArguments args) { 113 Dart_NativeArguments args) {
122 // The list that we should fill. 114 // The list that we should fill.
123 Dart_Handle results = Dart_GetNativeArgument(args, 0); 115 Dart_Handle results = Dart_GetNativeArgument(args, 0);
124 Dart_Handle path = Dart_GetNativeArgument(args, 1); 116 Dart_Handle path = Dart_GetNativeArgument(args, 1);
125 Dart_Handle recursive = Dart_GetNativeArgument(args, 2); 117 Dart_Handle recursive = Dart_GetNativeArgument(args, 2);
126 Dart_Handle follow_links = Dart_GetNativeArgument(args, 3); 118 Dart_Handle follow_links = Dart_GetNativeArgument(args, 3);
127 119
128 Dart_Handle dart_error; 120 Dart_Handle dart_error;
129 { 121 {
130 // Pass the list that should hold the directory listing to the 122 // Pass the list that should hold the directory listing to the
131 // SyncDirectoryListing object, which adds elements to it. 123 // SyncDirectoryListing object, which adds elements to it.
132 SyncDirectoryListing sync_listing(results, DartUtils::GetStringValue(path), 124 SyncDirectoryListing sync_listing(results, DartUtils::GetStringValue(path),
133 DartUtils::GetBooleanValue(recursive), 125 DartUtils::GetBooleanValue(recursive),
134 DartUtils::GetBooleanValue(follow_links)); 126 DartUtils::GetBooleanValue(follow_links));
135 Directory::List(&sync_listing); 127 Directory::List(&sync_listing);
136 dart_error = sync_listing.dart_error(); 128 dart_error = sync_listing.dart_error();
137 } 129 }
138 if (Dart_IsError(dart_error)) { 130 if (Dart_IsError(dart_error)) {
139 Dart_PropagateError(dart_error); 131 Dart_PropagateError(dart_error);
140 } else if (!Dart_IsNull(dart_error)) { 132 } else if (!Dart_IsNull(dart_error)) {
141 Dart_ThrowException(dart_error); 133 Dart_ThrowException(dart_error);
142 } 134 }
143 } 135 }
144 136
145
146 static const int kAsyncDirectoryListerFieldIndex = 0; 137 static const int kAsyncDirectoryListerFieldIndex = 0;
147 138
148
149 void FUNCTION_NAME(Directory_GetAsyncDirectoryListerPointer)( 139 void FUNCTION_NAME(Directory_GetAsyncDirectoryListerPointer)(
150 Dart_NativeArguments args) { 140 Dart_NativeArguments args) {
151 AsyncDirectoryListing* listing; 141 AsyncDirectoryListing* listing;
152 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); 142 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
153 ASSERT(Dart_IsInstance(dart_this)); 143 ASSERT(Dart_IsInstance(dart_this));
154 ThrowIfError( 144 ThrowIfError(
155 Dart_GetNativeInstanceField(dart_this, kAsyncDirectoryListerFieldIndex, 145 Dart_GetNativeInstanceField(dart_this, kAsyncDirectoryListerFieldIndex,
156 reinterpret_cast<intptr_t*>(&listing))); 146 reinterpret_cast<intptr_t*>(&listing)));
157 if (listing != NULL) { 147 if (listing != NULL) {
158 intptr_t listing_pointer = reinterpret_cast<intptr_t>(listing); 148 intptr_t listing_pointer = reinterpret_cast<intptr_t>(listing);
159 // Increment the listing's reference count. This native should only be 149 // Increment the listing's reference count. This native should only be
160 // be called when we are about to send the AsyncDirectoryListing* to the 150 // be called when we are about to send the AsyncDirectoryListing* to the
161 // IO service. 151 // IO service.
162 listing->Retain(); 152 listing->Retain();
163 Dart_SetReturnValue(args, Dart_NewInteger(listing_pointer)); 153 Dart_SetReturnValue(args, Dart_NewInteger(listing_pointer));
164 } 154 }
165 } 155 }
166 156
167
168 static void ReleaseListing(void* isolate_callback_data, 157 static void ReleaseListing(void* isolate_callback_data,
169 Dart_WeakPersistentHandle handle, 158 Dart_WeakPersistentHandle handle,
170 void* peer) { 159 void* peer) {
171 AsyncDirectoryListing* listing = 160 AsyncDirectoryListing* listing =
172 reinterpret_cast<AsyncDirectoryListing*>(peer); 161 reinterpret_cast<AsyncDirectoryListing*>(peer);
173 listing->Release(); 162 listing->Release();
174 } 163 }
175 164
176
177 void FUNCTION_NAME(Directory_SetAsyncDirectoryListerPointer)( 165 void FUNCTION_NAME(Directory_SetAsyncDirectoryListerPointer)(
178 Dart_NativeArguments args) { 166 Dart_NativeArguments args) {
179 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); 167 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
180 intptr_t listing_pointer = 168 intptr_t listing_pointer =
181 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); 169 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
182 AsyncDirectoryListing* listing = 170 AsyncDirectoryListing* listing =
183 reinterpret_cast<AsyncDirectoryListing*>(listing_pointer); 171 reinterpret_cast<AsyncDirectoryListing*>(listing_pointer);
184 Dart_NewWeakPersistentHandle(dart_this, reinterpret_cast<void*>(listing), 172 Dart_NewWeakPersistentHandle(dart_this, reinterpret_cast<void*>(listing),
185 sizeof(*listing), ReleaseListing); 173 sizeof(*listing), ReleaseListing);
186 Dart_Handle result = Dart_SetNativeInstanceField( 174 Dart_Handle result = Dart_SetNativeInstanceField(
187 dart_this, kAsyncDirectoryListerFieldIndex, listing_pointer); 175 dart_this, kAsyncDirectoryListerFieldIndex, listing_pointer);
188 if (Dart_IsError(result)) { 176 if (Dart_IsError(result)) {
189 Log::PrintErr("SetAsyncDirectoryListerPointer failed\n"); 177 Log::PrintErr("SetAsyncDirectoryListerPointer failed\n");
190 Dart_PropagateError(result); 178 Dart_PropagateError(result);
191 } 179 }
192 } 180 }
193 181
194
195 void Directory::SetSystemTemp(const char* path) { 182 void Directory::SetSystemTemp(const char* path) {
196 if (system_temp_path_override_ != NULL) { 183 if (system_temp_path_override_ != NULL) {
197 free(system_temp_path_override_); 184 free(system_temp_path_override_);
198 system_temp_path_override_ = NULL; 185 system_temp_path_override_ = NULL;
199 } 186 }
200 if (path != NULL) { 187 if (path != NULL) {
201 system_temp_path_override_ = strdup(path); 188 system_temp_path_override_ = strdup(path);
202 } 189 }
203 } 190 }
204 191
205
206 CObject* Directory::CreateRequest(const CObjectArray& request) { 192 CObject* Directory::CreateRequest(const CObjectArray& request) {
207 if ((request.Length() == 1) && request[0]->IsString()) { 193 if ((request.Length() == 1) && request[0]->IsString()) {
208 CObjectString path(request[0]); 194 CObjectString path(request[0]);
209 if (Directory::Create(path.CString())) { 195 if (Directory::Create(path.CString())) {
210 return CObject::True(); 196 return CObject::True();
211 } else { 197 } else {
212 return CObject::NewOSError(); 198 return CObject::NewOSError();
213 } 199 }
214 } 200 }
215 return CObject::IllegalArgumentError(); 201 return CObject::IllegalArgumentError();
216 } 202 }
217 203
218
219 CObject* Directory::DeleteRequest(const CObjectArray& request) { 204 CObject* Directory::DeleteRequest(const CObjectArray& request) {
220 if ((request.Length() == 2) && request[0]->IsString() && 205 if ((request.Length() == 2) && request[0]->IsString() &&
221 request[1]->IsBool()) { 206 request[1]->IsBool()) {
222 CObjectString path(request[0]); 207 CObjectString path(request[0]);
223 CObjectBool recursive(request[1]); 208 CObjectBool recursive(request[1]);
224 if (Directory::Delete(path.CString(), recursive.Value())) { 209 if (Directory::Delete(path.CString(), recursive.Value())) {
225 return CObject::True(); 210 return CObject::True();
226 } else { 211 } else {
227 return CObject::NewOSError(); 212 return CObject::NewOSError();
228 } 213 }
229 } 214 }
230 return CObject::IllegalArgumentError(); 215 return CObject::IllegalArgumentError();
231 } 216 }
232 217
233
234 CObject* Directory::ExistsRequest(const CObjectArray& request) { 218 CObject* Directory::ExistsRequest(const CObjectArray& request) {
235 static const int kExists = 1; 219 static const int kExists = 1;
236 static const int kDoesNotExist = 0; 220 static const int kDoesNotExist = 0;
237 if ((request.Length() == 1) && request[0]->IsString()) { 221 if ((request.Length() == 1) && request[0]->IsString()) {
238 CObjectString path(request[0]); 222 CObjectString path(request[0]);
239 Directory::ExistsResult result = Directory::Exists(path.CString()); 223 Directory::ExistsResult result = Directory::Exists(path.CString());
240 if (result == Directory::EXISTS) { 224 if (result == Directory::EXISTS) {
241 return new CObjectInt32(CObject::NewInt32(kExists)); 225 return new CObjectInt32(CObject::NewInt32(kExists));
242 } else if (result == Directory::DOES_NOT_EXIST) { 226 } else if (result == Directory::DOES_NOT_EXIST) {
243 return new CObjectInt32(CObject::NewInt32(kDoesNotExist)); 227 return new CObjectInt32(CObject::NewInt32(kDoesNotExist));
244 } else { 228 } else {
245 return CObject::NewOSError(); 229 return CObject::NewOSError();
246 } 230 }
247 } 231 }
248 return CObject::IllegalArgumentError(); 232 return CObject::IllegalArgumentError();
249 } 233 }
250 234
251
252 CObject* Directory::CreateTempRequest(const CObjectArray& request) { 235 CObject* Directory::CreateTempRequest(const CObjectArray& request) {
253 if ((request.Length() == 1) && request[0]->IsString()) { 236 if ((request.Length() == 1) && request[0]->IsString()) {
254 CObjectString path(request[0]); 237 CObjectString path(request[0]);
255 const char* result = Directory::CreateTemp(path.CString()); 238 const char* result = Directory::CreateTemp(path.CString());
256 if (result != NULL) { 239 if (result != NULL) {
257 CObject* temp_dir = new CObjectString(CObject::NewString(result)); 240 CObject* temp_dir = new CObjectString(CObject::NewString(result));
258 return temp_dir; 241 return temp_dir;
259 } else { 242 } else {
260 return CObject::NewOSError(); 243 return CObject::NewOSError();
261 } 244 }
262 } 245 }
263 return CObject::IllegalArgumentError(); 246 return CObject::IllegalArgumentError();
264 } 247 }
265 248
266
267 static CObject* CreateIllegalArgumentError() { 249 static CObject* CreateIllegalArgumentError() {
268 // Respond with an illegal argument list error message. 250 // Respond with an illegal argument list error message.
269 CObjectArray* error = new CObjectArray(CObject::NewArray(3)); 251 CObjectArray* error = new CObjectArray(CObject::NewArray(3));
270 error->SetAt(0, new CObjectInt32( 252 error->SetAt(0, new CObjectInt32(
271 CObject::NewInt32(AsyncDirectoryListing::kListError))); 253 CObject::NewInt32(AsyncDirectoryListing::kListError)));
272 error->SetAt(1, CObject::Null()); 254 error->SetAt(1, CObject::Null());
273 error->SetAt(2, CObject::IllegalArgumentError()); 255 error->SetAt(2, CObject::IllegalArgumentError());
274 return error; 256 return error;
275 } 257 }
276 258
277
278 CObject* Directory::ListStartRequest(const CObjectArray& request) { 259 CObject* Directory::ListStartRequest(const CObjectArray& request) {
279 if ((request.Length() == 3) && request[0]->IsString() && 260 if ((request.Length() == 3) && request[0]->IsString() &&
280 request[1]->IsBool() && request[2]->IsBool()) { 261 request[1]->IsBool() && request[2]->IsBool()) {
281 CObjectString path(request[0]); 262 CObjectString path(request[0]);
282 CObjectBool recursive(request[1]); 263 CObjectBool recursive(request[1]);
283 CObjectBool follow_links(request[2]); 264 CObjectBool follow_links(request[2]);
284 AsyncDirectoryListing* dir_listing = new AsyncDirectoryListing( 265 AsyncDirectoryListing* dir_listing = new AsyncDirectoryListing(
285 path.CString(), recursive.Value(), follow_links.Value()); 266 path.CString(), recursive.Value(), follow_links.Value());
286 if (dir_listing->error()) { 267 if (dir_listing->error()) {
287 // Report error now, so we capture the correct OSError. 268 // Report error now, so we capture the correct OSError.
288 CObject* err = CObject::NewOSError(); 269 CObject* err = CObject::NewOSError();
289 dir_listing->Release(); 270 dir_listing->Release();
290 CObjectArray* error = new CObjectArray(CObject::NewArray(3)); 271 CObjectArray* error = new CObjectArray(CObject::NewArray(3));
291 error->SetAt(0, new CObjectInt32(CObject::NewInt32( 272 error->SetAt(0, new CObjectInt32(CObject::NewInt32(
292 AsyncDirectoryListing::kListError))); 273 AsyncDirectoryListing::kListError)));
293 error->SetAt(1, request[0]); 274 error->SetAt(1, request[0]);
294 error->SetAt(2, err); 275 error->SetAt(2, err);
295 return error; 276 return error;
296 } 277 }
297 // TODO(ajohnsen): Consider returning the first few results. 278 // TODO(ajohnsen): Consider returning the first few results.
298 return new CObjectIntptr( 279 return new CObjectIntptr(
299 CObject::NewIntptr(reinterpret_cast<intptr_t>(dir_listing))); 280 CObject::NewIntptr(reinterpret_cast<intptr_t>(dir_listing)));
300 } 281 }
301 return CreateIllegalArgumentError(); 282 return CreateIllegalArgumentError();
302 } 283 }
303 284
304
305 CObject* Directory::ListNextRequest(const CObjectArray& request) { 285 CObject* Directory::ListNextRequest(const CObjectArray& request) {
306 if ((request.Length() == 1) && request[0]->IsIntptr()) { 286 if ((request.Length() == 1) && request[0]->IsIntptr()) {
307 CObjectIntptr ptr(request[0]); 287 CObjectIntptr ptr(request[0]);
308 AsyncDirectoryListing* dir_listing = 288 AsyncDirectoryListing* dir_listing =
309 reinterpret_cast<AsyncDirectoryListing*>(ptr.Value()); 289 reinterpret_cast<AsyncDirectoryListing*>(ptr.Value());
310 RefCntReleaseScope<AsyncDirectoryListing> rs(dir_listing); 290 RefCntReleaseScope<AsyncDirectoryListing> rs(dir_listing);
311 if (dir_listing->IsEmpty()) { 291 if (dir_listing->IsEmpty()) {
312 return new CObjectArray(CObject::NewArray(0)); 292 return new CObjectArray(CObject::NewArray(0));
313 } 293 }
314 const int kArraySize = 128; 294 const int kArraySize = 128;
315 CObjectArray* response = new CObjectArray(CObject::NewArray(kArraySize)); 295 CObjectArray* response = new CObjectArray(CObject::NewArray(kArraySize));
316 dir_listing->SetArray(response, kArraySize); 296 dir_listing->SetArray(response, kArraySize);
317 Directory::List(dir_listing); 297 Directory::List(dir_listing);
318 // In case the listing ended before it hit the buffer length, we need to 298 // In case the listing ended before it hit the buffer length, we need to
319 // override the array length. 299 // override the array length.
320 response->AsApiCObject()->value.as_array.length = dir_listing->index(); 300 response->AsApiCObject()->value.as_array.length = dir_listing->index();
321 return response; 301 return response;
322 } 302 }
323 return CreateIllegalArgumentError(); 303 return CreateIllegalArgumentError();
324 } 304 }
325 305
326
327 CObject* Directory::ListStopRequest(const CObjectArray& request) { 306 CObject* Directory::ListStopRequest(const CObjectArray& request) {
328 if ((request.Length() == 1) && request[0]->IsIntptr()) { 307 if ((request.Length() == 1) && request[0]->IsIntptr()) {
329 CObjectIntptr ptr(request[0]); 308 CObjectIntptr ptr(request[0]);
330 AsyncDirectoryListing* dir_listing = 309 AsyncDirectoryListing* dir_listing =
331 reinterpret_cast<AsyncDirectoryListing*>(ptr.Value()); 310 reinterpret_cast<AsyncDirectoryListing*>(ptr.Value());
332 RefCntReleaseScope<AsyncDirectoryListing> rs(dir_listing); 311 RefCntReleaseScope<AsyncDirectoryListing> rs(dir_listing);
333 312
334 // We have retained a reference to the listing here. Therefore the listing's 313 // We have retained a reference to the listing here. Therefore the listing's
335 // destructor can't be running. Since no further requests are dispatched by 314 // destructor can't be running. Since no further requests are dispatched by
336 // the Dart code after an async stop call, this PopAll() can't be racing 315 // the Dart code after an async stop call, this PopAll() can't be racing
337 // with any other call on the listing. We don't do an extra Release(), and 316 // with any other call on the listing. We don't do an extra Release(), and
338 // we don't delete the weak persistent handle. The file is closed here, but 317 // we don't delete the weak persistent handle. The file is closed here, but
339 // the memory for the listing will be cleaned up when the finalizer runs. 318 // the memory for the listing will be cleaned up when the finalizer runs.
340 dir_listing->PopAll(); 319 dir_listing->PopAll();
341 return new CObjectBool(CObject::Bool(true)); 320 return new CObjectBool(CObject::Bool(true));
342 } 321 }
343 return CreateIllegalArgumentError(); 322 return CreateIllegalArgumentError();
344 } 323 }
345 324
346
347 CObject* Directory::RenameRequest(const CObjectArray& request) { 325 CObject* Directory::RenameRequest(const CObjectArray& request) {
348 if ((request.Length() == 2) && request[0]->IsString() && 326 if ((request.Length() == 2) && request[0]->IsString() &&
349 request[1]->IsString()) { 327 request[1]->IsString()) {
350 CObjectString path(request[0]); 328 CObjectString path(request[0]);
351 CObjectString new_path(request[1]); 329 CObjectString new_path(request[1]);
352 bool completed = Directory::Rename(path.CString(), new_path.CString()); 330 bool completed = Directory::Rename(path.CString(), new_path.CString());
353 if (completed) { 331 if (completed) {
354 return CObject::True(); 332 return CObject::True();
355 } 333 }
356 return CObject::NewOSError(); 334 return CObject::NewOSError();
357 } 335 }
358 return CObject::IllegalArgumentError(); 336 return CObject::IllegalArgumentError();
359 } 337 }
360 338
361
362 bool AsyncDirectoryListing::AddFileSystemEntityToResponse(Response type, 339 bool AsyncDirectoryListing::AddFileSystemEntityToResponse(Response type,
363 const char* arg) { 340 const char* arg) {
364 array_->SetAt(index_++, new CObjectInt32(CObject::NewInt32(type))); 341 array_->SetAt(index_++, new CObjectInt32(CObject::NewInt32(type)));
365 if (arg != NULL) { 342 if (arg != NULL) {
366 array_->SetAt(index_++, new CObjectString(CObject::NewString(arg))); 343 array_->SetAt(index_++, new CObjectString(CObject::NewString(arg)));
367 } else { 344 } else {
368 array_->SetAt(index_++, CObject::Null()); 345 array_->SetAt(index_++, CObject::Null());
369 } 346 }
370 return index_ < length_; 347 return index_ < length_;
371 } 348 }
372 349
373
374 bool AsyncDirectoryListing::HandleDirectory(const char* dir_name) { 350 bool AsyncDirectoryListing::HandleDirectory(const char* dir_name) {
375 return AddFileSystemEntityToResponse(kListDirectory, dir_name); 351 return AddFileSystemEntityToResponse(kListDirectory, dir_name);
376 } 352 }
377 353
378
379 bool AsyncDirectoryListing::HandleFile(const char* file_name) { 354 bool AsyncDirectoryListing::HandleFile(const char* file_name) {
380 return AddFileSystemEntityToResponse(kListFile, file_name); 355 return AddFileSystemEntityToResponse(kListFile, file_name);
381 } 356 }
382 357
383
384 bool AsyncDirectoryListing::HandleLink(const char* link_name) { 358 bool AsyncDirectoryListing::HandleLink(const char* link_name) {
385 return AddFileSystemEntityToResponse(kListLink, link_name); 359 return AddFileSystemEntityToResponse(kListLink, link_name);
386 } 360 }
387 361
388
389 void AsyncDirectoryListing::HandleDone() { 362 void AsyncDirectoryListing::HandleDone() {
390 AddFileSystemEntityToResponse(kListDone, NULL); 363 AddFileSystemEntityToResponse(kListDone, NULL);
391 } 364 }
392 365
393
394 bool AsyncDirectoryListing::HandleError() { 366 bool AsyncDirectoryListing::HandleError() {
395 CObject* err = CObject::NewOSError(); 367 CObject* err = CObject::NewOSError();
396 array_->SetAt(index_++, new CObjectInt32(CObject::NewInt32(kListError))); 368 array_->SetAt(index_++, new CObjectInt32(CObject::NewInt32(kListError)));
397 CObjectArray* response = new CObjectArray(CObject::NewArray(3)); 369 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
398 response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError))); 370 response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError)));
399 // Delay calling CurrentPath() until after CObject::NewOSError() in case 371 // Delay calling CurrentPath() until after CObject::NewOSError() in case
400 // CurrentPath() pollutes the OS error code. 372 // CurrentPath() pollutes the OS error code.
401 response->SetAt(1, new CObjectString(CObject::NewString( 373 response->SetAt(1, new CObjectString(CObject::NewString(
402 error() ? "Invalid path" : CurrentPath()))); 374 error() ? "Invalid path" : CurrentPath())));
403 response->SetAt(2, err); 375 response->SetAt(2, err);
404 array_->SetAt(index_++, response); 376 array_->SetAt(index_++, response);
405 return index_ < length_; 377 return index_ < length_;
406 } 378 }
407 379
408
409 bool SyncDirectoryListing::HandleDirectory(const char* dir_name) { 380 bool SyncDirectoryListing::HandleDirectory(const char* dir_name) {
410 Dart_Handle dir_name_dart = DartUtils::NewString(dir_name); 381 Dart_Handle dir_name_dart = DartUtils::NewString(dir_name);
411 Dart_Handle dir = Dart_New(directory_type_, Dart_Null(), 1, &dir_name_dart); 382 Dart_Handle dir = Dart_New(directory_type_, Dart_Null(), 1, &dir_name_dart);
412 Dart_Handle result = Dart_Invoke(results_, add_string_, 1, &dir); 383 Dart_Handle result = Dart_Invoke(results_, add_string_, 1, &dir);
413 if (Dart_IsError(result)) { 384 if (Dart_IsError(result)) {
414 dart_error_ = result; 385 dart_error_ = result;
415 return false; 386 return false;
416 } 387 }
417 return true; 388 return true;
418 } 389 }
419 390
420
421 bool SyncDirectoryListing::HandleLink(const char* link_name) { 391 bool SyncDirectoryListing::HandleLink(const char* link_name) {
422 Dart_Handle link_name_dart = DartUtils::NewString(link_name); 392 Dart_Handle link_name_dart = DartUtils::NewString(link_name);
423 Dart_Handle link = Dart_New(link_type_, Dart_Null(), 1, &link_name_dart); 393 Dart_Handle link = Dart_New(link_type_, Dart_Null(), 1, &link_name_dart);
424 Dart_Handle result = Dart_Invoke(results_, add_string_, 1, &link); 394 Dart_Handle result = Dart_Invoke(results_, add_string_, 1, &link);
425 if (Dart_IsError(result)) { 395 if (Dart_IsError(result)) {
426 dart_error_ = result; 396 dart_error_ = result;
427 return false; 397 return false;
428 } 398 }
429 return true; 399 return true;
430 } 400 }
431 401
432
433 bool SyncDirectoryListing::HandleFile(const char* file_name) { 402 bool SyncDirectoryListing::HandleFile(const char* file_name) {
434 Dart_Handle file_name_dart = DartUtils::NewString(file_name); 403 Dart_Handle file_name_dart = DartUtils::NewString(file_name);
435 Dart_Handle file = Dart_New(file_type_, Dart_Null(), 1, &file_name_dart); 404 Dart_Handle file = Dart_New(file_type_, Dart_Null(), 1, &file_name_dart);
436 Dart_Handle result = Dart_Invoke(results_, add_string_, 1, &file); 405 Dart_Handle result = Dart_Invoke(results_, add_string_, 1, &file);
437 if (Dart_IsError(result)) { 406 if (Dart_IsError(result)) {
438 dart_error_ = result; 407 dart_error_ = result;
439 return false; 408 return false;
440 } 409 }
441 return true; 410 return true;
442 } 411 }
443 412
444
445 bool SyncDirectoryListing::HandleError() { 413 bool SyncDirectoryListing::HandleError() {
446 Dart_Handle dart_os_error = DartUtils::NewDartOSError(); 414 Dart_Handle dart_os_error = DartUtils::NewDartOSError();
447 Dart_Handle args[3]; 415 Dart_Handle args[3];
448 args[0] = DartUtils::NewString("Directory listing failed"); 416 args[0] = DartUtils::NewString("Directory listing failed");
449 args[1] = DartUtils::NewString(error() ? "Invalid path" : CurrentPath()); 417 args[1] = DartUtils::NewString(error() ? "Invalid path" : CurrentPath());
450 args[2] = dart_os_error; 418 args[2] = dart_os_error;
451 419
452 dart_error_ = Dart_New( 420 dart_error_ = Dart_New(
453 DartUtils::GetDartType(DartUtils::kIOLibURL, "FileSystemException"), 421 DartUtils::GetDartType(DartUtils::kIOLibURL, "FileSystemException"),
454 Dart_Null(), 3, args); 422 Dart_Null(), 3, args);
455 return false; 423 return false;
456 } 424 }
457 425
458
459 static bool ListNext(DirectoryListing* listing) { 426 static bool ListNext(DirectoryListing* listing) {
460 switch (listing->top()->Next(listing)) { 427 switch (listing->top()->Next(listing)) {
461 case kListFile: 428 case kListFile:
462 return listing->HandleFile(listing->CurrentPath()); 429 return listing->HandleFile(listing->CurrentPath());
463 430
464 case kListLink: 431 case kListLink:
465 return listing->HandleLink(listing->CurrentPath()); 432 return listing->HandleLink(listing->CurrentPath());
466 433
467 case kListDirectory: 434 case kListDirectory:
468 if (listing->recursive()) { 435 if (listing->recursive()) {
(...skipping 12 matching lines...) Expand all
481 } else { 448 } else {
482 return true; 449 return true;
483 } 450 }
484 451
485 default: 452 default:
486 UNREACHABLE(); 453 UNREACHABLE();
487 } 454 }
488 return false; 455 return false;
489 } 456 }
490 457
491
492 void Directory::List(DirectoryListing* listing) { 458 void Directory::List(DirectoryListing* listing) {
493 if (listing->error()) { 459 if (listing->error()) {
494 listing->HandleError(); 460 listing->HandleError();
495 listing->HandleDone(); 461 listing->HandleDone();
496 } else { 462 } else {
497 while (ListNext(listing)) { 463 while (ListNext(listing)) {
498 } 464 }
499 } 465 }
500 } 466 }
501 467
502 } // namespace bin 468 } // namespace bin
503 } // namespace dart 469 } // namespace dart
504 470
505 #endif // !defined(DART_IO_DISABLED) 471 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/directory.h ('k') | runtime/bin/directory_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698