| 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 #ifndef BIN_DIRECTORY_H_ | 5 #ifndef BIN_DIRECTORY_H_ |
| 6 #define BIN_DIRECTORY_H_ | 6 #define BIN_DIRECTORY_H_ |
| 7 | 7 |
| 8 #include "bin/builtin.h" | 8 #include "bin/builtin.h" |
| 9 #include "bin/dartutils.h" | 9 #include "bin/dartutils.h" |
| 10 #include "bin/thread.h" | 10 #include "bin/thread.h" |
| 11 #include "platform/globals.h" | 11 #include "platform/globals.h" |
| 12 | 12 |
| 13 | 13 |
| 14 namespace dart { | 14 namespace dart { |
| 15 namespace bin { | 15 namespace bin { |
| 16 | 16 |
| 17 enum ListType { | 17 enum ListType { |
| 18 kListFile = 0, | 18 kListFile = 0, |
| 19 kListDirectory = 1, | 19 kListDirectory = 1, |
| 20 kListLink = 2, | 20 kListLink = 2, |
| 21 kListError = 3, | 21 kListError = 3, |
| 22 kListDone = 4 | 22 kListDone = 4 |
| 23 }; | 23 }; |
| 24 | 24 |
| 25 class PathBuffer { | 25 class PathBuffer { |
| 26 public: | 26 public: |
| 27 PathBuffer(); | 27 PathBuffer(); |
| 28 ~PathBuffer() { | 28 ~PathBuffer(); |
| 29 free(data_); | |
| 30 } | |
| 31 | 29 |
| 32 bool Add(const char* name); | 30 bool Add(const char* name); |
| 33 bool AddW(const wchar_t* name); | 31 bool AddW(const wchar_t* name); |
| 34 | 32 |
| 35 char* AsString() const; | 33 char* AsString() const; |
| 36 wchar_t* AsStringW() const; | 34 wchar_t* AsStringW() const; |
| 37 | 35 |
| 38 void Reset(int new_length); | 36 // Makes a scope allocated copy of the string. |
| 37 const char* AsScopedString() const; |
| 39 | 38 |
| 40 int length() const { | 39 void Reset(intptr_t new_length); |
| 40 |
| 41 intptr_t length() const { |
| 41 return length_; | 42 return length_; |
| 42 } | 43 } |
| 43 | 44 |
| 44 private: | 45 private: |
| 45 void* data_; | 46 void* data_; |
| 46 int length_; | 47 intptr_t length_; |
| 47 | 48 |
| 48 DISALLOW_COPY_AND_ASSIGN(PathBuffer); | 49 DISALLOW_COPY_AND_ASSIGN(PathBuffer); |
| 49 }; | 50 }; |
| 50 | 51 |
| 51 class DirectoryListing; | 52 class DirectoryListing; |
| 52 | 53 |
| 53 struct LinkList; | 54 struct LinkList; |
| 54 | 55 |
| 55 // DirectoryListingEntry is used as a stack item, when performing recursive | 56 // DirectoryListingEntry is used as a stack item, when performing recursive |
| 56 // directory listing. By using DirectoryListingEntry as stack elements, a | 57 // directory listing. By using DirectoryListingEntry as stack elements, a |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 } | 106 } |
| 106 Push(new DirectoryListingEntry(NULL)); | 107 Push(new DirectoryListingEntry(NULL)); |
| 107 } | 108 } |
| 108 | 109 |
| 109 virtual ~DirectoryListing() { | 110 virtual ~DirectoryListing() { |
| 110 while (!IsEmpty()) { | 111 while (!IsEmpty()) { |
| 111 Pop(); | 112 Pop(); |
| 112 } | 113 } |
| 113 } | 114 } |
| 114 | 115 |
| 115 virtual bool HandleDirectory(char* dir_name) = 0; | 116 virtual bool HandleDirectory(const char* dir_name) = 0; |
| 116 virtual bool HandleFile(char* file_name) = 0; | 117 virtual bool HandleFile(const char* file_name) = 0; |
| 117 virtual bool HandleLink(char* link_name) = 0; | 118 virtual bool HandleLink(const char* link_name) = 0; |
| 118 virtual bool HandleError(const char* dir_name) = 0; | 119 virtual bool HandleError() = 0; |
| 119 virtual void HandleDone() {} | 120 virtual void HandleDone() {} |
| 120 | 121 |
| 121 void Push(DirectoryListingEntry* directory) { | 122 void Push(DirectoryListingEntry* directory) { |
| 122 top_ = directory; | 123 top_ = directory; |
| 123 } | 124 } |
| 124 | 125 |
| 125 void Pop() { | 126 void Pop() { |
| 126 ASSERT(!IsEmpty()); | 127 ASSERT(!IsEmpty()); |
| 127 DirectoryListingEntry* current = top_; | 128 DirectoryListingEntry* current = top_; |
| 128 top_ = top_->parent(); | 129 top_ = top_->parent(); |
| 129 delete current; | 130 delete current; |
| 130 } | 131 } |
| 131 | 132 |
| 132 bool IsEmpty() const { | 133 bool IsEmpty() const { |
| 133 return top_ == NULL; | 134 return top_ == NULL; |
| 134 } | 135 } |
| 135 | 136 |
| 136 DirectoryListingEntry* top() const { | 137 DirectoryListingEntry* top() const { |
| 137 return top_; | 138 return top_; |
| 138 } | 139 } |
| 139 | 140 |
| 140 bool recursive() const { | 141 bool recursive() const { |
| 141 return recursive_; | 142 return recursive_; |
| 142 } | 143 } |
| 143 | 144 |
| 144 bool follow_links() const { | 145 bool follow_links() const { |
| 145 return follow_links_; | 146 return follow_links_; |
| 146 } | 147 } |
| 147 | 148 |
| 148 char* CurrentPath() { | 149 const char* CurrentPath() { |
| 149 return path_buffer_.AsString(); | 150 return path_buffer_.AsScopedString(); |
| 150 } | 151 } |
| 151 | 152 |
| 152 PathBuffer& path_buffer() { | 153 PathBuffer& path_buffer() { |
| 153 return path_buffer_; | 154 return path_buffer_; |
| 154 } | 155 } |
| 155 | 156 |
| 156 bool error() const { | 157 bool error() const { |
| 157 return error_; | 158 return error_; |
| 158 } | 159 } |
| 159 | 160 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 175 kListError = 3, | 176 kListError = 3, |
| 176 kListDone = 4 | 177 kListDone = 4 |
| 177 }; | 178 }; |
| 178 | 179 |
| 179 AsyncDirectoryListing(const char* dir_name, | 180 AsyncDirectoryListing(const char* dir_name, |
| 180 bool recursive, | 181 bool recursive, |
| 181 bool follow_links) | 182 bool follow_links) |
| 182 : DirectoryListing(dir_name, recursive, follow_links) {} | 183 : DirectoryListing(dir_name, recursive, follow_links) {} |
| 183 | 184 |
| 184 virtual ~AsyncDirectoryListing() {} | 185 virtual ~AsyncDirectoryListing() {} |
| 185 virtual bool HandleDirectory(char* dir_name); | 186 virtual bool HandleDirectory(const char* dir_name); |
| 186 virtual bool HandleFile(char* file_name); | 187 virtual bool HandleFile(const char* file_name); |
| 187 virtual bool HandleLink(char* file_name); | 188 virtual bool HandleLink(const char* file_name); |
| 188 virtual bool HandleError(const char* dir_name); | 189 virtual bool HandleError(); |
| 189 virtual void HandleDone(); | 190 virtual void HandleDone(); |
| 190 | 191 |
| 191 void SetArray(CObjectArray* array, intptr_t length) { | 192 void SetArray(CObjectArray* array, intptr_t length) { |
| 192 ASSERT(length % 2 == 0); | 193 ASSERT(length % 2 == 0); |
| 193 array_ = array; | 194 array_ = array; |
| 194 index_ = 0; | 195 index_ = 0; |
| 195 length_ = length; | 196 length_ = length; |
| 196 } | 197 } |
| 197 | 198 |
| 198 intptr_t index() const { | 199 intptr_t index() const { |
| 199 return index_; | 200 return index_; |
| 200 } | 201 } |
| 201 | 202 |
| 202 private: | 203 private: |
| 203 bool AddFileSystemEntityToResponse(Response response, char* arg); | 204 bool AddFileSystemEntityToResponse(Response response, const char* arg); |
| 204 CObjectArray* array_; | 205 CObjectArray* array_; |
| 205 intptr_t index_; | 206 intptr_t index_; |
| 206 intptr_t length_; | 207 intptr_t length_; |
| 207 | 208 |
| 208 DISALLOW_IMPLICIT_CONSTRUCTORS(AsyncDirectoryListing); | 209 DISALLOW_IMPLICIT_CONSTRUCTORS(AsyncDirectoryListing); |
| 209 }; | 210 }; |
| 210 | 211 |
| 211 | 212 |
| 212 class SyncDirectoryListing: public DirectoryListing { | 213 class SyncDirectoryListing: public DirectoryListing { |
| 213 public: | 214 public: |
| 214 SyncDirectoryListing(Dart_Handle results, | 215 SyncDirectoryListing(Dart_Handle results, |
| 215 const char* dir_name, | 216 const char* dir_name, |
| 216 bool recursive, | 217 bool recursive, |
| 217 bool follow_links) | 218 bool follow_links) |
| 218 : DirectoryListing(dir_name, recursive, follow_links), | 219 : DirectoryListing(dir_name, recursive, follow_links), |
| 219 results_(results) { | 220 results_(results) { |
| 220 add_string_ = DartUtils::NewString("add"); | 221 add_string_ = DartUtils::NewString("add"); |
| 221 directory_type_ = | 222 directory_type_ = |
| 222 DartUtils::GetDartType(DartUtils::kIOLibURL, "Directory"); | 223 DartUtils::GetDartType(DartUtils::kIOLibURL, "Directory"); |
| 223 file_type_ = | 224 file_type_ = |
| 224 DartUtils::GetDartType(DartUtils::kIOLibURL, "File"); | 225 DartUtils::GetDartType(DartUtils::kIOLibURL, "File"); |
| 225 link_type_ = | 226 link_type_ = |
| 226 DartUtils::GetDartType(DartUtils::kIOLibURL, "Link"); | 227 DartUtils::GetDartType(DartUtils::kIOLibURL, "Link"); |
| 227 } | 228 } |
| 228 virtual ~SyncDirectoryListing() {} | 229 virtual ~SyncDirectoryListing() {} |
| 229 virtual bool HandleDirectory(char* dir_name); | 230 virtual bool HandleDirectory(const char* dir_name); |
| 230 virtual bool HandleFile(char* file_name); | 231 virtual bool HandleFile(const char* file_name); |
| 231 virtual bool HandleLink(char* file_name); | 232 virtual bool HandleLink(const char* file_name); |
| 232 virtual bool HandleError(const char* dir_name); | 233 virtual bool HandleError(); |
| 233 | 234 |
| 234 private: | 235 private: |
| 235 Dart_Handle results_; | 236 Dart_Handle results_; |
| 236 Dart_Handle add_string_; | 237 Dart_Handle add_string_; |
| 237 Dart_Handle directory_type_; | 238 Dart_Handle directory_type_; |
| 238 Dart_Handle file_type_; | 239 Dart_Handle file_type_; |
| 239 Dart_Handle link_type_; | 240 Dart_Handle link_type_; |
| 240 | 241 |
| 241 DISALLOW_IMPLICIT_CONSTRUCTORS(SyncDirectoryListing); | 242 DISALLOW_IMPLICIT_CONSTRUCTORS(SyncDirectoryListing); |
| 242 }; | 243 }; |
| 243 | 244 |
| 244 | 245 |
| 245 class Directory { | 246 class Directory { |
| 246 public: | 247 public: |
| 247 enum ExistsResult { | 248 enum ExistsResult { |
| 248 UNKNOWN, | 249 UNKNOWN, |
| 249 EXISTS, | 250 EXISTS, |
| 250 DOES_NOT_EXIST | 251 DOES_NOT_EXIST |
| 251 }; | 252 }; |
| 252 | 253 |
| 253 static void List(DirectoryListing* listing); | 254 static void List(DirectoryListing* listing); |
| 254 static ExistsResult Exists(const char* path); | 255 static ExistsResult Exists(const char* path); |
| 255 static char* Current(); | 256 |
| 257 // Returns the current working directory. The caller must call |
| 258 // free() on the result. |
| 259 static char* CurrentNoScope(); |
| 260 |
| 261 // Returns the current working directory. The returned string is allocated |
| 262 // with Dart_ScopeAllocate(). It lasts only as long as the current API scope. |
| 263 static const char* Current(); |
| 264 static const char* SystemTemp(); |
| 265 static const char* CreateTemp(const char* path); |
| 256 static bool SetCurrent(const char* path); | 266 static bool SetCurrent(const char* path); |
| 257 static bool Create(const char* path); | 267 static bool Create(const char* path); |
| 258 static char* SystemTemp(); | |
| 259 static char* CreateTemp(const char* path); | |
| 260 static bool Delete(const char* path, bool recursive); | 268 static bool Delete(const char* path, bool recursive); |
| 261 static bool Rename(const char* path, const char* new_path); | 269 static bool Rename(const char* path, const char* new_path); |
| 262 | 270 |
| 263 static CObject* CreateRequest(const CObjectArray& request); | 271 static CObject* CreateRequest(const CObjectArray& request); |
| 264 static CObject* DeleteRequest(const CObjectArray& request); | 272 static CObject* DeleteRequest(const CObjectArray& request); |
| 265 static CObject* ExistsRequest(const CObjectArray& request); | 273 static CObject* ExistsRequest(const CObjectArray& request); |
| 266 static CObject* CreateTempRequest(const CObjectArray& request); | 274 static CObject* CreateTempRequest(const CObjectArray& request); |
| 267 static CObject* CreateSystemTempRequest(const CObjectArray& request); | 275 static CObject* CreateSystemTempRequest(const CObjectArray& request); |
| 268 static CObject* ListStartRequest(const CObjectArray& request); | 276 static CObject* ListStartRequest(const CObjectArray& request); |
| 269 static CObject* ListNextRequest(const CObjectArray& request); | 277 static CObject* ListNextRequest(const CObjectArray& request); |
| 270 static CObject* ListStopRequest(const CObjectArray& request); | 278 static CObject* ListStopRequest(const CObjectArray& request); |
| 271 static CObject* RenameRequest(const CObjectArray& request); | 279 static CObject* RenameRequest(const CObjectArray& request); |
| 272 | 280 |
| 273 private: | 281 private: |
| 274 DISALLOW_ALLOCATION(); | 282 DISALLOW_ALLOCATION(); |
| 275 DISALLOW_IMPLICIT_CONSTRUCTORS(Directory); | 283 DISALLOW_IMPLICIT_CONSTRUCTORS(Directory); |
| 276 }; | 284 }; |
| 277 | 285 |
| 278 } // namespace bin | 286 } // namespace bin |
| 279 } // namespace dart | 287 } // namespace dart |
| 280 | 288 |
| 281 #endif // BIN_DIRECTORY_H_ | 289 #endif // BIN_DIRECTORY_H_ |
| OLD | NEW |