import "oaidl.idl";
import "shobjidl.idl";

interface IStorageDescriptor;
[
    helpstring("Describes the underlying storage"),
    uuid(1079acfa-29bd-11d3-8e0d-00c04f6837d5),
    object,
    pointer_default(unique)
]
interface IStorageDescriptor : IUnknown
{
    // IStorageDescriptor methods
    HRESULT GetStgDescription([out, string] LPOLESTR *ppszName);
};

interface IFileSystemDescriptor;
[
    helpstring("Describes file system Objects"),
    uuid(1079acfb-29bd-11d3-8e0d-00c04f6837d5),
    object,
    pointer_default(unique)
]
interface IFileSystemDescriptor : IStorageDescriptor
{
    // IFileSystemDescriptor methods
    HRESULT GetFSPath([out, string] LPOLESTR *ppszName);
};

[
    object,
    uuid(1079acfd-29bd-11d3-8e0d-00c04f6837d5),  // IID_ISMKStaticHelpers
    pointer_default(unique),
]

interface IMonikerHelper;
[
    helpstring("Assist legacy applications to use IMoniker"),
    uuid(679d9e36-f8f9-11d2-8deb-00c04f6837d5),
    object,
]

interface IMonikerHelper : IUnknown
{

cpp_quote("//  flags for IMonikerHelper methods")
cpp_quote("//  MKHELPF_INIT_READONLY            read only helper, Commit fails with E_ACCESSDENIED")
cpp_quote("//  MKHELPF_INIT_SAVEAS              write only helper, no download required for GLP")
cpp_quote("//  MKHELPF_FORCEROUNDTRIP           never use local cache (always roundtrip)")
cpp_quote("//  MKHELPF_NOPROGRESSUI             no progress will be displayed, only errors/confirmations")
cpp_quote("//  MKHELPF_NOUI                     overrides all other UI flags")

    [v1_enum] enum
    {
        MKHELPF_INIT_READONLY     = 0x00000001,
        MKHELPF_INIT_SAVEAS       = 0x00000002,
        MKHELPF_FORCEROUNDTRIP    = 0x00000010,
        MKHELPF_NOPROGRESSUI      = 0x00000020,
        MKHELPF_NOUI              = 0x00000040,
    };

    typedef DWORD MKHELPF;

    // IMonikerHelper methods
    HRESULT Init([in] MKHELPF flags, [in] IMoniker *pmk);
    HRESULT GetLocalPath([in] MKHELPF flags, [in] HWND hwnd, [in] LPCWSTR pszTitle, [out, size_is(*pcchOut)] LPWSTR pszOut, [in, out] DWORD *pcchOut);
    HRESULT Commit([in] MKHELPF flags, [in] HWND hwnd, [in] LPCWSTR pszTitle);
};


[
    uuid(50a7e9b1-70ef-11d1-b75a-00c04f6837d5), // LIBID_ShellHelpers
    helpstring("Microsoft Shell Helper Objects"),
    version(1.0),
    restricted
]
library ShellHelpers 
{
    [
        uuid(1079acf9-29be-11d3-8e0d-00c04f6837d5),     // CLSID_ShellMoniker
    ]
    coclass ShellItem
    {
        [restricted] interface IShellItem;
    };

    [
        uuid(679d9e37-f8f9-11d2-8deb-00c04f6837d5),     // CLSID_MonikerHelper
    ]
    coclass MonikerHelper
    {
        [restricted] interface IMonikerHelper;
    };

    [
        uuid(1079acfd-29be-11d3-8e0d-00c04f6837d5),     // CLSID_SMKStaticHelpers
    ]
    coclass SMKStaticHelpers
    {
        [restricted] interface ISMKStaticHelpers;
    };

};