/*
 * Copyright 2011 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";
import "ocidl.idl";

[
    uuid(8fdf6ca1-0189-47e4-b670-1a8a4636e340),
    object
]
interface IWPCSettings : IUnknown
{
    HRESULT IsLoggingRequired(
            [out] BOOL *pfRequired);

    HRESULT GetLastSettingsChangeTime(
            [out] SYSTEMTIME *pTime) ;

    HRESULT GetRestrictions(
            [out] DWORD *pdwRestrictions);
}

[
    uuid(95e87780-e158-489e-b452-bbb850790715),
    object
]
interface IWPCGamesSettings : IWPCSettings
{
    HRESULT IsBlocked(
            [in] GUID guidAppID,
            [out] DWORD *pdwReasons);
}

[
    uuid(ffccbdb8-0992-4c30-b0f1-1cbb09c240aa),
    object
]
interface IWPCWebSettings : IWPCSettings
{
    typedef enum tagWPCFLAG_WEB_SETTING {
        WPCFLAG_WEB_SETTING_NOTBLOCKED = 0,
        WPCFLAG_WEB_SETTING_DOWNLOADSBLOCKED = 1
    } WPCFLAG_WEB_SETTING;

    HRESULT GetSettings(
            [out] DWORD *pdwSettings);

    HRESULT RequestURLOverride(
            [in] HWND hWnd,
            [in] LPCWSTR pcszURL,
            [in] DWORD cURLs,
            [in] LPCWSTR *ppcszSubURLs,
            [out] BOOL *pfChanged);
}

typedef enum tagWPCFLAG_VISIBILITY {
    WPCFLAG_WPC_VISIBLE = 0,
    WPCFLAG_WPC_HIDDEN = 1
} WPCFLAG_VISIBILITY;

[
    uuid(4FF40A0F-3F3B-4d7c-A41B-4F39D7B44D05),
    object
]
interface IWindowsParentalControlsCore : IUnknown
{
    HRESULT GetVisibility(
            [out] WPCFLAG_VISIBILITY *peVisibility) ;

    HRESULT GetUserSettings(
            [in] LPCWSTR pcszSID,
            [out] IWPCSettings **ppSettings);

    HRESULT GetWebSettings(
            [in] LPCWSTR pcszSID,
            [out] IWPCWebSettings **ppSettings);

    HRESULT GetWebFilterInfo(
            [out] GUID *pguidID,
            [in] LPWSTR *ppszName);
}

[
    uuid(4ff40a0f-3f3b-4d7c-a41b-4f39d7b44d05),
    object
]
interface IWindowsParentalControls : IWindowsParentalControlsCore
{
    HRESULT GetGamesSettings(
            [in] LPCWSTR pcszSID,
            [out] IWPCGamesSettings **ppSettings) ;
}
