//***************************************************************************
//
//  Copyright (c) 1998-1999 Microsoft Corporation
//
//  util.h
//
//  alanbos  13-Feb-98   Created.
//
//  Useful things
//
//***************************************************************************

#ifndef _UTIL_H_
#define _UTIL_H_

HRESULT WmiVariantChangeType (VARIANT &vOut, VARIANT *pvIn, CIMTYPE lCimType);
HRESULT WmiConvertSafeArray (VARIANT &vOut, SAFEARRAY *pArray, CIMTYPE lCimType);
HRESULT WmiConvertDispatchArray (VARIANT &vOut, CComPtr<IDispatch> & pIDispatch, CIMTYPE lCimType);
bool	GetSafeArrayDimensions (SAFEARRAY &sArray, long &lLower, long &lUpper);

HRESULT	ConvertDispatchToArray (VARIANT *pDest, VARIANT *pSrc, CIMTYPE lCimType = CIM_ILLEGAL,
					BOOL bIsQualifier = false, VARTYPE requiredQualifierType = VT_NULL);

HRESULT MapToCIMOMObject (VARIANT *pVal);

HRESULT MapFromCIMOMObject (CSWbemServices *pService, VARIANT *pVal,
									ISWbemInternalObject *pObject = NULL,
									BSTR propertyName = NULL,
									long index = -1);

HRESULT ConvertArray(VARIANT * pDest, VARIANT * pSrc, BOOL bQualTypesOnly = false,
					 VARTYPE requiredVarType = VT_NULL);

HRESULT ConvertArrayRev(VARIANT * pDest, VARIANT * pSrc);

HRESULT ConvertBSTRArray(SAFEARRAY **ppDest, SAFEARRAY *pSrc);

HRESULT QualifierVariantChangeType(VARIANT* pvDest, VARIANT* pvSrc, VARTYPE vtNew);

VARTYPE GetAcceptableQualType(VARTYPE vt);

HRESULT BuildStringArray (SAFEARRAY *pArray, VARIANT & var);
HRESULT	SetFromStringArray (SAFEARRAY **ppArray, VARIANT *pVar);

BSTR FormatAssociatorsQuery (BSTR strObjectPath, BSTR strAssocClass,
	BSTR strResultClass, BSTR strResultRole, BSTR strRole, VARIANT_BOOL bClassesOnly,
	VARIANT_BOOL bSchemaOnly, BSTR strRequiredAssocQualifier, BSTR strRequiredQualifier);

BSTR FormatReferencesQuery (BSTR strObjectPath,	BSTR strResultClass, BSTR strRole,
	VARIANT_BOOL bClassesOnly, VARIANT_BOOL bSchemaOnly, BSTR strRequiredQualifier);

BSTR FormatMultiQuery (SAFEARRAY &pClassList, long iNumElements);

void	CheckArrayBounds (SAFEARRAY *psa, long index);
void	SetSite (VARIANT *pVal, ISWbemInternalObject *pSObject, BSTR propertyName, long index = -1);
void	SetWbemError (CSWbemServices *pService);
void	ResetLastErrors ();
void	SetException (EXCEPINFO *pExcepInfo, HRESULT hr, BSTR m_objectName);
BSTR	MapHresultToWmiDescription (HRESULT hr);
void	MapNulls (DISPPARAMS FAR* pdispparams);

void EnsureGlobalsInitialized ();

// CIM <-> VARIANT type coercion functions
VARTYPE CimTypeToVtType(CIMTYPE lType);
WbemCimtypeEnum GetCIMType (VARIANT &var, CIMTYPE iCIMType, 
								bool bIsArray = false, long lLBound = 0, long lUBound = 0);
bool CanCoerceString (const BSTR & bsValue, WbemCimtypeEnum cimType);
WbemCimtypeEnum MapVariantTypeToCimType (VARIANT *pVal, CIMTYPE cimType = CIM_ILLEGAL);

bool ReadUI64(LPCWSTR wsz, unsigned __int64& rui64);
bool ReadI64(LPCWSTR wsz, __int64& rui64);

bool IsNullOrEmptyVariant (VARIANT & var);
bool RemoveElementFromArray (SAFEARRAY & array, VARTYPE vt, long iIndex);
bool ShiftLeftElement (SAFEARRAY & array, VARTYPE vt, long iIndex);
bool ShiftElementsToRight (SAFEARRAY & array, VARTYPE vt, long iStartIndex, 
						   long iEndIndex, long iShift);																	

bool MatchBSTR (VARIANT & var, BSTR & bstrVal);
bool MatchUI1 (VARIANT & var, unsigned char bVal);
bool MatchI2 (VARIANT & var, short iVal);
bool MatchI4 (VARIANT & var, long lVal);
bool MatchR4 (VARIANT & var, float fltVal);
bool MatchR8 (VARIANT & var, double dblVal);
bool MatchBool (VARIANT & var, VARIANT_BOOL boolVal);
bool MatchValue (VARIANT &var1, VARIANT &var2);

