/*
 * COM interfaces for shell objects
 *
 * Copyright (C) 2004 Maxime Bellengé
 *
 * 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";

#include <shdispid.h>

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

/*****************************************************************************
 * IEnumACString interface
 */
[
    local,
    object,
    uuid(8e74c210-cf9d-4eaf-a403-7356428f0a5a),
    pointer_default(unique)
]
interface IEnumACString : IEnumString
{
    typedef IEnumACString *PENUMACSTRING, *LPENUMACSTRING;

    typedef enum _tagACENUMOPTION
    {
        ACEO_NONE            = 0x00000000,
        ACEO_MOSTRECENTFIRST = 0x00000001,
        ACEO_FIRSTUNUSED     = 0x00010000,
    } ACENUMOPTION;

    HRESULT NextItem( [out] LPWSTR pszUrl,
                      [in] ULONG cchMax,
                      [out] ULONG *pulSortIndex);

    HRESULT SetEnumOptions( [in] DWORD dwOptions );

    HRESULT GetEnumOptions( [out] DWORD *pdwOptions );
}

/*****************************************************************************
 * IAutoComplete interface
 */
[
    local,
    object,
    uuid(00bb2762-6a77-11d0-a535-00c04fd7d062),
    pointer_default(unique)
]
interface IAutoComplete : IUnknown
{
    typedef IAutoComplete *LPAUTOCOMPLETE;

    HRESULT Init( [in] HWND hwndEdit,
		  [in] IUnknown *punkACL,
		  [in] LPCOLESTR pwszRegKeyPath,
		  [in] LPCOLESTR pwszQuickComplete);
    
    HRESULT Enable( [in] BOOL fEnable );
}

/*****************************************************************************
 * IAutoComplete2 interface
 */
[
    local,
    object,
    uuid(eac04bc0-3791-11d2-bb95-0060977b464c),
    pointer_default(unique)
]
interface IAutoComplete2 : IAutoComplete
{
    typedef IAutoComplete2 *LPAUTOCOMPLETE2;

    typedef enum _tagAUTOCOMPLETEOPTIONS
	{
	    ACO_NONE           = 0x00,      /* No AutoComplete */
	    ACO_AUTOSUGGEST    = 0x01,      /* enable autosuggest dropdown */
	    ACO_AUTOAPPEND     = 0x02,      /* enable autoappend */
	    ACO_SEARCH         = 0x04,      /* add search entry to completion list */
	    ACO_FILTERPREFIXES = 0x08,      /* don't match common prefixes (www., http://, etc) */
	    ACO_USETAB         = 0x10,      /* use tab to select autosuggest entries */
	    ACO_UPDOWNKEYDROPSLIST = 0x20,  /* up/down arrow key invokes autosuggest dropdown (if enabled) */
	    ACO_RTLREADING     = 0x40,      /* enable RTL reading order for dropdown */
	} AUTOCOMPLETEOPTIONS;

    HRESULT SetOptions( [in] DWORD dwFlag);

    HRESULT GetOptions( [out] DWORD *pdwFlag);
}

