201 lines
6 KiB
C++
201 lines
6 KiB
C++
//***************************************************************************
|
|
// 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;
|
|
}
|