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

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

interface IExtensionServices: IUnknown
{
    typedef IExtensionServices *LPEXTENSIONSERVICES;

    HRESULT SetAdditionalHeaders(
        [in] LPCWSTR pwzAdditionalHeaders);

    HRESULT SetAuthenticateData(
        [in] HWND phwnd,
        [in] LPCWSTR pwzUsername,
        [in] LPCWSTR pwzPassword);
}