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

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

Issue 9773018: Add error handling to directory (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments Created 8 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « runtime/bin/directory.h ('k') | runtime/bin/directory.dart » ('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 #include "bin/directory.h" 5 #include "bin/directory.h"
6 6
7 #include "bin/dartutils.h" 7 #include "bin/dartutils.h"
8 #include "bin/thread.h" 8 #include "bin/thread.h"
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "platform/assert.h" 10 #include "platform/assert.h"
11 11
12 dart::Mutex Directory::mutex_; 12 dart::Mutex Directory::mutex_;
13 int Directory::service_ports_size_ = 0; 13 int Directory::service_ports_size_ = 0;
14 Dart_Port* Directory::service_ports_ = NULL; 14 Dart_Port* Directory::service_ports_ = NULL;
15 int Directory::service_ports_index_ = 0; 15 int Directory::service_ports_index_ = 0;
16 16
17 void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) { 17 void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) {
18 Dart_EnterScope(); 18 Dart_EnterScope();
19 char* current = Directory::Current(); 19 char* current = Directory::Current();
20 if (current != NULL) { 20 if (current != NULL) {
21 Dart_SetReturnValue(args, Dart_NewString(current)); 21 Dart_SetReturnValue(args, Dart_NewString(current));
22 free(current); 22 free(current);
23 } 23 }
24 Dart_ExitScope(); 24 Dart_ExitScope();
25 } 25 }
26 26
27 27
28 void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) { 28 void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) {
29 static const int kError = -1;
30 static const int kExists = 1; 29 static const int kExists = 1;
31 static const int kDoesNotExist = 0; 30 static const int kDoesNotExist = 0;
32 Dart_EnterScope(); 31 Dart_EnterScope();
33 Dart_Handle path = Dart_GetNativeArgument(args, 0); 32 Dart_Handle path = Dart_GetNativeArgument(args, 0);
34 if (Dart_IsString(path)) { 33 Directory::ExistsResult result =
35 Directory::ExistsResult result = 34 Directory::Exists(DartUtils::GetStringValue(path));
36 Directory::Exists(DartUtils::GetStringValue(path)); 35 if (result == Directory::EXISTS) {
37 int return_value = kError; 36 Dart_SetReturnValue(args, Dart_NewInteger(kExists));
38 if (result == Directory::EXISTS) { 37 } else if (result == Directory::DOES_NOT_EXIST) {
39 return_value = kExists; 38 Dart_SetReturnValue(args, Dart_NewInteger(kDoesNotExist));
39 } else {
40 Dart_Handle err = DartUtils::NewDartOSError();
41 if (Dart_IsError(err)) {
42 Dart_PropagateError(err);
40 } 43 }
41 if (result == Directory::DOES_NOT_EXIST) { 44 Dart_SetReturnValue(args, err);
42 return_value = kDoesNotExist;
43 }
44 Dart_SetReturnValue(args, Dart_NewInteger(return_value));
45 } else {
46 Dart_SetReturnValue(args, Dart_NewInteger(kDoesNotExist));
47 } 45 }
48 Dart_ExitScope(); 46 Dart_ExitScope();
49 } 47 }
50 48
51 49
52 void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) { 50 void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) {
53 Dart_EnterScope(); 51 Dart_EnterScope();
54 Dart_Handle path = Dart_GetNativeArgument(args, 0); 52 Dart_Handle path = Dart_GetNativeArgument(args, 0);
55 if (Dart_IsString(path)) { 53 if (Directory::Create(DartUtils::GetStringValue(path))) {
56 bool created = Directory::Create(DartUtils::GetStringValue(path)); 54 Dart_SetReturnValue(args, Dart_True());
57 Dart_SetReturnValue(args, Dart_NewBoolean(created));
58 } else { 55 } else {
59 Dart_SetReturnValue(args, Dart_NewBoolean(false)); 56 Dart_Handle err = DartUtils::NewDartOSError();
57 if (Dart_IsError(err)) {
58 Dart_PropagateError(err);
59 }
60 Dart_SetReturnValue(args, err);
60 } 61 }
61 Dart_ExitScope(); 62 Dart_ExitScope();
62 } 63 }
63 64
64 65
65 void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) { 66 void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) {
66 Dart_EnterScope(); 67 Dart_EnterScope();
67 Dart_Handle path = Dart_GetNativeArgument(args, 0); 68 Dart_Handle path = Dart_GetNativeArgument(args, 0);
68 char* result = Directory::CreateTemp(DartUtils::GetStringValue(path)); 69 char* result = Directory::CreateTemp(DartUtils::GetStringValue(path));
69 if (result != NULL) { 70 if (result != NULL) {
70 Dart_SetReturnValue(args, Dart_NewString(result)); 71 Dart_SetReturnValue(args, Dart_NewString(result));
71 free(result); 72 free(result);
72 } else { 73 } else {
73 Dart_Handle err = DartUtils::NewDartOSError(); 74 Dart_Handle err = DartUtils::NewDartOSError();
74 if (Dart_IsError(err)) { 75 if (Dart_IsError(err)) {
75 Dart_PropagateError(err); 76 Dart_PropagateError(err);
76 } 77 }
77 Dart_SetReturnValue(args, err); 78 Dart_SetReturnValue(args, err);
78 } 79 }
79 Dart_ExitScope(); 80 Dart_ExitScope();
80 } 81 }
81 82
82 83
83 void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) { 84 void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) {
84 Dart_EnterScope(); 85 Dart_EnterScope();
85 Dart_Handle path = Dart_GetNativeArgument(args, 0); 86 Dart_Handle path = Dart_GetNativeArgument(args, 0);
86 Dart_Handle recursive = Dart_GetNativeArgument(args, 1); 87 Dart_Handle recursive = Dart_GetNativeArgument(args, 1);
87 if (Dart_IsString(path) && Dart_IsBoolean(recursive)) { 88 if (Directory::Delete(DartUtils::GetStringValue(path),
88 bool deleted = Directory::Delete(DartUtils::GetStringValue(path), 89 DartUtils::GetBooleanValue(recursive))) {
89 DartUtils::GetBooleanValue(recursive)); 90 Dart_SetReturnValue(args, Dart_True());
90 Dart_SetReturnValue(args, Dart_NewBoolean(deleted));
91 } else { 91 } else {
92 Dart_SetReturnValue(args, Dart_NewBoolean(false)); 92 Dart_Handle err = DartUtils::NewDartOSError();
93 if (Dart_IsError(err)) {
94 Dart_PropagateError(err);
95 }
96 Dart_SetReturnValue(args, err);
93 } 97 }
94 Dart_ExitScope(); 98 Dart_ExitScope();
95 } 99 }
96 100
97 101
98 static CObject* DirectoryCreateRequest(const CObjectArray& request) { 102 static CObject* DirectoryCreateRequest(const CObjectArray& request) {
99 if (request.Length() == 2 && request[1]->IsString()) { 103 if (request.Length() == 2 && request[1]->IsString()) {
100 CObjectString path(request[1]); 104 CObjectString path(request[1]);
101 bool created = Directory::Create(path.CString()); 105 if (Directory::Create(path.CString())) {
102 return CObject::Bool(created); 106 return CObject::True();
107 } else {
108 return CObject::NewOSError();
109 }
103 } 110 }
104 return CObject::False(); 111 return CObject::IllegalArgumentError();
105 } 112 }
106 113
107 114
108 static CObject* DirectoryDeleteRequest(const CObjectArray& request) { 115 static CObject* DirectoryDeleteRequest(const CObjectArray& request) {
109 if (request.Length() == 3 && request[1]->IsString() && request[2]->IsBool()) { 116 if (request.Length() == 3 && request[1]->IsString() && request[2]->IsBool()) {
110 CObjectString path(request[1]); 117 CObjectString path(request[1]);
111 CObjectBool recursive(request[2]); 118 CObjectBool recursive(request[2]);
112 bool deleted = Directory::Delete(path.CString(), recursive.Value()); 119 if (Directory::Delete(path.CString(), recursive.Value())) {
113 return CObject::Bool(deleted); 120 return CObject::True();
121 } else {
122 return CObject::NewOSError();
123 }
114 } 124 }
115 return CObject::False(); 125 return CObject::IllegalArgumentError();
116 } 126 }
117 127
118 128
119 static CObject* DirectoryExistsRequest(const CObjectArray& request) { 129 static CObject* DirectoryExistsRequest(const CObjectArray& request) {
120 static const int kError = -1;
121 static const int kExists = 1; 130 static const int kExists = 1;
122 static const int kDoesNotExist = 0; 131 static const int kDoesNotExist = 0;
123 if (request.Length() == 2 && request[1]->IsString()) { 132 if (request.Length() == 2 && request[1]->IsString()) {
124 CObjectString path(request[1]); 133 CObjectString path(request[1]);
125 Directory::ExistsResult result = Directory::Exists(path.CString()); 134 Directory::ExistsResult result = Directory::Exists(path.CString());
126 int return_value = kError;
127 if (result == Directory::EXISTS) { 135 if (result == Directory::EXISTS) {
128 return_value = kExists; 136 return new CObjectInt32(CObject::NewInt32(kExists));
137 } else if (result == Directory::DOES_NOT_EXIST) {
138 return new CObjectInt32(CObject::NewInt32(kDoesNotExist));
139 } else {
140 return CObject::NewOSError();
129 } 141 }
130 if (result == Directory::DOES_NOT_EXIST) {
131 return_value = kDoesNotExist;
132 }
133 return new CObjectInt32(CObject::NewInt32(return_value));
134 } 142 }
135 return new CObjectInt32(CObject::NewInt32(kDoesNotExist)); 143 return CObject::IllegalArgumentError();
136 } 144 }
137 145
138 146
139 static CObject* DirectoryCreateTempRequest(const CObjectArray& request) { 147 static CObject* DirectoryCreateTempRequest(const CObjectArray& request) {
140 if (request.Length() == 2 && request[1]->IsString()) { 148 if (request.Length() == 2 && request[1]->IsString()) {
141 CObjectString path(request[1]); 149 CObjectString path(request[1]);
142 char* result = Directory::CreateTemp(path.CString()); 150 char* result = Directory::CreateTemp(path.CString());
143 if (result != NULL) { 151 if (result != NULL) {
144 CObject* temp_dir = new CObjectString(CObject::NewString(result)); 152 CObject* temp_dir = new CObjectString(CObject::NewString(result));
145 free(result); 153 free(result);
146 return temp_dir; 154 return temp_dir;
147 } else { 155 } else {
148 return CObject::NewOSError(); 156 return CObject::NewOSError();
149 } 157 }
150 } 158 }
151 return CObject::False(); 159 return CObject::IllegalArgumentError();
152 } 160 }
153 161
154 162
155 static CObject* DirectoryListRequest(const CObjectArray& request, 163 static CObject* DirectoryListRequest(const CObjectArray& request,
156 Dart_Port response_port) { 164 Dart_Port response_port) {
157 if (request.Length() == 3 && request[1]->IsString() && request[2]->IsBool()) { 165 if (request.Length() == 3 && request[1]->IsString() && request[2]->IsBool()) {
158 DirectoryListing* dir_listing = new DirectoryListing(response_port); 166 DirectoryListing* dir_listing = new DirectoryListing(response_port);
159 CObjectString path(request[1]); 167 CObjectString path(request[1]);
160 CObjectBool recursive(request[2]); 168 CObjectBool recursive(request[2]);
161 bool completed = Directory::List( 169 bool completed = Directory::List(
162 path.CString(), recursive.Value(), dir_listing); 170 path.CString(), recursive.Value(), dir_listing);
163 delete dir_listing; 171 delete dir_listing;
164 CObjectArray* response = new CObjectArray(CObject::NewArray(2)); 172 CObjectArray* response = new CObjectArray(CObject::NewArray(2));
165 response->SetAt( 173 response->SetAt(
166 0, new CObjectInt32(CObject::NewInt32(DirectoryListing::kListDone))); 174 0, new CObjectInt32(CObject::NewInt32(DirectoryListing::kListDone)));
167 response->SetAt(1, CObject::Bool(completed)); 175 response->SetAt(1, CObject::Bool(completed));
168 return response; 176 return response;
169 } 177 }
170 return CObject::False(); 178 // Respond with an illegal argument list error message.
179 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
180 response->SetAt(0, new CObjectInt32(
181 CObject::NewInt32(DirectoryListing::kListError)));
182 response->SetAt(1, request[1]);
183 response->SetAt(2, CObject::IllegalArgumentError());
184 Dart_PostCObject(response_port, response->AsApiCObject());
185
186 response = new CObjectArray(CObject::NewArray(2));
187 response->SetAt(
188 0, new CObjectInt32(CObject::NewInt32(DirectoryListing::kListDone)));
189 response->SetAt(1, CObject::False());
190 return response;
171 } 191 }
172 192
173 193
174 void DirectoryService(Dart_Port dest_port_id, 194 void DirectoryService(Dart_Port dest_port_id,
175 Dart_Port reply_port_id, 195 Dart_Port reply_port_id,
176 Dart_CObject* message) { 196 Dart_CObject* message) {
177 CObject* response = CObject::False(); 197 CObject* response = CObject::False();
178 CObjectArray request(message); 198 CObjectArray request(message);
179 if (message->type == Dart_CObject::kArray) { 199 if (message->type == Dart_CObject::kArray) {
180 if (request.Length() > 1 && request[0]->IsInt32()) { 200 if (request.Length() > 1 && request[0]->IsInt32()) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 280
261 281
262 bool DirectoryListing::HandleFile(char* file_name) { 282 bool DirectoryListing::HandleFile(char* file_name) {
263 // TODO(sgjesse): Pass flags to indicate whether file 283 // TODO(sgjesse): Pass flags to indicate whether file
264 // responses are needed. 284 // responses are needed.
265 CObjectArray* response = NewResponse(kListFile, file_name); 285 CObjectArray* response = NewResponse(kListFile, file_name);
266 return Dart_PostCObject(response_port_, response->AsApiCObject()); 286 return Dart_PostCObject(response_port_, response->AsApiCObject());
267 } 287 }
268 288
269 289
270 bool DirectoryListing::HandleError(char* message) { 290 bool DirectoryListing::HandleError(const char* dir_name) {
271 // TODO(sgjesse): Pass flags to indicate whether error 291 // TODO(sgjesse): Pass flags to indicate whether error
272 // responses are needed. 292 // responses are needed.
273 CObjectArray* response = NewResponse(kListError, message); 293 CObject* err = CObject::NewOSError();
294 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
295 response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError)));
296 response->SetAt(1, new CObjectString(CObject::NewString(dir_name)));
297 response->SetAt(2, err);
274 return Dart_PostCObject(response_port_, response->AsApiCObject()); 298 return Dart_PostCObject(response_port_, response->AsApiCObject());
275 } 299 }
OLDNEW
« no previous file with comments | « runtime/bin/directory.h ('k') | runtime/bin/directory.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698