/*
 * Copyright (C) 2004 Mike McCormack
 *
 * 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 "oaidl.idl";

typedef struct _ITS_Control_Data
{
    UINT cdwControlData;
    UINT adwControlData[1];

} ITS_Control_Data, *PITS_Control_Data;

typedef enum ECompactionLev { 
    COMPACT_DATA = 0,
    COMPACT_DATA_AND_PATH
} ECompactionLev;

[
  object,
  pointer_default(unique)
]
interface IITStorage : IUnknown
{
    HRESULT StgCreateDocfile(
        [in] const WCHAR * pwcsName,
        [in] DWORD grfMode,
        [in] DWORD reserved,
        [out] IStorage ** ppstgOpen);

    HRESULT StgCreateDocfileOnILockBytes(
        [in] ILockBytes * plkbyt,
        [in] DWORD grfMode,
        [in] DWORD reserved, 
        [out] IStorage ** ppstgOpen);


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

    HRESULT StgIsStorageILockBytes(
        [in] ILockBytes * plkbyt);

    HRESULT StgOpenStorage(
        [in] const WCHAR * pwcsName,
        [in] IStorage * pstgPriority,
        [in] DWORD grfMode,
        [in] SNB snbExclude,
        [in] DWORD reserved,
        [out] IStorage ** ppstgOpen);

    HRESULT StgOpenStorageOnILockBytes(
        [in] ILockBytes * plkbyt,
        [in] IStorage * pStgPriority,
        [in] DWORD grfMode,
        [in] SNB snbExclude,
        [in] DWORD reserved,
        [out] IStorage ** ppstgOpen);

    HRESULT StgSetTimes(
        [in] WCHAR const * lpszName,
        [in] FILETIME const * pctime,
        [in] FILETIME const * patime,
        [in] FILETIME const * pmtime);

    HRESULT SetControlData(
        [in] PITS_Control_Data pControlData);
    
    HRESULT DefaultControlData(
        [out] PITS_Control_Data * ppControlData);

    HRESULT Compact(
        [in] const WCHAR * pwcsName,
        [in] ECompactionLev iLev);
}

cpp_quote("DEFINE_GUID(CLSID_ITStorage,0x5d02926a,0x212e,0x11d0,0x9d,0xf9,0x00,0xa0,0xc9,0x22,0xe6,0xec );");
cpp_quote("DEFINE_GUID(IID_IITStorage, 0x88cc31de, 0x27ab, 0x11d0, 0x9d, 0xf9, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xec);");
