//--------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1995
//
//  File:  utilprop.cxx
//
//  Contents:  CUtilProp object definitions
//
//
//  History:   08-28-96     shanksh    Created.
//
//----------------------------------------------------------------------------
// @module UTILPROP.H | CUtilProp object definitions
//
//
#ifndef _UTILPROP_HXX_
#define _UTILPROP_HXX_


//-----------  structs and #defines -------------------------------------------

//
// simple table used to store property information. Used in
// the read-only implementation of IDBProperties::GetPropertyInfo and
//
typedef struct _tagPROPSTRUCT {
    DBPROPID    dwPropertyID;
    DBPROPFLAGS dwFlags;
    VARTYPE     vtType;
    BOOL        boolVal;
    LONG        longVal;
    DBPROPOPTIONS dwOptions;
    PWSTR       pwstrVal;
    LPOLESTR    pwszDescription;
    DBID        colid;
} PROPSTRUCT;


typedef struct tagPROPSET
{
    const GUID *guidPropertySet;
    ULONG       cProperties;
    PROPSTRUCT* pUPropInfo;
} PROPSET;

//
// flags for IDBProperties::GetPropertyInfo
//
#define F_ROWSETRO      (DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ)
#define F_ROWSETRW      (DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | \
                         DBPROPFLAGS_WRITE)
#define F_DSRO          (DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ)
#define F_DBINITRW      (DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | \
                         DBPROPFLAGS_WRITE)

#define F_SESSRO        (DBPROPFLAGS_SESSION | DBPROPFLAGS_READ)

#define F_ADSIRO        (DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ)
#define F_ADSIRW        (DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | \
                         DBPROPFLAGS_WRITE)

#define OPT_REQ         (DBPROPOPTIONS_REQUIRED)
#define OPT_SIC         (DBPROPOPTIONS_OPTIONAL)

// flags for Get and Set Properties
const DWORD        PROPSET_DSO        = 0x0001;
const DWORD        PROPSET_INIT       = 0x0002;
const DWORD        PROPSET_SESSION    = 0x0004;
const DWORD        PROPSET_COMMAND    = 0x0008;

//----------------------------------------------------------------------------
// CUtilProp | Containing class for all interfaces on the UtilProp
// Object
//
class CUtilProp {
    DWORD _dwDescBufferLen;
    IMalloc *_pIMalloc;
    CCredentials *_pCredentials;
protected:
    // Member for all of the property work
        PROPSTRUCT * _prgProperties;

    // Loads fields of DBPROPINFO struct. Helper for GetPropertyInfo
    STDMETHODIMP
    LoadDBPROPINFO(
        PROPSTRUCT*     pPropStruct,
        ULONG           cProperties,
        DBPROPINFO*     pPropInfo
    );

    // Loads fields of DBPROP struct. Helper for GetProperties
    STDMETHODIMP
    LoadDBPROP(
        PROPSTRUCT*     pPropSet,
        ULONG           cProperties,
        DBPROP*         pPropSupport,
        BOOL            IsDBInitPropSet
    );

    STDMETHODIMP
    CUtilProp::StoreDBPROP (
        PROPSTRUCT* pPropStruct,
        PROPSTRUCT* pStaticPropStruct,
        ULONG       cProperties,
        DBPROP*     pPropSupport,
                DWORD           dwPropIndex
    );

    HRESULT
    CUtilProp::IsValidValue (
        DBPROP*         pDBProp,
        DWORD           dwPropIndex
    );

    BOOL
    CUtilProp::IsADSIFlagSet();

    HRESULT
    CUtilProp::IsValidInitMode(long lVal);

    HRESULT
    CUtilProp::IsValidBindFlag(long lVal);

    BOOL
    CUtilProp::IsSpecialGuid(GUID guidPropSet);

public:

    CUtilProp(void);

    ~CUtilProp(void);


    STDMETHODIMP CUtilProp::FInit(
        CCredentials* pCredentials
    );

    STDMETHODIMP GetProperties(
        ULONG               cPropertySets,
        const DBPROPIDSET   rgPropertySets[],
        ULONG*              pcProperties,
        DBPROPSET**         prgProperties,
        DWORD               dwBitMask
        );

    STDMETHODIMP GetPropertyInfo(
        ULONG               cPropertySets,
        const DBPROPIDSET   rgPropertySets[],
        ULONG*              pcPropertyInfoSets,
        DBPROPINFOSET**     prgPropertyInfoSets,
        WCHAR**             ppDescBuffer,
        BOOL                fDSOInitialized
        );

    STDMETHODIMP CUtilProp::SetProperties(
        ULONG               cProperties,
        DBPROPSET           rgProperties[],
        DWORD               dwBitMask
        );

    HRESULT
    GetSearchPrefInfo(
        DBPROPID dwPropId,
        PADS_SEARCHPREF_INFO pSearchPrefInfo
        );

    HRESULT
    CUtilProp::FreeSearchPrefInfo(
        PADS_SEARCHPREF_INFO pSearchPrefInfo,
        DWORD dwNumSearchPrefs
        );

    PROPSET *
    CUtilProp::GetPropSetFromGuid (
        GUID guidPropSet
        );

    BOOL
    CUtilProp::IsIntegratedSecurity ();

    HRESULT
    CUtilProp::GetPropertiesArgChk(
        ULONG                   cPropertySets,
        const DBPROPIDSET       rgPropertySets[],
        ULONG*                  pcProperties,
        DBPROPSET**             prgProperties,
        DWORD                   dwBitMask
        );

};

typedef CUtilProp *PCUTILPROP;

#define NUMELEM(p) (sizeof(p) / sizeof(p[0]))

#endif