/*
 * 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 HlinkCreateExtensionServices(LPCWSTR, HWND, LPCWSTR, LPCWSTR, 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*);")
cpp_quote("HRESULT WINAPI HlinkIsShortcut(LPCWSTR);")
cpp_quote("HRESULT WINAPI HlinkTranslateURL(LPCWSTR,DWORD,LPWSTR*);")
cpp_quote("HRESULT WINAPI HlinkParseDisplayName(LPBC,LPCWSTR,BOOL,ULONG*,IMoniker**);");
cpp_quote("HRESULT WINAPI HlinkResolveMonikerForData(LPMONIKER,DWORD,LPBC,ULONG,FORMATETC*,IBindStatusCallback*,LPMONIKER);")

typedef enum _HLSR_NOREDEF10 {
    HLSR_HOME,
    HLSR_SEARCHPAGE,
    HLSR_HISTORYFOLDER
} HLSR;

cpp_quote("HRESULT WINAPI HlinkSetSpecialReference(ULONG uReference, LPCWSTR pwzReference);")
cpp_quote("HRESULT WINAPI HlinkGetSpecialReference(ULONG uReference, LPWSTR *ppwzReference);")

cpp_quote("#define SID_SHlinkFrame IID_IHlinkFrame")

/*****************************************************************************
 *    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);

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetObject")
cpp_quote("#endif")

    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);
}
