543 lines
12 KiB
C++
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
|
|
|