windows-nt/Source/XPSP1/NT/admin/activec/locparser/clasfact.cpp
2020-09-26 16:20:57 +08:00

231 lines
5.6 KiB
C++

//------------------------------------------------------------------------------
//
// File: classfact.cpp
// Copyright (C) 1995-1997 Microsoft Corporation
// All rights reserved.
//
// Purpose:
// Implementation of CLocImpClassFactory, which provides the IClassFactory
// interface for the parser.
//
// YOU SHOULD NOT NEED TO TOUCH ANYTHING IN THIS FILE. This code contains
// nothing parser-specific and is called only by Espresso.
//
// Owner:
//
//------------------------------------------------------------------------------
#include "stdafx.h"
#include "dllvars.h"
#include "resource.h"
#include "impparse.h"
#include "clasfact.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Constructor for class factory implementation.
//------------------------------------------------------------------------------
CLocImpClassFactory::CLocImpClassFactory()
{
m_uiRefCount = 0;
AddRef();
IncrementClassCount();
return;
} // end of CLocImpClassFactory::CLocImpClassFactory()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Destructor for class factory implementation.
//------------------------------------------------------------------------------
CLocImpClassFactory::~CLocImpClassFactory()
{
LTASSERT(0 == m_uiRefCount);
DEBUGONLY(AssertValid());
DecrementClassCount();
return;
} // end of CLocImpClassFactory::~CLocImpClassFactory()
#ifdef _DEBUG
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Assert if object is not valid. Unfortunately, there really isn't anything
// we can check.
//------------------------------------------------------------------------------
void
CLocImpClassFactory::AssertValid()
const
{
CLObject::AssertValid();
return;
} // end of CLocImpClassFactory::AssertValid()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Dump all internal data to supplied dump context, for debugging purposes.
//------------------------------------------------------------------------------
void
CLocImpClassFactory::Dump(
CDumpContext &dc) // Context to dump to.
const
{
CLObject::Dump(dc);
dc << "NET Parser CLocImpClassFactory:\n\r";
dc << "\tm_uiRefCount: " << m_uiRefCount << "\n\r";
return;
} // end of CLocImpClassFactory::Dump()
#endif // _DEBUG
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Increment reference count for object, return new value.
//------------------------------------------------------------------------------
ULONG
CLocImpClassFactory::AddRef()
{
return ++m_uiRefCount;
} // end of CLocImpClassFactory::AddRef()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Decrement reference count for object. If goes to 0, delete object. Return
// new reference count.
//------------------------------------------------------------------------------
ULONG
CLocImpClassFactory::Release()
{
LTASSERT(m_uiRefCount != 0);
m_uiRefCount--;
if (0 == m_uiRefCount)
{
delete this;
return 0;
}
return m_uiRefCount;
} // end of CLocImpClassFactory::Release()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Query whether this object supports a given interface. If it does,
// increment the reference count for this object.
//
// Return values: some sort of result code
// *ppvObj will point to this object if it does support the
// desired interface or be NULL if not.
//------------------------------------------------------------------------------
HRESULT
CLocImpClassFactory::QueryInterface(
REFIID iid, // Type of interface desired.
LPVOID *ppvObj) // Return pointer to object with such interface.
// Note it's a hidden double pointer!
{
LTASSERT(ppvObj != NULL);
SCODE sc = E_NOINTERFACE;
*ppvObj = NULL;
if (IID_IUnknown == iid)
{
*ppvObj = (IUnknown *)this;
sc = S_OK;
}
else if (IID_IClassFactory == iid)
{
*ppvObj = (IClassFactory *)this;
sc = S_OK;
}
if (S_OK == sc)
{
AddRef();
}
return ResultFromScode(sc);
} // end of CLocImpClassFactory::QueryInterface()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Create an instance of the requested class. All interfaces are implemented
// by the CLocImpParser object.
//
// Return values: some sort of result code
// ppvObj will point to a CLocImpParser object if it does
// support the desired interface or be NULL if not.
//------------------------------------------------------------------------------
HRESULT
CLocImpClassFactory::CreateInstance(
LPUNKNOWN pUnknown, // ???
REFIID iid, // Interface desired on parser object.
LPVOID *ppvObj) // Return pointer to object with interface.
// Note that it's a hidden double pointer!
{
LTASSERT(ppvObj != NULL);
SCODE sc = E_UNEXPECTED;
*ppvObj = NULL;
if (pUnknown != NULL)
{
sc = CLASS_E_NOAGGREGATION;
}
else
{
try
{
CLocImpParser *pParser;
pParser = new CLocImpParser;
sc = pParser->QueryInterface(iid, ppvObj);
pParser->Release();
}
catch (CMemoryException *pMem)
{
sc = E_OUTOFMEMORY;
pMem->Delete();
}
catch (...)
{
}
}
return ResultFromScode(sc);
} // end of CLocImpClassFactory::CreateInstance()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Not implemented. Always fails.
//------------------------------------------------------------------------------
HRESULT
CLocImpClassFactory::LockServer(
BOOL) // Unused.
{
return E_NOTIMPL;
} // end of CLocImpClassFactory::LockServer()