windows-nt/Source/XPSP1/NT/base/wmi/bmoflocparser/impresob.cpp
2020-09-26 16:20:57 +08:00

543 lines
12 KiB
C++

//-----------------------------------------------------------------------------
//
// File: IMPRESOB.CPP
//
// Implementation of the ICreateRecObj class
//
// Copyright (c) 1995 - 1997, Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "dllvars.h"
#include "resource.h"
#include "impbin.h"
#include "win32sub.h"
#include "impresob.h"
#include "sampres.h"
#include "samplver.h"
#include "misc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Constructor and member init
//
//------------------------------------------------------------------------------
CLocImpResObj::CLocImpResObj()
{
m_ulRefCount = 0;
m_IBinary.m_pParent = this;
m_IParser.m_pParent = this;
AddRef();
IncrementClassCount();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Destructor and member clean up
//
//------------------------------------------------------------------------------
CLocImpResObj::~CLocImpResObj()
{
DEBUGONLY(AssertValid());
LTASSERT(m_ulRefCount == 0);
DecrementClassCount();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Add to the reference count on the object. Return the new count
//
//------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)
CLocImpResObj::AddRef(void)
{
DEBUGONLY(AssertValid());
return ++m_ulRefCount;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Subtract from the reference count
//
//------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)
CLocImpResObj::Release(void)
{
DEBUGONLY(AssertValid());
LTASSERT(m_ulRefCount != 0);
m_ulRefCount--;
if (m_ulRefCount == 0)
{
delete this;
return 0;
}
return m_ulRefCount;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Query for the passed IID. Interfaces not implemented on this object
// are implemented as embedded objects. If the interface is found
// the reference count in increased.
//
//------------------------------------------------------------------------------
STDMETHODIMP
CLocImpResObj::QueryInterface(
REFIID iid,
LPVOID *ppvObj)
{
DEBUGONLY(AssertValid());
SCODE scResult = E_NOINTERFACE;
*ppvObj = NULL;
if (iid == IID_IUnknown)
{
*ppvObj = (IUnknown *)this;
scResult = S_OK;
}
else if (iid == IID_ICreateResObj2)
{
*ppvObj = (ICreateResObj2 *)this;
scResult = S_OK;
}
else if (iid == IID_ILocBinary)
{
LTASSERT(NULL != m_IBinary.m_pParent);
*ppvObj = &m_IBinary;
scResult = S_OK;
}
else if (iid == IID_ILocParser)
{
LTASSERT(NULL != m_IParser.m_pParent);
*ppvObj = &m_IParser;
scResult = S_OK;
}
else if (iid == IID_ILocVersion)
{
*ppvObj = (ILocVersion *) new CLocSamplVersion(this);
scResult = S_OK;
}
if (scResult == S_OK)
{
AddRef();
}
return ResultFromScode(scResult);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Assert this interface
//
//------------------------------------------------------------------------------
STDMETHODIMP_(void)
CLocImpResObj::AssertValidInterface(void)
const
{
DEBUGONLY(AssertValid());
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Create a CResObj from the CLocItem passed.
//
// Inspect the CLocTypeId and CLocResId of the CLocItem to determine
// if this is a CLocItem for this sub parser. The file pointer for
// p32File is positioned at the beginning of the resource if you need
// to read some of the reasource to decide.
//
//------------------------------------------------------------------------------
STDMETHODIMP_(CResObj*)
CLocImpResObj::CreateResObj(
C32File * p32File,
CLocItem * pLocItem,
DWORD dwSize,
void* pvHeader)
{
UNREFERENCED_PARAMETER(p32File);
UNREFERENCED_PARAMETER(dwSize);
UNREFERENCED_PARAMETER(pvHeader);
CResObj* pObj = NULL;
try
{
//TODO: Add compare code to decide if this item
// is for you.
//The TypeID and ResID are set in the LocItem
//Type ID is the resource type and ResId is the ID
//from the image or resource file.
// For this sample resource type "INIFILE" has
// a ini file in it that we will parse.
CPascalString pasType;
if (pLocItem->GetUniqueId().GetTypeId().GetId(pasType))
{
// There is a string type.
// If you wanted to look for a numeric type, you would
// pass a DWORD to the GetId call above.
if (L"MOFDATA" == pasType)
{
pObj = new CSampleResObj(pLocItem, dwSize, pvHeader);
}
}
}
catch (CException* pE)
{
LTTRACE("%s building a CResObj",
pE->GetRuntimeClass()->m_lpszClassName);
pObj = NULL;
pE->Delete();
}
return pObj;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Build any data objects used over the life of the file object.
// Sub parsers don't create the files so this function and
// OnDestroyWin32File gives the sub parsers a chance to scope data
// on the life of the file.
//
//------------------------------------------------------------------------------
STDMETHODIMP_(void)
CLocImpResObj::OnCreateWin32File(C32File* p32File)
{
// Force our entry in the sub data storage to be null.
// This is used in the SetParent function of the sample
// resource object
p32File->SetSubData(pidBMOF, NULL); //TODO: change to the real
//parser ID
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// The C32File object is about to be destroyed.
//
//------------------------------------------------------------------------------
STDMETHODIMP_(void)
CLocImpResObj::OnDestroyWin32File(C32File* p32File)
{
// Free the pointer if it is there
//TODO: change to use the real parser ID
CLocItem* pItem = (CLocItem*)p32File->GetSubData(pidBMOF);
if (NULL != pItem)
{
LTASSERTONLY(pItem->AssertValid());
delete pItem;
p32File->SetSubData(pidBMOF, NULL); //TODO: change to the real
//parser ID
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Called before enumeration
//
//------------------------------------------------------------------------------
STDMETHODIMP_(BOOL)
CLocImpResObj::OnBeginEnumerate(C32File*)
{
return TRUE;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Called after enumeration. The BOOL is TRUE on successful enumerate
//
//------------------------------------------------------------------------------
STDMETHODIMP_(BOOL)
CLocImpResObj::OnEndEnumerate(C32File*, BOOL)
{
return TRUE;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Called before Generate
//
//------------------------------------------------------------------------------
STDMETHODIMP_(BOOL)
CLocImpResObj::OnBeginGenerate(C32File*)
{
return TRUE;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Called after generate. The BOOL is TRUE if the generate
// was successful
//
//------------------------------------------------------------------------------
STDMETHODIMP_(BOOL)
CLocImpResObj::OnEndGenerate(C32File*, BOOL)
{
return TRUE;
}
#ifdef _DEBUG
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Assert this object is valid
//
//------------------------------------------------------------------------------
void
CLocImpResObj::AssertValid(void)
const
{
CLObject::AssertValid();
//Bump up this check if needed.
LTASSERT(m_ulRefCount >= 0 || m_ulRefCount < 100);
LTASSERT(NULL != m_IBinary.m_pParent);
LTASSERT(NULL != m_IParser.m_pParent);
//TODO: ASSERT any other member data objects
//Note: use LTASSERT instead of ASSERT
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Dump the contents of this object
//
//------------------------------------------------------------------------------
void
CLocImpResObj::Dump(
CDumpContext &dc)
const
{
CLObject::Dump(dc);
dc << _T("CLocImpResObj\n");
}
#endif // _DEBUG
// ILocBinary interface
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Constructor and member init
//
//------------------------------------------------------------------------------
CLocImpResObj::CLocImpBinary::CLocImpBinary()
{
m_pParent = NULL;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Destructor and clean up
//
//------------------------------------------------------------------------------
CLocImpResObj::CLocImpBinary::~CLocImpBinary()
{
DEBUGONLY(AssertValid());
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Add to the reference count
//
//------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)
CLocImpResObj::CLocImpBinary::AddRef(void)
{
DEBUGONLY(AssertValid());
return m_pParent->AddRef();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// subtract from the reference count
//
//------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)
CLocImpResObj::CLocImpBinary::Release(void)
{
DEBUGONLY(AssertValid());
return m_pParent->Release();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Query for the requested interface
//
//------------------------------------------------------------------------------
STDMETHODIMP
CLocImpResObj::CLocImpBinary::QueryInterface(
REFIID iid,
LPVOID *ppvObj)
{
DEBUGONLY(AssertValid());
return m_pParent->QueryInterface(iid, ppvObj);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Assert this interface is valie
//
//------------------------------------------------------------------------------
STDMETHODIMP_(void)
CLocImpResObj::CLocImpBinary::AssertValidInterface()
CONST_METHOD
{
DEBUGONLY(AssertValid());
DEBUGONLY(m_pParent->AssertValid());
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Create a Binary object.
// Sub parser IDs are only in the LOWORD
//
//-----------------------------------------------------------------------------
STDMETHODIMP_(BOOL)
CLocImpResObj::CLocImpBinary::CreateBinaryObject(BinaryId ID,
CLocBinary *REFERENCE pBinary)
{
DEBUGONLY(AssertValid());
BOOL bRet = FALSE;
pBinary = NULL;
try
{
switch (LOWORD(ID))
{
case btBMOF: //TODO: change to the real ID
pBinary = new CSampleBinary;
bRet = TRUE;
break;
default:
LTASSERT(0 && "Unknown binary ID");
break;
}
}
catch (CException* pE)
{
LTTRACE("%s in CreateBinaryObject",
pE->GetRuntimeClass()->m_lpszClassName);
if (NULL != pBinary)
{
delete pBinary;
}
bRet = FALSE;
pE->Delete();
}
catch (...)
{
LTTRACE("Unknown Exception in CreateBinaryObject");
if (NULL != pBinary)
{
delete pBinary;
}
bRet = FALSE;
}
return bRet;
}
#ifdef _DEBUG
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Assert that the object is valid
//
//------------------------------------------------------------------------------
void
CLocImpResObj::CLocImpBinary::AssertValid(void)
const
{
CLObject::AssertValid();
LTASSERT(NULL != m_pParent);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Dump the contents of the object
//
//------------------------------------------------------------------------------
void
CLocImpResObj::CLocImpBinary::Dump(
CDumpContext &dc)
const
{
CLObject::Dump(dc);
dc << _T("CLocImpResObj::CLocImpBinary\n");
dc << _T("m_pParent=");
dc << (void*)m_pParent;
dc << _T("\n");
}
#endif // _DEBUG