windows-nt/Source/XPSP1/NT/shell/ext/webcheck/throttle.h
2020-09-26 16:20:57 +08:00

213 lines
6 KiB
C++

#ifndef _throttle_h
#define _throttle_h
#include "factory.h"
#define MAX_RUNNING_ITEMS 3
#define STATE_USER_IDLE_BEGIN 1
#define STATE_USER_IDLE_END 2
#define WC_INTERNAL_S_PAUSED (MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xF000))
#define WC_INTERNAL_S_RESUMING (MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xF001))
#define WC_INTERNAL_S_PENDING (MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xF002))
void IdleBegin(HWND hwnd);
void IdleEnd(void);
class COfflineSync;
struct CSyncMgrNode;
struct CUpdateItem;
#define THROTTLER_WNDCLASS TEXT("WCThrottlerClass")
class CThrottler : public ISubscriptionAgentEvents,
public ISubscriptionThrottler
{
public:
// IUnknown members
STDMETHODIMP QueryInterface(REFIID riid, void **punk);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// ISubscriptionAgentEvents members
STDMETHODIMP UpdateBegin(
const SUBSCRIPTIONCOOKIE *pSubscriptionCookie);
STDMETHODIMP UpdateProgress(
const SUBSCRIPTIONCOOKIE *pSubscriptionCookie,
long lSizeDownloaded,
long lProgressCurrent,
long lProgressMax,
HRESULT hrStatus,
LPCWSTR wszStatus);
STDMETHODIMP UpdateEnd(
const SUBSCRIPTIONCOOKIE *pSubscriptionCookie,
long lSizeDownloaded,
HRESULT hrResult,
LPCWSTR wszResult);
STDMETHODIMP ReportError(
const SUBSCRIPTIONCOOKIE *pSubscriptionCookie,
HRESULT hrError,
LPCWSTR wszError);
STDMETHODIMP GetSubscriptionRunState(
/* [in] */ DWORD dwNumCookies,
/* [size_is][in] */ const SUBSCRIPTIONCOOKIE *pCookies,
/* [size_is][out] */ DWORD *pdwRunState);
STDMETHODIMP AbortItems(
/* [in] */ DWORD dwNumCookies,
/* [size_is][in] */ const SUBSCRIPTIONCOOKIE *pCookies);
STDMETHODIMP AbortAll();
static HRESULT GetThrottler(CThrottler **ppThrottler);
HRESULT RunCookies(
DWORD dwNumCookies,
const SUBSCRIPTIONCOOKIE *pSubscriptionCookies,
DWORD dwSyncFlags);
HRESULT Advise(COfflineSync *pOfflineSync);
HRESULT Unadvise(COfflineSync *pOfflineSync);
ULONG ExternalAddRef();
ULONG ExternalRelease();
static LRESULT ThrottlerWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static void OnIdleStateChange(DWORD dwState);
private:
enum { WM_THROTTLER_ABORTALL =WM_USER+99,
WM_THROTTLER_ABORTITEM=WM_USER+100,
WM_THROTTLER_AUTOCACHESIZE_ASK=WM_USER+101};
DWORD m_dwRegister;
#ifdef DEBUG
DWORD m_dwThreadId;
#endif
static CThrottler *s_pThrottler;
const static CFactoryData s_ThrottlerFactoryData;
static HRESULT CreateInstance(IUnknown *punkOuter, IUnknown **ppunk);
HRESULT RevokeClassObject();
inline void ReportThrottlerError(const SUBSCRIPTIONCOOKIE *pCookie, HRESULT hrError,
LPCWSTR pwszErrMsg)
{
ReportError(pCookie, hrError, pwszErrMsg);
}
HRESULT AutoCacheSizeRequest(const SUBSCRIPTIONCOOKIE *pCookie);
HRESULT AutoCacheSizeAskUser(DWORD dwCacheSizeKB);
HRESULT IncreaseCacheSize(DWORD *pdwNewCacheSizeKB);
CThrottler();
~CThrottler();
ULONG m_cRef;
ULONG m_cExternalRef;
CSyncMgrNode *m_pSyncMgrs;
CUpdateItem *m_pItemsHead;
CUpdateItem *m_pItemsTail;
CUpdateItem *m_updateQueue[MAX_RUNNING_ITEMS];
int m_nUpdating;
HWND m_hwndThrottler;
HWND m_hwndParent;
BOOL m_fAbortingAll:1;
BOOL m_fUserIsIdle:1;
BOOL m_fFillingTheQueue:1;
BOOL m_fForcedGlobalOnline:1;
BOOL m_fAutoDialed:1;
BOOL m_fAutoCacheSizePending:1;
DWORD m_dwMaxAutoCacheSize;
DWORD m_dwAutoCacheSizeIncrease;
int m_nAutoCacheSizeTimesAsked;
typedef enum {NH_UPDATEBEGIN, NH_UPDATEPROGRESS, NH_UPDATEEND, NH_REPORTERROR};
HRESULT AddItemToListTail(CUpdateItem *pAddItem);
HRESULT RemoveItemFromList(CUpdateItem *pRemoveItem, BOOL fDelete);
void OnIdleBegin();
void OnIdleEnd();
BOOL IsQueueSlotFree() { return m_nUpdating < ARRAYSIZE(m_updateQueue); }
int GetFreeQueueSlot();
int GetCookieIndexInQueue(const SUBSCRIPTIONCOOKIE *pCookie);
void FillTheQueue();
void FailedUpdate(HRESULT hr, const SUBSCRIPTIONCOOKIE *pCookie);
void RunItem(int queueSlot, CUpdateItem *pUpdateItem);
HRESULT CanScheduledItemRun(ISubscriptionItem *pSubsItem);
STDMETHODIMP ActuallyAbortItems(DWORD dwNumCookies, const SUBSCRIPTIONCOOKIE *pCookies);
STDMETHODIMP ActuallyAbortAll();
HRESULT DoAbortItem(CUpdateItem *pUpdateItem);
HRESULT CreateThrottlerWnd();
HRESULT NotifyHandlers(int idCmd, const SUBSCRIPTIONCOOKIE *pSubscriptionCookie, ...);
HRESULT FindCookie(
const SUBSCRIPTIONCOOKIE *pSubscriptionCookie,
CUpdateItem **ppUpdateItem);
};
#include "offsync.h"
struct CSyncMgrNode
{
CSyncMgrNode(COfflineSync *pOfflineSync, CSyncMgrNode *pNext) :
m_pOfflineSync(pOfflineSync),
m_pNext(pNext)
{
ASSERT(NULL != m_pOfflineSync);
}
~CSyncMgrNode()
{
SAFERELEASE(m_pOfflineSync);
}
COfflineSync *m_pOfflineSync;
CSyncMgrNode *m_pNext;
};
struct CUpdateItem
{
CUpdateItem(const SUBSCRIPTIONCOOKIE& cookie,
DWORD dwRunState) :
m_cookie(cookie),
m_dwRunState(dwRunState)
{
ASSERT(NULL == m_pNext);
ASSERT(NULL == m_pSubsAgentCtl);
ASSERT(CLSID_NULL != m_cookie);
m_nMax = 128;
}
~CUpdateItem()
{
SAFERELEASE(m_pSubsAgentCtl);
}
ISubscriptionAgentControl *m_pSubsAgentCtl;
SUBSCRIPTIONCOOKIE m_cookie;
DWORD m_dwRunState;
CUpdateItem *m_pNext;
LONG m_nMax;
};
#endif _throttle_h