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

Unified Diff: net/base/directory_lister.cc

Issue 11293: Port directory lister to posix. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/directory_lister.h ('k') | net/base/net_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/directory_lister.cc
===================================================================
--- net/base/directory_lister.cc (revision 5643)
+++ net/base/directory_lister.cc (working copy)
@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <process.h>
-
#include "net/base/directory_lister.h"
+#include "base/file_util.h"
#include "base/message_loop.h"
+#include "base/platform_thread.h"
+#include "net/base/net_errors.h"
namespace net {
@@ -27,65 +28,24 @@
}
scoped_refptr<DirectoryLister> lister;
- WIN32_FIND_DATA data[kFilesPerEvent];
- int count;
- DWORD error;
+ file_util::FileEnumerator::FindInfo data[kFilesPerEvent];
+ int count, error;
};
-/*static*/
-unsigned __stdcall DirectoryLister::ThreadFunc(void* param) {
- DirectoryLister* self = reinterpret_cast<DirectoryLister*>(param);
-
- std::wstring pattern = self->directory();
- if (pattern[pattern.size()-1] != '\\') {
- pattern.append(L"\\*");
- } else {
- pattern.append(L"*");
- }
-
- DirectoryDataEvent* e = new DirectoryDataEvent(self);
-
- HANDLE handle = FindFirstFile(pattern.c_str(), &e->data[e->count]);
- if (handle == INVALID_HANDLE_VALUE) {
- e->error = GetLastError();
- self->message_loop_->PostTask(FROM_HERE, e);
- e = NULL;
- } else {
- do {
- if (++e->count == kFilesPerEvent) {
- self->message_loop_->PostTask(FROM_HERE, e);
- e = new DirectoryDataEvent(self);
- }
- } while (!self->was_canceled() && FindNextFile(handle, &e->data[e->count]));
-
- FindClose(handle);
-
- if (e->count > 0) {
- self->message_loop_->PostTask(FROM_HERE, e);
- e = NULL;
- }
-
- // Notify done
- e = new DirectoryDataEvent(self);
- self->message_loop_->PostTask(FROM_HERE, e);
- }
-
- self->Release();
- return 0;
-}
-
-DirectoryLister::DirectoryLister(const std::wstring& dir, Delegate* delegate)
+DirectoryLister::DirectoryLister(const std::wstring& dir,
+ DirectoryListerDelegate* delegate)
: dir_(dir),
- message_loop_(NULL),
delegate_(delegate),
+ message_loop_(NULL),
thread_(NULL),
canceled_(false) {
DCHECK(!dir.empty());
}
DirectoryLister::~DirectoryLister() {
- if (thread_)
- CloseHandle(thread_);
+ if (thread_) {
+ PlatformThread::Join(thread_);
+ }
}
bool DirectoryLister::Start() {
@@ -97,12 +57,7 @@
AddRef(); // the thread will release us when it is done
- unsigned thread_id;
- thread_ = reinterpret_cast<HANDLE>(
- _beginthreadex(NULL, 0, DirectoryLister::ThreadFunc, this, 0,
- &thread_id));
-
- if (!thread_) {
+ if (!PlatformThread::Create(0, this, &thread_)) {
Release();
return false;
}
@@ -114,13 +69,48 @@
canceled_ = true;
if (thread_) {
- WaitForSingleObject(thread_, INFINITE);
- CloseHandle(thread_);
+ PlatformThread::Join(thread_);
thread_ = NULL;
}
}
-void DirectoryLister::OnReceivedData(const WIN32_FIND_DATA* data, int count) {
+void DirectoryLister::ThreadMain() {
+ DirectoryDataEvent* e = new DirectoryDataEvent(this);
+
+ if (!file_util::DirectoryExists(directory())) {
+ e->error = net::ERR_FILE_NOT_FOUND;
+ message_loop_->PostTask(FROM_HERE, e);
+ Release();
+ return;
+ }
+
+ file_util::FileEnumerator file_enum(directory(), false,
+ file_util::FileEnumerator::FILES_AND_DIRECTORIES);
+
+ std::wstring filename;
+ while (!was_canceled() && !(filename = file_enum.Next()).empty()) {
+ file_enum.GetFindInfo(&e->data[e->count]);
+
+ if (++e->count == kFilesPerEvent) {
+ message_loop_->PostTask(FROM_HERE, e);
+ e = new DirectoryDataEvent(this);
+ }
+ }
+
+ if (e->count > 0) {
+ message_loop_->PostTask(FROM_HERE, e);
+ e = NULL;
+ }
+
+ // Notify done
+ e = new DirectoryDataEvent(this);
+ message_loop_->PostTask(FROM_HERE, e);
+
+ Release();
+}
+
+void DirectoryLister::OnReceivedData(
+ const file_util::FileEnumerator::FindInfo* data, int count) {
// Since the delegate can clear itself during the OnListFile callback, we
// need to null check it during each iteration of the loop. Similarly, it is
// necessary to check the canceled_ flag to avoid sending data to a delegate
@@ -133,7 +123,7 @@
// If canceled, we need to report some kind of error, but don't overwrite the
// error condition if it is already set.
if (!error && canceled_)
- error = ERROR_OPERATION_ABORTED;
+ error = net::ERR_ABORTED;
if (delegate_)
delegate_->OnListDone(error);
« no previous file with comments | « net/base/directory_lister.h ('k') | net/base/net_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698