/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: PathParse.H Abstract: Implements the default object path parser. History: a-davj 5-feb-00 Created. --*/ #ifndef _PATHPARSE_H_ #define _PATHPARSE_H_ #include "genlex.h" #include #include #include "wbemcli.h" #include "flexarry.h" typedef LPVOID * PPVOID; class CSafeInCritSec : public CInCritSec { public: CSafeInCritSec(CRITICAL_SECTION * pcs):CInCritSec(pcs){}; ~CSafeInCritSec(){}; BOOL IsOK(){return true;}; }; class CRefCntCS { private: long m_lRef; CRITICAL_SECTION m_cs; HRESULT m_Status; public: CRefCntCS(); ~CRefCntCS() { if(m_Status == S_OK) DeleteCriticalSection(&m_cs); } HRESULT GetStatus(){return m_Status;}; long AddRef(void){long lRef = InterlockedIncrement(&m_lRef);return lRef;}; long Release(void); CRITICAL_SECTION * GetCS(){return &m_cs;}; }; //*************************************************************************** // // STRUCT NAME: // // CKeyRef // // DESCRIPTION: // // Holds information for a single key. Includes name, data, and data type. // //*************************************************************************** struct CKeyRef { LPWSTR m_pName; DWORD m_dwType; DWORD m_dwSize; void * m_pData; CKeyRef(); CKeyRef(LPCWSTR wszKeyName, DWORD dwType, DWORD dwSize, void * pData); HRESULT SetData(DWORD dwType, DWORD dwSize, void * pData); ~CKeyRef(); // note that the caller is to free the returned string. LPWSTR GetValue(BOOL bQuotes=TRUE); DWORD GetValueSize(); DWORD GetTotalSize(); }; //*************************************************************************** // // CLASS NAME: // // CParsedComponent // // DESCRIPTION: // // Each namespace, scope and the class is represented by an instance of this. It holds // an array of CKeyRef objects and supports the IWbemPathKeyList interface. // //*************************************************************************** class CParsedComponent : public IWbemPathKeyList { public: CParsedComponent(CRefCntCS *); ~CParsedComponent(); friend class CDefPathParser; friend class CUmiPathParser; void ClearKeys (); HRESULT GetName(BSTR *pName); HRESULT Unparse(BSTR *pKey, bool bGetQuotes, bool bUseClassName); HRESULT GetComponentType(DWORD &dwType); BOOL AddKeyRef(CKeyRef* pAcquireRef); bool IsPossibleNamespace(); bool IsInstance(); HRESULT SetNS(LPCWSTR pName); //IUnknown members STDMETHODIMP QueryInterface(REFIID riid, PPVOID ppv) { *ppv=NULL; if (IID_IUnknown==riid || IID_IWbemPathKeyList==riid) *ppv=this; else if (riid == IID_IMarshal && m_pFTM) return m_pFTM->QueryInterface(riid, ppv); //postponed till Blackcomb if (IID_IUmiURLKeyList==riid) //postponed till Blackcomb *ppv = &m_UmiWrapper; if (NULL!=*ppv) { AddRef(); return NOERROR; } return E_NOINTERFACE; }; STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&m_cRef); }; STDMETHODIMP_(ULONG) Release(void) { long lRef = InterlockedDecrement(&m_cRef); if (0L == lRef) delete this; return lRef; }; HRESULT STDMETHODCALLTYPE GetCount( /* [out] */ ULONG __RPC_FAR *puKeyCount); HRESULT STDMETHODCALLTYPE SetKey( /* [string][in] */ LPCWSTR wszName, /* [in] */ ULONG uFlags, /* [in] */ ULONG uCimType, /* [in] */ LPVOID pKeyVal); HRESULT STDMETHODCALLTYPE SetKey2( /* [string][in] */ LPCWSTR wszName, /* [in] */ ULONG uFlags, /* [in] */ ULONG uCimType, /* [in] */ VARIANT __RPC_FAR *pKeyVal); HRESULT STDMETHODCALLTYPE GetKey( /* [in] */ ULONG uKeyIx, /* [in] */ ULONG uFlags, /* [out][in] */ ULONG __RPC_FAR *puNameBufSize, /* [out][in] */ LPWSTR pszKeyName, /* [out][in] */ ULONG __RPC_FAR *puKeyValBufSize, /* [out][in] */ LPVOID pKeyVal, /* [out] */ ULONG __RPC_FAR *puApparentCimType); HRESULT STDMETHODCALLTYPE GetKey2( /* [in] */ ULONG uKeyIx, /* [in] */ ULONG uFlags, /* [out][in] */ ULONG __RPC_FAR *puNameBufSize, /* [out][in] */ LPWSTR pszKeyName, /* [out][in] */ VARIANT __RPC_FAR *pKeyValue, /* [out] */ ULONG __RPC_FAR *puApparentCimType); HRESULT STDMETHODCALLTYPE RemoveKey( /* [string][in] */ LPCWSTR wszName, /* [in] */ ULONG uFlags); HRESULT STDMETHODCALLTYPE RemoveAllKeys( /* [in] */ ULONG uFlags); HRESULT STDMETHODCALLTYPE MakeSingleton( boolean bSet); HRESULT STDMETHODCALLTYPE GetInfo( /* [in] */ ULONG uRequestedInfo, /* [out] */ ULONGLONG __RPC_FAR *puResponse); HRESULT STDMETHODCALLTYPE GetText( /* [in] */ long lFlags, /* [out][in] */ ULONG __RPC_FAR *puBuffLength, /* [string][out] */ LPWSTR pszText); private: BSTR m_sClassName; CFlexArray m_Keys; bool m_bSingleton; long m_cRef; CRefCntCS * m_pCS; IUnknown * m_pFTM; }; //*************************************************************************** // // CLASS NAME: // // CDefPathParser // // DESCRIPTION: // // Provides the default wmi path parser. // //*************************************************************************** class CDefPathParser : public IWbemPath { public: CDefPathParser(void); ~CDefPathParser(void); DWORD GetNumComponents(); bool IsEmpty(void); long GetNumNamespaces(); void Empty(void); enum Status {UNINITIALIZED, BAD_STRING, EXECEPTION_THROWN, OK, FAILED_TO_INIT}; BOOL ActualRelativeTest(LPWSTR wszMachine, LPWSTR wszNamespace, BOOL bChildrenOK); void InitEmpty(){}; //IUnknown members STDMETHODIMP QueryInterface(REFIID riid, PPVOID ppv) { *ppv=NULL; if(m_dwStatus == FAILED_TO_INIT) return WBEM_E_OUT_OF_MEMORY; if(m_pCS == NULL) return E_NOINTERFACE; if (IID_IUnknown==riid || IID_IWbemPath==riid) *ppv=(IWbemPath *)this; else if (riid == IID_IMarshal && m_pFTM) return m_pFTM->QueryInterface(riid, ppv); if (NULL!=*ppv) { AddRef(); return NOERROR; } return E_NOINTERFACE; }; STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&m_cRef); }; STDMETHODIMP_(ULONG) Release(void) { long lRef = InterlockedDecrement(&m_cRef); if (0L == lRef) delete this; return lRef; }; virtual HRESULT STDMETHODCALLTYPE SetText( /* [in] */ ULONG uMode, /* [in] */ LPCWSTR pszPath); virtual HRESULT STDMETHODCALLTYPE GetText( /* [in] */ long lFlags, /* [out][in] */ ULONG __RPC_FAR *puBuffLength, /* [string][out] */ LPWSTR pszText); virtual HRESULT STDMETHODCALLTYPE GetInfo( /* [in] */ ULONG uRequestedInfo, /* [out] */ ULONGLONG __RPC_FAR *puResponse); virtual HRESULT STDMETHODCALLTYPE SetServer( /* [string][in] */ LPCWSTR Name); virtual HRESULT STDMETHODCALLTYPE GetServer( /* [out][in] */ ULONG __RPC_FAR *puNameBufLength, /* [string][out] */ LPWSTR pName); virtual HRESULT STDMETHODCALLTYPE GetNamespaceCount( /* [out] */ ULONG __RPC_FAR *puCount); virtual HRESULT STDMETHODCALLTYPE SetNamespaceAt( /* [in] */ ULONG uIndex, /* [string][in] */ LPCWSTR pszName); virtual HRESULT STDMETHODCALLTYPE GetNamespaceAt( /* [in] */ ULONG uIndex, /* [out][in] */ ULONG __RPC_FAR *puNameBufLength, /* [string][out] */ LPWSTR pName); virtual HRESULT STDMETHODCALLTYPE RemoveNamespaceAt( /* [in] */ ULONG uIndex); virtual HRESULT STDMETHODCALLTYPE RemoveAllNamespaces( void); virtual HRESULT STDMETHODCALLTYPE GetScopeCount( /* [out] */ ULONG __RPC_FAR *puCount); virtual HRESULT STDMETHODCALLTYPE SetScope( unsigned long,unsigned short *); virtual HRESULT STDMETHODCALLTYPE SetScopeFromText( /* [in] */ ULONG uIndex, /* [in] */ LPWSTR pszText); virtual HRESULT STDMETHODCALLTYPE GetScope( /* [in] */ ULONG uIndex, /* [out][in] */ ULONG __RPC_FAR *puClassNameBufSize, /* [in] */ LPWSTR pszClass, /* [out] */ IWbemPathKeyList __RPC_FAR *__RPC_FAR *pKeyList); virtual HRESULT STDMETHODCALLTYPE GetScopeAsText( /* [in] */ ULONG uIndex, /* [out][in] */ ULONG __RPC_FAR *puTextBufSize, /* [out][in] */ LPWSTR pszText); virtual HRESULT STDMETHODCALLTYPE RemoveScope( /* [in] */ ULONG uIndex); virtual HRESULT STDMETHODCALLTYPE RemoveAllScopes( void); virtual HRESULT STDMETHODCALLTYPE SetClassName( /* [string][in] */ LPCWSTR Name); virtual HRESULT STDMETHODCALLTYPE GetClassName( /* [out][in] */ ULONG __RPC_FAR *puBuffLength, /* [string][out] */ LPWSTR pszName); virtual HRESULT STDMETHODCALLTYPE GetKeyList( /* [out] */ IWbemPathKeyList __RPC_FAR *__RPC_FAR *pOut); virtual HRESULT STDMETHODCALLTYPE CreateClassPart( /* [in] */ long lFlags, /* [string][in] */ LPCWSTR Name); virtual HRESULT STDMETHODCALLTYPE DeleteClassPart( /* [in] */ long lFlags); virtual BOOL STDMETHODCALLTYPE IsRelative( /* [string][in] */ LPWSTR wszMachine, /* [string][in] */ LPWSTR wszNamespace); virtual BOOL STDMETHODCALLTYPE IsRelativeOrChild( /* [string][in] */ LPWSTR wszMachine, /* [string][in] */ LPWSTR wszNamespace, /* [in] */ long lFlags); virtual BOOL STDMETHODCALLTYPE IsLocal( /* [string][in] */ LPCWSTR wszMachine); virtual BOOL STDMETHODCALLTYPE IsSameClassName( /* [string][in] */ LPCWSTR wszClass); HRESULT SetServer(LPCWSTR Name, bool m_bServerNameSetByDefault, bool bAcquire); BOOL HasServer(){return m_pServer != NULL;}; LPWSTR GetPath(DWORD nStartAt, DWORD nStopAt,bool bGetServer = false); BOOL AddNamespace(LPCWSTR wszNamespace); BOOL AddClass(LPCWSTR lpClassName); BOOL AddKeyRef(CKeyRef* pAcquireRef); BOOL SetSingletonObj(); LPWSTR GetNamespacePart(); LPWSTR GetParentNamespacePart(); BOOL SortKeys(); CParsedComponent * GetLastComponent(); HRESULT GetComponentString(ULONG Index, BSTR * pUnparsed, WCHAR & wDelim); HRESULT AddComponent(CParsedComponent * pComp); CParsedComponent * GetClass(); CRefCntCS * GetRefCntCS(){return m_pCS;}; void * m_pGenLex; // for test purposes only protected: bool m_bSetViaUMIPath; long m_cRef; LPWSTR m_pServer; // NULL if no server CFlexArray m_Components; // list of namespaces and scopes // CParsedComponent * m_pClass; // the class DWORD m_dwStatus; bool m_bParent; // true if text is ".." LPWSTR m_pRawPath; // temporary fix for Raja CRefCntCS * m_pCS; LPWSTR m_wszOriginalPath; bool m_bServerNameSetByDefault; IUnknown * m_pFTM; DWORD m_dwException; }; #endif