//+---------------------------------------------------------------------------- // // File: Monitor.h // // Module: CMMON32.EXE // // Synopsis: Definition of the class CMonitor // // Copyright (c) 1998-1999 Microsoft Corporation // // Author: fengsun Created 02/05/98 // //+---------------------------------------------------------------------------- #include "ArrayPtr.h" #include #include "ConTable.h" class CCmConnection; struct tagCmConnectedInfo; // CM_CONNECTED_INFO struct tagCmHangupInfo; // CM_HANGUP_INFO //+--------------------------------------------------------------------------- // // class CMonitor // // Description: Class CMonitor manage all connected CM conaction. It has // data/functions not specific to a particular connection. // It also manage the communication with // other CM components like CMDIAL.DLL. // // History: fengsun Created 1/22/98 // //---------------------------------------------------------------------------- class CMonitor { public: CMonitor(); ~CMonitor(); public: // // Static public functions, can be called without CMonitor instance // // Called by ::WinMain static int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmdLine, int iCmdShow); static HINSTANCE GetInstance() {return m_hInst;}; static HWND GetMonitorWindow() {MYDBGASSERT(m_pThis); return m_pThis->m_hwndMonitor;} static void MinimizeWorkingSet(); static void RestoreWorkingSet(); static BOOL ConnTableGetEntry(IN LPCTSTR pszEntry, OUT CM_CONNECTION* pCmEntry); static void RemoveConnection(CCmConnection* pConnection, BOOL fClearTable); static void MoveToReconnectingConn(CCmConnection* pConnection); protected: enum { // // this message is posted from connection thread to remove a connection // from shared table and internal array. // We use PostMessage, because all the operation on this array is handled // by monitor thread. Other wise we need CriticalSection to protect the array. // When both array are empty, cmmon exit // wParam is one of the value below, lParam is pointer to the connection // WM_REMOVE_CONNECTION = WM_USER + 1, }; // // wParam for WM_REMOVE_CONNECTION message // enum { REMOVE_CONNECTION, // Remove from Connected/Reconnecting Array MOVE_TO_RECONNECTING // Move from connected array to reconnecting array }; HANDLE m_hProcess; // the process handle for the monitor, used to changed working set // The Connection Table file mapping CConnectionTable m_SharedTable; // the invisible monitor window handle message from cmdial32.dll and connection thread HWND m_hwndMonitor; // Internal array for connected connection // Can only be accessed from the monitor thread CPtrArray m_InternalConnArray; // Array of reconnecting connections // Can only be accessed from the monitor thread // If both array are down to 0, cmmon exits CPtrArray m_ReconnectConnArray; // Called on start up // Open Connection Table // CreateMonitorWindow, SharedTable.SetHwndMonotor() BOOL Initialize(); // Called upon exit // Close all the connections, terminate all thread // Release connection table void Terminate(); // Register a window class and create the invisible monitorwindow HWND CreateMonitorWindow(); // The Monitor window procedure, process all the message static LRESULT CALLBACK MonitorWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); protected: // // Message handler // // upon receiving connected message from cmdial32.dll // Create the CcmConnection object, add to internal table void OnConnected(const tagCmConnectedInfo* pConnectedInfo); // Upon hangup request from CMDIAL32.DLL // Look up the InternalConnArray for the connection // Call pConnection->PostHangupMsg(); // Hangup is done in connection thread void OnHangup(const tagCmHangupInfo* pHangupInfo); // // Upon WM_QUERYENDSESSION message, we walk the table of connections // and call pConnection->OnEndSession on them so they will hangup and // clean themselves up. // BOOL OnQueryEndSession(BOOL fLogOff) const; // Upon WM_REMOVE_CONNECTION message posted by connection thread void OnRemoveConnection(DWORD dwRequestType, CCmConnection* pConnection); // Look up the connection array for a connection by name CCmConnection* LookupConnection(const CPtrArray& PtrArray, const TCHAR* pServiceName) const; // Look up the connection array for a connection by connection pointer int LookupConnection(const CPtrArray& ConnArray, const CCmConnection* pConnection) const; // Maintain or drop connections across a Fast User Switch BOOL HandleFastUserSwitch(DWORD dwAction); protected: // The exe instance handle static HINSTANCE m_hInst; // Used by static function MonitorWindowProc static CMonitor* m_pThis; #ifdef DEBUG void AssertValid() const; // protected: not safe to call in other thread #endif }; inline void CMonitor::MinimizeWorkingSet() { MYDBGASSERT(m_pThis->m_hProcess); if (m_pThis->m_hProcess) { SetProcessWorkingSetSize(m_pThis->m_hProcess, 128*1024, 384*1024); } } inline void CMonitor::RestoreWorkingSet() { MYDBGASSERT(m_pThis->m_hProcess); if (m_pThis->m_hProcess) { SetProcessWorkingSetSize(m_pThis->m_hProcess, 0, 0); } } inline BOOL CMonitor::ConnTableGetEntry(IN LPCTSTR pszEntry, OUT CM_CONNECTION* pCmEntry) { MYDBGASSERT(pCmEntry); MYDBGASSERT(m_pThis); return (SUCCEEDED(m_pThis->m_SharedTable.GetEntry(pszEntry, pCmEntry))); }