/*
 * 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 <wtf/Forward.h>
#include <wtf/WeakPtr.h>
#include <wtf/text/WTFString.h>

namespace WebCore {

class IDBError;
class IDBResourceIdentifier;
class IDBResultData;

namespace IDBServer {

class UniqueIDBDatabaseConnection;

class IDBConnectionToClientDelegate : public CanMakeWeakPtr<IDBConnectionToClientDelegate> {
public:
    virtual ~IDBConnectionToClientDelegate() = default;
    
    virtual uint64_t identifier() const = 0;

    virtual void didDeleteDatabase(const IDBResultData&) = 0;
    virtual void didOpenDatabase(const IDBResultData&) = 0;
    virtual void didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) = 0;
    virtual void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) = 0;
    virtual void didCreateObjectStore(const IDBResultData&) = 0;
    virtual void didDeleteObjectStore(const IDBResultData&) = 0;
    virtual void didRenameObjectStore(const IDBResultData&) = 0;
    virtual void didClearObjectStore(const IDBResultData&) = 0;
    virtual void didCreateIndex(const IDBResultData&) = 0;
    virtual void didDeleteIndex(const IDBResultData&) = 0;
    virtual void didRenameIndex(const IDBResultData&) = 0;
    virtual void didPutOrAdd(const IDBResultData&) = 0;
    virtual void didGetRecord(const IDBResultData&) = 0;
    virtual void didGetAllRecords(const IDBResultData&) = 0;
    virtual void didGetCount(const IDBResultData&) = 0;
    virtual void didDeleteRecord(const IDBResultData&) = 0;
    virtual void didOpenCursor(const IDBResultData&) = 0;
    virtual void didIterateCursor(const IDBResultData&) = 0;

    virtual void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion) = 0;
    virtual void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) = 0;
    virtual void didCloseFromServer(UniqueIDBDatabaseConnection&, const IDBError&) = 0;
    virtual void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion) = 0;

    virtual void didGetAllDatabaseNames(uint64_t callbackID, const Vector<String>& databaseNames) = 0;

    virtual void ref() = 0;
    virtual void deref() = 0;
};

} // namespace IDBServer
} // namespace WebCore

#endif // ENABLE(INDEXED_DATABASE)
