// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved // JobObjectProv.h #include "precomp.h" #include #include "FRQueryEx.h" #include "helpers.h" #include "globals.h" #include #include #include "CVARIANT.h" #include "CObjProps.h" #include #ifndef PROP_NONE_REQUIRED #define PROP_NONE_REQUIRED 0x00000000 #endif CObjProps::CObjProps(CHString& chstrNamespace) { m_chstrNamespace = chstrNamespace; } CObjProps::~CObjProps() { // Clean the property map. ClearProps(); } void CObjProps::ClearProps() { // Clean the property map. SHORT2PVARIANT::iterator theIterator; for(theIterator = m_PropMap.begin(); theIterator != m_PropMap.end(); theIterator++) { if(theIterator->second != NULL) { delete theIterator->second; } } m_PropMap.clear(); } // Accessors to the requested properties member. void CObjProps::SetReqProps(DWORD dwProps) { m_dwReqProps = dwProps; } DWORD CObjProps::GetReqProps() { return m_dwReqProps; } //*************************************************************************** // // Function: SetKeysFromPath // // called by the DeleteInstance and GetObject in order to load a // IWbemClassObject* with the key values in an object path. // // Inputs: IWbemClassObject* pInstance - Instance to store // key values in. // ParsedObjectPath* pParsedObjectPath - All the news // thats fit to print. // rgKeyNameArray An array of CHStrings containing // the names of the key properties. // sKeyNum An array of the key property // reference numbers. // // Outputs: // // Return: HRESULT Success/Failure // // Comments: The number of elements in rgKeyNameArray and sKeyNum must be // the same. // //*************************************************************************** HRESULT CObjProps::SetKeysFromPath( const BSTR ObjectPath, IWbemContext __RPC_FAR *pCtx, LPCWSTR wstrClassName, CHStringArray& rgKeyNameArray, short sKeyNum[]) { HRESULT hr = WBEM_S_NO_ERROR; _ASSERT(sKeyNum); CObjectPathParser objpathParser; ParsedObjectPath* pParsedPath = NULL; try { int iParseResult = objpathParser.Parse( ObjectPath, &pParsedPath); if(CObjectPathParser::NoError == iParseResult) { CFrameworkQueryEx cfwqe; cfwqe.Init( (ParsedObjectPath*) pParsedPath, (IWbemContext*) pCtx, wstrClassName, (CHString&) m_chstrNamespace); if(rgKeyNameArray.GetSize() == pParsedPath->m_dwNumKeys) { // populate key props... for (DWORD i = 0; SUCCEEDED(hr) && i < (pParsedPath->m_dwNumKeys); i++) { if (pParsedPath->m_paKeys[i]) { // If a name was specified in the form class.keyname=value if (pParsedPath->m_paKeys[i]->m_pName != NULL) { if(_wcsicmp(pParsedPath->m_paKeys[i]->m_pName, rgKeyNameArray[i]) == 0) { // Store the value... m_PropMap.insert(SHORT2PVARIANT::value_type( sKeyNum[i], new CVARIANT(pParsedPath->m_paKeys[i]->m_vValue))); } } else { // There is a special case that you can say class=value // only one key allowed in the format. Check the names // on the path if (pParsedPath->m_dwNumKeys == 1) { // Store the value... m_PropMap.insert(SHORT2PVARIANT::value_type( sKeyNum[i], new CVARIANT(pParsedPath->m_paKeys[i]->m_vValue))); } else { hr = WBEM_E_INVALID_OBJECT_PATH; _ASSERT(0); // somebody lied about the number // of keys or the datatype was wrong } } } else { hr = WBEM_E_INVALID_OBJECT_PATH; _ASSERT(0); // somebody lied about the number of keys! } } } else { hr = WBEM_E_INVALID_OBJECT_PATH; _ASSERT(0); // somebody lied about the number of keys! } } else { hr = WBEM_E_INVALID_OBJECT_PATH; _ASSERT(0); } if (pParsedPath) { objpathParser.Free( pParsedPath ); } } catch(CVARIANTError& cve) { hr = cve.GetWBEMError(); if (pParsedPath) { objpathParser.Free( pParsedPath ); } } catch(...) { if (pParsedPath) { objpathParser.Free( pParsedPath ); } throw; } return hr; } // Allows direct setting of key properties. // Key property values are stored in vecvKeys. // sKeyNum is an array of the key property // positions in m_PropMap. The elements of // these two arrays map to each other (e.g., // the first element in vecvKeys should be // associated with the first element in sKeyNum, // and so on). HRESULT CObjProps::SetKeysDirect( std::vector& vecvKeys, short sKeyNum[]) { HRESULT hr = S_OK; UINT uiCount = vecvKeys.size(); try // CVARIANT can throw and I want the error... { for (UINT u = 0; u < uiCount; u++) { // Store the value... m_PropMap.insert(SHORT2PVARIANT::value_type( sKeyNum[u], new CVARIANT(vecvKeys[u]))); } } catch(CVARIANTError& cve) { hr = cve.GetWBEMError(); } return hr; } HRESULT CObjProps::GetWhichPropsReq( CFrameworkQuery& cfwq, PFN_CHECK_PROPS pfnChk) { // Get the requested properties for this // specific object via derived class fn... m_dwReqProps = pfnChk(cfwq); return WBEM_S_NO_ERROR; } // Loads all properties stored in this // object into a new IWbemClassObject instance. HRESULT CObjProps::LoadPropertyValues( LPCWSTR rgwstrPropNames[], IWbemClassObject* pIWCO) { HRESULT hr = WBEM_S_NO_ERROR; if(!pIWCO) return E_POINTER; SHORT2PVARIANT::iterator theIterator; // Our map will only contain entries for properties // that were set via SetNonKeyReqProps, which only // set properties that were requested. try // CVARIANT can throw and I want the error... { for(theIterator = m_PropMap.begin(); theIterator != m_PropMap.end() && SUCCEEDED(hr); theIterator++) { // Because DWORDS and ULONGLONGs are not // automation compatible types (although // they are valid CIM types!), we need // to handle those two differently. Same // with the other types special cased below. LPCWSTR wstrFoo = rgwstrPropNames[theIterator->first]; CVARIANT* pvFoo = theIterator->second; if(theIterator->second->GetType() == VT_UI4) { WCHAR wstrTmp[256] = { '\0' }; _ultow(theIterator->second->GetDWORD(), wstrTmp, 10); CVARIANT vTmp(wstrTmp); hr = pIWCO->Put( rgwstrPropNames[theIterator->first], 0, &vTmp, NULL); } else if(theIterator->second->GetType() == VT_UI8) { WCHAR wstrTmp[256] = { '\0' }; _ui64tow(theIterator->second->GetULONGLONG(), wstrTmp, 10); CVARIANT vTmp(wstrTmp); hr = pIWCO->Put( rgwstrPropNames[theIterator->first], 0, &vTmp, NULL); } else if(theIterator->second->GetType() == VT_I8) { WCHAR wstrTmp[256] = { '\0' }; _i64tow(theIterator->second->GetLONGLONG(), wstrTmp, 10); CVARIANT vTmp(wstrTmp); hr = pIWCO->Put( rgwstrPropNames[theIterator->first], 0, &vTmp, NULL); } else { hr = pIWCO->Put( rgwstrPropNames[theIterator->first], 0, *(theIterator->second), NULL); } } } catch(CVARIANTError& cve) { hr = cve.GetWBEMError(); } return hr; }