#include #include #include "msnotify.h" #include "webcheck.h" GUID CLSID_ConnectionAgent = { 0xE6CC6978,0x6B6E,0x11D0,0xBE,0xCA,0x00,0xC0,0x4F,0xD9,0x40,0xBE }; int iState = 1; class CDialTest : public INotificationSink { public: CDialTest(); ~CDialTest(); // IUnknown members STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // INotificationSink members STDMETHODIMP OnNotification( INotification *pNotification, INotificationReport *pNotificationReport, DWORD dwReserved); HRESULT Dial(void); HRESULT OnConnected(INotificationReport *); HRESULT OnDisconnected(void); HRESULT SendNotification(NOTIFICATIONTYPE type); long m_cRef; }; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // // IUnknown members // STDMETHODIMP CDialTest::QueryInterface(REFIID riid, void ** ppv) { *ppv=NULL; // Validate requested interface if ((IID_IUnknown == riid) || (IID_INotificationSink == riid)) { *ppv=(INotificationSink*)this; } else { return E_NOINTERFACE; } ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; } STDMETHODIMP_(ULONG) CDialTest::AddRef(void) { return ++m_cRef; } STDMETHODIMP_(ULONG) CDialTest::Release(void) { if( 0L != --m_cRef ) return m_cRef; delete this; return 0L; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // // INotificationSink members // STDMETHODIMP CDialTest::OnNotification( INotification *pNotification, INotificationReport *pNotReport, DWORD dwReserved) { // Depending on the notification type, we call our other // existing members. NOTIFICATIONTYPE nt; HRESULT hr; hr = pNotification->GetNotificationInfo(&nt, NULL,NULL,NULL,0); if (FAILED(hr)) { printf("OnNotification failed to get notification type\n"); return E_INVALIDARG; } if (IsEqualGUID(nt, NOTIFICATIONTYPE_INET_ONLINE)) { printf("OnNotification: INET_ONLINE\n"); iState = 2; } else if (IsEqualGUID(nt, NOTIFICATIONTYPE_INET_OFFLINE)) { printf("OnNotification: INET_OFFLINE\n"); } else if (IsEqualGUID(nt, NOTIFICATIONTYPE_BEGIN_REPORT)) { printf("OnNotification: BEGIN_REPORT\n"); } else if (IsEqualGUID(nt, NOTIFICATIONTYPE_END_REPORT)) { printf("OnNotification: END_REPORT\n"); switch(iState) { case 0: // trying to exit... break; case 1: // dial failed, we're done iState = 0; break; case 2: // connected successfully - now hang up printf("Sending hangup notification.\n"); SendNotification(NOTIFICATIONTYPE_DISCONNECT_FROM_INTERNET); iState = 3; break; case 3: // hung up. We're done. iState = 0; break; default : break; } /* switch */ } else printf("OnNotification unknown notification type\n"); // Avoid bogus assert if (SUCCEEDED(hr)) hr = S_OK; return hr; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // // Other members // HRESULT CDialTest::SendNotification(NOTIFICATIONTYPE type) { HRESULT hr; INotificationMgr *pNotificationMgr = NULL; INotification *pNotification; // get notification manager hr = CoCreateInstance(CLSID_StdNotificationMgr, NULL, CLSCTX_INPROC_SERVER, IID_INotificationMgr, (void**)&pNotificationMgr); if(SUCCEEDED(hr)) { // create a notification hr = pNotificationMgr->CreateNotification( type, (NOTIFICATIONFLAGS)0, NULL, &pNotification, 0); } if(SUCCEEDED(hr)) { // deliver it hr = pNotificationMgr->DeliverNotification( pNotification, CLSID_ConnectionAgent, DM_NEED_COMPLETIONREPORT, (INotificationSink *)this, NULL, 0); pNotification->Release(); } if(pNotificationMgr) pNotificationMgr->Release(); return SUCCEEDED(hr); } CDialTest::CDialTest() { m_cRef = 0; } CDialTest::~CDialTest() { } HRESULT CDialTest::Dial(void) { printf("Sending dial notification.\n"); return SendNotification(NOTIFICATIONTYPE_CONNECT_TO_INTERNET); } int __cdecl main() { BOOL fDone = FALSE; DWORD dwRes; MSG msg; CDialTest s; if(FAILED(CoInitialize(NULL))) return TRUE; s.Dial(); while(iState && GetMessage(&msg, NULL, 0, 0)) { if(msg.hwnd != NULL) { TranslateMessage(&msg); DispatchMessage(&msg); } } CoUninitialize(); return 0; }