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/native_service.h" | 10 #include "bin/native_service.h" |
11 #include "platform/globals.h" | 11 #include "platform/globals.h" |
12 #include "platform/thread.h" | 12 #include "platform/thread.h" |
13 | 13 |
14 | 14 |
15 namespace dart { | 15 namespace dart { |
16 namespace bin { | 16 namespace bin { |
17 | 17 |
18 enum ListType { | |
19 kListFile = 0, | |
20 kListDirectory = 1, | |
21 kListLink = 2, | |
22 kListError = 3, | |
23 kListDone = 4 | |
24 }; | |
25 | |
26 class PathBuffer { | |
27 public: | |
28 PathBuffer(); | |
29 ~PathBuffer() { | |
30 free(data_); | |
31 } | |
32 | |
33 bool Add(const char* name); | |
34 bool AddW(const wchar_t* name); | |
35 | |
36 char* AsString() const; | |
37 wchar_t* AsStringW() const; | |
38 | |
39 void Reset(int new_length); | |
40 | |
41 int length() const { | |
42 return length_; | |
43 } | |
44 | |
45 private: | |
46 void* data_; | |
47 int length_; | |
48 }; | |
49 | |
50 class DirectoryListing; | |
51 | |
52 class DirectoryListingEntry { | |
53 public: | |
54 explicit DirectoryListingEntry(void* link); | |
55 | |
56 ~DirectoryListingEntry() { | |
57 if (parent_ == NULL || parent_->link_ != link_) { | |
58 free(link_); | |
59 } | |
60 } | |
61 | |
62 ListType Next(DirectoryListing* listing); | |
63 | |
64 DirectoryListingEntry* parent() const { | |
65 return parent_; | |
66 } | |
67 | |
68 void set_parent(DirectoryListingEntry* parent) { | |
69 parent_ = parent; | |
70 } | |
71 | |
72 void* link() { | |
73 return link_; | |
74 } | |
75 | |
76 private: | |
77 DirectoryListingEntry* parent_; | |
78 void* lister_; | |
Søren Gjesse
2013/06/12 12:52:41
lister_, done_ and path_length_ are not used.
Anders Johnsen
2013/06/13 08:38:24
They are, in Next.
| |
79 bool done_; | |
80 int path_length_; | |
81 void* link_; | |
82 }; | |
83 | |
18 class DirectoryListing { | 84 class DirectoryListing { |
19 public: | 85 public: |
20 virtual ~DirectoryListing() {} | 86 DirectoryListing(const char* dir_name, bool recursive, bool follow_links) |
87 : top_(NULL), | |
88 error_(false), | |
89 recursive_(recursive), | |
90 follow_links_(follow_links) { | |
91 if (!path_buffer_.Add(dir_name)) { | |
92 error_ = true; | |
93 } | |
94 Push(new DirectoryListingEntry(NULL)); | |
95 } | |
96 | |
97 virtual ~DirectoryListing() { | |
98 while (!IsEmpty()) { | |
99 Pop(); | |
100 } | |
101 } | |
102 | |
21 virtual bool HandleDirectory(char* dir_name) = 0; | 103 virtual bool HandleDirectory(char* dir_name) = 0; |
22 virtual bool HandleFile(char* file_name) = 0; | 104 virtual bool HandleFile(char* file_name) = 0; |
23 virtual bool HandleLink(char* file_name) = 0; | 105 virtual bool HandleLink(char* link_name) = 0; |
24 virtual bool HandleError(const char* dir_name) = 0; | 106 virtual bool HandleError(const char* dir_name) = 0; |
107 virtual void HandleDone() {} | |
108 | |
109 void Push(DirectoryListingEntry* directory) { | |
110 directory->set_parent(top_); | |
111 top_ = directory; | |
112 } | |
113 | |
114 void Pop() { | |
115 ASSERT(!IsEmpty()); | |
116 DirectoryListingEntry* current = top_; | |
117 top_ = top_->parent(); | |
118 delete current; | |
119 } | |
120 | |
121 bool IsEmpty() const { | |
122 return top_ == NULL; | |
123 } | |
124 | |
125 DirectoryListingEntry* top() const { | |
126 return top_; | |
127 } | |
128 | |
129 bool recursive() const { | |
130 return recursive_; | |
131 } | |
132 | |
133 bool follow_links() const { | |
134 return follow_links_; | |
135 } | |
136 | |
137 char* CurrentPath() { | |
138 return path_buffer_.AsString(); | |
139 } | |
140 | |
141 PathBuffer& path_buffer() { | |
Søren Gjesse
2013/06/12 12:52:41
Why not PathBuffer* ?
Anders Johnsen
2013/06/13 08:38:24
A pointer would indicated that it could be kept on
| |
142 return path_buffer_; | |
143 } | |
144 | |
145 bool error() const { | |
146 return error_; | |
147 } | |
148 | |
149 private: | |
150 PathBuffer path_buffer_; | |
151 DirectoryListingEntry* top_; | |
152 bool error_; | |
153 bool recursive_; | |
154 bool follow_links_; | |
25 }; | 155 }; |
26 | 156 |
27 | 157 |
28 class AsyncDirectoryListing : public DirectoryListing { | 158 class AsyncDirectoryListing : public DirectoryListing { |
29 public: | 159 public: |
30 enum Response { | 160 enum Response { |
31 kListFile = 0, | 161 kListFile = 0, |
32 kListDirectory = 1, | 162 kListDirectory = 1, |
33 kListLink = 2, | 163 kListLink = 2, |
34 kListError = 3, | 164 kListError = 3, |
35 kListDone = 4 | 165 kListDone = 4 |
36 }; | 166 }; |
37 | 167 |
38 explicit AsyncDirectoryListing(Dart_Port response_port) | 168 explicit AsyncDirectoryListing(const char* dir_name, |
Søren Gjesse
2013/06/12 12:52:41
No need for explicit when there is more than one a
Anders Johnsen
2013/06/13 08:38:24
Done.
| |
39 : response_port_(response_port) {} | 169 bool recursive, |
170 bool follow_links) | |
171 : DirectoryListing(dir_name, recursive, follow_links) { | |
172 } | |
173 | |
40 virtual ~AsyncDirectoryListing() {} | 174 virtual ~AsyncDirectoryListing() {} |
41 virtual bool HandleDirectory(char* dir_name); | 175 virtual bool HandleDirectory(char* dir_name); |
42 virtual bool HandleFile(char* file_name); | 176 virtual bool HandleFile(char* file_name); |
43 virtual bool HandleLink(char* file_name); | 177 virtual bool HandleLink(char* file_name); |
44 virtual bool HandleError(const char* dir_name); | 178 virtual bool HandleError(const char* dir_name); |
179 virtual void HandleDone(); | |
180 | |
181 void set_array(CObjectArray* array, intptr_t length) { | |
Søren Gjesse
2013/06/12 12:52:41
This should be named SetArray as it does not just
Anders Johnsen
2013/06/13 08:38:24
Done.
| |
182 array_ = array; | |
183 index_ = 0; | |
184 length_ = length; | |
185 } | |
186 | |
187 intptr_t index() const { | |
188 return index_; | |
189 } | |
45 | 190 |
46 private: | 191 private: |
47 CObjectArray* NewResponse(Response response, char* arg); | 192 bool NewResponse(Response response, char* arg); |
48 Dart_Port response_port_; | 193 CObjectArray* array_; |
194 intptr_t index_; | |
195 intptr_t length_; | |
49 | 196 |
50 DISALLOW_IMPLICIT_CONSTRUCTORS(AsyncDirectoryListing); | 197 DISALLOW_IMPLICIT_CONSTRUCTORS(AsyncDirectoryListing); |
51 }; | 198 }; |
52 | 199 |
53 | 200 |
54 class SyncDirectoryListing: public DirectoryListing { | 201 class SyncDirectoryListing: public DirectoryListing { |
55 public: | 202 public: |
56 explicit SyncDirectoryListing(Dart_Handle results) | 203 explicit SyncDirectoryListing(Dart_Handle results, |
Søren Gjesse
2013/06/12 12:52:41
No need for explicit when there is more than one a
Anders Johnsen
2013/06/13 08:38:24
Done.
| |
57 : results_(results) { | 204 const char* dir_name, |
205 bool recursive, | |
206 bool follow_links) | |
207 : DirectoryListing(dir_name, recursive, follow_links), | |
208 results_(results) { | |
58 add_string_ = DartUtils::NewString("add"); | 209 add_string_ = DartUtils::NewString("add"); |
59 directory_class_ = | 210 directory_class_ = |
60 DartUtils::GetDartClass(DartUtils::kIOLibURL, "Directory"); | 211 DartUtils::GetDartClass(DartUtils::kIOLibURL, "Directory"); |
61 file_class_ = | 212 file_class_ = |
62 DartUtils::GetDartClass(DartUtils::kIOLibURL, "File"); | 213 DartUtils::GetDartClass(DartUtils::kIOLibURL, "File"); |
63 link_class_ = | 214 link_class_ = |
64 DartUtils::GetDartClass(DartUtils::kIOLibURL, "Link"); | 215 DartUtils::GetDartClass(DartUtils::kIOLibURL, "Link"); |
65 } | 216 } |
66 virtual ~SyncDirectoryListing() {} | 217 virtual ~SyncDirectoryListing() {} |
67 virtual bool HandleDirectory(char* dir_name); | 218 virtual bool HandleDirectory(char* dir_name); |
(...skipping 20 matching lines...) Expand all Loading... | |
88 DOES_NOT_EXIST | 239 DOES_NOT_EXIST |
89 }; | 240 }; |
90 | 241 |
91 // This enum must be kept in sync with the request values in | 242 // This enum must be kept in sync with the request values in |
92 // directory_impl.dart. | 243 // directory_impl.dart. |
93 enum DirectoryRequest { | 244 enum DirectoryRequest { |
94 kCreateRequest = 0, | 245 kCreateRequest = 0, |
95 kDeleteRequest = 1, | 246 kDeleteRequest = 1, |
96 kExistsRequest = 2, | 247 kExistsRequest = 2, |
97 kCreateTempRequest = 3, | 248 kCreateTempRequest = 3, |
98 kListRequest = 4, | 249 kListStartRequest = 4, |
99 kRenameRequest = 5 | 250 kListNextRequest = 5, |
251 kListStopRequest = 6, | |
252 kRenameRequest = 7 | |
100 }; | 253 }; |
101 | 254 |
102 static bool List(const char* path, | 255 static void List(DirectoryListing* listing); |
103 bool recursive, | |
104 bool follow_links, | |
105 DirectoryListing* listing); | |
106 static ExistsResult Exists(const char* path); | 256 static ExistsResult Exists(const char* path); |
107 static char* Current(); | 257 static char* Current(); |
108 static bool SetCurrent(const char* path); | 258 static bool SetCurrent(const char* path); |
109 static bool Create(const char* path); | 259 static bool Create(const char* path); |
110 static char* CreateTemp(const char* const_template); | 260 static char* CreateTemp(const char* const_template); |
111 static bool Delete(const char* path, bool recursive); | 261 static bool Delete(const char* path, bool recursive); |
112 static bool Rename(const char* path, const char* new_path); | 262 static bool Rename(const char* path, const char* new_path); |
113 static Dart_Port GetServicePort(); | 263 static Dart_Port GetServicePort(); |
114 | 264 |
115 private: | 265 private: |
116 static NativeService directory_service_; | 266 static NativeService directory_service_; |
117 | 267 |
118 DISALLOW_ALLOCATION(); | 268 DISALLOW_ALLOCATION(); |
119 DISALLOW_IMPLICIT_CONSTRUCTORS(Directory); | 269 DISALLOW_IMPLICIT_CONSTRUCTORS(Directory); |
120 }; | 270 }; |
121 | 271 |
122 } // namespace bin | 272 } // namespace bin |
123 } // namespace dart | 273 } // namespace dart |
124 | 274 |
125 #endif // BIN_DIRECTORY_H_ | 275 #endif // BIN_DIRECTORY_H_ |
OLD | NEW |