// RequestObject.cpp: implementation of the CRequestObject class. // Copyright (c)1997-1999 Microsoft Corporation // ////////////////////////////////////////////////////////////////////// #include "precomp.h" #include "requestobject.h" #include //Classes #include "poddata.h" #include "podbase.h" //Associations CHeap_Exception CRequestObject::m_he(CHeap_Exception::E_ALLOCATION_ERROR); ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CRequestObject::CRequestObject() { m_cRef = 0; m_bstrPath = NULL; m_bstrClass = NULL; } CRequestObject::~CRequestObject() { } //*************************************************************************** // // CRequestObject::QueryInterface // CRequestObject::AddRef // CRequestObject::Release // // Purpose: IUnknown members for CRequestObject object. //*************************************************************************** /* STDMETHODIMP CRequestObject::QueryInterface(REFIID riid, PPVOID ppv) { return E_NOINTERFACE; } STDMETHODIMP_(ULONG) CRequestObject::AddRef(void) { InterlockedIncrement((long *)&m_cRef); return m_cRef; } STDMETHODIMP_(ULONG) CRequestObject::Release(void) { ULONG nNewCount = InterlockedDecrement((long *)&m_cRef); // if(0L == nNewCount) delete this; return nNewCount; } */ void CRequestObject::Initialize(IWbemServices *pNamespace) { m_pNamespace = pNamespace; m_pHandler = NULL; m_bstrClass = NULL; m_bstrPath = NULL; m_iPropCount = m_iValCount = 0; for(int i = 0; i < POD_KEY_LIST_SIZE; i++) m_Property[i] = m_Value[i] = NULL; } HRESULT CRequestObject::CreateObject(BSTR bstrPath, IWbemObjectSink *pHandler, IWbemContext *pCtx) { HRESULT hr = WBEM_S_NO_ERROR; CGenericClass *pClass = NULL; m_bstrPath = SysAllocString(bstrPath); if(!m_bstrPath) throw m_he; if(ParsePath(bstrPath)){ try{ //create the appropriate class if(SUCCEEDED(hr = CreateClass(&pClass, pCtx))){ if(!pClass) throw m_he; //get the requested object hr = pClass->CreateObject(pHandler, ACTIONTYPE_GET); } }catch(...){ if(pClass){ pClass->CleanUp(); delete pClass; } throw; } if(pClass){ pClass->CleanUp(); delete pClass; } }else hr = WBEM_E_FAILED; return hr; } HRESULT CRequestObject::CreateClass(CGenericClass **pClass, IWbemContext *pCtx) { HRESULT hr = WBEM_S_NO_ERROR; //Create the appropriate class ///////////// // Classes // ///////////// if(0 == _wcsicmp(m_bstrClass, L"Sample_DataClass")){ *pClass = new CPodData(this, m_pNamespace, pCtx); } else if(0 == _wcsicmp(m_bstrClass, L"Sample_BaseClass")){ *pClass = new CPodBase(this, m_pNamespace, pCtx); ////////////////// // Associations // ////////////////// }else return WBEM_E_NOT_FOUND; if(!(*pClass)) throw m_he; return hr; }; HRESULT CRequestObject::CreateObjectEnum(BSTR bstrPath, IWbemObjectSink *pHandler, IWbemContext *pCtx) { HRESULT hr = WBEM_S_NO_ERROR; CGenericClass *pClass = NULL; m_bstrPath = SysAllocString(bstrPath); if(!m_bstrPath) throw m_he; if(ParsePath(bstrPath)){ try{ //Create the appropriate class if(SUCCEEDED(hr = CreateClass(&pClass, pCtx))){ if(!pClass) throw m_he; //Enumerate the objects hr = pClass->CreateObject(pHandler, ACTIONTYPE_ENUM); } }catch(...){ if(pClass){ pClass->CleanUp(); delete pClass; } throw; } if(pClass){ pClass->CleanUp(); delete pClass; } }else hr = WBEM_E_FAILED; return hr; } HRESULT CRequestObject::PutObject(IWbemClassObject *pInst, IWbemObjectSink *pHandler, IWbemContext *pCtx) { HRESULT hr = WBEM_S_NO_ERROR; CGenericClass *pClass = NULL; VARIANT v; VariantInit(&v); if(SUCCEEDED(pInst->Get(L"__RELPATH", 0, &v, NULL, NULL))){ m_bstrPath = SysAllocString(V_BSTR(&v)); if(!m_bstrPath) throw m_he; if(!ParsePath(V_BSTR(&v))) hr = WBEM_E_FAILED; }else hr = WBEM_E_FAILED; if(SUCCEEDED(pInst->Get(L"__CLASS", 0, &v, NULL, NULL))){ try{ m_bstrClass = SysAllocString(V_BSTR(&v)); if(!m_bstrClass) throw m_he; //Create the appropriate class if(SUCCEEDED(hr = CreateClass(&pClass, pCtx))){ if(!pClass) throw m_he; //Enumerate the objects hr = pClass->PutInst(pInst, pHandler, pCtx); } }catch(...){ if(pClass){ pClass->CleanUp(); delete pClass; } throw; } if(pClass){ pClass->CleanUp(); delete pClass; } }else hr = WBEM_E_FAILED; VariantClear(&v); return hr; } HRESULT CRequestObject::ExecMethod(BSTR bstrPath, BSTR bstrMethod, IWbemClassObject *pInParams, IWbemObjectSink *pHandler, IWbemContext *pCtx) { HRESULT hr = WBEM_S_NO_ERROR; CGenericClass *pClass = NULL; m_bstrPath = SysAllocString(bstrPath); if(!m_bstrPath) throw m_he; if(ParsePath(bstrPath)){ try{ //Create the appropriate class if(SUCCEEDED(hr = CreateClass(&pClass, pCtx))){ if(!pClass) throw m_he; //execute the method hr = pClass->ExecMethod(bstrMethod, IsInstance(), pInParams, pHandler, pCtx); } }catch(...){ if(pClass){ pClass->CleanUp(); delete pClass; } throw; } if(pClass){ pClass->CleanUp(); delete pClass; } }else return WBEM_E_FAILED; return hr; } HRESULT CRequestObject::DeleteObject(BSTR bstrPath, IWbemObjectSink *pHandler, IWbemContext *pCtx) { HRESULT hr = WBEM_S_NO_ERROR; CGenericClass *pClass = NULL; m_bstrPath = SysAllocString(bstrPath); if(!m_bstrPath) throw m_he; if(ParsePath(bstrPath)){ try{ //Create the appropriate class if(SUCCEEDED(hr = CreateClass(&pClass, pCtx))){ if(!pClass) throw m_he; //delete the object hr = pClass->CreateObject(pHandler, ACTIONTYPE_DELETE); } }catch(...){ if(pClass){ pClass->CleanUp(); delete pClass; } throw; } if(pClass){ pClass->CleanUp(); delete pClass; } }else hr = WBEM_E_FAILED; return hr; } bool CRequestObject::ParsePath(BSTR bstrPath) { if(wcslen(bstrPath) < 1) return false; WCHAR wcTest[(BUFF_SIZE) + 1]; wcscpy(wcTest, bstrPath); WCHAR *pwcTest = NULL; WCHAR *pwcClassStart = wcTest; WCHAR *pwcNamespace = NULL; WCHAR *pwcStart = NULL; WCHAR *pwcStrip = NULL; WCHAR wcPrevious = NULL; int iNumQuotes = 0; bool bClass = false; bool bDoubles = false; //Main Parsing Loop for(pwcTest = wcTest; *pwcTest; pwcTest++){ if((*pwcTest == L'\\') && !bClass){ for(pwcNamespace = pwcTest; *pwcNamespace != L':'; pwcNamespace++){} pwcClassStart = pwcNamespace + 1; pwcTest = pwcNamespace; }else if(*pwcTest == L'.'){ if(iNumQuotes == 0){ // issolate the class name. *pwcTest = NULL; if(m_bstrClass){ SysFreeString(m_bstrClass); m_bstrClass = NULL; } m_bstrClass = SysAllocString(pwcClassStart); if(!m_bstrClass) throw m_he; bClass = true; pwcStart = (pwcTest + 1); } }else if(*pwcTest == L'='){ if(iNumQuotes == 0){ if(!bClass){ // issolate the class name. *pwcTest = NULL; if(m_bstrClass){ SysFreeString(m_bstrClass); m_bstrClass = NULL; } m_bstrClass = SysAllocString(pwcClassStart); if(!m_bstrClass) throw m_he; bClass = true; pwcStart = (pwcTest + 1); }else{ // issolate the property name. *pwcTest = NULL; if(pwcStart != NULL){ m_Property[m_iPropCount] = SysAllocString(pwcStart); if(!m_Property[m_iPropCount++]) throw m_he; pwcStart = (pwcTest + 1); }else pwcStart = (pwcTest + 1); } } }else if(*pwcTest == L','){ if(iNumQuotes != 1){ // issolate the property value. *pwcTest = NULL; if(pwcStart != NULL){ m_Value[m_iValCount] = SysAllocString(pwcStart); if(!m_Value[m_iValCount++]) throw m_he; pwcStart = (pwcTest + 1); }else return false; } }else if(*pwcTest == L'\"'){ if(wcPrevious != L'\\'){ // deal with quotes in path. iNumQuotes++; if(iNumQuotes == 1) pwcStart = (pwcTest + 1); else if(iNumQuotes == 2){ *pwcTest = NULL; iNumQuotes = 0; } }else if(iNumQuotes == 1){ //deal with embedded quotes for(pwcStrip = (--pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; } }else if((*pwcTest == L'\\') && (wcPrevious == L'\\') && bClass && !bDoubles){ for(pwcStrip = (--pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; } #ifdef _STRIP_ESCAPED_CHARS else if(*pwcTest == L'%'){ //deal with escaped URL characters if(*(pwcTest + 1) == L'0'){ if(*(pwcTest + 2) == L'7'){ //bell *pwcTest = L'\\'; *(++pwcTest) = L'a'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else if(*(pwcTest + 2) == L'8'){ //backspace *pwcTest = L'\\'; *(++pwcTest) = L'b'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else if(*(pwcTest + 2) == L'9'){ //horizontal tab *pwcTest = L'\\'; *(++pwcTest) = L't'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else if((*(pwcTest + 2) == L'A') || (*(pwcTest + 2) == L'a')){ //newline *pwcTest = L'\\'; *(++pwcTest) = L'n'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else if((*(pwcTest + 2) == L'B') || (*(pwcTest + 2) == L'b')){ //vertical tab *pwcTest = L'\\'; *(++pwcTest) = L'v'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else if((*(pwcTest + 2) == L'C') || (*(pwcTest + 2) == L'c')){ //formfeed *pwcTest = L'\\'; *(++pwcTest) = L'f'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else if((*(pwcTest + 2) == L'D') || (*(pwcTest + 2) == L'd')){ //carriage return *pwcTest = L'\\'; *(++pwcTest) = L'r'; for(pwcStrip = (++pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else return false; }else if(*(pwcTest + 1) == L'1'){ return false; }else if(*(pwcTest + 1) == L'2'){ if(*(pwcTest + 2) == L'0'){ //space *pwcTest++ = L' '; for(int ip = 0; ip < 2; ip++) for(pwcStrip = (pwcTest); *pwcStrip; pwcStrip++) *pwcStrip = *(pwcStrip + 1); *pwcStrip = NULL; }else return false; } } #endif //_STRIP_ESCAPED_CHARS if((wcPrevious == *pwcTest) && !bDoubles) bDoubles = true; else bDoubles = false; wcPrevious = *pwcTest; } // if we still have values to add, do so now if(pwcStart != NULL){ m_Value[m_iValCount] = SysAllocString(pwcStart); if(!m_Value[m_iValCount++]) throw m_he; }else if((m_iPropCount < 1) && (m_iValCount < 1)){ if(m_bstrClass){ SysFreeString(m_bstrClass); m_bstrClass = NULL; } m_bstrClass = SysAllocString(pwcClassStart); if(!m_bstrClass) throw m_he; } if(iNumQuotes != 0) return false; if(m_iValCount != m_iPropCount){ if(m_iValCount > m_iPropCount){ if(m_iValCount != 1) return false; } else return false; } if(!m_bstrClass) return false; return true; } bool CRequestObject::Cleanup() { //Let's destroy our list and clear up some space if(m_bstrClass != NULL) SysFreeString(m_bstrClass); if(m_bstrPath != NULL) SysFreeString(m_bstrPath); for(int i = 0; i < POD_KEY_LIST_SIZE; i++){ if(m_Property[i] != NULL) SysFreeString(m_Property[i]); if(m_Value[i] != NULL) SysFreeString(m_Value[i]); } return true; } bool CRequestObject::IsInstance() { if((m_iPropCount > 0) || (m_iValCount > 0)) return true; return false; } //Properties ///////////////////// const WCHAR *pSceStorePath = L"SceStorePath"; const WCHAR *pLogFilePath = L"LogFilePath"; const WCHAR *pLogFileRecord = L"LogFileRecord"; const WCHAR *pLogArea = L"LogArea"; const WCHAR *pLogErrorCode = L"LogErrorCode"; const WCHAR *pKeyName = L"KeyName"; const WCHAR *pKey = L"Key"; const WCHAR *pValue = L"Value"; const WCHAR *pPodID = L"PodID"; const WCHAR *pPodSection = L"PodSection"; const WCHAR *szPodGUID = L"{c5f6cc21_6195_4555_b9d8_3ef327763cae}";