//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1998 - 1999
//
//  File:       wmiprop.h
//
//--------------------------------------------------------------------------

#ifndef ___wmiprop_h___
#define ___wmiprop_h___

typedef TCHAR *PTCHAR;

//
// Datablock description
//

//
// Holds a list of valid values for an enumeration type
//
typedef struct _ENUMERATIONITEM
{
    ULONG64 Value;
    PTCHAR Text;
    ULONG Reserved;
} ENUMERATIONITEM, *PENUMERATIONITEM;

typedef struct _ENUMERATIONINFO
{
    ULONG Count;
    ULONG Reserved;
    ENUMERATIONITEM List[1];
} ENUMERATIONINFO, *PENUMERATIONINFO;

//
// Holds a range of values
typedef struct
{
    ULONG64 Minimum;
    ULONG64 Maximum;
} RANGEINFO, *PRANGEINFO;

//
// Holds a list of ranges of values
//
typedef struct
{
    ULONG Count;
    RANGEINFO Ranges[1];
} RANGELISTINFO, *PRANGELISTINFO;

typedef enum VALIDATIONFUNC
{
    WmiStringValidation,
    WmiDateTimeValidation,
    WmiRangeValidation,
    WmiValueMapValidation,
    WmiEmbeddedValidation
} VALIDATIONFUNC, *PVALIDATIONFUNC;
#define WmiMaximumValidation WmiEmbeddedValidation

struct _DATA_BLOCK_DESCRIPTION;

typedef struct _DATA_ITEM_DESCRIPTION
{
    // CONSIDER: Make Name a BSTR
    PTCHAR Name;
    PTCHAR DisplayName;
    PTCHAR Description;
    CIMTYPE DataType;
    ULONG DataSize;
    VALIDATIONFUNC ValidationFunc;
    union
    {
        //
        // Used for enumeration data types
        //
        PENUMERATIONINFO EnumerationInfo;
    
        //
        // Used for a range of numbers
        PRANGELISTINFO RangeListInfo;    

        //
	// Used for embedded classes
        struct _DATA_BLOCK_DESCRIPTION *DataBlockDesc;
    };
    
    //
    // Number of elements in array if this item is an array
    //
    ULONG ArrayElementCount;
	ULONG CurrentArrayIndex;
    

	//
	// Flags about property
	//
    ULONG IsReadOnly : 1;
    ULONG IsSignedValue : 1;
    ULONG DisplayInHex : 1;
    ULONG IsFixedArray : 1;
    ULONG IsVariableArray : 1;
	
    //
    // Actual value of the property
    //
    union
    {
        //
		// storage for non array
		//
        UCHAR Data;

        BOOLEAN boolval;
        CHAR sint8;
        SHORT sint16;
        LONG sint32;
        LONG64 sint64;
        UCHAR uint8;
        USHORT uint16;
        ULONG uint32;
        ULONG64 uint64;
        PTCHAR String;
        PTCHAR DateTime;
        IWbemClassObject *pIWbemClassObject;
	
		//
		// pointer for storage to arrays
		//
        PVOID ArrayPtr;

        BOOLEAN *boolArray;
        CHAR *sint8Array;
        SHORT *sint16Array;
        LONG *sint32Array;
        LONG64 *sint64Array;
        UCHAR *uint8Array;
        USHORT *uint16Array;
        ULONG *uint32Array;
        ULONG64 *uint64Array;
        PTCHAR *StringArray;
        PTCHAR *DateTimeArray;
		IWbemClassObject **pIWbemClassObjectArray;
    };
           
} DATA_ITEM_DESCRIPTION, *PDATA_ITEM_DESCRIPTION;

typedef struct _DATA_BLOCK_DESCRIPTION
{
    PTCHAR Name;
    PTCHAR DisplayName;
    PTCHAR Description;
    struct _DATA_BLOCK_DESCRIPTION *ParentDataBlockDesc;
	IWbemClassObject *pInstance;
    ULONG DataItemCount;
	ULONG CurrentDataItem;
	BOOLEAN UpdateClass;
    DATA_ITEM_DESCRIPTION DataItems[1];    
} DATA_BLOCK_DESCRIPTION, *PDATA_BLOCK_DESCRIPTION;

