15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * from this software without specific prior written permission. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IDBRequest_h 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IDBRequest_h 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptState.h" 33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptValue.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ActiveDOMObject.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMError.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMStringList.h" 3706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventListener.h" 3806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventTarget.h" 39d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "modules/EventModules.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBAny.h" 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/indexeddb/IDBTransaction.h" 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "modules/indexeddb/IndexedDB.h" 4310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/heap/Handle.h" 44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/platform/WebBlobInfo.h" 4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebIDBCursor.h" 4676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "public/platform/WebIDBTypes.h" 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass ExceptionState; 5143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class IDBCursor; 5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)struct IDBDatabaseMetadata; 53e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)class SharedBuffer; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)class IDBRequest 565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) : public RefCountedGarbageCollectedWillBeGarbageCollectedFinalized<IDBRequest> 57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) , public EventTargetWithInlineData 58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) , public ActiveDOMObject { 595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) DEFINE_EVENT_TARGET_REFCOUNTING_WILL_BE_REMOVED(RefCountedGarbageCollected<IDBRequest>); 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_WRAPPERTYPEINFO(); 61d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(IDBRequest); 6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)public: 63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) static IDBRequest* create(ScriptState*, IDBAny* source, IDBTransaction*); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~IDBRequest(); 652fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) void dispose(); 66d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void trace(Visitor*) OVERRIDE; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 682fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) ScriptState* scriptState() { return m_scriptState.get(); } 69a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ScriptValue result(ExceptionState&); 70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtrWillBeRawPtr<DOMError> error(ExceptionState&) const; 716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ScriptValue source() const; 72f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu IDBTransaction* transaction() const { return m_transaction.get(); } 73a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 74a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) bool isResultDirty() const { return m_resultDirty; } 75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) IDBAny* resultAsAny() const { return m_result; } 7651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // Requests made during index population are implementation details and so 7851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // events should not be visible to script. 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void preventPropagation() { m_preventPropagation = true; } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Defined in the IDL 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum ReadyState { 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PENDING = 1, 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DONE = 2, 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EarlyDeath = 3 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const String& readyState() const; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_ATTRIBUTE_EVENT_LISTENER(success); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_ATTRIBUTE_EVENT_LISTENER(error); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void setCursorDetails(IndexedDB::CursorType, WebIDBCursorDirection); 94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void setPendingCursor(IDBCursor*); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void abort(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual void onError(PassRefPtrWillBeRawPtr<DOMError>); 9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void onSuccess(const Vector<String>&); 99e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void onSuccess(PassOwnPtr<WebIDBCursor>, IDBKey*, IDBKey* primaryKey, PassRefPtr<SharedBuffer>, PassOwnPtr<Vector<WebBlobInfo> >); 100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void onSuccess(IDBKey*); 101e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void onSuccess(PassRefPtr<SharedBuffer>, PassOwnPtr<Vector<WebBlobInfo> >); 102e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void onSuccess(PassRefPtr<SharedBuffer>, PassOwnPtr<Vector<WebBlobInfo> >, IDBKey*, const IDBKeyPath&); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void onSuccess(int64_t); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void onSuccess(); 105e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void onSuccess(IDBKey*, IDBKey* primaryKey, PassRefPtr<SharedBuffer>, PassOwnPtr<Vector<WebBlobInfo> >); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // Only IDBOpenDBRequest instances should receive these: 10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual void onBlocked(int64_t oldVersion) { ASSERT_NOT_REACHED(); } 109e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void onUpgradeNeeded(int64_t oldVersion, PassOwnPtr<WebIDBDatabase>, const IDBDatabaseMetadata&, WebIDBDataLoss, String dataLossMessage) { ASSERT_NOT_REACHED(); } 110e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void onSuccess(PassOwnPtr<WebIDBDatabase>, const IDBDatabaseMetadata&) { ASSERT_NOT_REACHED(); } 11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ActiveDOMObject 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool hasPendingActivity() const OVERRIDE FINAL; 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void stop() OVERRIDE FINAL; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // EventTarget 1171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) virtual const AtomicString& interfaceName() const OVERRIDE; 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual ExecutionContext* executionContext() const OVERRIDE FINAL; 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void uncaughtExceptionInEventHandler() OVERRIDE FINAL; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) using EventTarget::dispatchEvent; 122a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch virtual bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>) OVERRIDE; 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 124a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // Called by a version change transaction that has finished to set this 125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // request back from DONE (following "upgradeneeded") back to PENDING (for 126a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // the upcoming "success" or "error"). 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void transactionDidFinishAndDispatch(); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 129a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) IDBCursor* getResultCursor() const; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 132d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) IDBRequest(ScriptState*, IDBAny* source, IDBTransaction*); 133a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch void enqueueEvent(PassRefPtrWillBeRawPtr<Event>); 134a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) void dequeueEvent(Event*); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool shouldEnqueueEvent() const; 136d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void onSuccessInternal(IDBAny*); 137d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void setResult(IDBAny*); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_contextStopped; 140d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Member<IDBTransaction> m_transaction; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ReadyState m_readyState; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_requestAborted; // May be aborted by transaction then receive async onsuccess; ignore vs. assert. 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 145e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void setResultCursor(IDBCursor*, IDBKey*, IDBKey* primaryKey, PassRefPtr<SharedBuffer> value, PassOwnPtr<Vector<WebBlobInfo> >); 1462fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) void setBlobInfo(PassOwnPtr<Vector<WebBlobInfo>>); 147f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void handleBlobAcks(); 1488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 149f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu RefPtr<ScriptState> m_scriptState; 150d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Member<IDBAny> m_source; 151d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Member<IDBAny> m_result; 152f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu RefPtrWillBeMember<DOMError> m_error; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_hasPendingActivity; 155f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu WillBeHeapVector<RefPtrWillBeMember<Event> > m_enqueuedEvents; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Only used if the result type will be a cursor. 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IndexedDB::CursorType m_cursorType; 159e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebIDBCursorDirection m_cursorDirection; 160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // When a cursor is continued/advanced, m_result is cleared and m_pendingCursor holds it. 161d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Member<IDBCursor> m_pendingCursor; 162a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // New state is not applied to the cursor object until the event is dispatched. 163d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Member<IDBKey> m_cursorKey; 164d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Member<IDBKey> m_cursorPrimaryKey; 165e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RefPtr<SharedBuffer> m_cursorValue; 166e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) OwnPtr<Vector<WebBlobInfo> > m_blobInfo; 167a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_didFireUpgradeNeededEvent; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_preventPropagation; 170a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) bool m_resultDirty; 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IDBRequest_h 176