#define WBEMS_PDN_SCHEME		L"WINMGMTS:"
#define WBEMS_LEFT_PAREN		L"("
#define WBEMS_RIGHT_PAREN		L")"
#define	WBEMS_LEFT_CURLY		L"{"
#define	WBEMS_RIGHT_CURLY		L"}"
#define WBEMS_LEFT_SQBRK		L"["
#define WBEMS_RIGHT_SQBRK		L"]"
#define WBEMS_LEFT_ANGLE		L"<"
#define WBEMS_RIGHT_ANGLE		L">"
#define	WBEMS_EQUALS			L"="
#define	WBEMS_COMMA				L","
#define	WBEMS_EXCLAMATION		L"!"
#define	WBEMS_AUTH_LEVEL		L"authenticationLevel"
#define WBEMS_AUTH_DEFAULT		L"default"
#define WBEMS_AUTH_NONE			L"none"
#define WBEMS_AUTH_CONNECT		L"connect"
#define WBEMS_AUTH_CALL			L"call"
#define WBEMS_AUTH_PKT			L"pkt"
#define WBEMS_AUTH_PKT_INT		L"pktIntegrity"
#define WBEMS_AUTH_PKT_PRIV		L"pktPrivacy"
#define	WBEMS_IMPERSON_LEVEL	L"impersonationLevel"
#define WBEMS_IMPERSON_ANON		L"anonymous"
#define WBEMS_IMPERSON_IDENTIFY L"identify"
#define WBEMS_IMPERSON_IMPERSON	L"impersonate"
#define WBEMS_IMPERSON_DELEGATE	L"delegate"
#define WBEMS_LOCALE			L"locale"
#define WBEMS_AUTHORITY			L"authority"
#define WBEMS_RK_SCRIPTING		_T("Software\\Microsoft\\Wbem\\Scripting")
#define WBEMS_RV_DEFNS			_T("Default Namespace")
#define WBEMS_RV_ENABLEFORASP	_T("Enable for ASP")
#define WBEMS_RV_DEFAULTIMPLEVEL _T("Default Impersonation Level")
#define WBEMS_DEFNS				_T("root\\cimv2")


// Strings for queries
#define WBEMS_QUERY_ASSOCOF		OLESTR("associators of ")
#define WBEMS_QUERY_OPENBRACE	OLESTR("{")
#define WBEMS_QUERY_CLOSEBRACE	OLESTR("}")
#define WBEMS_QUERY_WHERE		OLESTR(" where ")
#define WBEMS_QUERY_ASSOCCLASS	OLESTR(" AssocClass ")
#define WBEMS_QUERY_EQUALS		OLESTR("=")
#define WBEMS_QUERY_CLASSDEFS	OLESTR(" ClassDefsOnly ")
#define WBEMS_QUERY_REQASSOCQ	OLESTR(" RequiredAssocQualifier ")
#define WBEMS_QUERY_REQQUAL		OLESTR(" RequiredQualifier ")
#define WBEMS_QUERY_RESCLASS	OLESTR(" ResultClass ")
#define WBEMS_QUERY_RESROLE		OLESTR(" ResultRole ")
#define WBEMS_QUERY_ROLE		OLESTR(" Role ")
#define WBEMS_QUERY_SCHEMAONLY	OLESTR(" SchemaOnly ")
#define WBEMS_QUERY_REFOF		OLESTR("references of ")
#define	WBEMS_QUERY_SELECT		OLESTR("select * from ")
#define WBEMS_QUERY_GO			OLESTR(" go ")

// System properties
#define WBEMS_SP_CLASS				OLESTR("__CLASS")
#define WBEMS_SP_PATH				OLESTR("__PATH")
#define WBEMS_SP_RELPATH			OLESTR("__RELPATH")
#define WBEMS_SP_SERVER				OLESTR("__SERVER")
#define WBEMS_SP_NAMESPACE			OLESTR("__NAMESPACE")
#define WBEMS_SP_GENUS				OLESTR("__GENUS")
#define WBEMS_SP_DERIVATION			OLESTR("__DERIVATION")

// Context variables
#define	WBEMS_CV_GET_EXTENSIONS			OLESTR("__GET_EXTENSIONS")
#define WBEMS_CV_GET_EXT_CLIENT_REQUEST	OLESTR("__GET_EXT_CLIENT_REQUEST")
#define WBEMS_CV_GET_EXT_PROPERTIES		OLESTR("__GET_EXT_PROPERTIES")
#define WBEMS_CV_CLONE_SOURCE_PATH		OLESTR("__CloneSourcePath")
#define WBEMS_CV_OWNER					OLESTR("INCLUDE_OWNER")
#define WBEMS_CV_GROUP					OLESTR("INCLUDE_GROUP")
#define WBEMS_CV_DACL					OLESTR("INCLUDE_DACL")
#define WBEMS_CV_SACL					OLESTR("INCLUDE_SACL")


#define ENGLISH_LOCALE 1033

// Useful cleanup macros
#define RELEASEANDNULL(x) \
if (x) \
{ \
	x->Release (); \
	x = NULL; \
}

#define FREEANDNULL(x) \
if (x) \
{ \
	SysFreeString (x); \
	x = NULL; \
}

#define DELETEANDNULL(x) \
if (x) \
{ \
	delete x; \
	x = NULL; \
}

#ifdef _RDEBUG
extern void _RRPrint(int line, const char *file, const char *func, 
								const char *str, long code, const char *str2); 
#define _RD(a) a
#define _RPrint(a,b,c,d) _RRPrint(__LINE__,__FILE__,a,b,c,d)
#else
#define _RD(a)
#define _RPrint(a,b,c,d)
#endif

#endif