BOOLEAN ValidateEnumeration(
    PDATA_ITEM_DESCRIPTION DataItem,
    PTCHAR Value
    );

BOOLEAN ValidateRangeList(
    PDATA_ITEM_DESCRIPTION DataItem,
    ULONG64 Value
    );

BOOLEAN ValidateDateTime(
    PDATA_ITEM_DESCRIPTION DataItem,
    PTCHAR DateTime
    );


typedef struct
{
    PTCHAR MachineName;
    PTCHAR RelPath;
    PDATA_BLOCK_DESCRIPTION DataBlockDesc;
    IWbemServices *pIWbemServices;
} CONFIGCLASS, *PCONFIGCLASS;


//
// PageInfo and Prototypes
//

typedef struct _PAGE_INFO {
    HDEVINFO         deviceInfoSet;
    PSP_DEVINFO_DATA deviceInfoData;

    HKEY             hKeyDev;

    CONFIGCLASS ConfigClass;
} PAGE_INFO, * PPAGE_INFO;


//
// Debug support
//
#ifdef DebugPrint
#undef DebugPrint
#endif

#if DBG

ULONG
_cdecl
DbgPrint(
    PCH Format,
    ...
    );

#define DEBUG_BUFFER_LENGTH 256

#define DebugPrint(x) WmiDebugPrint x

#else

#define DebugPrint(x)

#endif // DBG

VOID
WmiDebugPrint(
    ULONG DebugPrintLevel,
    PCHAR DebugMessage,
    ...
    );




//
// function prototype
//

void WmiCleanDataItemDescData(
    PDATA_ITEM_DESCRIPTION DataItemDesc
    );

void WmiHideAllControls(
    HWND hDlg,
    BOOLEAN HideEmbeddedControls,
    BOOLEAN HideArrayControls						
    );


BOOLEAN WmiValidateNumber(
    struct _DATA_ITEM_DESCRIPTION *DataItemDesc,
    PTCHAR Value
    );

BOOLEAN WmiValidateDateTime(
    struct _DATA_ITEM_DESCRIPTION *DataItemDesc,
    PTCHAR Value
    );

BOOLEAN WmiValidateRange(
    struct _DATA_ITEM_DESCRIPTION *DataItemDesc,
    PTCHAR Value
    );

PPAGE_INFO
WmiCreatePageInfo(IN HDEVINFO         deviceInfoSet,
                  IN PSP_DEVINFO_DATA deviceInfoData);

void
WmiDestroyPageInfo(PPAGE_INFO * ppPageInfo);

//
// Function Prototypes
//
BOOL APIENTRY
WmiPropPageProvider(LPVOID               pinfo,
                    LPFNADDPROPSHEETPAGE pfnAdd,
                    LPARAM               lParam);

HPROPSHEETPAGE
WmiCreatePropertyPage(PROPSHEETPAGE *  ppsp,
                      PPAGE_INFO       ppi);

UINT CALLBACK
WmiDlgCallback(HWND            hwnd,
               UINT            uMsg,
               LPPROPSHEETPAGE ppsp);

INT_PTR APIENTRY
WmiDlgProc(IN HWND   hDlg,
           IN UINT   uMessage,
           IN WPARAM wParam,
           IN LPARAM lParam);

BOOLEAN
WmiApplyChanges(PPAGE_INFO ppi,
                HWND       hDlg);

void
WmiUpdate (PPAGE_INFO ppi,
           HWND       hDlg);

BOOL
WmiContextMenu(HWND HwndControl,
                           WORD Xpos,
                           WORD Ypos);

void
WmiHelp(HWND       ParentHwnd,
                LPHELPINFO HelpInfo);

#endif // ___Wmiprop_h___