/*
 * Copyright (C) 2006, 2007, 2008 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 COMPUTER, INC. ``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 COMPUTER, INC. OR
 * 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. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
#endif

interface IWebSecurityOrigin;

cpp_quote("#define WebDatabaseDisplayNameKey TEXT(\"WebDatabaseDisplayNameKey\")")
cpp_quote("#define WebDatabaseExpectedSizeKey TEXT(\"WebDatabaseExpectedSizeKey\")")
cpp_quote("#define WebDatabaseUsageKey TEXT(\"WebDatabaseUsageKey\")")

cpp_quote("#define WebDatabaseDidModifyOriginNotification TEXT(\"WebDatabaseDidModifyOriginNotification\")")
cpp_quote("#define WebDatabaseDidModifyDatabaseNotification TEXT(\"WebDatabaseDidModifyDatabaseNotification\")")
cpp_quote("#define WebDatabaseNameKey TEXT(\"WebDatabaseNameKey\")")

#ifndef DO_NO_IMPORTS
import "IWebSecurityOrigin.idl";
#endif

[
    object,
    oleautomation,
    uuid(5724f010-a77b-4a42-8f89-a5095b61d469),
    pointer_default(unique)
]
interface IWebDatabaseManager : IUnknown
{
    HRESULT sharedWebDatabaseManager([out, retval] IWebDatabaseManager** result);

    HRESULT origins([out, retval] IEnumVARIANT** result);
    HRESULT databasesWithOrigin([in] IWebSecurityOrigin* origin, [out, retval] IEnumVARIANT** result);
    HRESULT detailsForDatabase([in] BSTR databaseName, [in] IWebSecurityOrigin* origin, [out, retval] IPropertyBag **result);

    HRESULT deleteAllDatabases();
    HRESULT deleteOrigin([in] IWebSecurityOrigin* origin);
    HRESULT deleteDatabase([in] BSTR databaseName, [in] IWebSecurityOrigin* origin);

    HRESULT setQuota([in] BSTR originName, [in] unsigned long long quota);
}
