OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * Copyright (C) 2013 Samsung Electronics. All rights reserved. | 3 * Copyright (C) 2013 Samsung Electronics. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 EntrySyncVector result; | 70 EntrySyncVector result; |
71 size_t entryCount = entries.size(); | 71 size_t entryCount = entries.size(); |
72 result.reserveInitialCapacity(entryCount); | 72 result.reserveInitialCapacity(entryCount); |
73 for (size_t i = 0; i < entryCount; ++i) | 73 for (size_t i = 0; i < entryCount; ++i) |
74 result.uncheckedAppend(EntrySync::create(entries[i].get())); | 74 result.uncheckedAppend(EntrySync::create(entries[i].get())); |
75 return result; | 75 return result; |
76 } | 76 } |
77 }; | 77 }; |
78 | 78 |
79 // A helper template for FileSystemSync implementation. | 79 // A helper template for FileSystemSync implementation. |
80 template <typename SuccessCallback, typename ObserverType, typename CallbackArg,
typename ResultType> | 80 template <typename SuccessCallback, typename CallbackArg, typename ResultType> |
81 class SyncCallbackHelper { | 81 class SyncCallbackHelper { |
82 WTF_MAKE_NONCOPYABLE(SyncCallbackHelper); | 82 WTF_MAKE_NONCOPYABLE(SyncCallbackHelper); |
83 public: | 83 public: |
84 typedef SyncCallbackHelper<SuccessCallback, ObserverType, CallbackArg, Resul
tType> HelperType; | 84 typedef SyncCallbackHelper<SuccessCallback, CallbackArg, ResultType> HelperT
ype; |
85 typedef HelperResultType<ResultType, CallbackArg> ResultTypeTrait; | 85 typedef HelperResultType<ResultType, CallbackArg> ResultTypeTrait; |
86 typedef typename ResultTypeTrait::StorageType ResultStorageType; | 86 typedef typename ResultTypeTrait::StorageType ResultStorageType; |
87 typedef typename ResultTypeTrait::ReturnType ResultReturnType; | 87 typedef typename ResultTypeTrait::ReturnType ResultReturnType; |
88 | 88 |
89 SyncCallbackHelper(ObserverType* observer = 0) | 89 SyncCallbackHelper() |
90 : m_observer(observer) | 90 : m_successCallback(SuccessCallbackImpl::create(this)) |
91 , m_successCallback(SuccessCallbackImpl::create(this)) | |
92 , m_errorCallback(ErrorCallbackImpl::create(this)) | 91 , m_errorCallback(ErrorCallbackImpl::create(this)) |
93 , m_errorCode(FileError::OK) | 92 , m_errorCode(FileError::OK) |
94 , m_completed(false) | 93 , m_completed(false) |
95 { | 94 { |
96 } | 95 } |
97 | 96 |
98 ResultReturnType getResult(ExceptionState& es) | 97 ResultReturnType getResult(ExceptionState& es) |
99 { | 98 { |
100 if (m_observer) { | |
101 while (!m_completed) { | |
102 if (!m_observer->waitForOperationToComplete()) { | |
103 m_errorCode = FileError::ABORT_ERR; | |
104 break; | |
105 } | |
106 } | |
107 } | |
108 if (m_errorCode) | 99 if (m_errorCode) |
109 FileError::throwDOMException(es, m_errorCode); | 100 FileError::throwDOMException(es, m_errorCode); |
110 | 101 |
111 return m_result; | 102 return m_result; |
112 } | 103 } |
113 | 104 |
114 PassRefPtr<SuccessCallback> successCallback() { return m_successCallback; } | 105 PassRefPtr<SuccessCallback> successCallback() { return m_successCallback; } |
115 PassRefPtr<ErrorCallback> errorCallback() { return m_errorCallback; } | 106 PassRefPtr<ErrorCallback> errorCallback() { return m_errorCallback; } |
116 | 107 |
117 private: | 108 private: |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 m_errorCode = code; | 163 m_errorCode = code; |
173 m_completed = true; | 164 m_completed = true; |
174 } | 165 } |
175 | 166 |
176 void setResult(CallbackArg result) | 167 void setResult(CallbackArg result) |
177 { | 168 { |
178 m_result = ResultTypeTrait::createFromCallbackArg(result); | 169 m_result = ResultTypeTrait::createFromCallbackArg(result); |
179 m_completed = true; | 170 m_completed = true; |
180 } | 171 } |
181 | 172 |
182 ObserverType* m_observer; | |
183 RefPtr<SuccessCallbackImpl> m_successCallback; | 173 RefPtr<SuccessCallbackImpl> m_successCallback; |
184 RefPtr<ErrorCallbackImpl> m_errorCallback; | 174 RefPtr<ErrorCallbackImpl> m_errorCallback; |
185 ResultStorageType m_result; | 175 ResultStorageType m_result; |
186 FileError::ErrorCode m_errorCode; | 176 FileError::ErrorCode m_errorCode; |
187 bool m_completed; | 177 bool m_completed; |
188 }; | 178 }; |
189 | 179 |
190 struct EmptyType : public RefCounted<EmptyType> { | 180 struct EmptyType : public RefCounted<EmptyType> { |
191 static PassRefPtr<EmptyType> create(EmptyType*) | 181 static PassRefPtr<EmptyType> create(EmptyType*) |
192 { | 182 { |
193 return 0; | 183 return 0; |
194 } | 184 } |
195 }; | 185 }; |
196 | 186 |
197 struct EmptyObserverType { | 187 typedef SyncCallbackHelper<EntryCallback, Entry*, EntrySync> EntrySyncCallbackHe
lper; |
198 bool waitForOperationToComplete() | 188 typedef SyncCallbackHelper<EntriesCallback, const EntryVector&, EntrySyncVector>
EntriesSyncCallbackHelper; |
199 { | 189 typedef SyncCallbackHelper<MetadataCallback, Metadata*, Metadata> MetadataSyncCa
llbackHelper; |
200 return false; | 190 typedef SyncCallbackHelper<VoidCallback, EmptyType*, EmptyType> VoidSyncCallback
Helper; |
201 } | 191 typedef SyncCallbackHelper<FileSystemCallback, DOMFileSystem*, DOMFileSystemSync
> FileSystemSyncCallbackHelper; |
202 }; | |
203 | |
204 typedef SyncCallbackHelper<EntryCallback, AsyncFileSystem, Entry*, EntrySync> En
trySyncCallbackHelper; | |
205 typedef SyncCallbackHelper<EntriesCallback, AsyncFileSystem, const EntryVector&,
EntrySyncVector> EntriesSyncCallbackHelper; | |
206 typedef SyncCallbackHelper<MetadataCallback, AsyncFileSystem, Metadata*, Metadat
a> MetadataSyncCallbackHelper; | |
207 typedef SyncCallbackHelper<VoidCallback, AsyncFileSystem, EmptyType*, EmptyType>
VoidSyncCallbackHelper; | |
208 typedef SyncCallbackHelper<FileSystemCallback, EmptyObserverType, DOMFileSystem*
, DOMFileSystemSync> FileSystemSyncCallbackHelper; | |
209 | 192 |
210 } // namespace WebCore | 193 } // namespace WebCore |
211 | 194 |
212 #endif // SyncCallbackHelper_h | 195 #endif // SyncCallbackHelper_h |
OLD | NEW |