Index: Source/modules/filesystem/DirectoryReaderSync.cpp |
diff --git a/Source/modules/filesystem/DirectoryReaderSync.cpp b/Source/modules/filesystem/DirectoryReaderSync.cpp |
index 5f83d945020165d9e959fcf362ebc5b01de316c0..4b051868f6d3f644d6a6d770ee8e5f7e46999575 100644 |
--- a/Source/modules/filesystem/DirectoryReaderSync.cpp |
+++ b/Source/modules/filesystem/DirectoryReaderSync.cpp |
@@ -35,30 +35,74 @@ |
#include "core/dom/ExceptionCode.h" |
#include "modules/filesystem/DirectoryEntry.h" |
#include "modules/filesystem/DirectoryEntrySync.h" |
+#include "modules/filesystem/EntriesCallback.h" |
#include "modules/filesystem/EntrySync.h" |
+#include "modules/filesystem/ErrorCallback.h" |
#include "modules/filesystem/FileEntrySync.h" |
-#include "modules/filesystem/SyncCallbackHelper.h" |
namespace WebCore { |
+class DirectoryReaderSync::EntriesCallbackHelper : public EntriesCallback { |
+public: |
+ EntriesCallbackHelper(PassRefPtr<DirectoryReaderSync> reader) |
+ : m_reader(reader) |
+ { |
+ } |
+ |
+ virtual void handleEvent(const Vector<RefPtr<Entry> >& entries) OVERRIDE |
+ { |
+ EntrySyncVector syncEntries; |
+ syncEntries.reserveInitialCapacity(entries.size()); |
+ for (size_t i = 0; i < entries.size(); ++i) |
+ syncEntries.uncheckedAppend(EntrySync::create(entries[i].get())); |
+ m_reader->addEntries(syncEntries); |
+ } |
+ |
+private: |
+ RefPtr<DirectoryReaderSync> m_reader; |
+}; |
+ |
+class DirectoryReaderSync::ErrorCallbackHelper : public ErrorCallback { |
+public: |
+ ErrorCallbackHelper(PassRefPtr<DirectoryReaderSync> reader) |
+ : m_reader(reader) |
+ { |
+ } |
+ |
+ virtual void handleEvent(FileError* error) OVERRIDE |
+ { |
+ m_reader->setError(error->code()); |
+ } |
+ |
+private: |
+ RefPtr<DirectoryReaderSync> m_reader; |
+}; |
+ |
DirectoryReaderSync::DirectoryReaderSync(PassRefPtr<DOMFileSystemBase> fileSystem, const String& fullPath) |
: DirectoryReaderBase(fileSystem, fullPath) |
+ , m_callbacksId(0) |
+ , m_errorCode(FileError::OK) |
{ |
ScriptWrappable::init(this); |
} |
EntrySyncVector DirectoryReaderSync::readEntries(ExceptionState& exceptionState) |
{ |
- if (!m_hasMoreEntries) |
- return EntrySyncVector(); |
+ if (!m_callbacksId) { |
+ m_callbacksId = filesystem()->readDirectory(this, m_fullPath, adoptPtr(new EntriesCallbackHelper(this)), adoptPtr(new ErrorCallbackHelper(this)), DOMFileSystemBase::Synchronous); |
+ } |
+ |
+ if (m_errorCode == FileError::OK && m_hasMoreEntries && m_entries.isEmpty()) |
+ m_fileSystem->waitForAdditionalResult(m_callbacksId); |
- EntriesSyncCallbackHelper helper; |
- if (!m_fileSystem->readDirectory(this, m_fullPath, helper.successCallback(), helper.errorCallback(), DOMFileSystemBase::Synchronous)) { |
- exceptionState.throwDOMException(InvalidModificationError, "Failed to read the directory."); |
- setHasMoreEntries(false); |
+ if (m_errorCode != FileError::OK) { |
+ FileError::throwDOMException(exceptionState, m_errorCode); |
return EntrySyncVector(); |
} |
- return helper.getResult(exceptionState); |
+ |
+ EntrySyncVector result; |
+ result.swap(m_entries); |
+ return result; |
} |
} // namespace |