Modified: trunk/Source/WebCore/inspector/InspectorFileSystemAgent.cpp (120925 => 120926)
--- trunk/Source/WebCore/inspector/InspectorFileSystemAgent.cpp 2012-06-21 15:11:48 UTC (rev 120925)
+++ trunk/Source/WebCore/inspector/InspectorFileSystemAgent.cpp 2012-06-21 15:28:10 UTC (rev 120926)
@@ -96,6 +96,40 @@
namespace {
+template<typename BaseCallback, typename Handler, typename Argument>
+class CallbackDispatcher : public BaseCallback {
+public:
+ typedef bool (Handler::*HandlingMethod)(Argument*);
+
+ static PassRefPtr<CallbackDispatcher> create(PassRefPtr<Handler> handler, HandlingMethod handlingMethod)
+ {
+ return adoptRef(new CallbackDispatcher(handler, handlingMethod));
+ }
+
+ virtual bool handleEvent(Argument* argument) OVERRIDE
+ {
+ return (m_handler.get()->*m_handlingMethod)(argument);
+ }
+
+private:
+ CallbackDispatcher(PassRefPtr<Handler> handler, HandlingMethod handlingMethod)
+ : m_handler(handler)
+ , m_handlingMethod(handlingMethod) { }
+
+ RefPtr<Handler> m_handler;
+ HandlingMethod m_handlingMethod;
+};
+
+template<typename BaseCallback>
+class CallbackDispatcherFactory {
+public:
+ template<typename Handler, typename Argument>
+ static PassRefPtr<CallbackDispatcher<BaseCallback, Handler, Argument> > create(Handler* handler, bool (Handler::*handlingMethod)(Argument*))
+ {
+ return CallbackDispatcher<BaseCallback, Handler, Argument>::create(PassRefPtr<Handler>(handler), handlingMethod);
+ }
+};
+
class GetFileSystemRootTask : public RefCounted<GetFileSystemRootTask> {
WTF_MAKE_NONCOPYABLE(GetFileSystemRootTask);
public:
@@ -107,11 +141,9 @@
void start(ScriptExecutionContext*);
private:
- class ErrorCallback;
- class GetEntryCallback;
+ bool didHitError(FileError*);
+ bool gotEntry(Entry*);
- void gotEntry(Entry*);
-
void reportResult(FileError::ErrorCode errorCode, PassRefPtr<TypeBuilder::FileSystem::Entry> entry)
{
if (!m_frontendProvider || !m_frontendProvider->frontend())
@@ -130,46 +162,12 @@
String m_type;
};
-class GetFileSystemRootTask::ErrorCallback : public WebCore::ErrorCallback {
- WTF_MAKE_NONCOPYABLE(ErrorCallback);
-public:
- static PassRefPtr<GetFileSystemRootTask::ErrorCallback> create(PassRefPtr<GetFileSystemRootTask> getFileSystemRootTask)
- {
- return adoptRef(new GetFileSystemRootTask::ErrorCallback(getFileSystemRootTask));
- }
+bool GetFileSystemRootTask::didHitError(FileError* error)
+{
+ reportResult(error->code(), 0);
+ return true;
+}
- virtual bool handleEvent(FileError* error) OVERRIDE
- {
- m_getFileSystemRootTask->reportResult(error->code(), 0);
- return true;
- }
-
-private:
- ErrorCallback(PassRefPtr<GetFileSystemRootTask> getFileSystemRootTask)
- : m_getFileSystemRootTask(getFileSystemRootTask) { }
- RefPtr<GetFileSystemRootTask> m_getFileSystemRootTask;
-};
-
-class GetFileSystemRootTask::GetEntryCallback : public WebCore::EntryCallback {
- WTF_MAKE_NONCOPYABLE(GetEntryCallback);
-public:
- static PassRefPtr<GetFileSystemRootTask::GetEntryCallback> create(PassRefPtr<GetFileSystemRootTask> getFileSystemRootTask)
- {
- return adoptRef(new GetFileSystemRootTask::GetEntryCallback(getFileSystemRootTask));
- }
-
- virtual bool handleEvent(Entry* entry) OVERRIDE
- {
- m_getFileSystemRootTask->gotEntry(entry);
- return true;
- }
-
-private:
- GetEntryCallback(PassRefPtr<GetFileSystemRootTask> getFileSystemRootTask)
- : m_getFileSystemRootTask(getFileSystemRootTask) { }
- RefPtr<GetFileSystemRootTask> m_getFileSystemRootTask;
-};
-
void GetFileSystemRootTask::start(ScriptExecutionContext* scriptExecutionContext)
{
FileSystemType type;
@@ -182,17 +180,18 @@
return;
}
- RefPtr<EntryCallback> successCallback = GetFileSystemRootTask::GetEntryCallback::create(this);
- RefPtr<ErrorCallback> errorCallback = GetFileSystemRootTask::ErrorCallback::create(this);
+ RefPtr<EntryCallback> successCallback = CallbackDispatcherFactory<EntryCallback>::create(this, &GetFileSystemRootTask::gotEntry);
+ RefPtr<ErrorCallback> errorCallback = CallbackDispatcherFactory<ErrorCallback>::create(this, &GetFileSystemRootTask::didHitError);
OwnPtr<ResolveURICallbacks> fileSystemCallbacks = ResolveURICallbacks::create(successCallback, errorCallback, scriptExecutionContext, type, "/");
LocalFileSystem::localFileSystem().readFileSystem(scriptExecutionContext, type, fileSystemCallbacks.release());
}
-void GetFileSystemRootTask::gotEntry(Entry* entry)
+bool GetFileSystemRootTask::gotEntry(Entry* entry)
{
RefPtr<TypeBuilder::FileSystem::Entry> result(TypeBuilder::FileSystem::Entry::create().setUrl(entry->toURL()).setName("/").setIsDirectory(true));
reportResult(static_cast<FileError::ErrorCode>(0), result);
+ return true;
}
class ReadDirectoryTask : public RefCounted<ReadDirectoryTask> {
@@ -211,12 +210,14 @@
void start(ScriptExecutionContext*);
private:
- class ErrorCallback;
- class GetEntryCallback;
- class ReadDirectoryEntriesCallback;
+ bool didHitError(FileError* error)
+ {
+ reportResult(error->code(), 0);
+ return true;
+ }
- void gotEntry(Entry*);
- void didReadDirectoryEntries(EntryArray*);
+ bool gotEntry(Entry*);
+ bool didReadDirectoryEntries(EntryArray*);
void reportResult(FileError::ErrorCode errorCode, PassRefPtr<Array<TypeBuilder::FileSystem::Entry> > entries)
{
@@ -240,68 +241,6 @@
RefPtr<DirectoryReader> m_directoryReader;
};
-class ReadDirectoryTask::ErrorCallback : public WebCore::ErrorCallback {
- WTF_MAKE_NONCOPYABLE(ErrorCallback);
-public:
- static PassRefPtr<ReadDirectoryTask::ErrorCallback> create(PassRefPtr<ReadDirectoryTask> readDirectoryTask)
- {
- return adoptRef(new ReadDirectoryTask::ErrorCallback(readDirectoryTask));
- }
-
- virtual bool handleEvent(FileError* error) OVERRIDE
- {
- if (m_readDirectoryTask)
- m_readDirectoryTask->reportResult(error->code(), 0);
- return true;
- }
-
-private:
- ErrorCallback(PassRefPtr<ReadDirectoryTask> readDirectoryTask)
- : m_readDirectoryTask(readDirectoryTask) { }
- RefPtr<ReadDirectoryTask> m_readDirectoryTask;
-};
-
-class ReadDirectoryTask::GetEntryCallback : public EntryCallback {
- WTF_MAKE_NONCOPYABLE(GetEntryCallback);
-public:
- static PassRefPtr<ReadDirectoryTask::GetEntryCallback> create(PassRefPtr<ReadDirectoryTask> readDirectoryTask)
- {
- return adoptRef(new ReadDirectoryTask::GetEntryCallback(readDirectoryTask));
- }
-
- virtual bool handleEvent(Entry* fileSystem) OVERRIDE
- {
- m_readDirectoryTask->gotEntry(fileSystem);
- return true;
- }
-
-private:
- GetEntryCallback(PassRefPtr<ReadDirectoryTask> readDirectoryTask)
- : m_readDirectoryTask(readDirectoryTask) { }
- RefPtr<ReadDirectoryTask> m_readDirectoryTask;
-};
-
-class ReadDirectoryTask::ReadDirectoryEntriesCallback : public EntriesCallback {
- WTF_MAKE_NONCOPYABLE(ReadDirectoryEntriesCallback);
-public:
- static PassRefPtr<ReadDirectoryTask::ReadDirectoryEntriesCallback> create(PassRefPtr<ReadDirectoryTask> readDirectoryTask)
- {
- return adoptRef(new ReadDirectoryTask::ReadDirectoryEntriesCallback(readDirectoryTask));
- }
-
- virtual bool handleEvent(EntryArray* entries) OVERRIDE
- {
- ASSERT(entries);
- m_readDirectoryTask->didReadDirectoryEntries(entries);
- return true;
- }
-
-private:
- ReadDirectoryEntriesCallback(PassRefPtr<ReadDirectoryTask> readDirectoryTask)
- : m_readDirectoryTask(readDirectoryTask) { }
- RefPtr<ReadDirectoryTask> m_readDirectoryTask;
-};
-
void ReadDirectoryTask::start(ScriptExecutionContext* scriptExecutionContext)
{
ASSERT(scriptExecutionContext);
@@ -313,23 +252,24 @@
return;
}
- RefPtr<EntryCallback> successCallback = ReadDirectoryTask::GetEntryCallback::create(this);
- RefPtr<ErrorCallback> errorCallback = ReadDirectoryTask::ErrorCallback::create(this);
+ RefPtr<EntryCallback> successCallback = CallbackDispatcherFactory<EntryCallback>::create(this, &ReadDirectoryTask::gotEntry);
+ RefPtr<ErrorCallback> errorCallback = CallbackDispatcherFactory<ErrorCallback>::create(this, &ReadDirectoryTask::didHitError);
OwnPtr<ResolveURICallbacks> fileSystemCallbacks = ResolveURICallbacks::create(successCallback, errorCallback, scriptExecutionContext, type, path);
LocalFileSystem::localFileSystem().readFileSystem(scriptExecutionContext, type, fileSystemCallbacks.release());
}
-void ReadDirectoryTask::gotEntry(Entry* entry)
+bool ReadDirectoryTask::gotEntry(Entry* entry)
{
if (!entry->isDirectory()) {
reportResult(FileError::TYPE_MISMATCH_ERR, 0);
- return;
+ return true;
}
m_directoryReader = static_cast<DirectoryEntry*>(entry)->createReader();
m_entries = Array<TypeBuilder::FileSystem::Entry>::create();
readDirectoryEntries();
+ return true;
}
void ReadDirectoryTask::readDirectoryEntries()
@@ -339,16 +279,16 @@
return;
}
- RefPtr<EntriesCallback> successCallback = ReadDirectoryTask::ReadDirectoryEntriesCallback::create(this);
- RefPtr<ErrorCallback> errorCallback = ReadDirectoryTask::ErrorCallback::create(this);
+ RefPtr<EntriesCallback> successCallback = CallbackDispatcherFactory<EntriesCallback>::create(this, &ReadDirectoryTask::didReadDirectoryEntries);
+ RefPtr<ErrorCallback> errorCallback = CallbackDispatcherFactory<ErrorCallback>::create(this, &ReadDirectoryTask::didHitError);
m_directoryReader->readEntries(successCallback, errorCallback);
}
-void ReadDirectoryTask::didReadDirectoryEntries(EntryArray* entries)
+bool ReadDirectoryTask::didReadDirectoryEntries(EntryArray* entries)
{
if (!entries->length()) {
reportResult(static_cast<FileError::ErrorCode>(0), m_entries);
- return;
+ return true;
}
for (unsigned i = 0; i < entries->length(); ++i) {
@@ -375,6 +315,7 @@
m_entries->addItem(entryForFrontend);
}
readDirectoryEntries();
+ return true;
}
}