/****************************************************************************** Copyright (c) 1999 Microsoft Corporation Module Name: WMIParser_Snapshot.cpp Abstract: This file contains the implementation of the WMIParser::Snapshot class, which is used to hold the data of an snapshot inside a CIM schema. Revision History: Davide Massarenti (Dmassare) 07/25/99 created ******************************************************************************/ #include "stdafx.h" #define TAG_DECLARATION L"DECLARATION" #define TAG_DECLGROUP L"DECLGROUP.WITHPATH" //const LPCWSTR l_Instances[] = { L"DECLARATION/DECLGROUP/VALUE.OBJECT" , // L"DECLARATION/DECLGROUP.WITHNAME/VALUE.NAMEDOBJECT" , // L"DECLARATION/DECLGROUP.WITHPATH/VALUE.OBJECTWITHPATH" , // L"DECLARATION/DECLGROUP.WITHPATH/VALUE.OBJECTWITHLOCALPATH" }; static const WCHAR l_InstancesRoot[] = L"DECLARATION/DECLGROUP.WITHPATH"; static const LPCWSTR l_Instances[] = { L"DECLARATION/DECLGROUP.WITHPATH/VALUE.OBJECTWITHPATH" , L"DECLARATION/DECLGROUP.WITHPATH/VALUE.OBJECTWITHLOCALPATH" }; static CComBSTR l_EmptyCIM( L"" ); WMIParser::Snapshot::Snapshot() { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::Snapshot" ); // MPC_XmlUtil m_xmlNode; // // InstList m_lstInstances; } WMIParser::Snapshot::~Snapshot() { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::~Snapshot" ); } HRESULT WMIParser::Snapshot::Parse() { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::Parse" ); HRESULT hr; CComPtr xdnlList; CComPtr xdnNode; bool fEmpty; int iPass; m_lstInstances.clear(); for(iPass=0; iPassnextNode( &xdnNode )) && xdnNode != NULL; xdnNode = NULL) { InstIter wmipiNew = m_lstInstances.insert( m_lstInstances.end() ); __MPC_EXIT_IF_METHOD_FAILS(hr, wmipiNew->put_Node( xdnNode, fEmpty )); if(fEmpty == true) { // // The instance appears to be empty, so don't use it. // m_lstInstances.erase( wmipiNew ); } } } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////// HRESULT WMIParser::Snapshot::put_Node( /*[in]*/ IXMLDOMNode* pxdnNode ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::put_Node" ); _ASSERT(pxdnNode != NULL); HRESULT hr; m_xmlNode = pxdnNode; __MPC_EXIT_IF_METHOD_FAILS(hr, Parse()); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT WMIParser::Snapshot::get_Node( /*[out]*/ IXMLDOMNode* *pxdnNode ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::get_Node" ); HRESULT hr; __MPC_EXIT_IF_METHOD_FAILS(hr, m_xmlNode.GetRoot( pxdnNode )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT WMIParser::Snapshot::get_NodeForInstances( /*[out]*/ IXMLDOMNode* *pxdnNode ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::get_NodeForInstances" ); HRESULT hr; if(m_xdnInstances == NULL) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_xmlNode.GetNode( l_InstancesRoot, &m_xdnInstances )); if(m_xdnInstances == NULL) { __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG); } } __MPC_EXIT_IF_METHOD_FAILS(hr, m_xdnInstances->QueryInterface( IID_IXMLDOMNode, (void **)pxdnNode )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////// HRESULT WMIParser::Snapshot::get_Instances( /*[out]*/ InstIterConst& itBegin , /*[out]*/ InstIterConst& itEnd ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::get_Instances" ); HRESULT hr; itBegin = m_lstInstances.begin(); itEnd = m_lstInstances.end (); hr = S_OK; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////// HRESULT WMIParser::Snapshot::clone_Instance( /*[in] */ Instance* pwmipiOld , /*[out]*/ Instance*& pwmipiNew ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::clone" ); HRESULT hr; CComPtr xdnNode; CComPtr xdnNodeCloned; CComPtr xdnNodeParent; CComPtr xdnNodeReplaced; pwmipiNew = NULL; // // Get the XML node of old instance. // __MPC_EXIT_IF_METHOD_FAILS(hr, pwmipiOld->get_Node( &xdnNode )); // // Make a copy of it. // __MPC_EXIT_IF_METHOD_FAILS(hr, xdnNode->cloneNode( VARIANT_TRUE, &xdnNodeCloned )); // // Get the root of our document. // __MPC_EXIT_IF_METHOD_FAILS(hr, get_NodeForInstances( &xdnNodeParent )); __MPC_EXIT_IF_METHOD_FAILS(hr, xdnNodeParent->appendChild( xdnNodeCloned, &xdnNodeReplaced )); // // Create a new INSTANCE object, attach it to the XML node and insert it in the list of instances. // { InstIter wmipiNew = m_lstInstances.insert( m_lstInstances.end() ); bool fEmpty; __MPC_EXIT_IF_METHOD_FAILS(hr, wmipiNew->put_Node( xdnNodeReplaced, fEmpty )); pwmipiNew = &(*wmipiNew); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////// //////////////////////////////////////////////// //////////////////////////////////////////////// HRESULT WMIParser::Snapshot::New() { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::New" ); HRESULT hr; CComPtr xddDoc; VARIANT_BOOL fLoaded; // // Create the DOM object. // __MPC_EXIT_IF_METHOD_FAILS(hr, ::CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&xddDoc )); __MPC_EXIT_IF_METHOD_FAILS(hr, xddDoc->loadXML( l_EmptyCIM, &fLoaded )); if(fLoaded == VARIANT_FALSE) { __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG); } else { MPC::XmlUtil xml( xddDoc ); CComPtr xdnRoot; __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetRoot( &xdnRoot )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_xmlNode.New( xdnRoot, TRUE )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT WMIParser::Snapshot::Load( /*[in]*/ LPCWSTR szFile , /*[in]*/ LPCWSTR szRootTag ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::Load" ); HRESULT hr; bool fLoaded; __MPC_EXIT_IF_METHOD_FAILS(hr, m_xmlNode.Load( szFile, szRootTag, fLoaded )); if(fLoaded == false) { __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG); } __MPC_EXIT_IF_METHOD_FAILS(hr, Parse()); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT WMIParser::Snapshot::Save( /*[in]*/ LPCWSTR szFile ) { __HCP_FUNC_ENTRY( "WMIParser::Snapshot::Save" ); HRESULT hr; __MPC_EXIT_IF_METHOD_FAILS(hr, m_xmlNode.Save( szFile )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); }