/*
 * Deprecated shell interfaces
 *
 * Copyright (C) 2010 Nikolay Sivov 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 "ocidl.idl";
import "shtypes.idl";
import "shobjidl.idl";
import "hlink.idl";
import "exdisp.idl";

cpp_quote("#define TLOG_BACK    -1")
cpp_quote("#define TLOG_FORE    1")

cpp_quote("#define TLMENUF_INCLUDECURRENT   0x00000001")
cpp_quote("#define TLMENUF_CHECKCURRENT     (TLMENUF_INCLUDECURRENT | 0x00000002)")
cpp_quote("#define TLMENUF_BACK             0x00000010")
cpp_quote("#define TLMENUF_FORE             0x00000020")
cpp_quote("#define TLMENUF_BACKANDFORTH     (TLMENUF_BACK | TLMENUF_FORE | TLMENUF_INCLUDECURRENT)")

[
    hidden,
    local,
    object,
    uuid(F46EDB3B-BC2F-11d0-9412-00AA00A3EBD3)
]
interface ITravelEntry : IUnknown
{
    HRESULT Invoke(
        [in] IUnknown *punk);

    HRESULT Update(
        [in] IUnknown *punk,
        [in] BOOL fIsLocalAnchor);

    HRESULT GetPidl(
        [out] LPITEMIDLIST *ppidl);
};

[
    hidden,
    local,
    object,
    uuid(66A9CB08-4802-11d2-A561-00A0C92DBFE8)
]
interface ITravelLog : IUnknown
{
    HRESULT AddEntry(
        [in] IUnknown *punk,
        [in] BOOL fIsLocalAnchor);

    HRESULT UpdateEntry(
        [in] IUnknown *punk,
        [in] BOOL fIsLocalAnchor);

    HRESULT UpdateExternal(
        [in] IUnknown *punk,
        [in] IUnknown *punkHLBrowseContext);

    HRESULT Travel(
        [in] IUnknown *punk,
        [in] int iOffset);

    HRESULT GetTravelEntry(
        [in]  IUnknown *punk,
        [in]  int iOffset,
        [optional, out] ITravelEntry **ppte);

    HRESULT FindTravelEntry(
        [in]  IUnknown *punk,
        [in]  LPCITEMIDLIST pidl,
        [out] ITravelEntry **ppte);

    HRESULT GetToolTipText(
        [in]  IUnknown *punk,
        [in]  int iOffset,
        [in]  int idsTemplate,
        [out, size_is(cchText)] LPWSTR pwzText,
        [in]  DWORD cchText);

    HRESULT InsertMenuEntries(
        [in] IUnknown *punk,
        [in] HMENU hmenu,
        [in] int nPos,
        [in] int idFirst,
        [in] int idLast,
        [in] DWORD dwFlags);

    HRESULT Clone(
        [out] ITravelLog **pptl);

    DWORD CountEntries(
        [in] IUnknown *punk);

    HRESULT Revert();
};

typedef void *CIE4ConnectionPoint;

[
    local,
    object,
    uuid(0D7D1D00-6FC0-11D0-A974-00C04FD705A2)
]
interface IExpDispSupport : IUnknown
{
    HRESULT FindCIE4ConnectionPoint(
        REFIID riid,
        CIE4ConnectionPoint **ppccp);

    HRESULT OnTranslateAccelerator(
        MSG  *pMsg,
        DWORD grfModifiers);

    HRESULT OnInvoke(
        DISPID dispidMember,
        REFIID iid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pdispparams,
        VARIANT *pVarResult,
        EXCEPINFO *pexcepinfo,
        UINT *puArgErr);
};

typedef enum tagBNSTATE
{
    BNS_NORMAL = 0,
    BNS_BEGIN_NAVIGATE = 1,
    BNS_NAVIGATE = 2

} BNSTATE;

enum {
    SBSC_HIDE = 0,
    SBSC_SHOW = 1,
    SBSC_TOGGLE = 2,
    SBSC_QUERY =  3
};

cpp_quote("#define BSF_REGISTERASDROPTARGET     0x00000001")
cpp_quote("#define BSF_THEATERMODE              0x00000002")
cpp_quote("#define BSF_NOLOCALFILEWARNING       0x00000010")
cpp_quote("#define BSF_UISETBYAUTOMATION        0x00000100")
cpp_quote("#define BSF_RESIZABLE                0x00000200")
cpp_quote("#define BSF_CANMAXIMIZE              0x00000400")
cpp_quote("#define BSF_TOPBROWSER               0x00000800")
cpp_quote("#define BSF_NAVNOHISTORY             0x00001000")
cpp_quote("#define BSF_HTMLNAVCANCELED          0x00002000")
cpp_quote("#define BSF_DONTSHOWNAVCANCELPAGE    0x00004000")
cpp_quote("#define BSF_SETNAVIGATABLECODEPAGE   0x00008000")
cpp_quote("#define BSF_DELEGATEDNAVIGATION      0x00010000")
cpp_quote("#define BSF_TRUSTEDFORACTIVEX        0x00020000")

cpp_quote("#define HLNF_CALLERUNTRUSTED             0x00200000")
cpp_quote("#define HLNF_TRUSTEDFORACTIVEX           0x00400000")
cpp_quote("#define HLNF_DISABLEWINDOWRESTRICTIONS   0x00800000")
cpp_quote("#define HLNF_TRUSTFIRSTDOWNLOAD          0x01000000")
cpp_quote("#define HLNF_UNTRUSTEDFORDOWNLOAD        0x02000000")
cpp_quote("#define SHHLNF_NOAUTOSELECT              0x04000000")
cpp_quote("#define SHHLNF_WRITENOHISTORY            0x08000000")
cpp_quote("#define HLNF_EXTERNALNAVIGATE            0x10000000")
cpp_quote("#define HLNF_ALLOW_AUTONAVIGATE          0x20000000")
cpp_quote("#define HLNF_NEWWINDOWSMANAGED           0x80000000")

[
    local,
    object,
    uuid(02ba3b52-0547-11d1-b833-00c04fc9b31f)
]
interface IBrowserService : IUnknown
{
    HRESULT GetParentSite(
        [out] IOleInPlaceSite **ppipsite);

    HRESULT SetTitle(
        [in] IShellView *psv,
        [in] LPCWSTR pszName);

    HRESULT GetTitle(
        [in] IShellView *psv,
        [out, size_is(cchName)] LPWSTR pszName,
        [in] DWORD cchName);

    HRESULT GetOleObject(
        [out] IOleObject **ppobjv);

    HRESULT GetTravelLog(
        [out, optional] ITravelLog **pptl);

    HRESULT ShowControlWindow(
        [in] UINT id,
        [in] BOOL fShow);

    HRESULT IsControlWindowShown(
        [in] UINT id,
        [out] BOOL *pfShown);

    HRESULT IEGetDisplayName(
        [in] PCIDLIST_ABSOLUTE pidl,
        [out] LPWSTR pwszName,
        [in] UINT uFlags);

    HRESULT IEParseDisplayName(
        [in] UINT uiCP,
        [in] LPCWSTR pwszPath,
        [out] PIDLIST_ABSOLUTE *ppidlOut);

    HRESULT DisplayParseError(
        [in] HRESULT hres,
        [in] LPCWSTR pwszPath);

    HRESULT NavigateToPidl(
        [in] PCIDLIST_ABSOLUTE pidl,
        [in] DWORD grfHLNF);

    HRESULT SetNavigateState(
        [in] BNSTATE bnstate);

    HRESULT GetNavigateState(
        [out] BNSTATE *pbnstate);

    HRESULT NotifyRedirect(
        [in] IShellView *psv,
        [in] PCIDLIST_ABSOLUTE pidl,
        [out] BOOL *pfDidBrowse);

    HRESULT UpdateWindowList();

    HRESULT UpdateBackForwardState();

    HRESULT SetFlags(
        [in] DWORD dwFlags,
        [in] DWORD dwFlagMask);

    HRESULT GetFlags(
        [out] DWORD *pdwFlags);

    HRESULT CanNavigateNow();

    HRESULT GetPidl(
        [out] PIDLIST_ABSOLUTE *ppidl);

    HRESULT SetReferrer(
        [in] PCIDLIST_ABSOLUTE pidl);

    DWORD GetBrowserIndex();

    HRESULT GetBrowserByIndex(
        [in] DWORD dwID,
        [out] IUnknown **ppunk);

    HRESULT GetHistoryObject(
        [out] IOleObject **ppole,
        [out] IStream **pstm,
        [out] IBindCtx **ppbc);

    HRESULT SetHistoryObject(
        [in] IOleObject *pole,
        [in] BOOL fIsLocalAnchor);

    HRESULT CacheOLEServer(
        [in] IOleObject *pole);

    HRESULT GetSetCodePage(
        [in] VARIANT *pvarIn,
        [out] VARIANT *pvarOut);

    HRESULT OnHttpEquiv(
        [in] IShellView *psv,
        [in] BOOL fDone,
        [in] VARIANT *pvarargIn,
        [out] VARIANT *pvarargOut);

    HRESULT GetPalette(
        [out] HPALETTE *hpal);

    HRESULT RegisterWindow(
        [in] BOOL fForceRegister,
        [in] int swc);
}

[
    object,
    local,
    uuid(5836fb00-8187-11cf-a12b-00aa004ae837)
]
interface IShellService : IUnknown
{
    HRESULT SetOwner( [in] IUnknown *pUnk );
}

cpp_quote("#if 0")
typedef HANDLE HMONITOR;
cpp_quote("#endif")

enum {
    SECURELOCK_NOCHANGE                 = -1,
    SECURELOCK_SET_UNSECURE             = 0,
    SECURELOCK_SET_MIXED                = 1,
    SECURELOCK_SET_SECUREUNKNOWNBIT     = 2,
    SECURELOCK_SET_SECURE40BIT          = 3,
    SECURELOCK_SET_SECURE56BIT          = 4,
    SECURELOCK_SET_FORTEZZA             = 5,
    SECURELOCK_SET_SECURE128BIT         = 6,
    SECURELOCK_FIRSTSUGGEST             = 7,
    SECURELOCK_SUGGEST_UNSECURE         = SECURELOCK_FIRSTSUGGEST,
    SECURELOCK_SUGGEST_MIXED            = 8,
    SECURELOCK_SUGGEST_SECUREUNKNOWNBIT = 9,
    SECURELOCK_SUGGEST_SECURE40BIT      = 10,
    SECURELOCK_SUGGEST_SECURE56BIT      = 11,
    SECURELOCK_SUGGEST_FORTEZZA         = 12,
    SECURELOCK_SUGGEST_SECURE128BIT     = 13,
};


typedef struct {
    HWND _hwnd;
    ITravelLog *_ptl;
    IHlinkFrame *_phlf;
    IWebBrowser2 *_pautoWB2;
    IExpDispSupport *_pautoEDS;
    IShellService *_pautoSS;
    int _eSecureLockIcon;
    DWORD _fCreatingViewWindow;
    UINT _uActivateState;

    LPCITEMIDLIST _pidlNewShellView;

    IOleCommandTarget *_pctView;

    LPITEMIDLIST _pidlCur;
    IShellView *_psv;
    IShellFolder *_psf;
    HWND _hwndView;
    LPWSTR _pszTitleCur;

    LPITEMIDLIST _pidlPending;
    IShellView *_psvPending;
    IShellFolder *_psfPending;
    HWND _hwndViewPending;
    LPWSTR _pszTitlePending;

    BOOL _fIsViewMSHTML;
    BOOL _fPrivacyImpacted;

} BASEBROWSERDATA, *LPBASEBROWSERDATA;
typedef const BASEBROWSERDATA *LPCBASEBROWSERDATA;

cpp_quote("#define VIEW_PRIORITY_RESTRICTED         0x00000070")
cpp_quote("#define VIEW_PRIORITY_CACHEHIT           0x00000050")
cpp_quote("#define VIEW_PRIORITY_STALECACHEHIT      0x00000045")
cpp_quote("#define VIEW_PRIORITY_USEASDEFAULT       0x00000043")
cpp_quote("#define VIEW_PRIORITY_SHELLEXT           0x00000040")
cpp_quote("#define VIEW_PRIORITY_CACHEMISS          0x00000030")
cpp_quote("#define VIEW_PRIORITY_INHERIT            0x00000020")
cpp_quote("#define VIEW_PRIORITY_SHELLEXT_ASBACKUP  0x0015")
cpp_quote("#define VIEW_PRIORITY_DESPERATE          0x00000010")
cpp_quote("#define VIEW_PRIORITY_NONE               0x00000000")

typedef struct tagFolderSetData {
    FOLDERSETTINGS _fs;
    SHELLVIEWID _vidRestore;
    DWORD _dwViewPriority;
} FOLDERSETDATA, *LPFOLDERSETDATA;

typedef struct SToolbarItem {
    IDockingWindow *ptbar;
    BORDERWIDTHS rcBorderTool;
    LPWSTR pwszItem;
    BOOL fShow;
    HMONITOR hMon;
} TOOLBARITEM, *LPTOOLBARITEM;

cpp_quote("#define ITB_VIEW        ((UINT)-1)")

[
    local,
    object,
    uuid(68BD21CC-438B-11d2-A560-00A0C92DBFE8)
]
interface IBrowserService2 : IBrowserService
{
    LRESULT WndProcBS(
        [in] HWND hwnd,
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);

    HRESULT SetAsDefFolderSettings();

    HRESULT GetViewRect(
        [in, out] RECT *prc);

    HRESULT OnSize(
        [in] WPARAM wParam);

    HRESULT OnCreate(
        [in] struct tagCREATESTRUCTW *pcs);

    LRESULT OnCommand(
        [in] WPARAM wParam,
        [in] LPARAM lParam);

    HRESULT OnDestroy();

    LRESULT OnNotify(
        [in, out] struct tagNMHDR *pnm);

    HRESULT OnSetFocus();

    HRESULT OnFrameWindowActivateBS(
        [in] BOOL fActive);

    HRESULT ReleaseShellView();

    HRESULT ActivatePendingView();

    HRESULT CreateViewWindow(
        [in] IShellView *psvNew,
        [in] IShellView *psvOld,
        [out] LPRECT prcView,
        [out] HWND *phwnd);

    HRESULT CreateBrowserPropSheetExt(
        [in] REFIID riid,
        [out] void **ppv);

    HRESULT GetViewWindow(
        [out] HWND *phwndView);

    HRESULT GetBaseBrowserData(
        [in, out] LPCBASEBROWSERDATA *pbbd);

    LPBASEBROWSERDATA PutBaseBrowserData();

    HRESULT InitializeTravelLog(
        [in] ITravelLog *ptl,
        [in] DWORD dw);

    HRESULT SetTopBrowser();

    HRESULT Offline(
        [in] int iCmd);

    HRESULT AllowViewResize(
        [in] BOOL f);

    HRESULT SetActivateState(
        [in] UINT u);

    HRESULT UpdateSecureLockIcon(
        [in] int eSecureLock);

    HRESULT InitializeDownloadManager();

    HRESULT InitializeTransitionSite();

    HRESULT _Initialize(
        [in] HWND hwnd,
        [in] IUnknown *pauto);

    HRESULT _CancelPendingNavigationAsync();

    HRESULT _CancelPendingView();

    HRESULT _MaySaveChanges();

    HRESULT _PauseOrResumeView(
        [in] BOOL fPaused);

    HRESULT _DisableModeless();

    HRESULT _NavigateToPidl(
        [in] LPCITEMIDLIST pidl,
        [in] DWORD grfHLNF,
        [in] DWORD dwFlags);

    HRESULT _TryShell2Rename(
        [in] IShellView *psv,
        [in] LPCITEMIDLIST pidlNew);

    HRESULT _SwitchActivationNow();

    HRESULT _ExecChildren(
        [in] IUnknown *punkBar,
        [in] BOOL fBroadcast,
        [in] const GUID *pguidCmdGroup,
        [in] DWORD nCmdID,
        [in] DWORD nCmdexecopt,
        [in] VARIANTARG *pvarargIn,
        [in, out] VARIANTARG *pvarargOut);

    HRESULT _SendChildren(
        [in] HWND hwndBar,
        [in] BOOL fBroadcast,
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);

    HRESULT GetFolderSetData(
        [in, out] struct tagFolderSetData *pfsd);

    HRESULT _OnFocusChange(
        [in] UINT itb);

    HRESULT v_ShowHideChildWindows(
        [in] BOOL fChildOnly);

    UINT _get_itbLastFocus();

    HRESULT _put_itbLastFocus(
        [in] UINT itbLastFocus);

    HRESULT _UIActivateView(
        [in] UINT uState);

    HRESULT _GetViewBorderRect(
        [in, out] RECT* prc);

    HRESULT _UpdateViewRectSize();

    HRESULT _ResizeNextBorder(
        [in] UINT itb);

    HRESULT _ResizeView();

    HRESULT _GetEffectiveClientArea(
        [in, out] LPRECT lprectBorder,
        [in] HMONITOR hmon);

    IStream* v_GetViewStream(
        [in] LPCITEMIDLIST pidl,
        [in] DWORD grfMode,
        [in] LPCWSTR pwszName);

    LRESULT ForwardViewMsg(
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);

    HRESULT SetAcceleratorMenu(
        [in] HACCEL hacc);

    int _GetToolbarCount();

    LPTOOLBARITEM _GetToolbarItem(
        [in] int itb);

    HRESULT _SaveToolbars(
        [in] IStream *pstm);

    HRESULT _LoadToolbars(
        [in] IStream *pstm);

    HRESULT _CloseAndReleaseToolbars(
        [in] BOOL fClose);

    HRESULT v_MayGetNextToolbarFocus(
        [in] LPMSG lpMsg,
        [in] UINT itbNext,
        [in] int citb,
        [out] LPTOOLBARITEM *pptbi,
        [out] HWND *phwnd);

    HRESULT _ResizeNextBorderHelper(
        [in] UINT itb,
        [in] BOOL bUseHmonitor);

    UINT _FindTBar(
        [in] IUnknown *punkSrc);

    HRESULT _SetFocus(
        [in] LPTOOLBARITEM ptbi,
        [in] HWND hwnd,
        [in] LPMSG lpMsg);

    HRESULT v_MayTranslateAccelerator(
        [in] MSG* pmsg);

    HRESULT _GetBorderDWHelper(
        [in] IUnknown *punkSrc,
        [in] LPRECT lprectBorder,
        [in] BOOL bUseHmonitor);

    HRESULT v_CheckZoneCrossing(
        [in, out] LPCITEMIDLIST pidl);
};
