/*
 * Copyright 2005 Jacek Caban
 *
 * 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 "urlmon.idl";

interface IHlink;
interface IHlinkSite;
interface IHlinkFrame;
interface IHlinkBrowseContext;

cpp_quote("HRESULT WINAPI HlinkCreateFromMoniker(IMoniker*, LPCWSTR, LPCWSTR, IHlinkSite*, DWORD, IUnknown*, REFIID, void**);");
cpp_quote("HRESULT WINAPI HlinkCreateFromString(LPCWSTR, LPCWSTR, LPCWSTR, IHlinkSite*, DWORD, IUnknown*, REFIID, void**);");
cpp_quote("HRESULT WINAPI HlinkCreateFromData(IDataObject*, IHlinkSite*, DWORD dwSiteData, IUnknown*, REFIID, void**);");
cpp_quote("HRESULT WINAPI HlinkQueryCreateFromData(IDataObject*);");
cpp_quote("HRESULT WINAPI HlinkClone(IHlink*, REFIID, IHlinkSite*, DWORD, void **);");
cpp_quote("HRESULT WINAPI HlinkCreateBrowseContext(IUnknown*, REFIID, void **);");
cpp_quote("HRESULT WINAPI HlinkNavigateToStringReference(LPCWSTR, LPCWSTR, IHlinkSite*, DWORD, IHlinkFrame*, DWORD, LPBC, IBindStatusCallback*, IHlinkBrowseContext*);");
cpp_quote("HRESULT WINAPI HlinkNavigate(IHlink*, IHlinkFrame*, DWORD, LPBC, IBindStatusCallback*, IHlinkBrowseContext*);");
cpp_quote("HRESULT WINAPI HlinkOnNavigate(IHlinkFrame*, IHlinkBrowseContext*, DWORD, IMoniker*, LPCWSTR, LPCWSTR, ULONG*);");

/*****************************************************************************
 *    IHlink interface
 */
