287 lines
6.6 KiB
C++
287 lines
6.6 KiB
C++
#include <eapp.h>
|
|
|
|
extern "C" const GUID IID_IDebugRegister;
|
|
extern "C" const GUID IID_IDebugOut;
|
|
|
|
#if DBG==1
|
|
HRESULT DumpIID(REFIID riid)
|
|
{
|
|
|
|
HRESULT hr;
|
|
LPOLESTR pszStr = NULL;
|
|
hr = StringFromCLSID(riid, &pszStr);
|
|
EProtDebugOut((DEB_NOTFSINK, "API >>> DumpIID (riid:%ws) \n", pszStr));
|
|
|
|
if (pszStr)
|
|
{
|
|
delete pszStr;
|
|
}
|
|
return hr;
|
|
}
|
|
#else
|
|
#define DumpIID(x)
|
|
#endif
|
|
|
|
|
|
HRESULT CreateNotificationTest(DWORD dwId, REFCLSID rclsid, IUnknown *pUnkOuter, REFIID riid, IUnknown **ppUnk)
|
|
{
|
|
EProtDebugOut((DEB_NOTFSINK, "API _IN CreateKnownProtocolInstance\n"));
|
|
HRESULT hr = NOERROR;
|
|
|
|
EProtAssert(( (dwId == 0) && ppUnk));
|
|
|
|
do
|
|
{
|
|
if (!ppUnk)
|
|
{
|
|
// Note: aggregation only works if asked for IUnknown
|
|
EProtAssert((FALSE && "Dude, need out parameter"));
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
}
|
|
|
|
if (pUnkOuter)
|
|
{
|
|
hr = CLASS_E_NOAGGREGATION;
|
|
break;
|
|
}
|
|
|
|
CNotfSink *pNotfSink = new CNotfSink(L"Notificaion Sink");
|
|
|
|
if (pNotfSink)
|
|
{
|
|
hr = pNotfSink->QueryInterface(riid, (void **)ppUnk);
|
|
// remove extra refcount
|
|
pNotfSink->Release();
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
break;
|
|
} while (TRUE);
|
|
|
|
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "API OUT CreateKnownProtocolInstance(hr:%lx)\n", hr));
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
// Method: CNotfSink::QueryInterface
|
|
|
|
// Synopsis:
|
|
|
|
// Arguments: [riid] --
|
|
// [ppvObj] --
|
|
|
|
// Returns:
|
|
|
|
// History: 11-22-96 JohannP (Johann Posch) Created
|
|
|
|
// Notes:
|
|
|
|
|
|
STDMETHODIMP CNotfSink::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
VDATEPTROUT(ppvObj, void *);
|
|
VDATETHIS(this);
|
|
HRESULT hr = NOERROR;
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p _IN CNotfSink::QueryInterface\n", this));
|
|
EProtAssert(( IsApartmentThread() ));
|
|
|
|
*ppvObj = NULL;
|
|
if ((riid == IID_IUnknown) || (riid == IID_INotificationSink) )
|
|
{
|
|
*ppvObj = this;
|
|
AddRef();
|
|
}
|
|
else if ((riid == IID_IDebugRegister) )
|
|
{
|
|
*ppvObj = (IDebugRegister *) this;
|
|
AddRef();
|
|
}
|
|
else
|
|
{
|
|
hr = E_NOINTERFACE;
|
|
}
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p OUT CNotfSink::QueryInterface (hr:%lx\n", this,hr));
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
// Function: CNotfSink::AddRef
|
|
|
|
// Synopsis:
|
|
|
|
// Arguments: [ULONG] --
|
|
|
|
// Returns:
|
|
|
|
// History: 11-22-96 JohannP (Johann Posch) Created
|
|
|
|
// Notes:
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CNotfSink::AddRef(void)
|
|
{
|
|
EProtDebugOut((DEB_NOTFSINK, "%p _IN CNotfSink::AddRef\n", this));
|
|
EProtAssert(( IsApartmentThread() ));
|
|
|
|
LONG lRet = ++_CRefs;
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p OUT CNotfSink::AddRef (cRefs:%ld)\n", this,lRet));
|
|
return lRet;
|
|
}
|
|
|
|
|
|
|
|
// Function: CNotfSink::Release
|
|
|
|
// Synopsis:
|
|
|
|
// Arguments: [ULONG] --
|
|
|
|
// Returns:
|
|
|
|
// History: 11-22-96 JohannP (Johann Posch) Created
|
|
|
|
// Notes:
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CNotfSink::Release(void)
|
|
{
|
|
EProtDebugOut((DEB_NOTFSINK, "%p _IN CNotfSink::Release\n", this));
|
|
EProtAssert(( IsApartmentThread() ));
|
|
|
|
LONG lRet = --_CRefs;
|
|
|
|
if (_CRefs == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p OUT CNotfSink::Release (cRefs:%ld)\n",this,lRet));
|
|
return lRet;
|
|
}
|
|
|
|
|
|
|
|
|
|
// Method: CNotfSink::OnNotification
|
|
|
|
// Synopsis:
|
|
|
|
// Arguments: [itemtype] --
|
|
// [pWChkItem] --
|
|
// [dwReserved] --
|
|
|
|
// Returns:
|
|
|
|
// History: 12-02-1996 JohannP (Johann Posch) Created
|
|
|
|
// Notes:
|
|
|
|
|
|
STDMETHODIMP CNotfSink::OnNotification(
|
|
// the notification object itself
|
|
LPNOTIFICATION pNotification,
|
|
// the cookie of the object the notification is targeted too
|
|
//PNOTIFICATIONCOOKIE pRunningNotfCookie,
|
|
// flags how it was delivered and how it should
|
|
// be processed
|
|
//NOTIFICATIONFLAGS grfNotification,
|
|
// the report sink if - can be NULL
|
|
LPNOTIFICATIONREPORT pNotfctnReport,
|
|
DWORD dwReserved
|
|
)
|
|
{
|
|
EProtDebugOut((DEB_NOTFSINK, "%p _IN CNotfSink::OnNotification\n", this));
|
|
EProtAssert(( IsApartmentThread() ));
|
|
EProtAssert((pNotification));
|
|
HRESULT hr = NOERROR;
|
|
LPOLESTR pszStr = NULL;
|
|
NOTIFICATIONTYPE notfType;
|
|
NOTIFICATIONCOOKIE notfCookie;
|
|
|
|
PNOTIFICATIONCOOKIE pRunningNotfCookie = 0;
|
|
// flags how it was delivered and how it should
|
|
// be processed
|
|
NOTIFICATIONFLAGS grfNotification = (NOTIFICATIONFLAGS)0;
|
|
|
|
//hr = pNotification->GetNotificationType(¬fType);
|
|
hr = pNotification->GetNotificationInfo(¬fType, ¬fCookie, 0, 0, 0);
|
|
|
|
if (hr == NOERROR)
|
|
{
|
|
hr = StringFromCLSID(notfType, &pszStr);
|
|
}
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p CNotfSink:%ws received pNotification:%p\n with id:%ws\n", this, _pwzName, pNotification,pszStr));
|
|
//EProtDebugOut((DEB_NOTFSINK, "%p CNotfSink:%ws received pNotification:%p \n", this, _pwzName, pNotification));
|
|
MessageBeep(1000);
|
|
|
|
if (pszStr)
|
|
{
|
|
delete pszStr;
|
|
}
|
|
|
|
/*
|
|
if (pNotification->pCustomData != 0)
|
|
{
|
|
IDebugOut *pDbgOut = 0;
|
|
char szOutBuffer[256];
|
|
|
|
pDbgOut = (IDebugOut *) pNotification->pCustomData;
|
|
|
|
sprintf(szOutBuffer, "%p CNotfSink:%ws received pNotification:%p with id:%ws\n", this, _pwzName, pNotification, pNotification->pNotificationid);
|
|
|
|
pDbgOut->SendEntry(GetCurrentThreadId(), 0, szOutBuffer, 0);
|
|
}
|
|
*/
|
|
|
|
// don't return an error!
|
|
hr = NOERROR;
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p OUT CNotfSink::OnNotification (hr:%lx)\n",this, hr));
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CNotfSink::GetFacilities (LPCWSTR *ppwzNames, DWORD *pcNames, DWORD dwReserved)
|
|
{
|
|
EProtDebugOut((DEB_NOTFSINK, "%p _IN CNotfSink::GetFacilities\n", this));
|
|
EProtAssert(( IsApartmentThread() ));
|
|
EProtAssert(( ppwzNames && pcNames ));
|
|
|
|
HRESULT hr = NOERROR;
|
|
|
|
ppwzNames = v_gDbgFacilitieNames;
|
|
LONG x = sizeof(*v_gDbgFacilitieNames);
|
|
LONG y = sizeof(LPCWSTR);
|
|
|
|
*pcNames = (sizeof(*v_gDbgFacilitieNames)/sizeof(LPCWSTR));
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p OUT CNotfSink::GetFacilities (hr:%lx)\n",this, hr));
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CNotfSink::Register ( LPCWSTR pwzName, IDebugOut *pDbgOut, DWORD dwFlags, DWORD dwReserved)
|
|
{
|
|
EProtDebugOut((DEB_NOTFSINK, "%p _IN CNotfSink::Register\n", this));
|
|
EProtAssert(( IsApartmentThread() ));
|
|
HRESULT hr = NOERROR;
|
|
|
|
hr = RegisterDebugOut(pwzName, dwFlags, pDbgOut, dwReserved);
|
|
|
|
EProtDebugOut((DEB_NOTFSINK, "%p OUT CNotfSink::Register (hr:%lx)\n",this, hr));
|
|
return hr;
|
|
}
|
|
|
|
|