109 lines
3.2 KiB
C
109 lines
3.2 KiB
C
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// File: IdleStat.h
|
||
|
//
|
||
|
// Module: CMMON32.EXE
|
||
|
//
|
||
|
// Synopsis: Definition for the CIdleStatistics class to handle Idle Disconnect
|
||
|
//
|
||
|
// Copyright (c) 1996-1998 Microsoft Corporation
|
||
|
//
|
||
|
// Author: quintinb Created Header 08/16/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef IDLESTAT_H
|
||
|
#define IDLESTAT_H
|
||
|
|
||
|
#include "SmplRing.h"
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// class CIdleStatistics
|
||
|
//
|
||
|
// Description: A class to handle idle disconnect
|
||
|
// After Start(), call UpdateEveryInterval(dwTraffic) for every
|
||
|
// interval, every second. Then use IsIdle() and IsIdleTimeout()
|
||
|
// to tell whether it is currently idle and whether the idle
|
||
|
// timeout is reached.
|
||
|
// Note, this class will only handle one direction traffic
|
||
|
// (read or write)
|
||
|
//
|
||
|
// History: fengsun Created 10/1/97
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CIdleStatistics
|
||
|
{
|
||
|
public:
|
||
|
CIdleStatistics();
|
||
|
|
||
|
void Start(DWORD dwThreshold, DWORD dwTimeOut); // start the idle statistics
|
||
|
void Stop(); // Stop the idle statistics
|
||
|
BOOL IsStarted() const; // Whether the idle statistics is started
|
||
|
// return FALSE if Start() is not called
|
||
|
// or Stop() is called
|
||
|
void Reset(); // reset idle start time to 0
|
||
|
|
||
|
BOOL IsIdle() const; // Whether the connection is currently idle
|
||
|
BOOL IsIdleTimeout() const; // Whether the idle timeout is reached
|
||
|
void UpdateEveryInterval(DWORD dwTraffic); // This function is called every second
|
||
|
|
||
|
|
||
|
protected:
|
||
|
enum {IDLE_INTERVAL = 60L*1000L }; // 1 minute for idle disconnect time period
|
||
|
enum {IDLE_MONITOR_DATA_POINTS = IDLE_INTERVAL/1000}; // every second
|
||
|
|
||
|
DWORD m_dwTimeOut; // Timeout time in miniseconds
|
||
|
DWORD m_dwThreshold; // The threshold, if the traffic in last minute
|
||
|
// is below threshold, it is considered idle
|
||
|
DWORD m_dwStartIdleTime; // The start time when the connection is idle,
|
||
|
// or 0 if not currently idle
|
||
|
|
||
|
CSimpleRing<DWORD, IDLE_MONITOR_DATA_POINTS> m_DataPointsRing; // A 60 point DWORD data array
|
||
|
|
||
|
public:
|
||
|
#ifdef DEBUG
|
||
|
void AssertValid() const;
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Inline functions
|
||
|
//
|
||
|
|
||
|
inline CIdleStatistics::CIdleStatistics()
|
||
|
{
|
||
|
m_dwTimeOut = m_dwThreshold = m_dwStartIdleTime = 0;
|
||
|
}
|
||
|
|
||
|
inline void CIdleStatistics::Reset()
|
||
|
{
|
||
|
m_dwStartIdleTime = 0;
|
||
|
m_DataPointsRing.Reset();
|
||
|
}
|
||
|
|
||
|
inline void CIdleStatistics::Stop()
|
||
|
{
|
||
|
m_dwTimeOut = 0;
|
||
|
}
|
||
|
|
||
|
inline BOOL CIdleStatistics::IsStarted() const
|
||
|
{
|
||
|
return m_dwTimeOut != 0;
|
||
|
}
|
||
|
|
||
|
inline BOOL CIdleStatistics::IsIdle() const
|
||
|
{
|
||
|
return IsStarted() && (m_dwStartIdleTime != 0);
|
||
|
}
|
||
|
|
||
|
inline BOOL CIdleStatistics::IsIdleTimeout() const
|
||
|
{
|
||
|
return IsIdle() &&
|
||
|
( (GetTickCount() - m_dwStartIdleTime) > m_dwTimeOut);
|
||
|
}
|
||
|
|
||
|
#endif
|