| 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 |