286 lines
8.5 KiB
C++
286 lines
8.5 KiB
C++
#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);
|
|
}
|
|
};
|