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.
|
|
/*++
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 "TriggerProvider.h"
#include "TriggerFactory.h"
CTriggerFactory::CTriggerFactory( ) /*++
Routine Description: Constructor for CTriggerFactory class for initialization.
Arguments: None.
Return Value: None. --*/ { // initialize the reference count variable
m_dwCount = 0; }
CTriggerFactory::~CTriggerFactory( ) /*++
Routine Description: Destructor for CTriggerFactory class for releasing resources.
Arguments: None.
Return Value: None. --*/ { // there is nothing much to do at this place ... can be inlined, but
}
STDMETHODIMP CTriggerFactory::QueryInterface( IN REFIID riid, OUT LPVOID* ppv ) /*++
Routine Description: QueryInterface required to be overridden for a class derived from IUnknown interface.
Arguments: [IN] riid : which has the ID value of the interface being called. [OUT] ppv : pointer to the interface requested.
Return Value: NOERROR if successful. E_NOINTERFACE if unsuccessful --*/ { // 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; }
STDMETHODIMP_(ULONG) CTriggerFactory::AddRef( void ) /*++
Routine Description: Addref required to be overridden for a class derived from IUnknown interface.
Arguments: none.
Return Value: returns value of reference member. --*/ { // increment the reference count ... thread safe
return InterlockedIncrement( ( LPLONG ) &m_dwCount ); }
STDMETHODIMP_(ULONG) CTriggerFactory::Release( void ) /*++
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. --*/ { 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; }
STDMETHODIMP CTriggerFactory::CreateInstance( IN LPUNKNOWN pUnknownOutter, IN REFIID riid, OUT LPVOID* ppvObject ) /*++
Routine Description: Creates an object of the specified CLSID and retrieves an interface pointer to this object.
Arguments: [IN] pUnknownOutter : If the object is being created as part of an aggregate, then pIUnkOuter must be the outer unknown. Otherwise, pIUnkOuter must be NULL. [IN] riid : The IID of the requested interface. [OUT] ppvObject : A pointer to the interface pointer identified by riid.
Return Value: NOERROR if successful. Otherwise error value. --*/ { // local variables
HRESULT hr; CTriggerProvider* pProvider = NULL;
// kick off
*ppvObject = NULL; hr = E_OUTOFMEMORY; if ( NULL != pUnknownOutter ) { return CLASS_E_NOAGGREGATION; // object doesn't support aggregation.
} // create the Initialize object.
pProvider = new CTriggerProvider(); if ( NULL == pProvider ) { 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; }
STDMETHODIMP CTriggerFactory::LockServer( IN BOOL bLock ) /*++
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: [IN] bLock : specifying whether to increment or decrement the lock count.
Returns Value: NOERROR always. --*/ { // based on the request update the locks count
if ( bLock ) { InterlockedIncrement( ( LPLONG ) &g_dwLocks ); } else { InterlockedDecrement( ( LPLONG ) &g_dwLocks ); } // inform success
return NOERROR; }
|