//+---------------------------------------------------------------------------
//
//  Microsoft Net Library System
//  Copyright (C) Microsoft Corporation, 1996 - 1997.
//
//  File:       fsciexps.hxx
//
//  Contents:   Objects provided by the FileSystem CI client to
//              Olympus. These are :
//
//              1. Property Store.
//              2. Property Store iterator.
//              3. User mode security cache.
//
//  History:    4-07-97   srikants   Created
//              4-07-97   KrishnaN   Added property store declaration
//
//----------------------------------------------------------------------------

#pragma once

//+---------------------------------------------------------------------------
//
//  Class:      PPropertyStore
//
//  Purpose:    The property store.
//
//  History:    4-07-97   KrishnaN   Created
//
//  Notes:      This interface exposes a HPropRecord instead of the CI
//              specific CPropRecord.
//
//----------------------------------------------------------------------------

class CStorageVariant;
class CFullPropSpec;
typedef void (CALLBACK * T_UpdateDoc)(WORKID wid, BOOL fDelete, void const *pUserData);

typedef HANDLE HPropRecord;

// the sizes of CPropRecord and CCompositeRecord are smaller
// than the values specified here. We just want to be sure
// we allocate something larger than the actual size.
unsigned const sizeof_CPropRecord = 100;
unsigned const sizeof_CCompositePropRecord = 200;

//
// The following constants enable SetParameter and GetParameter to be generic
// and at the same time allow for control of individual params. Currently
// both the params should be accompanied by VT_UI4 datatype.
//

#define PSPARAM_PRIMARY_MAPPEDCACHESIZE         0
#define PSPARAM_PRIMARY_BACKUPSIZE              1
#define PSPARAM_SECONDARY_MAPPEDCACHESIZE       2
#define PSPARAM_SECONDARY_BACKUPSIZE            3

#define PRIMARY_STORE           0
#define SECONDARY_STORE         1
#define INVALID_STORE_LEVEL     0xFFFFFFFF

class PPropertyStore
{
public:

    virtual ~PPropertyStore() {}

    //
    // This method internally fabricates a CiStorage from the pwszDirectory.
    //
    virtual SCODE FastInit( WCHAR const * pwszDirectory) = 0;
    virtual SCODE LongInit( BOOL & fWasDirty, ULONG & cInconsistencies,
                  T_UpdateDoc pfnUpdateCallback, void const *pUserData ) = 0;
    virtual SCODE IsDirty( BOOL &fIsDirty ) const = 0;
    virtual SCODE Empty() = 0;

    //
    // Schema manipulation
    //

    virtual SCODE CanStore( PROPID pid, BOOL &fCanStore ) = 0;
    virtual SCODE Size( PROPID pid, unsigned * pusSize ) = 0;
    virtual SCODE Type( PROPID pid, PULONG pulType ) = 0;
    virtual SCODE BeginTransaction( PULONG_PTR pulReturn) = 0;
    virtual SCODE Setup( PROPID pid, ULONG vt, DWORD cbMaxLen,
                         ULONG_PTR ulToken, BOOL fCanBeModified = TRUE,
                         DWORD dwStoreLevel =  PRIMARY_STORE) = 0;
    virtual SCODE EndTransaction( ULONG_PTR ulToken, BOOL fCommit,
                                  PROPID pidFixedPrimary,
                                  PROPID pidFixedSecondary ) = 0;

    //
    // Property storage/retrieval.
    //

    virtual SCODE WriteProperty( WORKID wid, PROPID pid,
                                CStorageVariant const & var,
                                BOOL &fExists) = 0;
    virtual SCODE WritePropertyInNewRecord( PROPID pid,
                               CStorageVariant const & var, WORKID *pwid ) = 0;
    virtual SCODE ReadProperty( WORKID wid, PROPID pid,
                               PROPVARIANT * pbData, unsigned * pcb,
                               BOOL &fExists) = 0;
    virtual SCODE ReadProperty( WORKID wid, PROPID pid, PROPVARIANT & var,
                               BYTE * pbExtra, unsigned * pcbExtra,
                               BOOL &fExists) = 0;
    virtual SCODE ReadProperty( HPropRecord, PROPID pid, PROPVARIANT & var,
                               BYTE * pbExtra, unsigned * pcbExtra, BOOL &fExists ) = 0;
    virtual SCODE ReadProperty( HPropRecord, PROPID pid, PROPVARIANT * pbData,
                               unsigned * pcb, BOOL &fExists) = 0;
    virtual SCODE ReadProperty( WORKID wid, PROPID pid, PROPVARIANT & var,
                                BOOL &fExists) = 0;
    virtual SCODE OpenRecord( WORKID wid, BYTE * pb, HPropRecord &hRec) = 0;
    virtual SCODE CloseRecord( HPropRecord hRec ) = 0;

    //
    // Special path/wid support
    //

    virtual SCODE MaxWorkId(WORKID &wid) = 0;
    virtual SCODE DeleteRecord( WORKID wid ) = 0;
    virtual SCODE CountRecordsInUse(ULONG &ulRecInUse) const = 0;
    virtual SCODE Shutdown() = 0;
    virtual SCODE Flush() = 0;

