2025-11-28 00:35:46 +09:00

292 lines
5.2 KiB
C++

#include "StdAfx.h"
#include "NotifyInterfaceImp.h"
CReferenceCountedObject::CReferenceCountedObject() :
m_cRef(1)
{
// Increment the global count of objects.
InterlockedIncrement(&g_lObjsInUse);
}
CReferenceCountedObject::~CReferenceCountedObject()
{
// Decrement the global count of objects.
InterlockedDecrement(&g_lObjsInUse);
CClassFactory::AttemptToTerminateServer();
}
STDMETHODIMP CReferenceCountedObject::QueryInterface(REFIID riid, void** ppvObject)
{
if (riid == IID_IUnknown)
{
*ppvObject = (IUnknown*)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CReferenceCountedObject::AddRef()
{
InterlockedIncrement(&m_cRef);
return m_cRef;
}
STDMETHODIMP_(ULONG) CReferenceCountedObject::Release()
{
InterlockedDecrement(&m_cRef);
if (m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
CClassFactory::CClassFactory() :
m_cRef(1)
{
}
CClassFactory::~CClassFactory()
{
}
STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void** ppvObject)
{
if (riid == IID_IUnknown)
{
CReferenceCountedObject* pCReferenceCountedObject = (CReferenceCountedObject*)this;
*ppvObject = (IUnknown*)pCReferenceCountedObject;
((CReferenceCountedObject*)this) -> AddRef();
return S_OK;
}
if (riid == IID_IClassFactory)
{
*ppvObject = (IClassFactory*)this;
((CReferenceCountedObject*)this) -> AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
InterlockedIncrement(&m_cRef);
return m_cRef;
}
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
InterlockedDecrement(&m_cRef);
if (m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
// IClassFactory method.
STDMETHODIMP CClassFactory::CreateInstance
(
IUnknown __RPC_FAR *pUnkOuter,
REFIID riid,
void __RPC_FAR *__RPC_FAR *ppvObject
)
{
return E_NOTIMPL;
}
// IClassFactory method.
STDMETHODIMP CClassFactory::LockServer
(
BOOL fLock
)
{
if (fLock)
{
::InterlockedIncrement(&g_lServerLocks) ;
}
else
{
::InterlockedDecrement(&g_lServerLocks) ;
}
// If this is an out-of-proc server, check to see
// whether we should shut down.
AttemptToTerminateServer() ; //@local
return S_OK ;
}
// Shut down the application.
void CClassFactory::AttemptToTerminateServer()
{
if ((g_lObjsInUse > 0) || (g_lServerLocks > 0))
{
}
else
{
::PostThreadMessage(g_dwMainThreadID, WM_QUIT, 0, 0);
}
}
CNotifyInterfaceImp::CNotifyInterfaceImp()
{
}
CNotifyInterfaceImp::~CNotifyInterfaceImp()
{
}
STDMETHODIMP CNotifyInterfaceImp::QueryInterface(REFIID riid, void** ppvObject)
{
if (riid == IID_IUnknown || riid == __uuidof(IBackgroundCopyCallback2))
{
*ppvObject = (IBackgroundCopyCallback2*)this;
((CReferenceCountedObject*)this) -> AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
// IUnknown method.
STDMETHODIMP_(ULONG) CNotifyInterfaceImp::AddRef()
{
return CReferenceCountedObject::AddRef();
}
// IUnknown method.
STDMETHODIMP_(ULONG) CNotifyInterfaceImp::Release()
{
return CReferenceCountedObject::Release();
}
STDMETHODIMP CNotifyInterfaceImp::JobTransferred(IBackgroundCopyJob* pJob)
{
printf("Job Transfred\n");
pJob->Complete();
printf("It is OK to close the command window.\n");
return S_OK;
}
STDMETHODIMP CNotifyInterfaceImp::JobError(IBackgroundCopyJob* pJob, IBackgroundCopyError* pError)
{
printf("Job Failed\n");
pJob->Cancel();
printf("It is OK to close the command window.\n");
return S_OK;
}
STDMETHODIMP CNotifyInterfaceImp::JobModification(IBackgroundCopyJob* pJob, DWORD dwReserved)
{
return S_OK;
}
STDMETHODIMP CNotifyInterfaceImp::FileTransferred(IBackgroundCopyJob* pJob, IBackgroundCopyFile* pFile)
{
return S_OK;
}
CNotifyInterfaceImp_Factory::CNotifyInterfaceImp_Factory()
{
}
CNotifyInterfaceImp_Factory::~CNotifyInterfaceImp_Factory()
{
}
// IUnknown method. Overridde QueryInterface() method.
STDMETHODIMP CNotifyInterfaceImp_Factory::QueryInterface(REFIID riid, void** ppvObject)
{
if (riid == IID_IUnknown)
{
CReferenceCountedObject* pCReferenceCountedObject = (CReferenceCountedObject*)this;
*ppvObject = (IUnknown*)pCReferenceCountedObject;
((CReferenceCountedObject*)this) -> AddRef();
return S_OK;
}
if (riid == IID_IClassFactory)
{
*ppvObject = (IClassFactory*)this;
((CReferenceCountedObject*)this) -> AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
// IUnknown method.
STDMETHODIMP_(ULONG) CNotifyInterfaceImp_Factory::AddRef()
{
return CClassFactory::AddRef();
}
// IUnknown method.
STDMETHODIMP_(ULONG) CNotifyInterfaceImp_Factory::Release()
{
return CClassFactory::Release();
}
// IClassFactory method.
STDMETHODIMP CNotifyInterfaceImp_Factory::CreateInstance
(
IUnknown __RPC_FAR *pUnkOuter,
REFIID riid,
void __RPC_FAR *__RPC_FAR *ppvObject
)
{
CNotifyInterfaceImp* pCExeObj01 = NULL;
// Initialise the receiver.
*ppvObject = NULL;
if (pUnkOuter != NULL)
{
return CLASS_E_NOAGGREGATION;
}
// Create an instance of the component.
pCExeObj01 = new CNotifyInterfaceImp;
if (pCExeObj01 == NULL)
{
return E_OUTOFMEMORY;
}
pCExeObj01 -> QueryInterface (riid, ppvObject);
pCExeObj01 -> Release();
printf("return a new callback instance\n");
return S_OK;
}
// IClassFactory method.
STDMETHODIMP CNotifyInterfaceImp_Factory::LockServer
(
BOOL fLock
)
{
return CClassFactory::LockServer(fLock);
}