Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//------------------------------------------------------------------------------
//
// 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()
|