[
    object,
    uuid(79EAC9C3-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IHlink: IUnknown
{
    typedef [unique] IHlink *LPHLINK;

    typedef enum {
        HLNF_INTERNALJUMP          = 0x00000001,
        HLNF_OPENINNEWWINDOW       = 0x00000002,
        HLNF_NAVIGATINGBACK        = 0x00000004,
        HLNF_NAVIGATINGFORWARD     = 0x00000008,
        HLNF_NAVIGATINGTOSTACKITEM = 0x00000010,
        HLNF_CREATENOHISTORY       = 0x00000020
    } HLNF;

    typedef enum {
        HLINKGETREF_DEFAULT  = 0,
        HLINKGETREF_ABSOLUTE = 1,
        HLINKGETREF_RELATIVE = 2,
    } HLINKGETREF;

    typedef enum {
        HLFNAMEF_DEFAULT          = 0x00000000,
        HLFNAMEF_TRYCACHE         = 0x00000001,
        HLFNAMEF_TRYPRETTYTARGET  = 0x00000002,
        HLFNAMEF_TRYFULLTARGET    = 0x00000004,
        HLFNAMEF_TRYWIN95SHORTCUT = 0x00000008
    } HLFNAMEF;

    typedef enum {
        HLINKMISC_RELATIVE = 0x00000001,
    } HLINKMISC;

    typedef enum {
        HLINKSETF_TARGET   = 0x00000001,
        HLINKSETF_LOCATION = 0x00000002
    } HLINKSETF;

    HRESULT SetHlinkSite(
        [in, unique] IHlinkSite *pihlSite,
        [in] DWORD dwSiteData);

    HRESULT GetHlinkSite(
        [out] IHlinkSite **ppihlSite,
        [out] DWORD *pdwSiteData);

    HRESULT SetMonikerReference(
        [in] DWORD grfHLSETF,
        [in, unique] IMoniker *pimkTarget,
        [in, unique] LPCWSTR pwzLocation);

    HRESULT GetMonikerReference(
        [in]  DWORD dwWhichRef,
        [out] IMoniker **ppimkTarget,
        [out] LPWSTR *ppwzLocation);

    HRESULT SetStringReference(
        [in] DWORD grfHLSETF,
        [in, unique] LPCWSTR pwzTarget,
        [in, unique] LPCWSTR pwzLocation);

    HRESULT GetStringReference(
        [in]  DWORD dwWhichRef,
        [out] LPWSTR *ppwzTarget,
        [out] LPWSTR *ppwzLocation);

    HRESULT SetFriendlyName(
        [in, unique] LPCWSTR pwzFriendlyName);

    HRESULT GetFriendlyName(
        [in]  DWORD grfHLFNAMEF,
        [out] LPWSTR *ppwzFriendlyName);

    HRESULT SetTargetFrameName(
        [in, unique] LPCWSTR pwzTargetFrameName);

    HRESULT GetTargetFrameName(
        [out] LPWSTR *ppwzTargetFrameName);

    HRESULT GetMiscStatus(
        [out] DWORD *pdwStatus);

    HRESULT Navigate(
        [in] DWORD grfHLNF,
        [in, unique] LPBC pibc,
        [in, unique] IBindStatusCallback *pibsc,
        [in, unique] IHlinkBrowseContext *pihlbc);

    HRESULT SetAdditionalParams(
        [in, unique] LPCWSTR pwzAdditionalParams);

    HRESULT GetAdditionalParams(
        [out] LPWSTR *ppwzAdditionalParams);
}

/*****************************************************************************
 *    IHlink interface
 */
[
    object,
    uuid(79EAC9C2-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IHlinkSite: IUnknown
{
    typedef [unique] IHlinkSite *LPHLINKSITE;

    typedef enum {
        HLINKWHICHMK_CONTAINER = 1,
        HLINKWHICHMK_BASE      = 2,
    } HLINKWHICHMK;

    HRESULT QueryService(
        [in] DWORD dwSiteData,
        [in] REFGUID guidService,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppiunk);

    HRESULT GetMoniker(
        [in] DWORD dwSiteData,
        [in] DWORD dwAssign,
        [in] DWORD dwWhich,
        [out] IMoniker **ppimk);

    HRESULT ReadyToNavigate(
        [in] DWORD dwSiteData,
        [in] DWORD dwReserved);

    HRESULT OnNavigationComplete(
        [in] DWORD dwSiteData,
        [in] DWORD dwreserved,
        [in] HRESULT hrError,
        [in, unique] LPCWSTR pwzError);
}

/*****************************************************************************
 *    IEnumHLITEM interface
 */
[
    local,
    object,
    uuid(79EAC9C6-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IEnumHLITEM : IUnknown
{
    typedef [unique] IEnumHLITEM *LPENUMHLITEM;

    typedef struct tagHLITEM {
        ULONG  uHLID;
        LPWSTR pwzFriendlyName;
    } HLITEM;
    typedef [unique] HLITEM *LPHLITEM;

    HRESULT Next(
        [in]  ULONG celt,
        [out] HLITEM *rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumHLITEM **ppienumhlitem);
}

/*****************************************************************************
 *    IHlinkBrowseContext interface
 */
[
    local,
    object,
    uuid(79EAC9C7-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IHlinkBrowseContext : IUnknown
{
    typedef [unique] IHlinkBrowseContext *LPHLINKBROWSECONTEXT;

    enum {
        HLTB_DOCKEDLEFT    = 0,
        HLTB_DOCKEDTOP     = 1,
        HLTB_DOCKEDRIGHT   = 2,
        HLTB_DOCKEDBOTTOM  = 3,
        HLTB_FLOATING      = 4
    };

    typedef struct _tagHLTBINFO {
        ULONG uDockType;
        RECT  rcTbPos;
    } HLTBINFO;

    enum {
        HLBWIF_HASFRAMEWNDINFO   = 0x00000001,
        HLBWIF_HASDOCWNDINFO     = 0x00000002,
        HLBWIF_FRAMEWNDMAXIMIZED = 0x00000004,
        HLBWIF_DOCWNDMAXIMIZED   = 0x00000008,
        HLBWIF_HASWEBTOOLBARINFO = 0x00000010,
        HLBWIF_WEBTOOLBARHIDDEN  = 0x00000020
    };

    typedef struct _tagHLBWINFO {
        ULONG    cbSize;
        DWORD    grfHLBWIF;
        RECT     rcFramePos;
        RECT     rcDocPos;
        HLTBINFO hltbinfo;
    } HLBWINFO;

    typedef [unique] HLBWINFO *LPHLBWINFO;

    enum {
        HLID_INVALID     = 0x00000000,
        HLID_PREVIOUS    = 0xFFFFFFFF,
        HLID_NEXT        = 0xFFFFFFFE,
        HLID_CURRENT     = 0xFFFFFFFD,
        HLID_STACKBOTTOM = 0xFFFFFFFC,
        HLID_STACKTOP    = 0xFFFFFFFB
    };

    enum {
        HLQF_ISVALID   = 0x00000001,
        HLQF_ISCURRENT = 0x00000002
    };

    HRESULT Register(
        [in] DWORD reserved,
        [in, unique] IUnknown *piunk,
        [in, unique] IMoniker *pimk,
        [out] DWORD *pdwRegister);

    HRESULT GetObject(
        [in, unique] IMoniker *pimk,
        [in] BOOL fBindIfRootRegistered,
        [out] IUnknown **ppiunk);

    HRESULT Revoke(
        [in] DWORD dwRegister);

    HRESULT SetBrowseWindowInfo(
        [in, unique] HLBWINFO *phlbwi);

    HRESULT GetBrowseWindowInfo(
        [out] HLBWINFO *phlbwi);

    HRESULT SetInitialHlink(
        [in, unique] IMoniker * pimkTarget,
        [in, unique] LPCWSTR pwzLocation,
        [in, unique] LPCWSTR pwzFriendlyName);

    HRESULT OnNavigateHlink(
        [in] DWORD grfHLNF,
        [in, unique] IMoniker *pimkTarget,
        [in, unique] LPCWSTR pwzLocation,
        [in, unique] LPCWSTR pwzFriendlyName,
        [out] ULONG *puHLID);

    HRESULT UpdateHlink(
        [in] ULONG uHLID,
        [in, unique] IMoniker *pimkTarget,
        [in, unique] LPCWSTR pwzLocation,
        [in, unique] LPCWSTR pwzFriendlyName);

    HRESULT EnumNavigationStack(
        [in] DWORD dwReserved,
        [in] DWORD grfHLFNAMEF,
        [out] IEnumHLITEM **ppienumhlitem);

    HRESULT QueryHlink(
        [in] DWORD grfHLQF,
        [in] ULONG uHLID);

    HRESULT GetHlink(
        [in] ULONG uHLID,
        [out] IHlink **ppihl);

    HRESULT SetCurrentHlink(
        [in] ULONG uHLID);

    HRESULT Clone(
        [in, unique] IUnknown *piunkOuter,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppiunkObj);

    HRESULT Close(
        [in] DWORD reserved);
}


/*****************************************************************************
 *    IHlinkTarget interface
 */
[
    object,
    uuid(79EAC9C4-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IHlinkTarget : IUnknown
{
    typedef [unique] IHlinkTarget *LPHLINKTARGET;

    HRESULT SetBrowseContext(
        [in, unique] IHlinkBrowseContext *pihlbc);

    HRESULT GetBrowseContext(
        [out] IHlinkBrowseContext **ppihlbc);

    HRESULT Navigate(
        [in] DWORD grfHLNF,
        [in, unique] LPCWSTR pwzJumpLocation);

    HRESULT GetMoniker(
        [in,unique]  LPCWSTR pwzLocation,
        [in] DWORD dwAssign,
        [out] IMoniker **ppimkLocation);

    HRESULT GetFriendlyName(
        [in,unique]  LPCWSTR pwzLocation,
        [out] LPWSTR *ppwzFriendlyName);
}

/*****************************************************************************
 *    IHlinkFrame interface
 */
[
    object,
    uuid(79eac9c5-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]

interface IHlinkFrame : IUnknown
{
    typedef IHlinkFrame *LPHLINKFRAME;

    HRESULT SetBrowseContext( 
        [in, unique] IHlinkBrowseContext * pihlbc);
    HRESULT GetBrowseContext( 
        [out] IHlinkBrowseContext ** ppihlbc);
    HRESULT Navigate( 
        [in] DWORD grfHLNF, 
        [in, unique] LPBC pbc, 
        [in, unique] IBindStatusCallback *pibsc, 
        [in, unique] IHlink *pihlNavigate);
    HRESULT OnNavigate( 
        [in] DWORD grfHLNF, 
        [in, unique] IMoniker *pimkTarget, 
        [in, unique] LPCWSTR pwzLocation, 
        [in, unique] LPCWSTR pwzFriendlyName, 
        [in] DWORD dwreserved);
    HRESULT UpdateHlink( 
        [in] ULONG uHLID, 
        [in, unique] IMoniker *pimkTarget, 
        [in, unique] LPCWSTR pwzLocation, 
        [in, unique] LPCWSTR pwzFriendlyName);
}