    //
    // Property Save/Load
    //

    virtual SCODE Save( WCHAR const * pwszDirectory,
                        IProgressNotify * pProgressNotify,
                        ICiEnumWorkids * pEnumWorkids,
                        BOOL * pfAbort,
                        IEnumString ** ppFileList) = 0;

    virtual SCODE Load( WCHAR const * pwszDestinationDirectory, // dest dir
                        IEnumString * pFileList, // list of files to copy
                        IProgressNotify * pProgressNotify,
                        BOOL fCallerOwnsFiles,
                        BOOL * pfAbort ) = 0;

    //
    // Enables parametrization of the property store
    //

    virtual SCODE SetParameter(VARIANT var, DWORD eParamType) = 0;
    virtual SCODE GetParameter(VARIANT &var, DWORD eParamType) = 0;

    // Miscellaneous

    virtual SCODE GetTotalSizeInKB(ULONG * pSize) = 0;

    //
    // Enables refcounting. Final Release causes delete.
    //

    virtual ULONG AddRef() = 0;
    virtual ULONG Release() = 0;

};

//+---------------------------------------------------------------------------
//
//  Class:      PPropertyStoreIter
//
//  Purpose:    An iterator for the property store.
//
//  History:    4-07-97   srikants   Created
//
//  Notes:
//
//----------------------------------------------------------------------------

class PPropertyStore;

class PPropertyStoreIter
{

public:

    virtual ULONG AddRef() = 0;

    virtual ULONG Release() = 0;

    virtual SCODE GetWorkId(WORKID &wid) = 0;

    virtual SCODE GetNextWorkId(WORKID &wid) = 0;
};


typedef ULONG SDID;

//+---------------------------------------------------------------------------
//
//  Class:      PSecurityStore
//
//  Purpose:    A table for doing SecurityDescriptor to SDID mapping and
//              doing access checks based on the SDID.
//
//  History:    4-07-97   srikants   Created
//
//----------------------------------------------------------------------------

class PSecurityStore
{

public:

    virtual ~PSecurityStore() {}

    virtual ULONG AddRef() = 0;
    virtual ULONG Release() = 0;

    // Initialize data from the given directory location.
    virtual SCODE Init( WCHAR const * pwszDirectory ) = 0;

    // Load data from the files produced by "Save". The first parameter
    // is the target directory for loading.
    virtual SCODE Load( WCHAR const * pwszDestinationDirectory, // dest dir
                        IEnumString * pFileList, // list of files to copy
                        IProgressNotify * pProgressNotify,
                        BOOL fCallerOwnsFiles,
                        BOOL * pfAbort ) = 0;

    // Make a copy of the security store. This can potentially be shipped
    // to a different machine.
    virtual SCODE Save( WCHAR const * pwszSaveDir,
                        BOOL * pfAbort,
                        IEnumString ** ppFileList,
                        IProgressNotify * pProgressEnum ) = 0;


    // Empty the contents of the security store.
    virtual SCODE Empty() = 0;

    // Look up the 4byte SDID of the given security descriptor.
    virtual SCODE LookupSDID( PSECURITY_DESCRIPTOR pSD, ULONG cbSD,
                              SDID & sdid ) = 0;

    // Tests if the given token has access to the document with the given
    // SDID.
    virtual SCODE AccessCheck( SDID sdid,
                               HANDLE hToken,
                               ACCESS_MASK am,
                               BOOL & fGranted ) = 0;

    // Obtains the security descriptor associated with the given SDID.
    virtual SCODE GetSecurityDescriptor(
                              SDID sdid,
                              PSECURITY_DESCRIPTOR pSD,
                              ULONG cbSDIn,
                              ULONG & cbSDOut ) = 0;

    virtual SCODE Shutdown() = 0;

};

//
// DLL exports for creating the various objects.
//
extern "C" {
// Creates a property store. Needs ICiAdviseStatus
SCODE CreatePropertyStore(  ICiCAdviseStatus *pAdviseStatus,
                            ULONG ulMaxPropertyStoreMappedCache,
                            PPropertyStore **ppPropertyStore );

// Creates a property store iterator given a property store.
SCODE CreatePropertyStoreIter( PPropertyStore * pPropStore,
                               PPropertyStoreIter ** ppPropStoreIter );

// Creates a security store.
SCODE CreateSecurityStore( ICiCAdviseStatus * pAdviseStatus,
                           PSecurityStore ** ppSecurityStore );

}   // extern "C"


#define CREATE_PROPERTY_STORE_PROC_A  "CreatePropertyStore"
#define CREATE_PROPERTY_STORE_PROC_W  L"CreatePropertyStore"

#define CREATE_PROPERTY_STORE_ITER_PROC_A  "CreatePropertyStoreIter"
#define CREATE_PROPERTY_STORE_ITER_PROC_W  L"CreatePropertyStoreIter"

#define CREATE_SECURITY_STORE_PROC_A  "CreateSecurityStore"
#define CREATE_SECURITY_STORE_PROC_W  L"CreateSecurityStore"