|
|
/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name: WMIParser_Value.cpp
Abstract: This file contains the implementation of the WMIParser::Value class, which is used to hold the data of an value inside a CIM schema.
Revision History: Davide Massarenti (Dmassare) 07/01/99 created
******************************************************************************/
#include "stdafx.h"
WMIParser::Value::Value() { __HCP_FUNC_ENTRY( "WMIParser::Value::Value" );
m_lData = 0; // long m_lData;
m_rgData = NULL; // BYTE* m_rgData;
// MPC::wstring m_szData;
}
WMIParser::Value::~Value() { __HCP_FUNC_ENTRY( "WMIParser::Value::~Value" );
if(m_rgData) { delete [] m_rgData;
m_rgData = NULL; } }
////////////////////////////////////////////////
bool WMIParser::Value::operator==( /*[in]*/ Value const &wmipv ) const { __HCP_FUNC_ENTRY( "WMIParser::Value::operator==" );
bool fRes = true; MPC::NocaseCompare cmp; bool leftBinary = ( m_rgData != NULL); bool rightBinary = (wmipv.m_rgData != NULL);
if(leftBinary != rightBinary) { fRes = false; // Different kind of data, not comparable.
} else { if(leftBinary) { // Binary Data, do byte-to-byte comparison.
if( m_lData != wmipv.m_lData ) fRes = false; if(::memcmp( m_rgData , wmipv.m_rgData, m_lData )) fRes = false; } else { // Text Data, do string comparison.
if(m_szData != wmipv.m_szData) fRes = false; } }
__HCP_FUNC_EXIT(fRes); }
////////////////////////////////////////////////
HRESULT WMIParser::Value::Parse( /*[in] */ IXMLDOMNode* pxdnNode , /*[in]*/ LPCWSTR szTag ) { __HCP_FUNC_ENTRY( "WMIParser::Value::Parse" );
HRESULT hr; MPC::XmlUtil xmlNode( pxdnNode ); CComVariant vValue; bool fFound;
__MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pxdnNode); __MPC_PARAMCHECK_END();
//
// Analize the node...
//
__MPC_EXIT_IF_METHOD_FAILS(hr, xmlNode.GetValue( szTag, vValue, fFound )); if(fFound) { if(vValue.vt == VT_BSTR) { m_szData = OLE2W( vValue.bstrVal ); } else if(SUCCEEDED(vValue.ChangeType( VT_ARRAY | VT_UI1 ))) { long lLBound; long lUBound; BYTE* rgData;
__MPC_EXIT_IF_METHOD_FAILS(hr, SafeArrayGetLBound( vValue.parray, 1, &lLBound )); __MPC_EXIT_IF_METHOD_FAILS(hr, SafeArrayGetUBound( vValue.parray, 1, &lUBound ));
m_lData = lUBound - lLBound + 1; __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rgData, new BYTE[m_lData]);
__MPC_EXIT_IF_METHOD_FAILS(hr, SafeArrayAccessData( vValue.parray, (void **)&rgData ));
CopyMemory( m_rgData, rgData, m_lData );
__MPC_EXIT_IF_METHOD_FAILS(hr, SafeArrayUnaccessData( vValue.parray )); } }
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr); }
////////////////////////////////////////////////
HRESULT WMIParser::Value::get_Data( /*[out]*/ long& lData , /*[out]*/ BYTE*& rgData ) { __HCP_FUNC_ENTRY( "WMIParser::Value::get_Data" );
HRESULT hr;
lData = m_lData; rgData = m_rgData; hr = S_OK;
__HCP_FUNC_EXIT(hr); }
HRESULT WMIParser::Value::get_Data( /*[out]*/ MPC::wstring& szData ) { __HCP_FUNC_ENTRY( "WMIParser::Value::get_Data" );
HRESULT hr;
szData = m_szData; hr = S_OK;
__HCP_FUNC_EXIT(hr); }
|