windows-nt/Source/XPSP1/NT/net/config/shell/statmon/smeng.h
2020-09-26 16:20:57 +08:00

216 lines
6 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998.
//
// File: S M E N G . H
//
// Contents: The engine that provides statistics to the status monitor
//
// Notes:
//
// Author: CWill 7 Oct 1997
//
//----------------------------------------------------------------------------
#pragma once
#include "cfpidl.h"
#include "ncnetcon.h"
#include "smutil.h"
#include "hnetbcon.h"
typedef struct tagPersistConn
{
BYTE* pbBuf;
ULONG ulSize;
CLSID clsid;
} PersistConn;
extern CRITICAL_SECTION g_csStatmonData;
class CPspStatusMonitorGen;
class CPspStatusMonitorTool;
class CPspStatusMonitorRas;
class CPspStatusMonitorIpcfg;
#define _ATL_DEBUG_INTERFACES
class ATL_NO_VTABLE CNetStatisticsEngine :
public CComObjectRootEx <CComObjectThreadModel>,
public IConnectionPointImpl <CNetStatisticsEngine,
&IID_INetConnectionStatisticsNotifySink>,
public IConnectionPointContainerImpl <CNetStatisticsEngine>,
public INetStatisticsEngine
{
public:
~CNetStatisticsEngine(VOID);
BEGIN_COM_MAP(CNetStatisticsEngine)
COM_INTERFACE_ENTRY(INetStatisticsEngine)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CNetStatisticsEngine)
CONNECTION_POINT_ENTRY(IID_INetConnectionStatisticsNotifySink)
END_CONNECTION_POINT_MAP()
// INetStatisticsEngine
//
public:
STDMETHOD(StartStatistics)(VOID);
STDMETHOD(StopStatistics)(VOID);
STDMETHOD(ShowStatusMonitor)(VOID);
STDMETHOD(CloseStatusMonitor)(VOID);
STDMETHOD(UpdateStatistics)(BOOL* pfNoLongerConnected);
STDMETHOD(UpdateTitle)(PCWSTR pszwNewName);
STDMETHOD(UpdateRasLinkList)();
STDMETHOD(GetGuidId)(GUID* pguidId);
STDMETHOD(GetStatistics)(STATMON_ENGINEDATA** ppseAllData);
// Secret interfaces
//
public:
HRESULT HrInitStatEngine(const CONFOLDENTRY& pccfe);
VOID SetParent(CNetStatisticsCentral * pnsc)
{
AssertH(NULL == m_pnsc);
m_pnsc = pnsc;
::AddRefObj(m_pnsc);
}
VOID SetPropsheetWindow(HWND hwnd)
{
m_hwndPsh = hwnd;
}
VOID UnSetCreatingDialog()
{
m_fCreatingDialog = FALSE;
}
HRESULT HrGetConnectionFromBlob (INetConnection** ppCon)
{
return HrGetConnectionFromPersistData(
m_PersistConn.clsid,
m_PersistConn.pbBuf,
m_PersistConn.ulSize,
IID_INetConnection,
reinterpret_cast<VOID**>(ppCon));
}
// Callback for the property sheet page
//
public:
static INT CALLBACK PshCallback(HWND hwndDlg, UINT uMsg, LPARAM lParam);
static DWORD MonitorThread(CNetStatisticsEngine * pnse);
// Utility functions
//
private:
// Connection class specific functions
//
private:
virtual HRESULT HrUpdateData(DWORD* pdwChangeFlags, BOOL* pfNoLongerConnected) PURE;
protected:
CNetStatisticsEngine(VOID);
protected:
// Net Statistics Central object
//
CNetStatisticsCentral * m_pnsc;
// Property sheet data
//
CPspStatusMonitorGen* m_ppsmg;
CPspStatusMonitorTool* m_ppsmt;
CPspStatusMonitorRas* m_ppsmr;
CPspStatusMonitorIpcfg* m_ppsms;
// Connection data
//
STATMON_ENGINEDATA* m_psmEngineData;
// Connection identifiers
//
GUID m_guidId;
NETCON_MEDIATYPE m_ncmType;
NETCON_SUBMEDIATYPE m_ncsmType;
DWORD m_dwCharacter;
PersistConn m_PersistConn;
LONG m_cStatRef;
BOOL m_fRefreshIcon;
HWND m_hwndPsh;
DWORD m_dwChangeFlags;
// This boolean synchronizes the thread that creates the property sheet
// in CNetStatisticsEngine::ShowStatusMonitor
BOOL m_fCreatingDialog;
};
class CRasStatEngine : public CNetStatisticsEngine
{
public:
CRasStatEngine();
VOID put_RasConn(HRASCONN hRasConn);
VOID put_MediaType(NETCON_MEDIATYPE ncmType, NETCON_SUBMEDIATYPE ncsmType);
VOID put_Character(DWORD dwCharacter);
HRESULT HrUpdateData(DWORD* pdwChangeFlags, BOOL* pfNoLongerConnected);
private:
HRASCONN m_hRasConn;
};
class CLanStatEngine : public CNetStatisticsEngine
{
public:
CLanStatEngine();
HRESULT put_Device(tstring* pstrName);
VOID put_MediaType(NETCON_MEDIATYPE ncmType, NETCON_SUBMEDIATYPE ncsmType);
HRESULT HrUpdateData(DWORD* pdwChangeFlags, BOOL* pfNoLongerConnected);
private:
tstring m_strDevice;
UNICODE_STRING m_ustrDevice;
};
class CSharedAccessStatEngine : public CNetStatisticsEngine
{
public:
CSharedAccessStatEngine();
HRESULT HrUpdateData(DWORD* pdwChangeFlags, BOOL* pfNoLongerConnected);
HRESULT Initialize(NETCON_MEDIATYPE MediaType, INetSharedAccessConnection* pNetSharedAccessConnection);
HRESULT FinalConstruct(VOID);
HRESULT FinalRelease(VOID);
private:
static HRESULT GetStringStateVariable(IUPnPService* pService, LPWSTR pszVariableName, BSTR* pString);
static HRESULT InvokeVoidAction(IUPnPService * pService, LPTSTR pszCommand, VARIANT* pOutParams);
static DWORD WINAPI StaticUpdateStats(LPVOID lpParameter);
HRESULT UpdateStats();
WCHAR m_szLocalDeviceGuidStorage[64]; // enough for \Device\{...GUID...}
UNICODE_STRING m_LocalDeviceGuid;
IGlobalInterfaceTable* m_pGlobalInterfaceTable;
DWORD m_dwCommonInterfaceCookie;
DWORD m_dwWANConnectionCookie;
BOOL m_bRequested;
NETCON_STATUS m_Status;
ULONG m_ulTotalBytesSent;
ULONG m_ulTotalBytesReceived;
ULONG m_ulTotalPacketsSent;
ULONG m_ulTotalPacketsReceived;
ULONG m_ulUptime;
ULONG m_ulSpeedbps;
};
HRESULT HrGetAutoNetSetting(PWSTR pszGuid, DHCP_ADDRESS_TYPE * pAddrType);
HRESULT HrGetAutoNetSetting(REFGUID pGuidId, DHCP_ADDRESS_TYPE * pAddrType);