//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  File: IDirectory.idl
//
//  Contents: IDirectory interface definition
//
//  History:    14-Jun-1995 HenryLee    initial version
//
//--------------------------------------------------------------------------

import "unknwn.idl";
import "transact.idl";
interface IEnumSTATDIR;

typedef enum tagSTGFMT
{
    STGFMT_DOCUMENT  = 0,
    STGFMT_DIRECTORY = 1,
    STGFMT_CATALOG   = 2,
    STGFMT_FILE      = 3,
    STGFMT_ANY       = 4,
    STGFMT_DOCFILE   = 5,
    STGFMT_STORAGE   = 6,
    STGFMT_JUNCTION  = 7
} STGFMT;

cpp_quote("#define STGFMT_FLATFILE STGFMT_FILE")

typedef struct tagSTGTEMPLATE
{
    IUnknown *      pUnkTemplate;
    DWORD           ciidTemplate;
    IID *           riidTemplate;
} STGTEMPLATE;

typedef struct tagOBJECT_SECURITY_INIT
{
    TRUSTEE_W * pTrusteeOwner;
    TRUSTEE_W * pTrusteeGroup;
    DWORD            cAccessRightsLength;
    EXPLICIT_ACCESS_W *pAccessRightsList;
    DWORD            cAuditEntriesLength;
    EXPLICIT_ACCESS_W *pAuditEntriesList;
} OBJECT_SECURITY_INIT;

typedef struct tagSTGCREATE
{
    DWORD       grfAttrs;
    STGTEMPLATE *pTemplate;
    OBJECT_SECURITY_INIT *pSecurity;
} STGCREATE;

typedef struct tagSTGOPEN
{
    STGFMT      stgfmt;
    DWORD       grfMode;
    DWORD       grfFlags;
    ITransaction *  pTransaction;
} STGOPEN;

typedef struct tagSTATDIR
{
    WCHAR *     pwcsName;
    STGFMT      stgfmt;
    DWORD       grfAttrs;
    ULARGE_INTEGER cbSize;
    FILETIME    mtime;
    FILETIME    atime;
    FILETIME    ctime;
    DWORD       grfMode;
    CLSID       clsid;
    DWORD       grfStateBits;
} STATDIR;


[
    object,
    uuid(5c036ea0-b556-11ce-b33a-00aa00680937),
    pointer_default(unique)
]
interface IDirectory : IUnknown
{
    [local]
    HRESULT __stdcall CreateElement ([in] const WCHAR * pwcsName,
                [in] STGCREATE *     pStgCreate,
                [in] STGOPEN   *     pStgOpen,
                [in] REFIID riid,
                [out] void ** ppObjectOpen);


    [call_as(CreateElement)]
    HRESULT __stdcall RemoteCreateElement ([in] const WCHAR * pwcsName,
                [in] STGCREATE *     pStgCreate,
                [in] STGOPEN   *     pStgOpen,
                [in] REFIID riid,
                [out, iid_is(riid)] IUnknown ** ppObjectOpen);

    [local]
    HRESULT __stdcall OpenElement ([in] const WCHAR *pwcsName,
                [in] STGOPEN  * pStgOpen,
                [in] REFIID riid,
                [out] STGFMT * pStgfmt,
                [out] void ** ppObjectOpen);

    [call_as(OpenElement)]
    HRESULT __stdcall RemoteOpenElement ([in] const WCHAR *pwcsName,
                [in] STGOPEN  * pStgOpen,
                [in] REFIID riid,
                [out] STGFMT * pStgfmt,
                [out, iid_is(riid)] IUnknown ** ppObjectOpen);


    HRESULT MoveElement ([in] const WCHAR *pwcsName,
                [in, unique] IDirectory * pdirDest,
                [in, unique] const WCHAR * pwcsNewName,
                [in] DWORD grfFlags);

    HRESULT CommitDirectory ([in] DWORD grfCommitFlags);
    HRESULT RevertDirectory ();

    HRESULT DeleteElement ([in] const WCHAR *pwcsName);

    HRESULT SetTimes ([in, unique] const WCHAR *pwcsName,
                [in, unique] const FILETIME * pctime,
                [in, unique] const FILETIME * patime,
                [in, unique] const FILETIME * pmtime);

    HRESULT SetDirectoryClass ([in] REFCLSID clsid); // redudant ?

    HRESULT SetAttributes ([in, unique] const WCHAR * pwcsName,
                [in] DWORD grfAttrs);

    HRESULT StatElement ([in, unique] const WCHAR *pwcsName,
                [out] STATDIR *pstatdir,
                [in] DWORD grfStatFlag);

    HRESULT EnumDirectoryElements ([out] IEnumSTATDIR ** ppenum);

}

[
    object,
    uuid(74c76b90-b556-11ce-b33a-00aa00680937),
    pointer_default(unique)
]
interface IEnumSTATDIR : IUnknown
{
    [local]
    HRESULT __stdcall Next(
        [in]    ULONG                   celt,
        [in]    STATDIR *               rgelt,
        [out]   ULONG *                 pceltFetched );

    [call_as(Next)]
    HRESULT __stdcall RemoteNext(
        [in]    ULONG                   celt,
        [out, size_is(celt), length_is(*pceltFetched)] STATDIR * rgelt,
        [out]   ULONG *                 pceltFetched );


    HRESULT Skip([in] ULONG          celt);

    HRESULT Reset();

    HRESULT Clone([out] IEnumSTATDIR **  ppenum);
}