[
    uuid(50a7e9b0-70ef-11d1-b75a-00a0c90564fe),
    version(1.0)
]
library Shell32
{

importlib("stdole2.tlb");

[
    object,
    oleautomation,
    uuid(9ba05970-f6a8-11cf-a442-00a0c90a8f39),
    pointer_default(unique)
]
interface IFolderViewOC : IDispatch
{
    HRESULT SetFolderView( [in] IDispatch *pdisp );
}

[
    uuid(62112aa2-ebe4-11cf-a5fb-0020afe7292d)
]
dispinterface DShellFolderViewEvents
{
    properties:
    methods:
    [id(DISPID_SELECTIONCHANGED)]
    void SelectionChanged();

    [id(DISPID_FILELISTENUMDONE)]
    void EnumDone();

    [id(DISPID_VERBINVOKED)]
    VARIANT_BOOL VerbInvoked();

    [id(DISPID_DEFAULTVERBINVOKED)]
    VARIANT_BOOL DefaultVerbInvoked();

    [id(DISPID_BEGINDRAG)]
    VARIANT_BOOL BeginDrag();
}

[
    uuid(9ba05971-f6a8-11cf-a442-00a0c90a8f39),
    hidden
]
coclass ShellFolderViewOC
{
    [default]         interface     IFolderViewOC;
    [default, source] dispinterface DShellFolderViewEvents;
}

interface FolderItem;
interface FolderItems;
interface FolderItemVerb;
interface FolderItemVerbs;

/*****************************************************************************
 * Folder interface
 */
[
    object,
    uuid(bbcbde60-c3ff-11ce-8350-444553540000),
    oleautomation,
    dual
]
interface Folder : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Title( [out, retval] BSTR *pbs );

    [propget]
    HRESULT Application( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT Parent( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT ParentFolder( [out, retval] Folder **ppsf );

    HRESULT Items( [out, retval] FolderItems **ppid );

    HRESULT ParseName( [in] BSTR bName, [out, retval] FolderItem **ppid );

    HRESULT NewFolder( [in] BSTR bName, [in, optional] VARIANT vOptions );

    HRESULT MoveHere( [in] VARIANT vItem, [in, optional] VARIANT vOptions );

    HRESULT CopyHere( [in] VARIANT vItem, [in, optional] VARIANT vOptions );

    HRESULT GetDetailsOf( [in] VARIANT vItem,
        [in] int iColumn,
        [out, retval] BSTR *pbs );
}

/*****************************************************************************
 * Folder2 interface
 */
[
    object,
    uuid(f0d2d8ef-3890-11d2-bf8b-00c04fb93661),
    oleautomation,
    dual
]
interface Folder2 : Folder
{
    [propget]
    HRESULT Self( [out, retval] FolderItem **ppfi );

    [propget]
    HRESULT OfflineStatus( [out, retval] LONG *pul );

    HRESULT Synchronize();

    [propget, id(1)]
    HRESULT HaveToShowWebViewBarricade(
        [out, retval] VARIANT_BOOL *pbHaveToShowWebViewBarricade );

    HRESULT DismissedWebViewBarricade();
}

/*****************************************************************************
 * Folder3 interface
 */
[
    object,
    uuid(a7ae5f64-c4d7-4d7f-9307-4d24ee54b841),
    oleautomation,
    dual
]
interface Folder3 : Folder2
{
    [propget, id(2)]
    HRESULT ShowWebViewBarricade(
        [out, retval] VARIANT_BOOL *pbShowWebViewBarricade );

    [propput, id(2)]
    HRESULT ShowWebViewBarricade( [in] VARIANT_BOOL bShowWebViewBarricade );
}

/*****************************************************************************
 * FolderItem interface
 */
[
    object,
    uuid(fac32c80-cbe4-11ce-8350-444553540000),
    oleautomation,
    dual
]
interface FolderItem : IDispatch
{
    typedef FolderItem *LPFOLDERITEM;

    [propget]
    HRESULT Application( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT Parent( [out, retval] IDispatch **ppid );

    [propget, id(DISPID_VALUE)]
    HRESULT Name( [out, retval] BSTR *pbs );

    [propput, id(DISPID_VALUE)]
    HRESULT Name( [in] BSTR bs );

    [propget]
    HRESULT Path( [out, retval] BSTR *pbs );

    [propget]
    HRESULT GetLink( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT GetFolder( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT IsLink( [out, retval] VARIANT_BOOL *pb );

    [propget]
    HRESULT IsFolder( [out, retval] VARIANT_BOOL *pb );

    [propget]
    HRESULT IsFileSystem( [out, retval] VARIANT_BOOL *pb );

    [propget]
    HRESULT IsBrowsable( [out, retval] VARIANT_BOOL *pb );

    [propget]
    HRESULT ModifyDate( [out, retval] DATE *pdt );

    [propput]
    HRESULT ModifyDate( [in] DATE dt );

    [propget]
    HRESULT Size( [out, retval] LONG *pul );

    [propget]
    HRESULT Type( [out, retval] BSTR *pbs );

    HRESULT Verbs( [out, retval] FolderItemVerbs **ppfic );

    HRESULT InvokeVerb( [in, optional] VARIANT vVerb );
}

[
    object,
    uuid(edc817aa-92b8-11d1-b075-00c04fc33aa5),
    oleautomation,
    dual
]
interface FolderItem2 : FolderItem
{
    HRESULT InvokeVerbEx([in, optional] VARIANT verb, [in, optional] VARIANT args);
    HRESULT ExtendedProperty([in] BSTR propname, [out, retval] VARIANT *ret);
}

/*****************************************************************************
 * FolderItems interface
 */
[
    object,
    uuid(744129e0-cbe5-11ce-8350-444553540000),
    oleautomation,
    dual
]
interface FolderItems : IDispatch
{
    [propget]
    HRESULT Count( [out, retval] long *plCount );

    [propget]
    HRESULT Application( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT Parent( [out, retval] IDispatch **ppid );

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

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

/*****************************************************************************
 * FolderItemVerb interface
 */
[
    object,
    uuid(08ec3e00-50b0-11cf-960c-0080c7f4ee85),
    oleautomation,
    dual
]
interface FolderItemVerb : IDispatch
{
    [propget]
    HRESULT Application( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT Parent( [out, retval] IDispatch **ppid );

    [propget, id(DISPID_VALUE)]
    HRESULT Name( [out, retval] BSTR *pbs );

    HRESULT DoIt();
}

/*****************************************************************************
 * FolderItemVerbs interface
 */
[
    object,
    uuid(1f8352c0-50b0-11cf-960c-0080c7f4ee85),
    oleautomation,
    dual
]
interface FolderItemVerbs : IDispatch
{
    [propget]
    HRESULT Count( [out, retval] long *plCount );

    [propget]
    HRESULT Application( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT Parent( [out, retval] IDispatch **ppid );

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

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

/*****************************************************************************
 * IShellDispatch interface
 */
[
    object,
    uuid(d8f015c0-c278-11ce-a49e-444553540000),
    oleautomation,
    hidden,
    dual
]
interface IShellDispatch : IDispatch
{
    [propget]
    HRESULT Application( [out, retval] IDispatch **ppid );

    [propget]
    HRESULT Parent( [out, retval] IDispatch **ppid );

    HRESULT NameSpace( [in] VARIANT vDir, [out, retval] Folder **ppsdf );

    HRESULT BrowseForFolder( [in] long Hwnd,
        [in] BSTR Title,
        [in] long Options,
        [in, optional] VARIANT RootFolder,
        [out, retval] Folder **ppsdf );

    HRESULT Windows( [out, retval] IDispatch **ppid );

    HRESULT Open( [in] VARIANT vDir );

    HRESULT Explore( [in] VARIANT vDir );

    HRESULT MinimizeAll();

    HRESULT UndoMinimizeALL();

    HRESULT FileRun();

    HRESULT CascadeWindows();

    HRESULT TileVertically();

    HRESULT TileHorizontally();

    HRESULT ShutdownWindows();

    HRESULT Suspend();

    HRESULT EjectPC();

    HRESULT SetTime();

    HRESULT TrayProperties();

    HRESULT Help();

    HRESULT FindFiles();

    HRESULT FindComputer();

    HRESULT RefreshMenu();

    HRESULT ControlPanelItem( [in] BSTR szDir );
}

[
    object,
    uuid(a4c6892c-3ba9-11d2-9dea-00c04fb16162),
    oleautomation,
    hidden,
    dual
]
interface IShellDispatch2 : IShellDispatch
{
    HRESULT IsRestricted([in] BSTR group, [in] BSTR restriction, [out, retval] long *value);
    HRESULT ShellExecute([in] BSTR file, [in, optional] VARIANT args, [in, optional] VARIANT dir,
        [in, optional] VARIANT op, [in, optional] VARIANT show);
    HRESULT FindPrinter([in, optional] BSTR name, [in, optional] BSTR location, [in, optional] BSTR model);
    HRESULT GetSystemInformation([in] BSTR name, [out, retval] VARIANT *ret);
    HRESULT ServiceStart([in] BSTR service, [in] VARIANT persistent, [out, retval] VARIANT *ret);
    HRESULT ServiceStop([in] BSTR service, [in] VARIANT persistent, [out, retval] VARIANT *ret);
    HRESULT IsServiceRunning([in] BSTR service, [out, retval] VARIANT *running);
    HRESULT CanStartStopService([in] BSTR service, [out, retval] VARIANT *ret);
    HRESULT ShowBrowserBar([in] BSTR clsid, [in] VARIANT show, [out, retval] VARIANT *ret);
}

[
    object,
    uuid(177160ca-bb5a-411c-841d-bd38facdeaa0),
    oleautomation,
    hidden,
    dual
]
interface IShellDispatch3 : IShellDispatch2
{
    HRESULT AddToRecent([in] VARIANT file, [in, optional] BSTR category);
}

[
    object,
    uuid(efd84b2d-4bcf-4298-be25-eb542a59fbda),
    oleautomation,
    hidden,
    dual
]
interface IShellDispatch4 : IShellDispatch3
{
    HRESULT WindowsSecurity();
    HRESULT ToggleDesktop();
    HRESULT ExplorerPolicy([in] BSTR policy, [out, retval] VARIANT *value);
    HRESULT GetSetting([in] long setting, [out,retval] VARIANT_BOOL *result);
}

[
    object,
    uuid(866738b9-6cf2-4de8-8767-f794ebe74f4e),
    oleautomation,
    hidden,
    dual
]
interface IShellDispatch5 : IShellDispatch4
{
    HRESULT WindowSwitcher();
}

[
    uuid(13709620-c279-11ce-a49e-444553540000)
]
coclass Shell
{
    [default] interface IShellDispatch2;
}

[
    uuid(0a89a860-d7b1-11ce-8350-444553540000),
    hidden
]
coclass ShellDispatchInproc
{
    interface IUnknown;
}

typedef
[
    uuid(ca31ea20-48d0-11cf-8350-444553540000)
]
enum ShellSpecialFolderConstants {
    ssfDESKTOP          = 0x00,
    ssfPROGRAMS         = 0x02,
    ssfCONTROLS         = 0x03,
    ssfPRINTERS         = 0x04,
    ssfPERSONAL         = 0x05,
    ssfFAVORITES        = 0x06,
    ssfSTARTUP          = 0x07,
    ssfRECENT           = 0x08,
    ssfSENDTO           = 0x09,
    ssfBITBUCKET        = 0x0a,
    ssfSTARTMENU        = 0x0b,
    ssfDESKTOPDIRECTORY = 0x10,
    ssfDRIVES           = 0x11,
    ssfNETWORK          = 0x12,
    ssfNETHOOD          = 0x13,
    ssfFONTS            = 0x14,
    ssfTEMPLATES        = 0x15,
    ssfCOMMONSTARTMENU  = 0x16,
    ssfCOMMONPROGRAMS   = 0x17,
    ssfCOMMONSTARTUP    = 0x18,
    ssfCOMMONDESKTOPDIR = 0x19,
    ssfAPPDATA          = 0x1a,
    ssfPRINTHOOD        = 0x1b,
    ssfLOCALAPPDATA     = 0x1c,
    ssfALTSTARTUP       = 0x1d,
    ssfCOMMONALTSTARTUP = 0x1e,
    ssfCOMMONFAVORITES  = 0x1f,
    ssfINTERNETCACHE    = 0x20,
    ssfCOOKIES          = 0x21,
    ssfHISTORY          = 0x22,
    ssfCOMMONAPPDATA    = 0x23,
    ssfWINDOWS          = 0x24,
    ssfSYSTEM           = 0x25,
    ssfPROGRAMFILES     = 0x26,
    ssfMYPICTURES       = 0x27,
    ssfPROFILE          = 0x28,
    ssfSYSTEMx86        = 0x29,
    ssfPROGRAMFILESx86  = 0x30
} ShellSpecialFolderConstants;

} /* library Shell32 */

/*****************************************************************************
 * IAsyncOperation interface
 */
[
    uuid(3d8b0590-f691-11d2-8ea9-006097df5bd4),
    object,
]

interface IAsyncOperation : IUnknown
{
    typedef [unique] IAsyncOperation *LPASYNCOPERATION;

    HRESULT SetAsyncMode([in] BOOL fDoOpAsync);

    HRESULT GetAsyncMode([out] BOOL *pfIsOpAsync);

    HRESULT StartOperation([in, unique, optional] IBindCtx *pbcReserved);

    HRESULT InOperation([out] BOOL *pfInAsyncOp);

    HRESULT EndOperation(
            [in] HRESULT hResult,
            [in, unique] IBindCtx *pbcReserved,
            [in] DWORD dwEffects);
}
