|
|
#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; }
|