// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved // JOBase.cpp #include "precomp.h" //#include //#include //#include //#include #include "CUnknown.h" #include #include "FRQueryEx.h" #include "globals.h" #include "CVARIANT.h" #include "CObjProps.h" #include "JOBase.h" #include "Factory.h" #include "helpers.h" #include #include #include "SmartHandle.h" #include "AssertBreak.h" HRESULT CJOBase::Initialize( LPWSTR pszUser, LONG lFlags, LPWSTR pszNamespace, LPWSTR pszLocale, IWbemServices *pNamespace, IWbemContext *pCtx, IWbemProviderInitSink *pInitSink) { if(pNamespace) pNamespace->AddRef(); m_pNamespace = pNamespace; m_chstrNamespace = pszNamespace; //Let CIMOM know you are initialized pInitSink->SetStatus( WBEM_S_INITIALIZED, 0); return WBEM_S_NO_ERROR; } HRESULT CJOBase::GetObjectAsync( const BSTR ObjectPath, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler, CObjProps& objprops, PFN_CHECK_PROPS pfnChk, LPWSTR wstrClassName, LPCWSTR wstrKeyProp) { HRESULT hr = WBEM_E_NOT_FOUND; // We need the name of the instance they requested... WCHAR wstrObjInstKeyVal[MAX_PATH]; hr = GetObjInstKeyVal( ObjectPath, wstrClassName, wstrKeyProp, wstrObjInstKeyVal, sizeof(wstrObjInstKeyVal) - sizeof(WCHAR)); if(SUCCEEDED(hr)) { // wstrObjInstKeyVal now contains the name of the object. See if // it exists... SmartHandle hJob; hJob = ::OpenJobObject( MAXIMUM_ALLOWED, FALSE, wstrObjInstKeyVal); if(hJob) { // We seem to have found one matching the specified name, // so create a return instance... objprops.SetJobHandle(hJob); IWbemClassObjectPtr pIWCO = NULL; hr = CreateInst( m_pNamespace, &pIWCO, _bstr_t(wstrClassName), pCtx); if(SUCCEEDED(hr)) { // see what properties are requested... hr = objprops.GetWhichPropsReq( ObjectPath, pCtx, wstrClassName, pfnChk); } if(SUCCEEDED(hr)) { // set the key properties... hr = objprops.SetKeysFromPath( ObjectPath, pCtx); } if(SUCCEEDED(hr)) { // set the non-key requested properties... hr = objprops.SetNonKeyReqProps(); } if(SUCCEEDED(hr)) { // Load requested non-key properties // to the instance... hr = objprops.LoadPropertyValues( pIWCO); // Commit the instance... if(SUCCEEDED(hr)) { hr = pResponseHandler->Indicate( 1, &pIWCO); } } } } // Set Status pResponseHandler->SetStatus(0, hr, NULL, NULL); return hr; } HRESULT CJOBase::ExecQueryAsync( const BSTR QueryLanguage, const BSTR Query, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler, CObjProps& objprops, LPCWSTR wstrClassName, LPCWSTR wstrKeyProp) { HRESULT hr = WBEM_S_NO_ERROR; // We will optimize for those cases in which // a particular set of named job objects // (e.g., 1 or more). Enumerate also // optimizes for the properties that were // requested. CFrameworkQuery cfwq; hr = cfwq.Init( QueryLanguage, Query, lFlags, m_chstrNamespace); std::vector<_bstr_t> rgNamedJOs; if(SUCCEEDED(hr)) { hr = cfwq.GetValuesForProp( _bstr_t(wstrKeyProp), rgNamedJOs); } if(SUCCEEDED(hr)) { hr = Enumerate( pCtx, pResponseHandler, rgNamedJOs, objprops, wstrClassName); } return hr; } HRESULT CJOBase::CreateInstanceEnumAsync( const BSTR Class, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler, CObjProps& objprops, LPCWSTR wstrClassName) { HRESULT hr = WBEM_S_NO_ERROR; if(wcsicmp( Class, wstrClassName) != NULL) { hr = WBEM_E_INVALID_CLASS; } // For every job object, return all accounting // info properties... if(SUCCEEDED(hr)) { // Get a list of named jobs... std::vector<_bstr_t> rgNamedJOs; hr = GetJobObjectList(rgNamedJOs); if(SUCCEEDED(hr)) { hr = Enumerate( pCtx, pResponseHandler, rgNamedJOs, objprops, wstrClassName); } } return hr; } HRESULT CJOBase::Enumerate( IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler, std::vector<_bstr_t>& rgNamedJOs, CObjProps& objprops, LPCWSTR wstrClassName) { HRESULT hr = S_OK; long lNumJobs = rgNamedJOs.size(); try // CVARIANT can throw and I want the error... { if(lNumJobs > 0) { // Create an object path... _bstr_t bstrtObjPath; bstrtObjPath = wstrClassName; // Get which props requested... hr = objprops.GetWhichPropsReq( bstrtObjPath, pCtx); if(SUCCEEDED(hr)) { SmartHandle hJob; for(long m = 0L; m < lNumJobs; m++) { // We have the name of a JO; need to open it up // and get its properties... hJob = ::OpenJobObject( MAXIMUM_ALLOWED, FALSE, (LPCWSTR)(rgNamedJOs[m])); // (NOTE: hJob smarthandle class automatically // closes its handle on destruction and on // reassignment.) if(hJob) { // Set the handle... objprops.SetJobHandle(hJob); // Set the key properties directly... std::vector vecvKeys; CVARIANT vID(rgNamedJOs[m]); vecvKeys.push_back(vID); hr = objprops.SetKeysDirect(vecvKeys); if(SUCCEEDED(hr)) { // set the non-key requested // properties... hr = objprops.SetNonKeyReqProps(); } // Create a new outgoing instance... IWbemClassObjectPtr pIWCO = NULL; if(SUCCEEDED(hr)) { hr = CreateInst( m_pNamespace, &pIWCO, _bstr_t(wstrClassName), pCtx); } // Load the properties of the // new outgoing instance... if(SUCCEEDED(hr)) { hr = objprops.LoadPropertyValues(pIWCO); } // And send it out... if(SUCCEEDED(hr)) { hr = pResponseHandler->Indicate( 1, &pIWCO); } } else { ASSERT_BREAK(0); } } } } } catch(CVARIANTError& cve) { hr = cve.GetWBEMError(); } return hr; }