Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

200 lines
6.0 KiB

//***************************************************************************
// Copyright (c) Microsoft Corporation
//
// Module Name:
// TRIGGERFACTORY.CPP
//
// Abstract:
// Contains the class factory. This creates objects when connections are requested.
//
// Author:
// Vasundhara .G
//
// Revision History :
// Vasundhara .G 9-oct-2k : Created It.
//***************************************************************************
#include "pch.h"
#include "EventConsumerProvider.h"
#include "TriggerFactory.h"
#include "TriggerProvider.h"
//***************************************************************************
// Routine Description:
// Constructor for CTriggerFactory class for initialization.
//
// Arguments:
// None.
//
// Return Value:
// None.
//***************************************************************************
CTriggerFactory::CTriggerFactory()
{
// initialize the reference count variable
m_dwCount = 0;
}
//***************************************************************************
// Routine Description:
// Destructor for CTriggerFactory class for releasing resources.
//
// Arguments:
// None.
//
// Return Value:
// None.
//***************************************************************************
CTriggerFactory::~CTriggerFactory()
{
// there is nothing much to do at this place ... can be inlined, but
}
//***************************************************************************
// Routine Description:
// QueryInterface required to be overridden for a class derived from IUnknown
// interface.
//
// Arguments:
// riid [in] : which has the ID value of the interface being called.
// ppv [out] : pointer to the interface requested.
//
// Return Value:
// NOERROR if successful.
// E_NOINTERFACE if unsuccessful
//***************************************************************************
STDMETHODIMP CTriggerFactory::QueryInterface( REFIID riid, LPVOID* ppv )
{
// initialy set to NULL
*ppv = NULL;
// check whether interface requested is one we have
if ( riid == IID_IUnknown || riid == IID_IClassFactory )
{
//
// yes ... we have the requested interface
*ppv=this; // set the out parameter for the returning the requested interface
this->AddRef(); // update the reference count
return NOERROR; // inform success
}
// interface is not available
return E_NOINTERFACE;
}
//***************************************************************************
// Routine Description:
// Addref required to be overridden for a class derived from IUnknown interface.
//
// Arguments:
// none.
//
// Return Value:
// returns value of reference member.
//***************************************************************************
STDMETHODIMP_(ULONG) CTriggerFactory::AddRef( void )
{
// increment the reference count ... thread safe
return InterlockedIncrement( ( LPLONG ) &m_dwCount );
}
//***************************************************************************
// Routine Description:
// Release required to be overridden for a class derived from IUnknown interface.
//
// Arguments:
// none.
//
// Return Value:
// returns value of reference member, g_lCObj.
//***************************************************************************
STDMETHODIMP_(ULONG) CTriggerFactory::Release( void )
{
DWORD dwCount;
// decrement the reference count ( thread safe ) and check whether
// there are some more references or not ... based on the result value
dwCount = InterlockedDecrement( ( LPLONG ) &m_dwCount );
if ( 0 == dwCount )
{
// free the current factory instance
delete this;
}
// return the no. of instances references left
return dwCount;
}
//***************************************************************************
// Routine Description:
// Creates an object of the specified CLSID and retrieves
// an interface pointer to this object.
//
// Arguments:
// pUnknownOutter [in] :If the object is being created as part of an
// aggregate, then pIUnkOuter must be the outer
// unknown. Otherwise, pIUnkOuter must be NULL.
// riid [in] : The IID of the requested interface.
// ppvObject [out] : A pointer to the interface pointer identified by riid.
//
// Return Value:
// NOERROR if successful.
// Otherwise error value.
//***************************************************************************
STDMETHODIMP CTriggerFactory::CreateInstance( LPUNKNOWN pUnknownOutter,
REFIID riid, LPVOID* ppvObject )
{
// local variables
HRESULT hr;
CTriggerProvider* pProvider = NULL;
// kick off
*ppvObject = NULL;
hr = E_OUTOFMEMORY;
if ( pUnknownOutter != NULL )
{
return CLASS_E_NOAGGREGATION; // object doesn't support aggregation.
}
// create the Initialize object.
pProvider = new CTriggerProvider();
if ( pProvider == NULL )
{
return E_OUTOFMEMORY; // ran out of memory
}
// get the pointer to the requested interface
hr = pProvider->QueryInterface( riid, ppvObject );
if ( FAILED( hr ) )
{
delete pProvider; // interface not available ... de-allocate memory
}
// return the appropriate result
return hr;
}
//***************************************************************************
//
// Routine Description:
// Increments or decrements the lock count of the DLL.
// If the lock count goes to zero and there are no objects,
// the DLL is allowed to unload.
//
// arguments:
// bLock [in] : specifying whether to increment or decrement the lock count.
//
// Returns Value:
// NOERROR always.
//
//***************************************************************************
STDMETHODIMP CTriggerFactory::LockServer( BOOL bLock )
{
// based on the request update the locks count
if ( bLock )
{
InterlockedIncrement( ( LPLONG ) &g_dwLocks );
}
else
{
InterlockedDecrement( ( LPLONG ) &g_dwLocks );
}
// inform success
return NOERROR;
}