summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/indexeddb/shared/IDBResultData.h')
-rw-r--r--Source/WebCore/Modules/indexeddb/shared/IDBResultData.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h b/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h
new file mode 100644
index 000000000..217c9a3ca
--- /dev/null
+++ b/Source/WebCore/Modules/indexeddb/shared/IDBResultData.h
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBDatabaseInfo.h"
+#include "IDBError.h"
+#include "IDBGetAllResult.h"
+#include "IDBGetResult.h"
+#include "IDBKeyData.h"
+#include "IDBResourceIdentifier.h"
+#include "IDBTransactionInfo.h"
+#include "ThreadSafeDataBuffer.h"
+
+namespace WebCore {
+
+class ThreadSafeDataBuffer;
+
+enum class IDBResultType {
+ Error,
+ OpenDatabaseSuccess,
+ OpenDatabaseUpgradeNeeded,
+ DeleteDatabaseSuccess,
+ CreateObjectStoreSuccess,
+ DeleteObjectStoreSuccess,
+ ClearObjectStoreSuccess,
+ PutOrAddSuccess,
+ GetRecordSuccess,
+ GetAllRecordsSuccess,
+ GetCountSuccess,
+ DeleteRecordSuccess,
+ CreateIndexSuccess,
+ DeleteIndexSuccess,
+ OpenCursorSuccess,
+ IterateCursorSuccess,
+ RenameObjectStoreSuccess,
+ RenameIndexSuccess,
+};
+
+namespace IDBServer {
+class UniqueIDBDatabaseConnection;
+class UniqueIDBDatabaseTransaction;
+}
+
+class IDBResultData {
+public:
+ static IDBResultData error(const IDBResourceIdentifier&, const IDBError&);
+ static IDBResultData openDatabaseSuccess(const IDBResourceIdentifier&, IDBServer::UniqueIDBDatabaseConnection&);
+ static IDBResultData openDatabaseUpgradeNeeded(const IDBResourceIdentifier&, IDBServer::UniqueIDBDatabaseTransaction&);
+ static IDBResultData deleteDatabaseSuccess(const IDBResourceIdentifier&, const IDBDatabaseInfo&);
+ static IDBResultData createObjectStoreSuccess(const IDBResourceIdentifier&);
+ static IDBResultData deleteObjectStoreSuccess(const IDBResourceIdentifier&);
+ static IDBResultData renameObjectStoreSuccess(const IDBResourceIdentifier&);
+ static IDBResultData clearObjectStoreSuccess(const IDBResourceIdentifier&);
+ static IDBResultData createIndexSuccess(const IDBResourceIdentifier&);
+ static IDBResultData deleteIndexSuccess(const IDBResourceIdentifier&);
+ static IDBResultData renameIndexSuccess(const IDBResourceIdentifier&);
+ static IDBResultData putOrAddSuccess(const IDBResourceIdentifier&, const IDBKeyData&);
+ static IDBResultData getRecordSuccess(const IDBResourceIdentifier&, const IDBGetResult&);
+ static IDBResultData getAllRecordsSuccess(const IDBResourceIdentifier&, const IDBGetAllResult&);
+ static IDBResultData getCountSuccess(const IDBResourceIdentifier&, uint64_t count);
+ static IDBResultData deleteRecordSuccess(const IDBResourceIdentifier&);
+ static IDBResultData openCursorSuccess(const IDBResourceIdentifier&, const IDBGetResult&);
+ static IDBResultData iterateCursorSuccess(const IDBResourceIdentifier&, const IDBGetResult&);
+
+ WEBCORE_EXPORT IDBResultData(const IDBResultData&);
+
+ enum IsolatedCopyTag { IsolatedCopy };
+ IDBResultData(const IDBResultData&, IsolatedCopyTag);
+ IDBResultData isolatedCopy() const;
+
+ IDBResultType type() const { return m_type; }
+ IDBResourceIdentifier requestIdentifier() const { return m_requestIdentifier; }
+
+ const IDBError& error() const { return m_error; }
+ uint64_t databaseConnectionIdentifier() const { return m_databaseConnectionIdentifier; }
+
+ const IDBDatabaseInfo& databaseInfo() const;
+ const IDBTransactionInfo& transactionInfo() const;
+
+ const IDBKeyData* resultKey() const { return m_resultKey.get(); }
+ uint64_t resultInteger() const { return m_resultInteger; }
+
+ WEBCORE_EXPORT const IDBGetResult& getResult() const;
+ WEBCORE_EXPORT const IDBGetAllResult& getAllResult() const;
+
+ WEBCORE_EXPORT IDBResultData();
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static bool decode(Decoder&, IDBResultData&);
+
+private:
+ IDBResultData(const IDBResourceIdentifier&);
+ IDBResultData(IDBResultType, const IDBResourceIdentifier&);
+
+ static void isolatedCopy(const IDBResultData& source, IDBResultData& destination);
+
+ IDBResultType m_type { IDBResultType::Error };
+ IDBResourceIdentifier m_requestIdentifier;
+
+ IDBError m_error;
+ uint64_t m_databaseConnectionIdentifier { 0 };
+ std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
+ std::unique_ptr<IDBTransactionInfo> m_transactionInfo;
+ std::unique_ptr<IDBKeyData> m_resultKey;
+ std::unique_ptr<IDBGetResult> m_getResult;
+ std::unique_ptr<IDBGetAllResult> m_getAllResult;
+ uint64_t m_resultInteger { 0 };
+};
+
+template<class Encoder>
+void IDBResultData::encode(Encoder& encoder) const
+{
+ encoder << m_requestIdentifier << m_error << m_databaseConnectionIdentifier << m_resultInteger;
+
+ encoder.encodeEnum(m_type);
+
+ encoder << !!m_databaseInfo;
+ if (m_databaseInfo)
+ encoder << *m_databaseInfo;
+
+ encoder << !!m_transactionInfo;
+ if (m_transactionInfo)
+ encoder << *m_transactionInfo;
+
+ encoder << !!m_resultKey;
+ if (m_resultKey)
+ encoder << *m_resultKey;
+
+ encoder << !!m_getResult;
+ if (m_getResult)
+ encoder << *m_getResult;
+
+ encoder << !!m_getAllResult;
+ if (m_getAllResult)
+ encoder << *m_getAllResult;
+}
+
+template<class Decoder> bool IDBResultData::decode(Decoder& decoder, IDBResultData& result)
+{
+ if (!decoder.decode(result.m_requestIdentifier))
+ return false;
+
+ if (!decoder.decode(result.m_error))
+ return false;
+
+ if (!decoder.decode(result.m_databaseConnectionIdentifier))
+ return false;
+
+ if (!decoder.decode(result.m_resultInteger))
+ return false;
+
+ if (!decoder.decodeEnum(result.m_type))
+ return false;
+
+ bool hasObject;
+
+ if (!decoder.decode(hasObject))
+ return false;
+ if (hasObject) {
+ auto object = std::make_unique<IDBDatabaseInfo>();
+ if (!decoder.decode(*object))
+ return false;
+ result.m_databaseInfo = WTFMove(object);
+ }
+
+ if (!decoder.decode(hasObject))
+ return false;
+ if (hasObject) {
+ auto object = std::make_unique<IDBTransactionInfo>();
+ if (!decoder.decode(*object))
+ return false;
+ result.m_transactionInfo = WTFMove(object);
+ }
+
+ if (!decoder.decode(hasObject))
+ return false;
+ if (hasObject) {
+ auto object = std::make_unique<IDBKeyData>();
+ if (!decoder.decode(*object))
+ return false;
+ result.m_resultKey = WTFMove(object);
+ }
+
+ if (!decoder.decode(hasObject))
+ return false;
+ if (hasObject) {
+ auto object = std::make_unique<IDBGetResult>();
+ if (!decoder.decode(*object))
+ return false;
+ result.m_getResult = WTFMove(object);
+ }
+
+ if (!decoder.decode(hasObject))
+ return false;
+ if (hasObject) {
+ auto object = std::make_unique<IDBGetAllResult>();
+ if (!decoder.decode(*object))
+ return false;
+ result.m_getAllResult = WTFMove(object);
+ }
+
+ return true;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)