Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
3.3 KiB

// NATEM.h : Declaration of the CNATDynamicPortMappingService
#ifndef __NATEVENTMANAGER_H_
#define __NATEVENTMANAGER_H_
#include <upnp.h>
#include <upnpp.h>
#include <netcon.h>
#include <list>
/////////////////////////////////////////////////////////////////////////////
// CNATEventManager
class ATL_NO_VTABLE CNATEventManager :
public CComObjectRootEx<CComSingleThreadModel>,
// public CComCoClass<CNATEventManager, &CLSID_NATEventManager>,
public IDispatchImpl<INATEventManager, &IID_INATEventManager, &LIBID_NATUPNPLib>
{
private:
CComPtr<IUPnPServiceCallbackPrivate> m_spUPSCP;
std::list<DWORD> m_listOfCookies;
public:
CNATEventManager()
{
}
~CNATEventManager()
{
// run through list of cookies and remove each callback
std::list<DWORD>::iterator iterCookies = m_listOfCookies.begin();
for (DWORD dwCookie = *iterCookies;
iterCookies != m_listOfCookies.end();
dwCookie = *++iterCookies) {
HRESULT hr = m_spUPSCP->RemoveTransientCallback (dwCookie);
_ASSERT (hr == S_OK);
}
m_listOfCookies.clear();
}
//DECLARE_REGISTRY_RESOURCEID(IDR_NATEVENTMANAGER)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CNATEventManager)
COM_INTERFACE_ENTRY(INATEventManager)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// INATEventManager
public:
STDMETHOD(put_ExternalIPAddressCallback)(/*[in]*/ IUnknown * pUnk);
STDMETHOD(put_NumberOfEntriesCallback)(/*[in]*/ IUnknown * pUnk);
// CNATEventManager
public:
HRESULT Initialize (IUPnPService * pUPS)
{
if (!pUPS)
return E_INVALIDARG;
_ASSERT (m_spUPSCP == NULL);
return pUPS->QueryInterface (__uuidof(IUPnPServiceCallbackPrivate),
(void**)&m_spUPSCP);
}
HRESULT AddTransientCallback (IUnknown * punk)
{
DWORD dwCookie = 0;
HRESULT hr = m_spUPSCP->AddTransientCallback (punk, &dwCookie);
if (SUCCEEDED(hr)) {
// add cookie to list
m_listOfCookies.push_back (dwCookie);
}
return hr;
}
};
class ATL_NO_VTABLE CExternalIPAddressCallback :
public CComObjectRootEx <CComMultiThreadModel>,
public IUPnPServiceCallback
{
private:
CComPtr<IUnknown> m_spUnk;
public:
BEGIN_COM_MAP(CExternalIPAddressCallback)
COM_INTERFACE_ENTRY(IUPnPServiceCallback)
END_COM_MAP()
// IUPnPServiceCallback
public:
STDMETHODIMP StateVariableChanged(IUPnPService *pus, LPCWSTR pcwszStateVarName, VARIANT vaValue);
STDMETHODIMP ServiceInstanceDied(IUPnPService *pus);
// CExternalIPAddressCallback
public:
HRESULT Initialize (IUnknown * punk)
{
_ASSERT (m_spUnk == NULL);
m_spUnk = punk;
return S_OK;
}
};
class ATL_NO_VTABLE CNumberOfEntriesCallback :
public CComObjectRootEx <CComMultiThreadModel>,
public IUPnPServiceCallback
{
private:
CComPtr<IUnknown> m_spUnk;
public:
BEGIN_COM_MAP(CNumberOfEntriesCallback)
COM_INTERFACE_ENTRY(IUPnPServiceCallback)
END_COM_MAP()
// IUPnPServiceCallback
public:
STDMETHODIMP StateVariableChanged(IUPnPService *pus, LPCWSTR pcwszStateVarName, VARIANT vaValue);
STDMETHODIMP ServiceInstanceDied(IUPnPService *pus);
// CNumberOfEntriesCallback
public:
HRESULT Initialize (IUnknown * punk)
{
_ASSERT (m_spUnk == NULL);
m_spUnk = punk;
return S_OK;
}
};
#endif //__NATEVENTMANAGER_H_