/////////////////////////////////////////////////////////////////////////////
//
//	Copyright (c) 1999 Microsoft Corporation
//
//	Module Name:
//		objectpath.h
//
//	Implementation File:
//		objectpath.cpp
//
//	Description:
//		Definition of the CObjpath class and other common class.
//
//	Author:
//		Henry Wang (Henrywa)	March 8, 2000
//
//	Notes:
//
/////////////////////////////////////////////////////////////////////////////
#pragma once


#include "common.h"
#include <list>
#include <string>
#include "genlex.h"		//wbem sdk header
#include "objpath.h"	//wbem sdk header


using namespace std;


class CPropertyValue
{
public:
	CPropertyValue();
	CPropertyValue(
		const CPropertyValue&
		);
	CPropertyValue& operator=(
		const CPropertyValue&
		);
	virtual ~CPropertyValue();
	wstring m_PropName;
	VARIANT m_PropValue;
	wstring m_Operator;
};


/////////////////////////////////////////////////////////////////////////////
//++
//
//	class CObjPath
//
//	Description:
//		CObjpath class make it easier to work with Object path string
//
//	Inheritance:
//		
//
//--
/////////////////////////////////////////////////////////////////////////////

class CObjPath 
{
public:
	wstring GetObjectPathString();
	BOOL SetProperty(
	    const WCHAR *   wszName,
	    //string &        strValue
        const WCHAR *   wszValue
		);
	BOOL AddProperty(
		const WCHAR*,
		string&
        );
	BOOL AddProperty(
	    const WCHAR *   wszName, 
	    const WCHAR *   wszValue
		);
	BOOL AddProperty(
	    const WCHAR *   wszName, 
	    VARIANT *       pvValue
        );
	BOOL AddProperty(
	    const WCHAR *   wszName, 
	    WORD            wValue
		);
	BOOL SetServer(
		const WCHAR *
		);
	BOOL SetNameSpace(
    	const WCHAR *wszValue
  		);
	BOOL SetClass(
    	const WCHAR *wszValue
		);
	wstring	GetStringValueForProperty(
    	const WCHAR* str
		);
	BOOL GetNumericValueForProperty(
	    const WCHAR *   wszName, 
	    WORD *          wValue
		);
	wstring	GetClassName(void);
	BOOL Init(
    	const WCHAR* szObjPath
		);
/*	wstring m_Server;
	wstring m_NameSpace;
	wstring m_Class;
	list<CPropertyValue> m_PropList;
*/	
	CObjPath();
	CObjPath(
		const CObjPath&
		);
	virtual ~CObjPath();
protected:
	wstring m_Server;
	wstring m_NameSpace;
	wstring m_Class;
	list<CPropertyValue> m_PropList;

};

class CDomainNode
{
public:
	wstring wstrZoneName;
	wstring wstrNodeName;
	wstring wstrChildName;
	CDomainNode();
	~CDomainNode();
	CDomainNode(
		const CDomainNode& 
		);
};

/////////////////////////////////////////////////////////////////////////////
//++
//
//	class CObjPath
//
//	Description:
//		base provider exception class
//
//	Inheritance:
//		exception
//
//--
/////////////////////////////////////////////////////////////////////////////

class CDnsProvException : public exception
{
public:
    CDnsProvException(
		const char* ,
		DWORD = 0);
    CDnsProvException();
	~CDnsProvException();
	CDnsProvException(
		const CDnsProvException& 
		) 
		throw();
    CDnsProvException& operator=(
		const CDnsProvException& 
		) throw();

	const char *what() const throw();
	DWORD GetErrorCode(void);
protected:
	string m_strError;
	DWORD m_dwCode;
};

/////////////////////////////////////////////////////////////////////////////
//++
//
//	class CObjPath
//
//	Description:
//		exception class specialized for set value exception
//
//	Inheritance:
//		CDnsProvException
//
//--
/////////////////////////////////////////////////////////////////////////////

class CDnsProvSetValueException : public CDnsProvException
{
public:
	CDnsProvSetValueException();
	~CDnsProvSetValueException();
	CDnsProvSetValueException(
		const WCHAR*
		);
	CDnsProvSetValueException(
		const CDnsProvSetValueException& rhs
		) throw();
    CDnsProvSetValueException& operator=(
		const CDnsProvSetValueException& rhs
		) throw();
};

/////////////////////////////////////////////////////////////////////////////
//++
//
//	class CObjPath
//
//	Description:
//		exception class specialized for get value exception
//
//	Inheritance:
//		CDnsProvException
//
//--
/////////////////////////////////////////////////////////////////////////////

class CDnsProvGetValueException : public CDnsProvException
{
public:
	CDnsProvGetValueException();
	~CDnsProvGetValueException();
	CDnsProvGetValueException(
		const WCHAR*
		);
	CDnsProvGetValueException(
		const CDnsProvGetValueException& rhs
		) throw();
    CDnsProvGetValueException& operator=(
		const CDnsProvGetValueException& rhs
		) throw();
};
/////////////////////////////////////////////////////////////////////////////
//++
//
//	class CWbemClassObject
//
//	Description:
//		Wrap for IWbemClassObject
//  
//
//	Inheritance:
//      	
//
//--
/////////////////////////////////////////////////////////////////////////////

class CWbemClassObject
{
protected:
	IWbemClassObject* m_pClassObject;
	VARIANT m_v;
public:
	CWbemClassObject();
	CWbemClassObject(IWbemClassObject*);
	virtual ~CWbemClassObject();
	IWbemClassObject** operator&();
	
	SCODE SetProperty(
        LPCSTR  pszValue, 
        LPCWSTR wszPropName
        );

	SCODE SetProperty(
        DWORD   dwValue, 
        LPCWSTR wszPropName
		);
	SCODE SetProperty(
        UCHAR   ucValue, 
        LPCWSTR wszPropName
        );

	SCODE SetProperty(
        LPCWSTR pszValue, 
        LPCWSTR wszPropName
		);

	SCODE SetProperty(
        wstring &   wstrValue, 
        LPCWSTR     wszPropName
        );

	SCODE SetProperty(
        SAFEARRAY * psa, 
        LPCWSTR     wszPropName
        );
	SCODE SetProperty(
        DWORD *     pdwValue, 
        DWORD       dwSize, 
        LPCWSTR     wszPropName
        );


	SCODE GetProperty(
        DWORD *     dwValue, 
        LPCWSTR     wszPropName
		);

	SCODE GetProperty(
        wstring &   wsStr, 
        LPCWSTR     wszPropName
        );
	SCODE GetProperty(
        string &    strStr, 
        LPCWSTR     wszPropName
        );
	SCODE GetProperty(
        BOOL *  bValue, 
        LPCWSTR szPropName
		);
	SCODE GetProperty(
		SAFEARRAY** ,
		LPCWSTR);
	SCODE GetProperty(
        DWORD **    ppValue, 
        DWORD *     dwSize, 
        LPCWSTR     szPropName
		);
	SCODE GetProperty(
        DWORD Value[], 
        DWORD *dwSize, 
        LPCWSTR szPropName
        );
	SCODE GetProperty(
        VARIANT *   pv, 
        LPCWSTR     wszPropName 
        );
	SCODE GetMethod(
        BSTR                name,
        LONG                lFlag,
        IWbemClassObject**  ppIN,
        IWbemClassObject**  ppOut
        );
	SCODE SpawnInstance(
		LONG,
		IWbemClassObject**);

	IWbemClassObject* data() { return m_pClassObject;};
};