/*
 * Defines the COM interfaces and APIs related to the IE Web browser
 *
 * Copyright (C) 2001 John R. Sheets (for CodeWeavers)
 * Copyright (C) 2003 Alexandre Julliard
 * Copyright (C) 2004 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 "ocidl.idl";
import "docobj.idl";

#include <olectl.h>
#include <exdispid.h>

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

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

/*****************************************************************************
 * SHDocVw library
 */
[
    uuid(EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B),
    version(1.1),
    helpstring("Microsoft Internet Controls")
]
library SHDocVw
{

importlib("stdole2.tlb");


/*****************************************************************************
 * IWebBrowser interface
 */
[
    object,
    oleautomation,
    uuid(eab22ac1-30c1-11cf-a7eb-0000c05bae0b),
    hidden,
    dual
]
interface IWebBrowser : IDispatch
{
    typedef enum BrowserNavConstants
    {
        navOpenInNewWindow   = 0x1,
        navNoHistory         = 0x2,
        navNoReadFromCache   = 0x4,
        navNoWriteToCache    = 0x8,
        navAllowAutosearch   = 0x10,
        navBrowserBar        = 0x20,
        navHyperlink         = 0x40,
        navEnforceRestricted = 0x80
    } BrowserNavConstants;

    typedef enum RefreshConstants
    {
        REFRESH_NORMAL     = 0,
        REFRESH_IFEXPIRED  = 1,
        REFRESH_COMPLETELY = 3
    } RefreshConstants;

    [id(100)] HRESULT GoBack();
    [id(101)] HRESULT GoForward();
    [id(102)] HRESULT GoHome();
    [id(103)] HRESULT GoSearch();

    [id(104)]
    HRESULT Navigate(
        [in] BSTR URL,
        [in, optional] VARIANT *Flags,
        [in, optional] VARIANT *TargetFrameName,
        [in, optional] VARIANT *PostData,
        [in, optional] VARIANT *Headers);

    [id(DISPID_REFRESH)] HRESULT Refresh();
    [id(105)] HRESULT Refresh2([in, optional] VARIANT *Level);
    [id(106)] HRESULT Stop();
    [id(200), propget] HRESULT Application([out, retval] IDispatch** ppDisp);
    [id(201), propget] HRESULT Parent([out, retval] IDispatch** ppDisp);
    [id(202), propget] HRESULT Container([out, retval] IDispatch** ppDisp);
    [id(203), propget] HRESULT Document([out, retval] IDispatch** ppDisp);
    [id(204), propget] HRESULT TopLevelContainer([out, retval] VARIANT_BOOL* pBool);
    [id(205), propget] HRESULT Type([out, retval] BSTR* Type);
    [id(206), propget] HRESULT Left([out, retval] long *pl);
    [id(206), propput] HRESULT Left([in] long Left);
    [id(207), propget] HRESULT Top([out, retval] long *pl);
    [id(207), propput] HRESULT Top([in] long Top);
    [id(208), propget] HRESULT Width([out, retval] long *pl);
    [id(208), propput] HRESULT Width([in] long Width);
    [id(209), propget] HRESULT Height([out, retval] long *pl);
    [id(209), propput] HRESULT Height([in] long Height);
    [id(210), propget] HRESULT LocationName([out, retval] BSTR *LocationName);
    [id(211), propget] HRESULT LocationURL([out, retval] BSTR *LocationURL);
    [id(212), propget] HRESULT Busy([out, retval] VARIANT_BOOL *pBool);
}

/*****************************************************************************
 * DWebBrowserEvents dispinterface
 */
[
    uuid(eab22ac2-30c1-11CF-a7eb-0000C05bae0b),
    hidden
]
dispinterface DWebBrowserEvents
{
    properties:
    methods:
    [id(DISPID_BEFORENAVIGATE)]
    void BeforeNavigate(
        [in] BSTR URL,
        long Flags,
        BSTR TargetFrameName,
        VARIANT *PostData,
        BSTR Headers,
        [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_NAVIGATECOMPLETE)]
    void NavigateComplete([in] BSTR URL);

    [id(DISPID_STATUSTEXTCHANGE)]
    void StatusTextChange([in] BSTR Text);

    [id(DISPID_PROGRESSCHANGE)]
    void ProgressChange([in] long Progress, [in] long ProgressMax);

    [id(DISPID_DOWNLOADCOMPLETE)]
    void DownloadComplete();

    [id(DISPID_COMMANDSTATECHANGE)]
    void CommandStateChange([in] long Command, [in]VARIANT_BOOL Enable);

    [id(DISPID_DOWNLOADBEGIN)]
    void DownloadBegin();

    [id(DISPID_NEWWINDOW)]
    void NewWindow(
        [in] BSTR URL,
        [in] long Flags,
        [in] BSTR TargetFrameName,
        [in] VARIANT *PostData,
        [in] BSTR Headers,
        [in,out] VARIANT_BOOL *Processed);

    [id(DISPID_TITLECHANGE)]
    void TitleChange([in] BSTR Text);

    [id(DISPID_FRAMEBEFORENAVIGATE)]
    void FrameBeforeNavigate(
        [in] BSTR URL,
        long Flags,
        BSTR TargetFrameName,
        VARIANT *PostData,
        BSTR Headers,
        [in, out]VARIANT_BOOL *Cancel);

    [id(DISPID_FRAMENAVIGATECOMPLETE)]
    void FrameNavigateComplete([in] BSTR URL);

    [id(DISPID_FRAMENEWWINDOW)]
    void FrameNewWindow(
        [in] BSTR URL,
        [in] long Flags,
        [in] BSTR TargetFrameName,
        [in] VARIANT *PostData,
        [in] BSTR Headers,
        [in,out] VARIANT_BOOL *Processed);

    [id(DISPID_QUIT)]
    void Quit([in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_WINDOWMOVE)]
    void WindowMove();

    [id(DISPID_WINDOWRESIZE)]
    void WindowResize();

    [id(DISPID_WINDOWACTIVATE)]
    void WindowActivate();

    [id(DISPID_PROPERTYCHANGE)]
    void PropertyChange([in] BSTR Property);
}

typedef
[
    uuid(34a226e0-df30-11cf-89a9-00a0c9054129)
]
enum CommandStateChangeConstants {
    CSC_UPDATECOMMANDS  = -1,
    CSC_NAVIGATEFORWARD = 1,
    CSC_NAVIGATEBACK    = 2
} CommandStateChangeConstants;

/*****************************************************************************
 * IWebBrowserApp interface
 */
[
    object,
    oleautomation,
    uuid(0002df05-0000-0000-c000-000000000046),
    hidden,
    dual
]
interface IWebBrowserApp : IWebBrowser
{
    [id(300)] HRESULT Quit();
    [id(301)] HRESULT ClientToWindow([in,out] int* pcx, [in,out] int* pcy);
    [id(302)] HRESULT PutProperty([in] BSTR Property, [in] VARIANT vtValue);
    [id(303)] HRESULT GetProperty([in] BSTR Property, [out, retval] VARIANT *pvtValue);
    [id(DISPID_VALUE), propget] HRESULT Name([out, retval] BSTR* Name);
    [id(DISPID_HWND), propget] HRESULT HWND([out, retval] SHANDLE_PTR *pHWND);
    [id(400), propget] HRESULT FullName([out, retval] BSTR* FullName);
    [id(401), propget] HRESULT Path([out, retval] BSTR* Path);
    [id(402), propget] HRESULT Visible([out, retval] VARIANT_BOOL* pBool);
    [id(402), propput] HRESULT Visible([in] VARIANT_BOOL Value);
    [id(403), propget] HRESULT StatusBar([out, retval] VARIANT_BOOL* pBool);
    [id(403), propput] HRESULT StatusBar([in] VARIANT_BOOL Value);
    [id(404), propget] HRESULT StatusText([out, retval] BSTR *StatusText);
    [id(404), propput] HRESULT StatusText([in] BSTR StatusText);
    [id(405), propget] HRESULT ToolBar([out, retval] int * Value);
    [id(405), propput] HRESULT ToolBar([in] int Value);
    [id(406), propget] HRESULT MenuBar([out, retval] VARIANT_BOOL *Value);
    [id(406), propput] HRESULT MenuBar([in] VARIANT_BOOL Value);
    [id(407), propget] HRESULT FullScreen([out, retval] VARIANT_BOOL *pbFullScreen);
    [id(407), propput] HRESULT FullScreen([in] VARIANT_BOOL bFullScreen);
}

/*****************************************************************************
 * IWebBrowser2 interface
 */
[
    object,
    oleautomation,
    uuid(d30c1661-cdaf-11d0-8a3e-00c04fc9e26e),
    hidden,
    dual
]
interface IWebBrowser2 : IWebBrowserApp
{
    [id(500)] HRESULT Navigate2(
        [in] VARIANT *URL,
        [in, optional] VARIANT *Flags,
        [in, optional] VARIANT *TargetFrameName,
        [in, optional] VARIANT *PostData,
        [in, optional] VARIANT *Headers);

    [id(501)] HRESULT QueryStatusWB(
        [in] OLECMDID cmdID,
        [out, retval] OLECMDF *pcmdf);

    [id(502)] HRESULT ExecWB(
        [in] OLECMDID cmdID,
        [in] OLECMDEXECOPT cmdexecopt,
        [in, optional] VARIANT *pvaIn,
        [out, in, optional] VARIANT *pvaOut);

    [id(503)] HRESULT ShowBrowserBar(
        [in] VARIANT *pvaClsid,
        [in, optional] VARIANT *pvarShow,
        [in, optional] VARIANT *pvarSize);

    [id(DISPID_READYSTATE), propget, bindable]
    HRESULT ReadyState([out, retval] READYSTATE *plReadyState);

    [id(550), propget] HRESULT Offline([out, retval] VARIANT_BOOL *pbOffline);
    [id(550), propput] HRESULT Offline([in] VARIANT_BOOL bOffline);
    [id(551), propget] HRESULT Silent([out, retval] VARIANT_BOOL *pbSilent);
    [id(551), propput] HRESULT Silent([in] VARIANT_BOOL bSilent);
    [id(552), propget] HRESULT RegisterAsBrowser([out, retval] VARIANT_BOOL *pbRegister);
    [id(552), propput] HRESULT RegisterAsBrowser([in] VARIANT_BOOL bRegister);
    [id(553), propget] HRESULT RegisterAsDropTarget([out, retval] VARIANT_BOOL *pbRegister);
    [id(553), propput] HRESULT RegisterAsDropTarget([in] VARIANT_BOOL bRegister);
    [id(554), propget] HRESULT TheaterMode([out, retval] VARIANT_BOOL *pbRegister);
    [id(554), propput] HRESULT TheaterMode([in] VARIANT_BOOL bRegister);
    [id(555), propget] HRESULT AddressBar([out, retval] VARIANT_BOOL *Value);
    [id(555), propput] HRESULT AddressBar([in] VARIANT_BOOL Value);
    [id(556), propget] HRESULT Resizable([out, retval] VARIANT_BOOL *Value);
    [id(556), propput] HRESULT Resizable([in] VARIANT_BOOL Value);
}

typedef
[
    uuid(65507be0-91a8-11d3-a845-009027220e6d)
]
enum SecureLockIconConstants {
    secureLockIconUnsecure          = 0,
    secureLockIconMixed             = 1,
    secureLockIconSecureUnknownBits = 2,
    secureLockIconSecure40Bit       = 3,
    secureLockIconSecure56Bit       = 4,
    secureLockIconSecureFortezza    = 5,
    secureLockIconSecure128Bit      = 6
} SecureLockIconConstants;

/*****************************************************************************
 * DWebBrowserEvents2 dispinterface
 */
[
    uuid(34a715a0-6587-11d0-924a-0020afc7ac4d),
    hidden
]
dispinterface DWebBrowserEvents2
{
    properties:
    methods:
    [id(DISPID_STATUSTEXTCHANGE)]
    void StatusTextChange([in] BSTR Text);

    [id(DISPID_PROGRESSCHANGE)]
    void ProgressChange([in] long Progress, [in] long ProgressMax);

    [id(DISPID_COMMANDSTATECHANGE)]
    void CommandStateChange([in] long Command, [in] VARIANT_BOOL Enable);

    [id(DISPID_DOWNLOADBEGIN)]
    void DownloadBegin();

    [id(DISPID_DOWNLOADCOMPLETE)]
    void DownloadComplete();

    [id(DISPID_TITLECHANGE)]
    void TitleChange([in] BSTR Text);

    [id(DISPID_PROPERTYCHANGE)]
    void PropertyChange([in] BSTR szProperty);

    [id(DISPID_BEFORENAVIGATE2)]
    void BeforeNavigate2(
        [in] IDispatch *pDisp,
        [in] VARIANT *URL,
        [in] VARIANT *Flags,
        [in] VARIANT *TargetFrameName,
        [in] VARIANT *PostData,
        [in] VARIANT *Headers,
        [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_NEWWINDOW2)]
    void NewWindow2([in, out] IDispatch **ppDisp, [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_NAVIGATECOMPLETE2)]
    void NavigateComplete2([in] IDispatch *pDisp, [in] VARIANT *URL);

    [id(DISPID_DOCUMENTCOMPLETE)]
    void DocumentComplete([in] IDispatch *pDisp, [in] VARIANT *URL);

    [id(DISPID_ONQUIT)]
    void OnQuit();

    [id(DISPID_ONVISIBLE)]
    void OnVisible([in] VARIANT_BOOL Visible);

    [id(DISPID_ONTOOLBAR)]
    void OnToolBar([in] VARIANT_BOOL ToolBar);

    [id(DISPID_ONMENUBAR)]
    void OnMenuBar([in] VARIANT_BOOL MenuBar);

    [id(DISPID_ONSTATUSBAR)]
    void OnStatusBar([in] VARIANT_BOOL StatusBar);

    [id(DISPID_ONFULLSCREEN)]
    void OnFullScreen([in] VARIANT_BOOL FullScreen);

    [id(DISPID_ONTHEATERMODE)]
    void OnTheaterMode([in] VARIANT_BOOL TheaterMode);

    [id(DISPID_WINDOWSETRESIZABLE)]
    void WindowSetResizable([in] VARIANT_BOOL Resizable);

    [id(DISPID_WINDOWSETLEFT)]
    void WindowSetLeft([in] long Left);

    [id(DISPID_WINDOWSETTOP)]
    void WindowSetTop([in] long Top);

    [id(DISPID_WINDOWSETWIDTH)]
    void WindowSetWidth([in] long Width);

    [id(DISPID_WINDOWSETHEIGHT)]
    void WindowSetHeight([in] long Height);

    [id(DISPID_WINDOWCLOSING)]
    void WindowClosing(
            [in] VARIANT_BOOL IsChildWindow,
            [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_CLIENTTOHOSTWINDOW)]
    void ClientToHostWindow(
            [in, out] long *CX,
            [in, out] long *CY);

    [id(DISPID_SETSECURELOCKICON)]
    void SetSecureLockIcon([in] long SecureLockIcon);

    [id(DISPID_FILEDOWNLOAD)]
    void FileDownload(
            [in] VARIANT_BOOL ActiveDocument,
            [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_NAVIGATEERROR)]
    void NavigateError(
            [in] IDispatch *pDisp,
            [in] VARIANT *URL,
            [in] VARIANT *Frame,
            [in] VARIANT *StatusCode,
            [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_PRINTTEMPLATEINSTANTIATION)]
    void PrintTemplateInstantiation([in] IDispatch *pDisp);

    [id(DISPID_PRINTTEMPLATETEARDOWN)]
    void PrintTemplateTeardown([in] IDispatch *pDisp);

    [id(DISPID_UPDATEPAGESTATUS)]
    void UpdatePageStatus(
            [in] IDispatch *pDisp,
            [in] VARIANT *nPage,
            [in] VARIANT *fDone);

    [id(DISPID_PRIVACYIMPACTEDSTATECHANGE)]
    void PrivacyImpactedStateChange([in] VARIANT_BOOL bImpacted);

    [id(DISPID_NEWWINDOW3)]
    void NewWindow3(
            [in, out] IDispatch **ppDisp,
            [in, out] VARIANT_BOOL *Cancel,
            [in] DWORD dwFlags,
            [in] BSTR bstrUrlContext,
            [in] BSTR bstrUrl);

    [id(DISPID_SETPHISHINGFILTERSTATUS)]
    void SetPhishingFilterStatus([in] long PhishingFilterStatus);

    [id(DISPID_WINDOWSTATECHANGED)]
    void WindowStateChanged(
            [in] DWORD dwWindowStateFlags,
            [in] DWORD dwValidFlagsMask);

    [id(DISPID_NEWPROCESS)]
    void NewProcess(
            [in] long lCauseFlag,
            [in] IDispatch *pWB2,
            [in, out] VARIANT_BOOL *Cancel);

    [id(DISPID_THIRDPARTYURLBLOCKED)]
    void ThirdPartyUrlBlocked(
            [in] VARIANT *URL,
            [in] DWORD dwCount);

    [id(DISPID_REDIRECTXDOMAINBLOCKED)]
    void RedirectXDomainBlocked(
            [in] IDispatch *pDisp,
            [in] VARIANT *StartURL,
            [in] VARIANT *RedirectURL,
            [in] VARIANT *Frame,
            [in] VARIANT *StatusCode);
}

[
    helpstring("Microsoft Web Browser Version 1"),
    threading(apartment),
    progid("Shell.Explorer.1"),
    vi_progid("Shell.Explorer"),
    uuid(eab22ac3-30c1-11cf-a7eb-0000c05bae0b),
    control
]
coclass WebBrowser_V1
{
    interface IWebBrowser2;
    [default] interface IWebBrowser;
    [source] dispinterface DWebBrowserEvents2;
    [default, source] dispinterface DWebBrowserEvents;
}

[
    helpstring("Microsoft Web Browser"),
    threading(apartment),
    progid("Shell.Explorer.2"),
    vi_progid("Shell.Explorer"),
    uuid(8856f961-340a-11d0-a96b-00c04fd705a2),
    control
]
coclass WebBrowser
{
    [default] interface IWebBrowser2;
    interface IWebBrowser;
    [default, source] dispinterface DWebBrowserEvents2;
    [source] dispinterface DWebBrowserEvents;
}

[
    helpstring("Internet Explorer(Ver 1.0)"),
    progid("InternetExplorer.Application.1"),
    vi_progid("InternetExplorer.Application"),
    uuid(0002df01-0000-0000-c000-000000000046)
]
coclass InternetExplorer
{
    [default] interface IWebBrowser2;
              interface IWebBrowserApp;
    [default, source] dispinterface DWebBrowserEvents2;
    [source]          dispinterface DWebBrowserEvents;
}

[
    uuid(C08AFD90-F2A1-11D1-8455-00A0C91F3880),
    hidden
]
coclass ShellBrowserWindow
{
    [default] interface IWebBrowser2;
    interface IWebBrowserApp;
    [default, source] dispinterface DWebBrowserEvents2;
    [source] dispinterface DWebBrowserEvents;
}

typedef
[
    uuid(f41e6981-28e5-11d0-82b4-00a0c90c29c5)
]
enum ShellWindowTypeConstants {
    SWC_EXPLORER = 0,
    SWC_BROWSER  = 1,
    SWC_3RDPARTY = 2,
    SWC_CALLBACK = 4,
    SWC_DESKTOP  = 8
} ShellWindowTypeConstants;

typedef
[
    uuid(7716a370-38Ca-11d0-a48B-00a0c90a8f39)
]
enum ShellWindowFindWindowOptions {
    SWFO_NEEDDISPATCH   = 1,
    SWFO_INCLUDEPENDING = 2,
    SWFO_COOKIEPASSED   = 4
} ShellWindowFindWindowOptions;

[
    uuid(FE4106E0-399A-11D0-A48C-00A0C90A8F39)
]
dispinterface DShellWindowsEvents {
    properties:
    methods:
    [id(DISPID_WINDOWREGISTERED)]
    void WindowRegistered([in] long lCookie);

    [id(DISPID_WINDOWREVOKED)]
    void WindowRevoked([in] long lCookie);
}

[
    object,
    oleautomation,
    uuid(85cb6900-4d95-11cf-960c-0080c7f4ee85),
    dual
]
interface IShellWindows : IDispatch
{
    [propget] HRESULT Count([out, retval] long *Count);

    [id(DISPID_VALUE)]
    HRESULT Item(
            [in, optional] VARIANT index,
            [out, retval] IDispatch **Folder);

    [id(DISPID_NEWENUM)]
    HRESULT _NewEnum([out, retval] IUnknown **ppunk);

    [hidden] HRESULT Register(
            [in] IDispatch *pid,
            [in] long hWnd,
            [in] int swClass,
            [out] long *plCookie);

    [hidden] HRESULT RegisterPending(
            [in] long lThreadId,
            [in] VARIANT *pvarloc,
            [in] VARIANT *pvarlocRoot,
            [in] int swClass,
            [out] long *plCookie);

    [hidden] HRESULT Revoke([in] long lCookie);
    [hidden] HRESULT OnNavigate([in] long lCookie, [in] VARIANT *pvarLoc);
    [hidden] HRESULT OnActivated([in] long lCookie, [in] VARIANT_BOOL fActive);
    [hidden] HRESULT FindWindowSW(
            [in] VARIANT *pvarLoc,
            [in] VARIANT *pvarLocRoot,
            [in] int swClass,
            [out] long *phwnd,
            [in] int swfwOptions,
            [out, retval] IDispatch **ppdispOut);

    [hidden] HRESULT OnCreated([in] long lCookie, [in] IUnknown *punk);
    [hidden] HRESULT ProcessAttachDetach([in] VARIANT_BOOL fAttach);
}

[
    threading(apartment),
    uuid(9ba05972-f6a8-11cf-a442-00a0c90a8f39)
]
coclass ShellWindows
{
    [default] interface IShellWindows;
    [default, source] dispinterface DShellWindowsEvents;
}

[
    odl,
    uuid(729fe2f8-1ea8-11d1-8f85-00C04fc2fbe1),
    dual,
    oleautomation
]
interface IShellUIHelper : IDispatch {
    [id(1), hidden] HRESULT ResetFirstBootMode();
    [id(2), hidden] HRESULT ResetSafeMode();
    [id(3), hidden] HRESULT RefreshOfflineDesktop();

    [id(4)] HRESULT AddFavorite(
            [in] BSTR URL,
            [in, optional] VARIANT* Title);

    [id(5)] HRESULT AddChannel([in] BSTR URL);

    [id(6)] HRESULT AddDesktopComponent(
            [in] BSTR URL,
            [in] BSTR Type,
            [in, optional] VARIANT *Left,
            [in, optional] VARIANT *Top,
            [in, optional] VARIANT *Width,
            [in, optional] VARIANT *Height);

    [id(7)] HRESULT IsSubscribed(
            [in] BSTR URL,
            [out, retval] VARIANT_BOOL *pBool);

    [id(8)] HRESULT NavigateAndFind(
            [in] BSTR URL,
            [in] BSTR strQuery,
            [in] VARIANT *varTargetFrame);

    [id(9)] HRESULT ImportExportFavorites(
            [in] VARIANT_BOOL fImport,
            [in] BSTR strImpExpPath);

    [id(10)] HRESULT AutoCompleteSaveForm([in, optional] VARIANT *Form);

    [id(11)] HRESULT AutoScan(
            [in] BSTR strSearch,
            [in] BSTR strFailureUrl,
            [in, optional] VARIANT *pvarTargetFrame);

    [id(12), hidden] HRESULT AutoCompleteAttach([in, optional] VARIANT *Reserved);

    [id(13)] HRESULT ShowBrowserUI(
            [in] BSTR bstrName,
            [in] VARIANT *pvarIn,
            [out, retval] VARIANT *pvarOut);
}

[
    uuid(a7fe6eda-1932-4281-b881-87b31b8bc52c),
    oleautomation,
    dual
]
interface IShellUIHelper2 : IShellUIHelper {
    [id(DISPID_ADDSEARCHPROVIDER)]
    HRESULT AddSearchProvider([in] BSTR URL);

    [id(DISPID_RUNONCESHOWN)]
    HRESULT RunOnceShown();

    [id(DISPID_SKIPRUNONCE)]
    HRESULT SkipRunOnce();

    [id(DISPID_CUSTOMIZESETTINGS)] HRESULT CustomizeSettings(
        [in] VARIANT_BOOL fSQM,
        [in] VARIANT_BOOL fPhishing,
        [in] BSTR bstrLocale);

    [id(DISPID_SQMENABLED)]
    HRESULT SqmEnabled([out, retval] VARIANT_BOOL *pfEnabled);

    [id(DISPID_PHISHINGENABLED)]
    HRESULT PhishingEnabled([out, retval] VARIANT_BOOL *pfEnabled);

    [id(DISPID_BRANDIMAGEURI)]
    HRESULT BrandImageUri([out, retval] BSTR *pbstrUri);

    [id(DISPID_SKIPTABSWELCOME)]
    HRESULT SkipTabsWelcome();

    [id(DISPID_DIAGNOSECONNECTION)]
    HRESULT DiagnoseConnection();

    [id(DISPID_CUSTOMIZECLEARTYPE)]
    HRESULT CustomizeClearType([in] VARIANT_BOOL fSet);

    [id(DISPID_ISSEARCHPROVIDERINSTALLED)]
    HRESULT IsSearchProviderInstalled(
        [in] BSTR URL,
        [out, retval] DWORD *pdwResult);

    [id(DISPID_ISSEARCHMIGRATED)]
    HRESULT IsSearchMigrated([out, retval] VARIANT_BOOL *pfMigrated);

    [id(DISPID_DEFAULTSEARCHPROVIDER)]
    HRESULT DefaultSearchProvider([out, retval] BSTR *pbstrName);

    [id(DISPID_RUNONCEREQUIREDSETTINGSCOMPLETE)]
    HRESULT RunOnceRequiredSettingsComplete([in] VARIANT_BOOL fComplete);

    [id(DISPID_RUNONCEHASSHOWN)]
    HRESULT RunOnceHasShown([out, retval] VARIANT_BOOL *pfShown);

    [id(DISPID_SEARCHGUIDEURL)]
    HRESULT SearchGuideUrl([out, retval] BSTR *pbstrUrl);
}

[
    helpstring("Microsoft Shell UI Helper"),
    threading(apartment),
    progid("Shell.UIHelper.1"),
    vi_progid("Shell.UIHelper"),
    uuid(64ab4bb7-111e-11d1-8f79-00c04fc2fbe1)
]
coclass ShellUIHelper {
    [default] interface IShellUIHelper2;
}

[
    uuid(55136806-b2de-11d1-b9f2-00a0c98bc547)
]
dispinterface DShellNameSpaceEvents {
    properties:
    methods:
    [id(1)] void FavoritesSelectionChange(
            [in] long cItems,
            [in] long hItem,
            [in] BSTR strName,
            [in] BSTR strUrl,
            [in] long cVisits,
            [in] BSTR strDate,
            [in] long fAvailableOffline);

    [id(2)] void SelectionChange();
    [id(3)] void DoubleClick();
    [id(4)] void Initialized();
}

[
    odl,
    uuid(55136804-b2de-11d1-b9f2-00a0c98bc547),
    hidden,
    dual,
    oleautomation
]
interface IShellFavoritesNameSpace : IDispatch {
    [id(1)] HRESULT MoveSelectionUp();
    [id(2)] HRESULT MoveSelectionDown();
    [id(3)] HRESULT ResetSort();
    [id(4)] HRESULT NewFolder();
    [id(5)] HRESULT Synchronize();
    [id(6)] HRESULT Import();
    [id(7)] HRESULT Export();
    [id(8)] HRESULT InvokeContextMenuCommand([in] BSTR strCommand);
    [id(9)] HRESULT MoveSelectionTo();
    [id(10), propget] HRESULT SubscriptionsEnabled([out, retval] VARIANT_BOOL *pBool);
    [id(11)] HRESULT CreateSubscriptionForSelection([out, retval] VARIANT_BOOL *pBool);
    [id(12)] HRESULT DeleteSubscriptionForSelection([out, retval] VARIANT_BOOL *pBool);
    [id(13)] HRESULT SetRoot([in] BSTR bstrFullPath);
}

[
    odl,
    uuid(e572d3c9-37be-4ae2-825d-d521763e3108),
    hidden,
    dual,
    oleautomation
]
interface IShellNameSpace : IShellFavoritesNameSpace {
    [id(14), propget] HRESULT EnumOptions([out, retval] long* pgrfEnumFlags);
    [id(14), propput] HRESULT EnumOptions([in] long pgrfEnumFlags);

    [id(15), propget] HRESULT SelectedItem([out, retval] IDispatch **pItem);
    [id(15), propput] HRESULT SelectedItem([in] IDispatch *pItem);

    [id(16), propget] HRESULT Root([out, retval] VARIANT *pvar);
    [id(16), propput] HRESULT Root([in] VARIANT pvar);

    [id(17), propget] HRESULT Depth([out, retval] int *piDepth);
    [id(17), propput] HRESULT Depth([in] int piDepth);

    [id(18), propget] HRESULT Mode([out, retval] unsigned int *puMode);
    [id(18), propput] HRESULT Mode([in] unsigned int puMode);

    [id(19), propget] HRESULT Flags([out, retval] unsigned long *pdwFlags);
    [id(19), propput] HRESULT Flags([in] unsigned long pdwFlags);

    [id(20), propput] HRESULT TVFlags([in] unsigned long dwFlags);
    [id(20), propget] HRESULT TVFlags([out, retval] unsigned long *dwFlags);

    [id(21), propget] HRESULT Columns([out, retval] BSTR *bstrColumns);
    [id(21), propput] HRESULT Columns([in] BSTR bstrColumns);

    [id(22), propget] HRESULT CountViewTypes([out, retval] int *piTypes);

    [id(23)] HRESULT SetViewType([in] int iType);
    [id(24)] HRESULT SelectedItems([out, retval] IDispatch **ppid);
    [id(25)] HRESULT Expand([in] VARIANT var,  int iDepth);
    [id(26)] HRESULT UnselectAll();
}

[
    helpstring("Shell Name Space"),
    threading(apartment),
    progid("ShellNameSpace.ShellNameSpace.1"),
    vi_progid("ShellNameSpace.ShellNameSpace"),
    uuid(2f2f1f96-2bc1-4b1c-be28-ea3774f4676a)
]
coclass ShellShellNameSpace {
    [default] interface IShellNameSpace;
    [default, source] dispinterface DShellNameSpaceEvents;
}

[
    helpstring("Shell Name Space"),
    threading(apartment),
    progid("ShellNameSpace.ShellNameSpace.1"),
    vi_progid("ShellNameSpace.ShellNameSpace"),
    uuid(55136805-b2de-11d1-b9f2-00a0c98bc547)
]
coclass ShellNameSpace {
    [default] interface IShellNameSpace;
    [default, source] dispinterface DShellNameSpaceEvents;
}

[
    odl,
    uuid(f3470f24-15fd-11d2-bb2e-00805ff7efca),
    hidden,
    dual,
    oleautomation
]
interface IScriptErrorList : IDispatch {
    [id(10)] HRESULT advanceError();
    [id(11)] HRESULT retreatError();
    [id(12)] HRESULT canAdvanceError([out, retval] long *pfCanAdvance);
    [id(13)] HRESULT canRetreatError([out, retval] long *pfCanRetreat);
    [id(14)] HRESULT getErrorLine([out, retval] long *plLine);
    [id(15)] HRESULT getErrorChar([out, retval] long *plChar);
    [id(16)] HRESULT getErrorCode([out, retval] long *plCode);
    [id(17)] HRESULT getErrorMsg([out, retval] BSTR *pstr);
    [id(18)] HRESULT getErrorUrl([out, retval] BSTR *pstr);
    [id(23)] HRESULT getAlwaysShowLockState([out, retval] long *pfAlwaysShowLocked);
    [id(19)] HRESULT getDetailsPaneOpen([out, retval] long *pfDetailsPaneOpen);
    [id(20)] HRESULT setDetailsPaneOpen(long fDetailsPaneOpen);
    [id(21)] HRESULT getPerErrorDisplay([out, retval] long *pfPerErrorDisplay);
    [id(22)] HRESULT setPerErrorDisplay(long fPerErrorDisplay);
}

[
    uuid(efd01300-160f-11d2-bb2e-00805ff7efca),
    hidden,
    noncreatable
]
coclass CScriptErrorList {
    [default] interface IScriptErrorList;
}

[
    odl,
    uuid(ba9239a4-3dd5-11d2-bf8b-00c04fb93661),
    hidden,
    dual,
    oleautomation
]
interface ISearch : IDispatch {
    [propget] HRESULT Title([out, retval] BSTR *pbstrTitle);
    [propget] HRESULT Id([out, retval] BSTR *pbstrId);
    [propget] HRESULT URL([out, retval] BSTR *pbstrUrl);
}

[
    odl,
    uuid(47c922a2-3dd5-11d2-bf8b-00c04fb93661),
    hidden,
    dual,
    oleautomation
]
interface ISearches : IDispatch {
    [propget] HRESULT Count([out, retval] long *plCount);
    [propget] HRESULT Default([out, retval] BSTR *pbstrDefault);

    HRESULT Item(
            [in, optional] VARIANT index,
            [out, retval] ISearch **ppid);

    [id(DISPID_NEWENUM)]
    HRESULT _NewEnum([out, retval] IUnknown **ppunk);
}

[
    odl,
    uuid(72423e8f-8011-11d2-be79-00a0c9a83da1),
    hidden,
    dual,
    oleautomation
]
interface ISearchAssistantOC : IDispatch {
    [id(1)] HRESULT AddNextMenuItem([in] BSTR bstrText, [in] long idItem);
    [id(2)] HRESULT SetDefaultSearchUrl([in] BSTR bstrUrl);
    [id(3)] HRESULT NavigateToDefaultSearch();

    [id(4)] HRESULT IsRestricted(
            [in] BSTR bstrGuid,
            [out, retval] VARIANT_BOOL *pVal);

    [id(5), propget] HRESULT ShellFeaturesEnabled([out, retval] VARIANT_BOOL *pVal);
    [id(6), propget] HRESULT SearchAssistantDefault([out, retval] VARIANT_BOOL *pVal);
    [id(7), propget] HRESULT Searches([out, retval] ISearches **ppid);
    [id(8), propget] HRESULT InWebFolder([out, retval] VARIANT_BOOL *pVal);

    [id(9)] HRESULT PutProperty(
            [in] VARIANT_BOOL bPerLocale,
            [in] BSTR bstrName,
            [in] BSTR bstrValue);

    [id(10)] HRESULT GetProperty(
            [in] VARIANT_BOOL bPerLocale,
            [in] BSTR bstrName,
            [out, retval] BSTR *pbstrValue);

    [id(11), propput] HRESULT EventHandled([in] VARIANT_BOOL rhs);
    [id(12)] HRESULT ResetNextMenu();
    [id(13)] HRESULT FindOnWeb();
    [id(14)] HRESULT FindFilesOrFolders();
    [id(15)] HRESULT FindComputer();
    [id(16)] HRESULT FindPrinter();
    [id(17)] HRESULT FindPeople();

    [id(18)] HRESULT GetSearchAssistantURL(
            [in] VARIANT_BOOL bSubstitute,
            [in] VARIANT_BOOL bCustomize,
            [out, retval] BSTR *pbstrValue);

    [id(19)] HRESULT NotifySearchSettingsChanged();

    [id(20), propput] HRESULT ASProvider([in] BSTR pProvider);
    [id(20), propget] HRESULT ASProvider([out, retval] BSTR *pProvider);

    [id(21), propput] HRESULT ASSetting([in] int pSetting);
    [id(21), propget] HRESULT ASSetting([out, retval] int *pSetting);

    [id(22)] HRESULT NETDetectNextNavigate();
    [id(23)] HRESULT PutFindText([in] BSTR FindText);
    [id(24), propget] HRESULT Version([out, retval] int *pVersion);

    [id(25)] HRESULT EncodeString(
            [in] BSTR bstrValue,
            [in] BSTR bstrCharSet,
            [in] VARIANT_BOOL bUseUTF8,
            [out, retval] BSTR* pbstrResult);
}

[
    odl,
    uuid(72423e8f-8011-11d2-be79-00a0c9a83da2),
    hidden,
    dual,
    oleautomation
]
interface ISearchAssistantOC2 : ISearchAssistantOC {
    [id(26), propget] HRESULT ShowFindPrinter([out, retval] VARIANT_BOOL *pbShowFindPrinter);
}

[
    odl,
    uuid(72423e8f-8011-11d2-be79-00a0c9a83da3),
    hidden,
    dual,
    oleautomation
]
interface ISearchAssistantOC3 : ISearchAssistantOC2 {
    [id(27), propget] HRESULT SearchCompanionAvailable([out, retval] VARIANT_BOOL *pbAvailable);

    [id(28), propput] HRESULT UseSearchCompanion([in] VARIANT_BOOL pbUseSC);
    [id(28), propget] HRESULT UseSearchCompanion([out, retval] VARIANT_BOOL *pbUseSC);
}

[
    uuid(1611fdda-445b-11d2-85de-00C04fa35c89),
    hidden
]
dispinterface _SearchAssistantEvents {
    properties:
    methods:
    [id(1)] void OnNextMenuSelect([in] long idItem);
    [id(2)] void OnNewSearch();
}

[
    helpstring("SearchAssistantOC"),
    threading(apartment),
    progid("SearchAssistantOC.SearchAssistantOC.1"),
    vi_progid("SearchAssistantOC.SearchAssistantOC"),
    uuid(2e71fd0f-aab1-42c0-9146-6d2c4edcf07d),
    hidden
]
coclass ShellSearchAssistantOC {
    [default] interface ISearchAssistantOC3;
    [default, source] dispinterface _SearchAssistantEvents;
}

[
    threading(apartment),
    progid("SearchAssistantOC.SearchAssistantOC.1"),
    vi_progid("SearchAssistantOC.SearchAssistantOC"),
    uuid(b45ff030-4447-11d2-85de-00C04fa35c89),
    hidden
]
coclass SearchAssistantOC {
    [default] interface ISearchAssistantOC3;
    [default, source] dispinterface _SearchAssistantEvents;
}

} /* library */
