//+--------------------------------------------------------------------------- // // 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 , public IConnectionPointImpl , public IConnectionPointContainerImpl , 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(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);