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 #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 Loading... |
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 } |
OLD | NEW |