|
|
#define UA_STATUS_IDLE 0
#define UA_STATUS_UPDATEALL 1
#define UA_STATUS_MULTIPLE 2
#define UPDATEALL_PENDING 3
#define MULTIPLE_PENDING 4
#define U_STATUS_ABORTED 5
const UM_ONREQUEST = WM_USER + 4; const UM_ONSKIP = WM_USER + 5; const UM_ONABORT = WM_USER + 6; const UM_ONSKIPSINGLE = WM_USER + 7; const UM_ONADDSINGLE = WM_USER + 8; // At CleanUp msg we call CleanUp()/Release().
const UM_CLEANUP = WM_USER + 3; // At Ready msg we call AddRef().
// Who is sending us WM_USER + 9?
const UM_READY = WM_USER + 10; const UM_BACKGROUND = WM_USER + 11; const UM_DECREASE = WM_USER + 12; const UM_BEGINREPORT = WM_USER + 13; const UM_ENDREPORT = WM_USER + 14; // Note: This is redefined in urlmon\download
const UM_NEEDREBOOT = WM_USER + 16;
#define IS_UPDATING(l) (((l)==UA_STATUS_UPDATEALL) || ((l)==UA_STATUS_MULTIPLE))
#define IS_PENDING(l) (((l)==UPDATEALL_PENDING) || ((l)==MULTIPLE_PENDING))
#define IS_IDLE(l) ((l)==UA_STATUS_IDLE)
#define DIALER_OFFLINE 0
#define DIALER_ONLINE 1
#define DIALER_CONNECTING 2
#define IDD_START IDD_RESET
typedef enum { ITEM_STAT_IDLE, ITEM_STAT_PENDING, ITEM_STAT_SKIPPED, ITEM_STAT_FAILED, ITEM_STAT_UPDATING, ITEM_STAT_SUCCEEDED, ITEM_STAT_ABORTED, ITEM_STAT_QUEUED, E_ATTEMPT_FAILED, E_CONNECTION_LOST } STATUS, CONNECT_ERROR;
#define MAX_COLUMN 16
#define CHECKBOX_NONE 16384
#define CHECKBOX_OFF 4096
#define CHECKBOX_ON 8192
class CDialHelper; class CUpdateAgent; class CUpdateController;
struct CookieItemMapEntry { CLSID _cookie; LPARAM _id; };
class CCookieItemMap { private: CookieItemMapEntry* _map; UINT _count; UINT _capacity; LPARAM _lParamNext; public: CCookieItemMap(); ~CCookieItemMap(); STDMETHODIMP Init(UINT size = 0); STDMETHODIMP DelCookie(CLSID *); STDMETHODIMP FindLParam(CLSID *, LPARAM *); STDMETHODIMP FindCookie(LPARAM, CLSID *); STDMETHODIMP AddCookie(CLSID *, LPARAM *); STDMETHODIMP ResetMap(); };
extern DWORD WINAPI UpdateThreadProc(LPVOID); extern BOOL CALLBACK UpdateDlgProc(HWND hDlg, UINT iMsg, WPARAM, LPARAM); extern BOOL ListView_OnNotify(HWND hDlg, NM_LISTVIEW *, CUpdateController *);
class CUpdateDialog { friend BOOL CALLBACK UpdateDlgProc(HWND, UINT, WPARAM, LPARAM); friend DWORD WINAPI UpdateThreadProc(LPVOID); public: CUpdateDialog(); ~CUpdateDialog();
// Helper APIs
// Get columns set up.
STDMETHODIMP Init(HWND hParent, CUpdateController *); // Show/Hide the page.
STDMETHODIMP Show(BOOL); // Change the appearance of item accord to new stat and return old stat
// if needed.
STDMETHODIMP RefreshStatus(CLSID *, LPTSTR, STATUS, LPTSTR = NULL); // Add new item with the status.
STDMETHODIMP AddItem(CLSID *, LPTSTR, STATUS); // Reset the dialog.
STDMETHODIMP ResetDialog(void); // Get a list of cookies that are selected.
STDMETHODIMP GetSelectedCookies(CLSID *, UINT *); // Get the count of selected cookies.
STDMETHODIMP GetSelectionCount(UINT *); // Get the cookie according to the iItem;
STDMETHODIMP IItem2Cookie(const int iItem, CLSID *); STDMETHODIMP CleanUp(void);
BOOL SelectFirstUpdatingSubscription(); DWORD SetSiteDownloadSize (CLSID *, DWORD);
HWND m_hDlg; DWORD m_ThreadID; int colMap[MAX_COLUMN]; CUpdateController * m_pController; static BOOL m_bDetail; int m_cDlKBytes; int m_cDlDocs;
int m_cxWidget; int m_cyWidget;
private: static int CALLBACK SortUpdatingToTop (LPARAM, LPARAM, LPARAM); BOOL PersistStateToRegistry (HWND hDlg); BOOL GetPersistentStateFromRegistry (struct _PROG_PERSIST_STATE& state, int iCharWidth);
HWND m_hLV; HWND m_hParent; BOOL m_bInitialized; CCookieItemMap cookieMap; };
//----------------------------------------------------------------------------
// Update controller class
//----------------------------------------------------------------------------
typedef struct ReportMapEntry { NOTIFICATIONCOOKIE startCookie; STATUS status; DWORD progress; LPTSTR name; LPTSTR url; SUBSCRIPTIONTYPE subType; } * PReportMap;
class CUpdateController : public INotificationSink { friend BOOL CALLBACK UpdateDlgProc(HWND, UINT, WPARAM, LPARAM); friend DWORD WINAPI UpdateThreadProc(LPVOID); friend BOOL ListView_OnNotify(HWND hDlg, NM_LISTVIEW *, CUpdateController *); friend class CDialHelper; private: ULONG m_cRef; // OLE ref count
enum {CUC_ENTRY_INCRE = 32, CUC_MAX_ENTRY = 1024};
PReportMap m_aReport; UINT m_cReportCount; UINT m_cReportCapacity;
INotificationMgr *m_pNotMgr; CUpdateDialog *m_pDialog; CDialHelper *m_pDialer;
DWORD m_ThreadID; // Update thread ID
LONG m_count; // Current active updates.
UINT m_cTotal; UINT m_cFinished;
BOOL m_fInit; BOOL m_fSessionEnded;
// private Helper APIs
STDMETHODIMP AddEntry(NOTIFICATIONITEM *, STATUS); STDMETHODIMP DispatchRequest(PReportMap); STDMETHODIMP CancelRequest(PReportMap); STDMETHODIMP IncreaseCount(); STDMETHODIMP DecreaseCount(CLSID *); STDMETHODIMP StartPending(void); STDMETHODIMP GetItemList(UINT *); STDMETHODIMP GetLocationOf(CLSID *, LPTSTR, UINT); BOOL IsSkippable(CLSID *); STDMETHODIMP ResyncData(); STDMETHODIMP OnBeginReportFromTray(INotification *); STDMETHODIMP OnEndReportFromTray(INotification *);
public: CUpdateController(); ~CUpdateController();
STDMETHODIMP QueryInterface(REFIID riid, void **punk); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// INotificationSink members
STDMETHODIMP OnNotification( LPNOTIFICATION pNotification, LPNOTIFICATIONREPORT pNotificationReport, DWORD dwReserved );
// Helper APIs:
STDMETHODIMP StartService(void); STDMETHODIMP StopService(STATUS); STDMETHODIMP CleanUp(); STDMETHODIMP OnRequest(INotification *); STDMETHODIMP Skip(void); STDMETHODIMP SkipSingle(CLSID *); STDMETHODIMP AddSingle(CLSID *); STDMETHODIMP Restart(UINT count); STDMETHODIMP Abort(void); STDMETHODIMP Init(CUpdateDialog *);
PReportMap FindReportEntry(CLSID *); SUBSCRIPTIONTYPE GetSubscriptionType(CLSID *); };
class CUpdateAgent { protected: CUpdateController *m_pController; CUpdateDialog *m_pDialog; public: DWORD m_DialogThreadID; DWORD m_ThreadID; CUpdateAgent(void); ~CUpdateAgent(void);
// other functions
STDMETHODIMP Init(void); };
class CDialHelper : public INotificationSink { friend class CUpdateController; protected: ULONG m_cRef; CUpdateController * m_pController; INotificationMgr * m_pNotMgr; INotificationReport * m_pConnAgentReport; UINT m_cConnection; DWORD m_ThreadID; public: INT m_iDialerStatus;
public: CDialHelper(void); ~CDialHelper(void) {}
// IUnknown members
STDMETHODIMP QueryInterface(REFIID riid, void **punk); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// INotificationSink members
STDMETHODIMP OnNotification( LPNOTIFICATION pNotification, LPNOTIFICATIONREPORT pNotificationReport, DWORD dwReserved );
STDMETHODIMP OnInetOnline(INotification *); STDMETHODIMP OnInetOffline(INotification *); STDMETHODIMP NotifyAutoDialer(NOTIFICATIONTYPE); STDMETHODIMP Init(CUpdateController *); STDMETHODIMP CleanUp(); STDMETHODIMP HangUp(); STDMETHODIMP DialOut(); BOOL IsOffline() { return (DIALER_OFFLINE == m_iDialerStatus); } BOOL IsConnecting() { return (DIALER_CONNECTING == m_iDialerStatus); } };
|