219 lines
5.3 KiB
C++
219 lines
5.3 KiB
C++
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#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;
|
||
|
}
|
||
|
|