Chromium Code Reviews| Index: Source/modules/filesystem/SyncCallbackHelper.h |
| diff --git a/Source/modules/filesystem/SyncCallbackHelper.h b/Source/modules/filesystem/SyncCallbackHelper.h |
| index 7ef045d065dd128df8caf1e84e3e67eeec851ced..875e4e62386bb5d754158f5fc5bea020b2f57417 100644 |
| --- a/Source/modules/filesystem/SyncCallbackHelper.h |
| +++ b/Source/modules/filesystem/SyncCallbackHelper.h |
| @@ -1,5 +1,6 @@ |
| /* |
| * Copyright (C) 2010 Google Inc. All rights reserved. |
| + * Copyright (C) 2013 Samsung Electronics. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| @@ -35,9 +36,10 @@ |
| #include "core/fileapi/FileError.h" |
| #include "core/html/VoidCallback.h" |
| #include "modules/filesystem/DirectoryEntry.h" |
| +#include "modules/filesystem/DirectoryReaderSync.h" |
| #include "modules/filesystem/EntriesCallback.h" |
| -#include "modules/filesystem/EntryArraySync.h" |
| #include "modules/filesystem/EntryCallback.h" |
| +#include "modules/filesystem/EntrySync.h" |
| #include "modules/filesystem/ErrorCallback.h" |
| #include "modules/filesystem/FileEntry.h" |
| #include "modules/filesystem/FileSystemCallback.h" |
| @@ -54,12 +56,12 @@ class EntrySync; |
| class FileEntrySync; |
|
kinuko
2013/08/08 11:39:19
I guess actually we can remove all these forward d
|
| // A helper template for FileSystemSync implementation. |
| -template <typename SuccessCallback, typename ObserverType, typename CallbackArg, typename ResultType> |
| -class SyncCallbackHelper { |
| - WTF_MAKE_NONCOPYABLE(SyncCallbackHelper); |
| +template <typename SuccessCallback, typename ObserverType, typename CallbackArg> |
| +class SyncCallbackHelperBase { |
| + WTF_MAKE_NONCOPYABLE(SyncCallbackHelperBase); |
| public: |
| - typedef SyncCallbackHelper<SuccessCallback, ObserverType, CallbackArg, ResultType> HelperType; |
| - SyncCallbackHelper(ObserverType* observer = 0) |
| + typedef SyncCallbackHelperBase<SuccessCallback, ObserverType, CallbackArg> HelperType; |
| + SyncCallbackHelperBase(ObserverType* observer) |
| : m_observer(observer) |
| , m_successCallback(SuccessCallbackImpl::create(this)) |
| , m_errorCallback(ErrorCallbackImpl::create(this)) |
| @@ -68,26 +70,10 @@ public: |
| { |
| } |
| - PassRefPtr<ResultType> getResult(ExceptionState& es) |
| - { |
| - if (m_observer) { |
| - while (!m_completed) { |
| - if (!m_observer->waitForOperationToComplete()) { |
| - m_errorCode = FileError::ABORT_ERR; |
| - break; |
| - } |
| - } |
| - } |
| - if (m_errorCode) |
| - FileError::throwDOMException(es, m_errorCode); |
| - |
| - return m_result.release(); |
| - } |
| - |
| PassRefPtr<SuccessCallback> successCallback() { return m_successCallback; } |
| PassRefPtr<ErrorCallback> errorCallback() { return m_errorCallback; } |
| -private: |
| +protected: |
| class SuccessCallbackImpl : public SuccessCallback { |
| public: |
| static PassRefPtr<SuccessCallbackImpl> create(HelperType* helper) |
| @@ -103,7 +89,7 @@ private: |
| virtual bool handleEvent(CallbackArg arg) |
| { |
| - m_helper->setResult(ResultType::create(arg)); |
| + m_helper->setResult(arg); |
| return true; |
| } |
| @@ -146,20 +132,85 @@ private: |
| m_completed = true; |
| } |
| - void setResult(PassRefPtr<ResultType> result) |
| + void waitForCompletion(ExceptionState& es) |
| { |
| - m_result = result; |
| - m_completed = true; |
| + if (m_observer) { |
| + while (!m_completed) { |
| + if (!m_observer->waitForOperationToComplete()) { |
| + m_errorCode = FileError::ABORT_ERR; |
| + break; |
| + } |
| + } |
| + } |
| + if (m_errorCode) |
| + FileError::throwDOMException(es, m_errorCode); |
| } |
| + virtual void setResult(CallbackArg) = 0; |
| + |
| ObserverType* m_observer; |
| RefPtr<SuccessCallbackImpl> m_successCallback; |
| RefPtr<ErrorCallbackImpl> m_errorCallback; |
| - RefPtr<ResultType> m_result; |
| FileError::ErrorCode m_errorCode; |
| bool m_completed; |
| }; |
| +template <typename SuccessCallback, typename ObserverType, typename CallbackArg, typename ResultType> |
|
kinuko
2013/08/08 11:39:19
Could this change become simpler if we define trai
|
| +class SyncCallbackHelper : public SyncCallbackHelperBase<SuccessCallback, ObserverType, CallbackArg> { |
| + WTF_MAKE_NONCOPYABLE(SyncCallbackHelper); |
| +public: |
| + SyncCallbackHelper(ObserverType* observer = 0) |
| + : SyncCallbackHelperBase<SuccessCallback, ObserverType, CallbackArg>(observer) |
| + { |
| + } |
| + |
| + PassRefPtr<ResultType> getResult(ExceptionState& es) |
| + { |
| + SyncCallbackHelperBase<SuccessCallback, ObserverType, CallbackArg>::waitForCompletion(es); |
| + |
| + return m_result.release(); |
| + } |
| + |
| +private: |
| + virtual void setResult(CallbackArg result) |
| + { |
| + m_result = ResultType::create(result); |
| + SyncCallbackHelperBase<SuccessCallback, ObserverType, CallbackArg>::m_completed = true; |
| + } |
| + |
| + RefPtr<ResultType> m_result; |
| +}; |
| + |
| +// Partial specialization for EntryVector / EntrySyncVector. |
| +template <typename SuccessCallback, typename ObserverType> |
| +class SyncCallbackHelper<SuccessCallback, ObserverType, const EntryVector&, EntrySyncVector> : public SyncCallbackHelperBase<SuccessCallback, ObserverType, const EntryVector&> { |
| + WTF_MAKE_NONCOPYABLE(SyncCallbackHelper); |
| +public: |
| + SyncCallbackHelper(ObserverType* observer = 0) |
| + : SyncCallbackHelperBase<SuccessCallback, ObserverType, const EntryVector&>(observer) |
| + { |
| + } |
| + |
| + EntrySyncVector getResult(ExceptionState& es) |
| + { |
| + SyncCallbackHelperBase<SuccessCallback, ObserverType, const EntryVector&>::waitForCompletion(es); |
| + |
| + return m_result; |
| + } |
| + |
| +private: |
| + virtual void setResult(const EntryVector& result) |
| + { |
| + size_t entryCount = result.size(); |
| + m_result.resize(entryCount); |
| + for (size_t i = 0; i < entryCount; ++i) |
| + m_result[i] = EntrySync::create(result[i].get()); |
| + SyncCallbackHelperBase<SuccessCallback, ObserverType, const EntryVector&>::m_completed = true; |
| + } |
| + |
| + EntrySyncVector m_result; |
| +}; |
| + |
| struct EmptyType : public RefCounted<EmptyType> { |
| static PassRefPtr<EmptyType> create(EmptyType*) |
| { |
| @@ -175,7 +226,7 @@ struct EmptyObserverType { |
| }; |
| typedef SyncCallbackHelper<EntryCallback, AsyncFileSystem, Entry*, EntrySync> EntrySyncCallbackHelper; |
| -typedef SyncCallbackHelper<EntriesCallback, AsyncFileSystem, const EntryVector&, EntryArraySync> EntriesSyncCallbackHelper; |
| +typedef SyncCallbackHelper<EntriesCallback, AsyncFileSystem, const EntryVector&, EntrySyncVector> EntriesSyncCallbackHelper; |
| typedef SyncCallbackHelper<MetadataCallback, AsyncFileSystem, Metadata*, Metadata> MetadataSyncCallbackHelper; |
| typedef SyncCallbackHelper<VoidCallback, AsyncFileSystem, EmptyType*, EmptyType> VoidSyncCallbackHelper; |
| typedef SyncCallbackHelper<FileSystemCallback, EmptyObserverType, DOMFileSystem*, DOMFileSystemSync> FileSystemSyncCallbackHelper; |