/*
 * COM interfaces for shell objects
 *
 * Copyright (C) 1999 Juergen Schmied
 * Copyright (C) 2003 Alexandre Julliard
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "shtypes.idl";
import "servprov.idl";
import "comcat.idl";
import "propidl.idl";
/*import "prsht.idl";*/
/*import "msxml.idl";*/


/*****************************************************************************
 * IPersistFolder interface
 */
[
    object,
    uuid(000214ea-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IPersistFolder : IPersist
{
    typedef IPersistFolder *LPPERSISTFOLDER;

    HRESULT Initialize( [in] LPCITEMIDLIST pidl );
}


/*****************************************************************************
 * IPersistFolder2 interface
 */
[
    object,
    uuid(1ac3d9f0-175c-11d1-95be-00609797ea4f),
    pointer_default(unique)
]
interface IPersistFolder2 : IPersistFolder
{
    typedef IPersistFolder2 *LPPERSISTFOLDER2;

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


/*****************************************************************************
 * IEnumIDList interface
 */
[
    object,
    uuid(000214f2-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IEnumIDList : IUnknown
{
    typedef IEnumIDList *LPENUMIDLIST;

    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] LPITEMIDLIST *rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip( [in] ULONG celt );
    HRESULT Reset();
    HRESULT Clone( [out] IEnumIDList **ppenum );
}


/*****************************************************************************
 * IShellFolder interface
 */
[
    object,
    uuid(000214e6-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellFolder : IUnknown
{
    typedef IShellFolder * LPSHELLFOLDER;

    typedef enum tagSHGDN
    {
        SHGDN_NORMAL = 0,
        SHGDN_INFOLDER = 1,
        SHGDN_FOREDITING = 0x1000,
        SHGDN_INCLUDE_NONFILESYS = 0x2000,
        SHGDN_FORADDRESSBAR = 0x4000,
        SHGDN_FORPARSING = 0x8000
    } SHGNO;

    typedef DWORD SHGDNF;

    enum tagSHCONTF
    {
        SHCONTF_FOLDERS = 32,
        SHCONTF_NONFOLDERS = 64,
        SHCONTF_INCLUDEHIDDEN = 128,
        SHCONTF_INIT_ON_FIRST_NEXT = 256,
        SHCONTF_NETPRINTERSRCH = 512,
        SHCONTF_SHAREABLE = 1024,
        SHCONTF_STORAGE = 2048
    };

    typedef DWORD SHCONTF;

    cpp_quote("#define SFGAO_CANCOPY           DROPEFFECT_COPY")
    cpp_quote("#define SFGAO_CANMOVE           DROPEFFECT_MOVE")
    cpp_quote("#define SFGAO_CANLINK           DROPEFFECT_LINK")
    cpp_quote("#define SFGAO_CANRENAME         0x00000010L")
    cpp_quote("#define SFGAO_CANDELETE         0x00000020L")
    cpp_quote("#define SFGAO_HASPROPSHEET      0x00000040L")
    cpp_quote("#define SFGAO_DROPTARGET        0x00000100L")
    cpp_quote("#define SFGAO_CAPABILITYMASK    0x00000177L")
    cpp_quote("#define SFGAO_LINK              0x00010000L")
    cpp_quote("#define SFGAO_SHARE             0x00020000L")
    cpp_quote("#define SFGAO_READONLY          0x00040000L")
    cpp_quote("#define SFGAO_GHOSTED           0x00080000L")
    cpp_quote("#define SFGAO_HIDDEN            0x00080000L")
    cpp_quote("#define SFGAO_DISPLAYATTRMASK   0x000F0000L")
    cpp_quote("#define SFGAO_FILESYSANCESTOR   0x10000000L")
    cpp_quote("#define SFGAO_FOLDER            0x20000000L")
    cpp_quote("#define SFGAO_FILESYSTEM        0x40000000L")
    cpp_quote("#define SFGAO_HASSUBFOLDER      0x80000000L")
    cpp_quote("#define SFGAO_CONTENTSMASK      0x80000000L")
    cpp_quote("#define SFGAO_VALIDATE          0x01000000L")
    cpp_quote("#define SFGAO_REMOVABLE         0x02000000L")
    cpp_quote("#define SFGAO_COMPRESSED        0x04000000L")
    cpp_quote("#define SFGAO_BROWSABLE         0x08000000L")
    cpp_quote("#define SFGAO_NONENUMERATED     0x00100000L")
    cpp_quote("#define SFGAO_NEWCONTENT        0x00200000L")

    typedef ULONG SFGAOF;

    HRESULT ParseDisplayName(
        [in] HWND hwndOwner,
        [in] LPBC pbcReserved,
        [in, string] LPOLESTR lpszDisplayName,
        [out] ULONG *pchEaten,
        [out] LPITEMIDLIST *ppidl,
        [in, out, unique] ULONG *pdwAttributes);

    HRESULT EnumObjects(
        [in] HWND hwndOwner,
        [in] SHCONTF grfFlags,
        [out] IEnumIDList **ppenumIDList);

    HRESULT BindToObject(
        [in] LPCITEMIDLIST pidl,
        [in] LPBC pbcReserved,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT BindToStorage(
        [in] LPCITEMIDLIST pidl,
        [in] LPBC pbcReserved,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvObj);

    HRESULT CompareIDs(
        [in] LPARAM lParam,
        [in] LPCITEMIDLIST pidl1,
        [in] LPCITEMIDLIST pidl2);

    HRESULT CreateViewObject(
        [in] HWND hwndOwner,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT GetAttributesOf(
        [in] UINT cidl,
        [in, size_is(cidl)] LPCITEMIDLIST *apidl,
        [in, out] SFGAOF *rgfInOut);

    HRESULT GetUIObjectOf(
        [in] HWND hwndOwner,
        [in] UINT cidl,
        [in, size_is(cidl)] LPCITEMIDLIST *apidl,
        [in] REFIID riid,
        [in, out, unique] UINT *prgfInOut,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT GetDisplayNameOf(
        [in] LPCITEMIDLIST pidl,
        [in] SHGDNF uFlags,
        [out] STRRET *lpName);

    HRESULT SetNameOf(
        [in] HWND hwnd,
        [in] LPCITEMIDLIST pidl,
        [in, string] LPCOLESTR lpszName,
        [in] SHGDNF uFlags,
        [out] LPITEMIDLIST *ppidlOut);
}


/*****************************************************************************
 * IEnumExtraSearch interface
 */
[
    object,
    uuid(0e700be1-9db6-11d1-a1ce-00c04fd75d13),
    pointer_default(unique)
]
interface IEnumExtraSearch : IUnknown
{
    typedef IEnumExtraSearch *LPENUMEXTRASEARCH;

    typedef struct
    {
        GUID guidSearch;
        WCHAR wszFriendlyName[80];
        /*
         *WCHAR wszMenuText[80];
         *WCHAR wszHelpText[MAX_PATH];
         */
        WCHAR wszUrl[2084];
        /*
         *WCHAR wszIcon[MAX_PATH+10];
         *WCHAR wszGreyIcon[MAX_PATH+10];
         *WCHAR wszClrIcon[MAX_PATH+10];
         */
    } EXTRASEARCH, *LPEXTRASEARCH;

    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] EXTRASEARCH *rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip( [in] ULONG celt );
    HRESULT Reset();
    HRESULT Clone( [out] IEnumExtraSearch **ppenum );
}


/*****************************************************************************
 * IShellFolder2 interface
 */
[
    object,
    uuid(93f2f68c-1d1b-11d3-a30e-00c04f79abd1),
    pointer_default(unique)
]
interface IShellFolder2 : IShellFolder
{
    typedef enum
    {
        SHCOLSTATE_TYPE_STR = 0x00000001,
        SHCOLSTATE_TYPE_INT = 0x00000002,
        SHCOLSTATE_TYPE_DATE = 0x00000003,
        SHCOLSTATE_TYPEMASK = 0x0000000f,
        SHCOLSTATE_ONBYDEFAULT = 0x00000010,
        SHCOLSTATE_SLOW = 0x00000020,
        SHCOLSTATE_EXTENDED = 0x00000040,
        SHCOLSTATE_SECONDARYUI = 0x00000080,
        SHCOLSTATE_HIDDEN = 0x00000100,
        SHCOLSTATE_PREFER_VARCMP = 0x00000200
    } SHCOLSTATE;

    typedef DWORD SHCOLSTATEF;

    typedef struct
    {
        GUID    fmtid;
        DWORD   pid;
    } SHCOLUMNID, *LPSHCOLUMNID;
    typedef const SHCOLUMNID *LPCSHCOLUMNID;

    HRESULT GetDefaultSearchGUID( [out] GUID *lpguid );
    HRESULT EnumSearches( [out] IEnumExtraSearch **ppenum );
    HRESULT GetDefaultColumn( [in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay );
    HRESULT GetDefaultColumnState( [in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags );
    HRESULT GetDetailsEx( [in] LPCITEMIDLIST pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv);
    HRESULT GetDetailsOf( [in] LPCITEMIDLIST pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd);
    HRESULT MapColumnToSCID( [in] UINT iColumn, [in] SHCOLUMNID *pscid );
}



/*****************************************************************************
 * FOLDERSETTINGS
 */
typedef char *LPVIEWSETTINGS;

typedef enum
{
    FWF_AUTOARRANGE         = 0x00000001,
    FWF_ABBREVIATEDNAMES    = 0x00000002,
    FWF_SNAPTOGRID          = 0x00000004,
    FWF_OWNERDATA           = 0x00000008,
    FWF_BESTFITWINDOW       = 0x00000010,
    FWF_DESKTOP             = 0x00000020,
    FWF_SINGLESEL           = 0x00000040,
    FWF_NOSUBFOLDERS        = 0x00000080,
    FWF_TRANSPARENT         = 0x00000100,
    FWF_NOCLIENTEDGE        = 0x00000200,
    FWF_NOSCROLL            = 0x00000400,
    FWF_ALIGNLEFT           = 0x00000800,
    FWF_NOICONS             = 0x00001000,
    FWF_SHOWSELALWAYS       = 0x00002000,
    FWF_NOVISIBLE           = 0x00004000,
    FWF_SINGLECLICKACTIVATE = 0x00008000,
    FWF_NOWEBVIEW           = 0x00010000,
    FWF_HIDEFILENAMES       = 0x00020000,
    FWF_CHECKSELECT         = 0x00040000
} FOLDERFLAGS;

typedef enum
{
    FVM_ICON       = 1,
    FVM_FIRST      = FVM_ICON,
    FVM_SMALLICON  = 2,
    FVM_LIST       = 3,
    FVM_DETAILS    = 4,
    FVM_THUMBNAIL  = 5,
    FVM_TILE       = 6,
    FVM_THUMBSTRIP = 7,
    FVM_LAST       = FVM_THUMBSTRIP
} FOLDERVIEWMODE;

typedef struct
{
    UINT ViewMode;
    UINT fFlags;
} FOLDERSETTINGS, *PFOLDERSETTINGS, *LPFOLDERSETTINGS;
typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS;


/*****************************************************************************
 * IShellView interface
 */
interface IShellBrowser;  /* forward declaration */
[
    object,
    uuid(000214e3-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellView : IOleWindow
{
    typedef IShellView *LPSHELLVIEW;

    cpp_quote("#define SVSI_DESELECT       0x00000000")
    cpp_quote("#define SVSI_SELECT         0x00000001")
    cpp_quote("#define SVSI_EDIT           0x00000003")
    cpp_quote("#define SVSI_DESELECTOTHERS 0x00000004")
    cpp_quote("#define SVSI_ENSUREVISIBLE  0x00000008")
    cpp_quote("#define SVSI_FOCUSED        0x00000010")
    cpp_quote("#define SVSI_TRANSLATEPT    0x00000020")
    cpp_quote("#define SVSI_SELECTIONMARK  0x00000040")
    cpp_quote("#define SVSI_POSITIONITEM   0x00000080")
    cpp_quote("#define SVSI_CHECK          0x00000100")
    cpp_quote("#define SVSI_NOSTATECHANGE  0x80000000")

    typedef UINT SVSIF;

    typedef enum
    {
        SVGIO_BACKGROUND     = 0x00000000,
        SVGIO_SELECTION      = 0x00000001,
        SVGIO_ALLVIEW        = 0x00000002,
        SVGIO_CHECKED        = 0x00000003,
        SVGIO_TYPE_MASK      = 0x0000000f,
        SVGIO_FLAG_VIEWORDER = 0x80000000,
    } SVGIO;

    typedef enum
    {
        SVUIA_DEACTIVATE       = 0,
        SVUIA_ACTIVATE_NOFOCUS = 1,
        SVUIA_ACTIVATE_FOCUS   = 2,
        SVUIA_INPLACEACTIVATE  = 3
    } SVUIA_STATUS;

cpp_quote("#if 0")
    typedef LPARAM LPFNSVADDPROPSHEETPAGE;
cpp_quote("#else")
cpp_quote("#include <prsht.h>")
cpp_quote("typedef LPFNADDPROPSHEETPAGE LPFNSVADDPROPSHEETPAGE;")
cpp_quote("#endif")

    HRESULT TranslateAccelerator( [in] MSG *pmsg );
    HRESULT EnableModeless( [in] BOOL fEnable );
    HRESULT UIActivate( [in] UINT uState );
    HRESULT Refresh();
    HRESULT CreateViewWindow(
        [in] IShellView *psvPrevious,
        [in] LPCFOLDERSETTINGS lpfs,
        [in] IShellBrowser *psb,
        [out] RECT *prcView,
        [out] HWND *phWnd);

    HRESULT DestroyViewWindow();
    HRESULT GetCurrentInfo( [out] LPFOLDERSETTINGS lpfs );

    [local] HRESULT AddPropertySheetPages(
        [in] DWORD dwReserved,
        [in] LPFNSVADDPROPSHEETPAGE pfn,
        [in] LPARAM lparam);

    HRESULT SaveViewState();
    HRESULT SelectItem(
        [in] LPCITEMIDLIST pidlItem,
        [in] SVSIF uFlags);
    HRESULT GetItemObject(
        [in] UINT uItem,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);
}


/*****************************************************************************
 * IShellBrowser interface
 */
[
    object,
    uuid(000214e2-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellBrowser : IOleWindow
{
    typedef IShellBrowser *LPSHELLBROWSER;

cpp_quote("#define SBSP_DEFBROWSER            0x00000000")
cpp_quote("#define SBSP_SAMEBROWSER           0x00000001")
cpp_quote("#define SBSP_NEWBROWSER            0x00000002")
cpp_quote("#define SBSP_DEFMODE               0x00000000")
cpp_quote("#define SBSP_OPENMODE              0x00000010")
cpp_quote("#define SBSP_EXPLOREMODE           0x00000020")
cpp_quote("#define SBSP_HELPMODE              0x00000040")
cpp_quote("#define SBSP_NOTRANSFERHIST        0x00000080")
cpp_quote("#define SBSP_ABSOLUTE              0x00000000")
cpp_quote("#define SBSP_RELATIVE              0x00001000")
cpp_quote("#define SBSP_PARENT                0x00002000")
cpp_quote("#define SBSP_NAVIGATEBACK          0x00004000")
cpp_quote("#define SBSP_NAVIGATEFORWARD       0x00008000")
cpp_quote("#define SBSP_ALLOW_AUTONAVIGATE    0x00010000")
cpp_quote("#define SBSP_NOAUTOSELECT          0x04000000")
cpp_quote("#define SBSP_WRITENOHISTORY        0x08000000")
cpp_quote("#define SBSP_REDIRECT              0x40000000")
cpp_quote("#define SBSP_INITIATEDBYHLINKFRAME 0x80000000")

cpp_quote("#define FCW_STATUS      0x0001")
cpp_quote("#define FCW_TOOLBAR     0x0002")
cpp_quote("#define FCW_TREE        0x0003")
cpp_quote("#define FCW_INTERNETBAR 0x0006")
cpp_quote("#define FCW_PROGRESS    0x0008")

cpp_quote("#define FCT_MERGE       0x0001")
cpp_quote("#define FCT_CONFIGABLE  0x0002")
cpp_quote("#define FCT_ADDTOEND    0x0004")

cpp_quote("#if 0")
    typedef LPARAM LPTBBUTTONSB;
cpp_quote("#else")
cpp_quote("#include <commctrl.h>")
cpp_quote("typedef LPTBBUTTON LPTBBUTTONSB;")
cpp_quote("#endif")

    HRESULT InsertMenusSB(
        [in] HMENU hmenuShared,
        [in, out] LPOLEMENUGROUPWIDTHS lpMenuWidths);

    HRESULT SetMenuSB(
        [in] HMENU hmenuShared,
        [in] HOLEMENU holemenuReserved,
        [in] HWND hwndActiveObject);

    HRESULT RemoveMenusSB( [in] HMENU hmenuShared );
    HRESULT SetStatusTextSB( [in, unique] LPCOLESTR pszStatusText );
    HRESULT EnableModelessSB( [in] BOOL fEnable );
    HRESULT TranslateAcceleratorSB( [in] MSG *pmsg, [in] WORD wID );

    HRESULT BrowseObject(
        [in] LPCITEMIDLIST pidl,
        [in] UINT wFlags);

    HRESULT GetViewStateStream(
        [in] DWORD grfMode,
        [out] IStream **ppStrm);

    HRESULT GetControlWindow(
        [in] UINT id,
        [out] HWND *phwnd);

    [local] HRESULT SendControlMsg(
        [in] UINT id,
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [in] LRESULT *pret);

    HRESULT QueryActiveShellView( [out] IShellView **ppshv );
    HRESULT OnViewWindowActive( [in] IShellView *pshv );

    [local]
    HRESULT SetToolbarItems(
        [in] LPTBBUTTONSB lpButtons,
        [in] UINT nButtons,
        [in] UINT uFlags);
}


/*****************************************************************************
 * IShellLinkA interface
 */
[
    object,
    uuid(000214ee-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellLinkA : IUnknown
{
    typedef enum
    {
        SLR_NO_UI               = 0x0001,
        SLR_ANY_MATCH           = 0x0002,
        SLR_UPDATE              = 0x0004,
        SLR_NOUPDATE            = 0x0008,
        SLR_NOSEARCH            = 0x0010,
        SLR_NOTRACK             = 0x0020,
        SLR_NOLINKINFO          = 0x0040,
        SLR_INVOKE_MSI          = 0x0080,
        SLR_NO_UI_WITH_MSG_PUMP = 0x0101,
    } SLR_FLAGS;

    typedef enum
    {
        SLGP_SHORTPATH   = 0x0001,
        SLGP_UNCPRIORITY = 0x0002,
        SLGP_RAWPATH     = 0x0004,
    } SLGP_FLAGS;

    HRESULT GetPath(
        [out, size_is(cch)] LPSTR pszFile,
        [in] int cch,
        [in, out] WIN32_FIND_DATAA *pfd,
        [in] DWORD fFlags);

    HRESULT GetIDList( [out] LPITEMIDLIST * ppidl );

    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );

    HRESULT GetDescription(
        [out, size_is(cch)] LPSTR pszName,
        [in] int cch);

    HRESULT SetDescription( [in] LPCSTR pszName );

    HRESULT GetWorkingDirectory(
        [out, size_is(cch)] LPSTR pszDir,
        [in] int cch);

    HRESULT SetWorkingDirectory( [in] LPCSTR pszDir );

    HRESULT GetArguments(
        [out, size_is(cch)] LPSTR pszArgs,
        [in] int cch);

    HRESULT SetArguments( [in] LPCSTR pszArgs );

    HRESULT GetHotkey( [out] WORD *pwHotkey );

    HRESULT SetHotkey( [in] WORD wHotkey );

    HRESULT GetShowCmd( [out] int *piShowCmd );

    HRESULT SetShowCmd( [in] int iShowCmd );

    HRESULT GetIconLocation(
        [out, size_is(cch)] LPSTR pszIconPath,
        [in] int cch,
        [out] int *piIcon);

    HRESULT SetIconLocation(
        [in] LPCSTR pszIconPath,
        [in] int iIcon);

    HRESULT SetRelativePath(
        [in] LPCSTR pszPathRel,
        [in] DWORD dwReserved);

    HRESULT Resolve(
        [in] HWND hwnd,
        [in] DWORD fFlags);

    HRESULT SetPath( [in] LPCSTR pszFile );
}


/*****************************************************************************
 * IShellLinkW interface
 */
[
    object,
    uuid(000214f9-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellLinkW : IUnknown
{
    HRESULT GetPath(
        [out, size_is(cch)] LPWSTR pszFile,
        [in] int cch,
        [in, out] WIN32_FIND_DATAW *pfd,
        [in] DWORD fFlags);

    HRESULT GetIDList( [out] LPITEMIDLIST * ppidl );

    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );

    HRESULT GetDescription(
        [out, size_is(cch)] LPWSTR pszName,
        [in] int cch);

    HRESULT SetDescription( [in] LPCWSTR pszName );

    HRESULT GetWorkingDirectory(
        [out, size_is(cch)] LPWSTR pszDir,
        [in] int cch);

    HRESULT SetWorkingDirectory( [in] LPCWSTR pszDir );

    HRESULT GetArguments(
        [out, size_is(cch)] LPWSTR pszArgs,
        [in] int cch);

    HRESULT SetArguments( [in] LPCWSTR pszArgs );

    HRESULT GetHotkey( [out] WORD *pwHotkey );

    HRESULT SetHotkey( [in] WORD wHotkey );

    HRESULT GetShowCmd( [out] int *piShowCmd );

    HRESULT SetShowCmd( [in] int iShowCmd );

    HRESULT GetIconLocation(
        [out, size_is(cch)] LPWSTR pszIconPath,
        [in] int cch,
        [out] int *piIcon);

    HRESULT SetIconLocation(
        [in] LPCWSTR pszIconPath,
        [in] int iIcon);

    HRESULT SetRelativePath(
        [in] LPCWSTR pszPathRel,
        [in] DWORD dwReserved);

    HRESULT Resolve(
        [in] HWND hwnd,
        [in] DWORD fFlags);

    HRESULT SetPath( [in] LPCWSTR pszFile );
}

cpp_quote("#define IShellLink WINELIB_NAME_AW(IShellLink)")


/*****************************************************************************
 * IShellExtInit interface
 */
[
    object,
    uuid(000214e8-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellExtInit : IUnknown
{
    typedef IShellExtInit *LPSHELLEXTINIT;

    HRESULT Initialize(
        [in] LPCITEMIDLIST pidlFolder,
        [in] IDataObject *pdtobj,
        [in] HKEY hkeyProgID);
}


/*******************************************************************************/
/* Note: the following interfaces are not in shobjidl.idl under Windows, they  */
/* are declared directly in shlobj.h. It hopefully won't break anything to put */
/* them here anyway.                                                           */
/*******************************************************************************/

#ifndef MAX_PATH
#define MAX_PATH 260
#endif


/*****************************************************************************
 * IPersistFolder3 interface
 */
[
    object,
    uuid(cef04fdf-fe72-11d2-87a5-00c04f6837cf),
    pointer_default(unique)
]
interface IPersistFolder3 : IPersistFolder2
{
    typedef struct
    {
        LPITEMIDLIST	pidlTargetFolder;
	WCHAR		szTargetParsingName[MAX_PATH];
	WCHAR		szNetworkProvider[MAX_PATH];
	DWORD		dwAttributes;
	int		csidl;
    } PERSIST_FOLDER_TARGET_INFO;

    HRESULT InitializeEx(
        [in] IBindCtx *pbc,
        [in] LPCITEMIDLIST pidlRoot,
        [in] const PERSIST_FOLDER_TARGET_INFO *ppfti);

    HRESULT GetFolderTargetInfo( [out] PERSIST_FOLDER_TARGET_INFO *ppfti );
}


/*****************************************************************************
 * IExtractIconA interface
 */
[
    object,
    uuid(000214eb-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IExtractIconA : IUnknown
{
cpp_quote("#define GIL_OPENICON     0x0001")
cpp_quote("#define GIL_FORSHELL     0x0002")
cpp_quote("#define GIL_ASYNC        0x0020")
cpp_quote("#define GIL_DEFAULTICON  0x0040")
cpp_quote("#define GIL_FORSHORTCUT  0x0080")

cpp_quote("#define GIL_SIMULATEDOC  0x0001")
cpp_quote("#define GIL_PERINSTANCE  0x0002")
cpp_quote("#define GIL_PERCLASS     0x0004")
cpp_quote("#define GIL_NOTFILENAME  0x0008")
cpp_quote("#define GIL_DONTCACHE    0x0010")

    typedef IExtractIconA *LPEXTRACTICONA;

    HRESULT GetIconLocation(
        [in] UINT uFlags,
        [out, size_is(cchMax)] LPSTR szIconFile,
        [in] UINT cchMax,
        [out] INT *piIndex,
        [out] UINT *pwFlags);

    HRESULT Extract(
        [in] LPCSTR pszFile,
        [in] UINT nIconIndex,
        [out] HICON *phiconLarge,
        [out] HICON *phiconSmall,
        [in] UINT nIconSize );
}


/*****************************************************************************
 * IExtractIconW interface
 */
[
    object,
    uuid(000214fa-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IExtractIconW : IUnknown
{
    typedef IExtractIconW *LPEXTRACTICONW;

    HRESULT GetIconLocation(
        [in] UINT uFlags,
        [out, size_is(cchMax)] LPWSTR szIconFile,
        [in] UINT cchMax,
        [out] INT *piIndex,
        [out] UINT *pwFlags);

    HRESULT Extract(
        [in] LPCWSTR pszFile,
        [in] UINT nIconIndex,
        [out] HICON *phiconLarge,
        [out] HICON *phiconSmall,
        [in] UINT nIconSize );
}

cpp_quote("#define LPEXTRACTICON WINELIB_NAME_AW(LPEXTRACTICON)")
cpp_quote("#define IExtractIcon WINELIB_NAME_AW(IExtractIcon)")


/*****************************************************************************
 * ICommDlgBrowser interface
 */
[
    object,
    uuid(000214f1-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface ICommDlgBrowser : IUnknown
{
cpp_quote("#define CDBOSC_SETFOCUS     0x00000000")
cpp_quote("#define CDBOSC_KILLFOCUS    0x00000001")
cpp_quote("#define CDBOSC_SELCHANGE    0x00000002")
cpp_quote("#define CDBOSC_RENAME       0x00000003")
cpp_quote("#define CDBOSC_STATECHANGE  0x00000004")

    typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

    HRESULT OnDefaultCommand( [in] IShellView *shv );
    HRESULT OnStateChange( [in] IShellView *shv, [in] ULONG uChange );
    HRESULT IncludeObject( [in] IShellView *shv, [in] LPCITEMIDLIST pidl );
}


/*****************************************************************************
 * IDockingWindowFrame interface
 */
[
    object,
    uuid(47d2657a-7b27-11d0-8ca9-00a0c92dbfe8),
    pointer_default(unique)
]
interface IDockingWindowFrame : IOleWindow
{
cpp_quote("#define DWFRF_NORMAL           0x0000")
cpp_quote("#define DWFRF_DELETECONFIGDATA 0x0001")
cpp_quote("#define DWFAF_HIDDEN           0x0001")

    HRESULT AddToolbar(
        [in] IUnknown *punkSrc,
        [in] LPCWSTR pwszItem,
        [in] DWORD dwAddFlags);

    HRESULT RemoveToolbar(
        [in] IUnknown *punkSrc,
        [in] DWORD dwRemoveFlags);

    HRESULT FindToolbar(
        [in] LPCWSTR pwszItem,
        [in] REFIID riid,
        [out] LPVOID *ppvObj);
}


/*****************************************************************************
 * IDragSourceHelper interface
 */
[
    object,
    uuid(de5bf786-477a-11d2-839d-00c04fd918d0),
    pointer_default(unique)
]
interface IDragSourceHelper : IUnknown
{
    typedef struct
    {
        SIZE     sizeDragImage;
        POINT    ptOffset;
        HBITMAP  hbmpDragImage;
        COLORREF crColorKey;
    } SHDRAGIMAGE, *LPSHDRAGIMAGE;

  HRESULT InitializeFromBitmap(
      [in] LPSHDRAGIMAGE pshdi,
      [in] IDataObject *pDataObject);

  HRESULT InitializeFromWindow(
      [in] HWND hwnd,
      [in] POINT *ppt,
      [in] IDataObject *pDataObject);
}


/*****************************************************************************
 * IDropTargetHelper interface
 */
[
    object,
    uuid(4657278b-411b-11d2-839a-00c04fd918d0),
    pointer_default(unique)
]
interface IDropTargetHelper : IUnknown
{
    HRESULT DragEnter(
        [in] HWND hwndTarget,
        [in] IDataObject *pDataObject,
        [in] POINT *ppt,
        [in] DWORD dwEffect);

    HRESULT DragLeave();

    HRESULT DragOver(
        [in] POINT *ppt,
        [in] DWORD dwEffect);

    HRESULT Drop(
        [in] IDataObject *pDataObject,
        [in] POINT *ppt,
        [in] DWORD dwEffect);

    HRESULT Show( [in] BOOL fShow );
}


/*****************************************************************************
 * IContextMenu interface
 */
[
    object,
    uuid(000214e4-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IContextMenu : IUnknown
{
cpp_quote("#define CMF_NORMAL        0x00000000")
cpp_quote("#define CMF_DEFAULTONLY   0x00000001")
cpp_quote("#define CMF_VERBSONLY     0x00000002")
cpp_quote("#define CMF_EXPLORE       0x00000004")
cpp_quote("#define CMF_NOVERBS       0x00000008")
cpp_quote("#define CMF_CANRENAME     0x00000010")
cpp_quote("#define CMF_NODEFAULT     0x00000020")
cpp_quote("#define CMF_INCLUDESTATIC 0x00000040")
cpp_quote("#define CMF_EXTENDEDVERBS 0x00000100")
cpp_quote("#define CMF_RESERVED      0xffff0000")

cpp_quote("#define GCS_VERBA         0x00000000")
cpp_quote("#define GCS_HELPTEXTA     0x00000001")
cpp_quote("#define GCS_VALIDATEA     0x00000002")
cpp_quote("#define GCS_VERBW         0x00000004")
cpp_quote("#define GCS_HELPTEXTW     0x00000005")
cpp_quote("#define GCS_VALIDATEW     0x00000006")
cpp_quote("#define GCS_UNICODE       0x00000004")
cpp_quote("#define GCS_VERB          WINELIB_NAME_AW(GCS_VERB)")
cpp_quote("#define GCS_HELPTEXT      WINELIB_NAME_AW(GCS_HELPTEXT)")
cpp_quote("#define GCS_VALIDATE      WINELIB_NAME_AW(GCS_VALIDATE)")

cpp_quote("#define CMDSTR_NEWFOLDERA   \"NewFolder\"")
cpp_quote("#define CMDSTR_VIEWLISTA    \"ViewList\"")
cpp_quote("#define CMDSTR_VIEWDETAILSA \"ViewDetails\"")
cpp_quote("#if defined(__GNUC__)")
cpp_quote("# define CMDSTR_NEWFOLDERW (const WCHAR []){ 'N','e','w','F','o','l','d','e','r',0 }")
cpp_quote("# define CMDSTR_VIEWLISTW (const WCHAR []){ 'V','i','e','w','L','i','s','t',0 }")
cpp_quote("# define CMDSTR_VIEWDETAILSW (const WCHAR []){ 'V','i','e','w','D','e','t','a','i','l','s',0 }")
cpp_quote("#elif defined(_MSC_VER)")
cpp_quote("# define CMDSTR_NEWFOLDERW   L\"NewFolder\"")
cpp_quote("# define CMDSTR_VIEWLISTW    L\"ViewList\"")
cpp_quote("# define CMDSTR_VIEWDETAILSW L\"ViewDetails\"")
cpp_quote("#else")
cpp_quote("static const WCHAR CMDSTR_NEWFOLDERW[] = {'N','e','w','F','o','l','d','e','r',0};")
cpp_quote("static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0};")
cpp_quote("static const WCHAR CMDSTR_VIEWDETAILSW[] = {'V','i','e','w','D','e','t','a','i','l','s',0};")
cpp_quote("#endif")
cpp_quote("#define CMDSTR_NEWFOLDER    WINELIB_NAME_AW(CMDSTR_NEWFOLDER)")
cpp_quote("#define CMDSTR_VIEWLIST     WINELIB_NAME_AW(CMDSTR_VIEWLIST)")
cpp_quote("#define CMDSTR_VIEWDETAILS  WINELIB_NAME_AW(CMDSTR_VIEWDETAILS)")

cpp_quote("#define CMIC_MASK_HOTKEY         SEE_MASK_HOTKEY")
cpp_quote("#define CMIC_MASK_ICON           SEE_MASK_ICON")
cpp_quote("#define CMIC_MASK_FLAG_NO_UI     SEE_MASK_FLAG_NO_UI")
cpp_quote("#define CMIC_MASK_UNICODE        SEE_MASK_UNICODE")
cpp_quote("#define CMIC_MASK_NO_CONSOLE     SEE_MASK_NO_CONSOLE")
cpp_quote("#define CMIC_MASK_HASLINKNAME    SEE_MASK_HASLINKNAME")
cpp_quote("#define CMIC_MASK_FLAG_SEP_VDM   SEE_MASK_FLAG_SEPVDM")
cpp_quote("#define CMIC_MASK_HASTITLE       SEE_MASK_HASTITLE")
cpp_quote("#define CMIC_MASK_ASYNCOK        SEE_MASK_ASYNCOK")
cpp_quote("#define CMIC_MASK_SHIFT_DOWN     0x10000000")
cpp_quote("#define CMIC_MASK_PTINVOKE       0x20000000")
cpp_quote("#define CMIC_MASK_CONTROL_DOWN   0x40000000")
cpp_quote("#define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE")
cpp_quote("#define CMIC_MASK_NOZONECHECKS   SEE_MASK_NOZONECHECKS")

    typedef IContextMenu *LPCONTEXTMENU;

    typedef struct tagCMINVOKECOMMANDINFO
    {
        DWORD cbSize;
        DWORD fMask;
        HWND hwnd;
        LPCSTR lpVerb;
        LPCSTR lpParameters;
        LPCSTR lpDirectory;
        INT nShow;
        DWORD dwHotKey;
        HANDLE hIcon;
    } CMINVOKECOMMANDINFO, *LPCMINVOKECOMMANDINFO;

    typedef struct tagCMInvokeCommandInfoEx
    {
        DWORD cbSize;
        DWORD fMask;
        HWND hwnd;
        LPCSTR lpVerb;
        LPCSTR lpParameters;
        LPCSTR lpDirectory;
        INT nShow;
        DWORD dwHotKey;
        HANDLE hIcon;
        LPCSTR lpTitle;
        LPCWSTR lpVerbW;
        LPCWSTR lpParametersW;
        LPCWSTR lpDirectoryW;
        LPCWSTR lpTitleW;
        POINT ptInvoke;
    } CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;

    HRESULT QueryContextMenu(
        [in] HMENU hmenu,
        [in] UINT indexMenu,
        [in] UINT idCmdFirst,
        [in] UINT idCmdLast,
        [in] UINT uFlags);

    HRESULT InvokeCommand( [in] LPCMINVOKECOMMANDINFO lpici );

    HRESULT GetCommandString(
        [in] UINT idCmd,
        [in] UINT uType,
        [out] UINT *pwReserved,
        [out, size_is(cchMax)] LPSTR pszName,
        [in] UINT cchMax);
}


/*****************************************************************************
 * IContextMenu2 interface
 */
[
    object,
    uuid(000214f4-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IContextMenu2 : IContextMenu
{
    typedef IContextMenu2 *LPCONTEXTMENU2;

    HRESULT HandleMenuMsg(
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);
}


/*****************************************************************************
 * IContextMenu3 interface
 */
[
    object,
    uuid(bcfce0a0-ec17-11d0-8d10-00a0c90f2719),
    pointer_default(unique)
]
interface IContextMenu3 : IContextMenu2
{
    typedef IContextMenu3 *LPCONTEXTMENU3;

    HRESULT HandleMenuMsg2(
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] LRESULT *plResult);
}


/*****************************************************************************
 * IShellExecuteHookA interface
 */
[
    object,
    uuid(000214f5-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellExecuteHookA : IUnknown
{
    cpp_quote("struct _SHELLEXECUTEINFOA;");
    HRESULT Execute(
        [in, out] struct _SHELLEXECUTEINFOA* pei);
}


/*****************************************************************************
 * IShellExecuteHookW interface
 */
[
    object,
    uuid(000214fb-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellExecuteHookW : IUnknown
{
    cpp_quote("struct _SHELLEXECUTEINFOW;");
    HRESULT Execute(
		[in, out] struct _SHELLEXECUTEINFOW* pei);
}
