/*
 * Copyright 2006,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 "objidl.idl";
import "oleidl.idl";
import "urlmon.idl";

cpp_quote("#include <htiframe.h>")


/*****************************************************************************
 *    ITargetFrame interface
 */
[
    object,
    uuid(d5f78c80-5252-11cf-90fa-00aa0042106e),
    pointer_default(unique)
]
interface ITargetFrame: IUnknown
{
    typedef [unique] ITargetFrame *LPTARGETFRAME;

    typedef enum {
        NAVIGATEFRAME_FL_RECORD                    = 0x01,
        NAVIGATEFRAME_FL_POST                      = 0x02,
        NAVIGATEFRAME_FL_NO_DOC_CACHE              = 0x04,
        NAVIGATEFRAME_FL_NO_IMAGE_CACHE            = 0x08,
        NAVIGATEFRAME_FL_AUTH_FAIL_CACHE_OK        = 0x10,
        NAVIGATEFRAME_FL_SENDING_FROM_FORM         = 0x20,
        NAVIGATEFRAME_FL_REALLY_SENDING_FROM_FORM  = 0x40
    } NAVIGATEFRAME_FLAGS;

    typedef struct tagNavigateData {
        ULONG ulTarget;
        ULONG ulURL;
        ULONG ulRefURL;
        ULONG ulPostData;
        DWORD dwFlags;
    } NAVIGATEDATA;

    HRESULT SetFrameName([in] LPCWSTR pszFrameName);
    HRESULT GetFrameName([out] LPWSTR *ppszFrameName);
    HRESULT GetParentFrame([out] IUnknown **ppunkParent);

    HRESULT FindFrame(
            [in] LPCWSTR pszTargetName,
            [in] IUnknown *ppunkContextFrame,
            [in] DWORD dwFlags,
            [out] IUnknown **ppunkTargetFrame);

    HRESULT SetFrameSrc([in] LPCWSTR pszFrameSrc);
    HRESULT GetFrameSrc([out] LPWSTR *ppszFrameSrc);
    HRESULT GetFramesContainer([out] IOleContainer **ppContainer);
    HRESULT SetFrameOptions([in] DWORD dwFlags);
    HRESULT GetFrameOptions([out] DWORD *pdwFlags);

    HRESULT SetFrameMargins(
            [in] DWORD dwWidth,
            [in] DWORD dwHeight);

    HRESULT GetFrameMargins(
            [out] DWORD *pdwWidth,
            [out] DWORD *pdwHeight);

    HRESULT RemoteNavigate(
            [in] ULONG cLength,
            [in, size_is(cLength)] ULONG *pulData);

    HRESULT OnChildFrameActivate([in] IUnknown *pUnkChildFrame);
    HRESULT OnChildFrameDeactivate([in] IUnknown *pUnkChildFrame);
}

/*****************************************************************************
 *    ITargetFramePriv interface
 */
[
    object,
    uuid(9216e421-2bf5-11d0-82b4-00a0c90c29c5),
    pointer_default(unique)
]
interface ITargetFramePriv : IUnknown
{
    typedef [unique] ITargetFramePriv *LPTARGETFRAMEPRIV;

    HRESULT FindFrameDownwards(
            [in] LPCWSTR pszTargetName,
            [in] DWORD dwFlags,
            [out] IUnknown **ppunkTargetFrame);

    HRESULT FindFrameInContext(
            [in] LPCWSTR pszTargetName,
            [in] IUnknown *punkContextFrame,
            [in] DWORD dwFlags,
            [out] IUnknown **ppunkTargetFrame);

    HRESULT OnChildFrameActivate([in] IUnknown *pUnkChildFrame);
    HRESULT OnChildFrameDeactivate([in] IUnknown *pUnkChildFrame);

    HRESULT NavigateHack(
            [in] DWORD grfHLNF,
            [in, unique] LPBC pbc,
            [in, unique] IBindStatusCallback *pibsc,
            [in, unique] LPCWSTR pszTargetName,
            [in] LPCWSTR pszUrl,
            [in, unique] LPCWSTR pszLocation);

    HRESULT FindBrowserByIndex(
            [in] DWORD dwID,
            [out] IUnknown **ppunkBrowser);
}

/*****************************************************************************
 *    ITargetFramePriv2 interface
 */
[
    object,
    uuid(b2c867e6-69d6-46f2-a611-ded9a4bd7fef),
    pointer_default(unique)
]
interface ITargetFramePriv2 : ITargetFramePriv
{
    typedef [unique] ITargetFramePriv2 *LPTARGETFRAMEPRIV2;

    HRESULT AggregatedNavigation2(
            [in] DWORD grfHLNF,
            [in, unique] LPBC pbc,
            [in, unique] IBindStatusCallback *pibsc,
            [in, unique] LPCWSTR pszTargetName,
            [in] IUri *pUri,
            [in, unique] LPCWSTR pszLocation);
}
