|
|
#include "private.h"
#include "offl_cpp.h"
#include "propshts.h"
#include "subsmgrp.h"
#include <iehelpid.h>
#include <mluisupp.h>
#define INITGUID
#include <initguid.h>
#include "imnact.h"
#include "helper.h"
void WriteDefaultEmail(LPTSTR szBuf); void WriteDefaultSMTPServer(LPTSTR szBuf);
const TCHAR c_szDefEmail[] = TEXT("DefaultEmail"); const TCHAR c_szDefServer[] = TEXT("DefaultSMTPServer"); TCHAR c_szHelpFile[] = TEXT("iexplore.hlp");
struct NEWSCHED_DATA { SYNCSCHEDULECOOKIE SchedCookie; TCHAR szSchedName[MAX_PATH]; };
#define MIN_DOWNLOAD_K 50
#define MAX_DOWNLOAD_K UD_MAXVAL
#define DEF_DOWNLOAD_K 500
DWORD aHelpIDs[] = {
// Schedule page
IDC_SCHEDULE_TEXT, IDH_GROUPBOX, IDC_MANUAL_SYNC, IDH_SUBPROPS_SCHEDTAB_MANUAL_SCHEDULE, IDC_SCHEDULED_SYNC, IDH_SUBPROPS_SCHEDTAB_CUSTOM_SCHEDULE, IDC_SCHEDULE_LIST, IDH_SUBPROPS_SCHEDTAB_SCHEDDESC, IDC_SCHEDULE_NEW, IDH_NEW_OFFLINE_SCHED, IDC_SCHEDULE_EDIT, IDH_EDIT_OFFLINE_SCHED, IDC_SCHEDULE_REMOVE, IDH_REMOVE_OFFLINE_SCHED, // IDC_IDLE_ONLY, IDH_SUBPROPS_SCHED_DONTUPDATE,
// Download page
IDC_CONTENT_GROUPBOX, IDH_GROUPBOX, IDC_DOWNLOAD_PAGES_LABEL1, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP, IDC_LEVELS, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP, IDC_LEVELS_SPIN, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP, IDC_DOWNLOAD_PAGES_LABEL2, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP, IDC_FOLLOW_LINKS, IDH_SUBPROPS_RECTAB_ADVOPTS_FOLLOW_LINKS, IDC_LIMIT_SPACE_CHECK, IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD, IDC_LIMIT_SPACE_EDIT, IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD, IDC_LIMIT_SPACE_SPIN, IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD, IDC_LIMIT_SPACE_TEXT, IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD, IDC_ADVANCED, IDH_SUBPROPS_RECTAB_ADVANCED, IDC_EMAIL_GROUPBOX, IDH_SUBPROPS_RECTAB_EMAIL_NOTIFICATION, IDC_EMAIL_NOTIFY, IDH_SUBPROPS_RECTAB_EMAIL_NOTIFICATION, IDC_EMAIL_ADDRESS_TEXT, IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_ADDRESS, IDC_EMAIL_ADDRESS, IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_ADDRESS, IDC_EMAIL_SERVER_TEXT, IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_SERVER, IDC_EMAIL_SERVER, IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_SERVER, IDC_LOGIN_LABEL, IDH_SUBPROPS_RECTAB_CHANNEL_LOGIN, IDC_LOGIN, IDH_SUBPROPS_RECTAB_CHANNEL_LOGIN, IDC_DOWNLOAD_ALL, IDH_CHANNEL_DOWNLOAD_ALL, IDC_DOWNLOAD_MIN, IDH_CHANNEL_DOWNLOAD_COVER_N_TOC,
// Advanced popup
IDC_ADVANCED_GROUPBOX, IDH_GROUPBOX, IDC_DOWNLOAD_IMAGES, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_IMAGES, IDC_DOWNLOAD_MEDIA, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_SOUND, IDC_DOWNLOAD_APPLETS, IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_ACTIVEX, IDC_DOWNLOAD_ONLY_HTML_LINKS, IDH_SUBPROPS_RECTAB_ADVOPTS_ONLY_HTML_LINKS,
// Login popup
IDC_USERNAME_LABEL, IDH_SUBPROPS_RECTAB_LOGINOPTS_USER_ID, IDC_USERNAME, IDH_SUBPROPS_RECTAB_LOGINOPTS_USER_ID, IDC_PASSWORD_LABEL, IDH_SUBPROPS_RECTAB_LOGINOPTS_PASSWORD, IDC_PASSWORD, IDH_SUBPROPS_RECTAB_LOGINOPTS_PASSWORD, IDC_PASSWORDCONFIRM_LABEL, IDH_SUBPROPS_RECTAB_LOGINOPTS_PASSWORD_CONFIRM, IDC_PASSWORDCONFIRM, IDH_SUBPROPS_RECTAB_LOGINOPTS_PASSWORD_CONFIRM,
// New schedule popup
IDC_SCHEDULE_LABEL1, IDH_NEWSCHED_EVERY_AT_TIME, IDC_SCHEDULE_DAYS, IDH_NEWSCHED_EVERY_AT_TIME, IDC_SCHEDULE_DAYS_SPIN, IDH_NEWSCHED_EVERY_AT_TIME, IDC_SCHEDULE_LABEL2, IDH_NEWSCHED_EVERY_AT_TIME, IDC_SCHEDULE_TIME, IDH_NEWSCHED_EVERY_AT_TIME, IDC_SCHEDULE_NAME_TEXT, IDH_NEWSCHED_NAME, IDC_SCHEDULE_NAME, IDH_NEWSCHED_NAME, IDC_SCHEDULE_LABEL3, IDH_NEWSCHED_EVERY_AT_TIME, IDC_WIZ_SCHEDULE_AUTOCONNECT, IDH_SUBPROPS_NEW_SCHEDULE_AUTOCONNECT,
// Summary page
IDC_NAME, IDH_SUBPROPS_SUBTAB_SUBSCRIBED_NAME, IDC_URL_TEXT, IDH_SUBPROPS_SUBTAB_SUBSCRIBED_URL, IDC_URL, IDH_SUBPROPS_SUBTAB_SUBSCRIBED_URL, IDC_VISITS_TEXT, IDH_WEBDOC_VISITS, IDC_VISITS, IDH_WEBDOC_VISITS, IDC_MAKE_OFFLINE, IDH_MAKE_AVAIL_OFFLINE, IDC_SUMMARY, IDH_GROUPBOX, IDC_LAST_SYNC_TEXT, IDH_SUBPROPS_SUBTAB_LAST, IDC_LAST_SYNC, IDH_SUBPROPS_SUBTAB_LAST, IDC_DOWNLOAD_SIZE_TEXT, IDH_SUBPROPS_DLSIZE, IDC_DOWNLOAD_SIZE, IDH_SUBPROPS_DLSIZE, IDC_DOWNLOAD_RESULT_TEXT, IDH_SUBPROPS_SUBTAB_RESULT, IDC_DOWNLOAD_RESULT, IDH_SUBPROPS_SUBTAB_RESULT,
// dah end
0, 0 };
/********************************************************************************
Property sheet helpers *********************************************************************************/
inline POOEBuf GetBuf(HWND hdlg) { POOEBuf pBuf = (POOEBuf) GetWindowLongPtr(hdlg, DWLP_USER);
return pBuf; }
void EnableControls(HWND hdlg, const int *pIDs, int nIDs, BOOL bEnable) { for (int i = 0; i < nIDs; i++) { EnableWindow(GetDlgItem(hdlg, *pIDs++), bEnable); } }
/********************************************************************************
Summary property sheet code *********************************************************************************/ inline POOEBuf Summary_GetBuf(HWND hdlg) { CSubscriptionMgr *pSubsMgr = (CSubscriptionMgr*) GetWindowLongPtr(hdlg, DWLP_USER);
ASSERT(NULL != pSubsMgr);
return (NULL != pSubsMgr) ? pSubsMgr->m_pBuf : NULL; }
void Summary_ShowOfflineSummary(HWND hdlg, POOEBuf pBuf, BOOL bShow) { static const int offSumIDs[] = { IDC_SUMMARY, IDC_LAST_SYNC_TEXT, IDC_LAST_SYNC, IDC_DOWNLOAD_SIZE_TEXT, IDC_DOWNLOAD_SIZE, IDC_DOWNLOAD_RESULT, IDC_DOWNLOAD_RESULT_TEXT, IDC_FREESPACE_TEXT };
if (bShow) { TCHAR szLastSync[128]; TCHAR szDownloadSize[128]; TCHAR szDownloadResult[128];
MLLoadString(IDS_VALUE_UNKNOWN, szLastSync, ARRAYSIZE(szLastSync)); StrCpyN(szDownloadSize, szLastSync, ARRAYSIZE(szDownloadSize)); StrCpyN(szDownloadResult, szLastSync, ARRAYSIZE(szDownloadResult));
ISubscriptionItem *psi; if (SUCCEEDED(SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi))) { enum { spLastSync, spDownloadSize, spDownloadResult };
static const LPCWSTR pProps[] = { c_szPropCompletionTime, c_szPropCrawlActualSize, c_szPropStatusString }; VARIANT vars[ARRAYSIZE(pProps)];
if (SUCCEEDED(psi->ReadProperties(ARRAYSIZE(pProps), pProps, vars))) { if (VT_DATE == vars[spLastSync].vt) { FILETIME ft, ft2; DWORD dwFlags = FDTF_DEFAULT; VariantTimeToFileTime(vars[spLastSync].date, ft); LocalFileTimeToFileTime(&ft, &ft2); SHFormatDateTime(&ft2, &dwFlags, szLastSync, ARRAYSIZE(szLastSync)); }
if (VT_I4 == vars[spDownloadSize].vt) { StrFormatByteSize(vars[spDownloadSize].lVal * 1024, szDownloadSize, ARRAYSIZE(szDownloadSize)); }
if (VT_BSTR == vars[spDownloadResult].vt) { wnsprintf(szDownloadResult, ARRAYSIZE(szDownloadResult), TEXT("%s"), vars[spDownloadResult].bstrVal); }
for (int i = 0; i < ARRAYSIZE(pProps); i++) { VariantClear(&vars[i]); } } psi->Release(); }
SetDlgItemText(hdlg, IDC_LAST_SYNC, szLastSync); SetDlgItemText(hdlg, IDC_DOWNLOAD_SIZE, szDownloadSize); SetDlgItemText(hdlg, IDC_DOWNLOAD_RESULT, szDownloadResult); }
for (int i = 0; i < ARRAYSIZE(offSumIDs); i++) { ShowWindow(GetDlgItem(hdlg, offSumIDs[i]), bShow ? SW_SHOW : SW_HIDE); } }
BOOL Summary_AddPageCallback(HPROPSHEETPAGE hpage, LPARAM lParam) { return PropSheet_AddPage((HWND)lParam, hpage) ? TRUE : FALSE; }
BOOL Summary_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl) { BOOL bResult = FALSE; BOOL bChanged = FALSE; POOEBuf pBuf = Summary_GetBuf(hdlg);
switch (wID) { case IDC_MAKE_OFFLINE: if (BN_CLICKED == wNotifyCode) { CSubscriptionMgr *pSubsMgr = (CSubscriptionMgr*) GetWindowLongPtr(hdlg, DWLP_USER);
BOOL bShow = IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE);
Summary_ShowOfflineSummary(hdlg, pBuf, bShow); if (NULL != pSubsMgr) { if (bShow) { pSubsMgr->AddPages(Summary_AddPageCallback, (LPARAM)GetParent(hdlg)); } else { pSubsMgr->RemovePages(GetParent(hdlg)); } } bChanged = TRUE; } bResult = TRUE; break; }
if (bChanged) { PropSheet_Changed(GetParent(hdlg), hdlg); }
return bResult; }
BOOL Summary_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh) { BOOL bResult = TRUE;
switch (pnmh->code) { case PSN_APPLY: { CSubscriptionMgr *pSubsMgr = (CSubscriptionMgr*) GetWindowLongPtr(hdlg, DWLP_USER); POOEBuf pBuf = Summary_GetBuf(hdlg);
ASSERT(NULL != pSubsMgr); ASSERT(NULL != pBuf); if ((NULL != pSubsMgr) && (NULL != pBuf)) { if (IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE)) { pBuf->dwFlags = PROP_WEBCRAWL_ALL; SaveBufferChange(pBuf, TRUE); } else { WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
MyStrToOleStrN(wszURL, ARRAYSIZE(wszURL), pBuf->m_URL); pSubsMgr->DeleteSubscription(wszURL, NULL); } } break; } default: bResult = FALSE; break; } return bResult; }
BOOL Summary_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam) { ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)); ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr(hdlg, DWLP_USER, ((LPPROPSHEETPAGE)lParam)->lParam);
// Now read in values and populate the dialog
POOEBuf pBuf = Summary_GetBuf(hdlg); ISubscriptionItem *psi; HICON hicon; BOOL bSubscribed;
HRESULT hr = SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi);
if (SUCCEEDED(hr)) { bSubscribed = TRUE; hicon = LoadItemIcon(psi, TRUE); psi->Release(); } else { bSubscribed = FALSE; hicon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_WEBDOC)); }
SendDlgItemMessage(hdlg, IDC_ICONEX2, STM_SETICON, (WPARAM)hicon, 0);
if ((!IsHTTPPrefixed(pBuf->m_URL)) || (bSubscribed && SHRestricted2(REST_NoRemovingSubscriptions, pBuf->m_URL, 0)) || (!bSubscribed && SHRestricted2(REST_NoAddingSubscriptions, pBuf->m_URL, 0))) { EnableWindow(GetDlgItem(hdlg, IDC_MAKE_OFFLINE), FALSE); } SetDlgItemText(hdlg, IDC_NAME, pBuf->m_Name); SetDlgItemText(hdlg, IDC_URL, pBuf->m_URL);
CheckDlgButton(hdlg, IDC_MAKE_OFFLINE, bSubscribed);
TCHAR szVisits[256];
BYTE cei[MY_MAX_CACHE_ENTRY_INFO]; LPINTERNET_CACHE_ENTRY_INFO pcei = (LPINTERNET_CACHE_ENTRY_INFO)cei; DWORD cbcei = sizeof(cei);
if (GetUrlCacheEntryInfo(pBuf->m_URL, pcei, &cbcei)) { wnsprintf(szVisits, ARRAYSIZE(szVisits), TEXT("%d"), pcei->dwHitRate); } else { MLLoadString(IDS_VALUE_UNKNOWN, szVisits, ARRAYSIZE(szVisits)); } SetDlgItemText(hdlg, IDC_VISITS, szVisits);
Summary_ShowOfflineSummary(hdlg, pBuf, bSubscribed);
return TRUE; }
void Summary_OnDestroy(HWND hdlg) { POOEBuf pBuf = Summary_GetBuf(hdlg);
if (NULL != pBuf && !(pBuf->m_dwPropSheetFlags & PSF_IS_ALREADY_SUBSCRIBED) && IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE)) { SendUpdateRequests(NULL, &pBuf->m_Cookie, 1); } }
INT_PTR CALLBACK SummaryPropDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bHandled = FALSE;
switch (message) { case WM_INITDIALOG: bHandled = Summary_OnInitDialog(hdlg, (HWND)wParam, lParam); break;
case WM_COMMAND: bHandled = Summary_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
case WM_DESTROY: Summary_OnDestroy(hdlg); break; case WM_NOTIFY: bHandled = Summary_OnNotify(hdlg, (int)wParam, (LPNMHDR)lParam); break;
case WM_HELP: SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile, HELP_WM_HELP, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break;
case WM_CONTEXTMENU: SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break; } return bHandled; }
/********************************************************************************
Schedule property sheet code *********************************************************************************/
void Sched_EnableScheduleButtons(HWND hdlg) { POOEBuf pBuf = GetBuf(hdlg); ASSERT(pBuf);
BOOL bEditAllowed = !(pBuf->m_dwPropSheetFlags & (PSF_NO_EDITING_SCHEDULES | PSF_NO_SCHEDULED_UPDATES)); BOOL bEnable = (bEditAllowed) && ListView_GetSelectedCount(GetDlgItem(hdlg, IDC_SCHEDULE_LIST));
EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_NEW), bEditAllowed); EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_EDIT), bEnable);
// TODO: Don't enable remove for publisher's schedule
EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_REMOVE), bEnable); }
struct SCHED_ENUM_DATA { HWND hwndSchedList; POOEBuf pBuf; SYNCSCHEDULECOOKIE customSchedule; BOOL bHasAtLeastOneSchedule; };
struct SCHED_LIST_DATA { SYNCSCHEDULECOOKIE SchedCookie; BOOL bChecked; BOOL bStartChecked; };
inline int SchedList_GetIndex(HWND hwndSchedList, int index) { return (index != -1) ? index : ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED); }
void SchedList_GetName(HWND hwndSchedList, int index, TCHAR *pszSchedName, int cchSchedName) { LV_ITEM lvi = {0};
lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
if (lvi.iItem != -1) { lvi.mask = LVIF_TEXT; lvi.pszText = pszSchedName; lvi.cchTextMax = cchSchedName; ListView_GetItem(hwndSchedList, &lvi); } }
void SchedList_SetName(HWND hwndSchedList, int index, LPTSTR pszSchedName) { LV_ITEM lvi = {0};
lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
if (lvi.iItem != -1) { lvi.mask = LVIF_TEXT; lvi.pszText = pszSchedName; ListView_SetItem(hwndSchedList, &lvi); } }
SCHED_LIST_DATA *SchedList_GetData(HWND hwndSchedList, int index) { SCHED_LIST_DATA *psld = NULL; LV_ITEM lvi = {0};
lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
if (lvi.iItem != -1) { lvi.mask = LVIF_PARAM; if (ListView_GetItem(hwndSchedList, &lvi)) { psld = (SCHED_LIST_DATA *)lvi.lParam; } }
return psld; }
void SchedList_UncheckAll(HWND hwndSchedList) { int count = ListView_GetItemCount(hwndSchedList); for (int i = 0; i < count; i++) { SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, i);
if (NULL != psld) { psld->bChecked = 0; ListView_SetItemState(hwndSchedList, i, COMP_UNCHECKED, LVIS_STATEIMAGEMASK); } } }
void SchedList_Select(HWND hwndSchedList, int index) { int curIndex = ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED);
if (curIndex != index) { ListView_SetItemState(hwndSchedList, curIndex, 0, LVIS_SELECTED | LVIS_FOCUSED); ListView_SetItemState(hwndSchedList, index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } }
void SchedList_DeleteData(HWND hwndSchedList, int index, BOOL bDeleteItem) { LV_ITEM lvi = {0};
lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
if (lvi.iItem != -1) {
SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, lvi.iItem);
lvi.mask = LVIF_PARAM; lvi.lParam = NULL;
if ((NULL != psld) && ListView_SetItem(hwndSchedList, &lvi)) { delete psld; }
if (bDeleteItem) { ListView_DeleteItem(hwndSchedList, lvi.iItem); } } }
void SchedList_DeleteAllData(HWND hwndSchedList) { int count = ListView_GetItemCount(hwndSchedList); for (int i = 0; i < count; i++) { SchedList_DeleteData(hwndSchedList, i, FALSE); } }
BOOL Sched_EnumCallback(ISyncSchedule *pSyncSchedule, SYNCSCHEDULECOOKIE *pSchedCookie, LPARAM lParam) { BOOL bAdded = FALSE; SCHED_ENUM_DATA *psed = (SCHED_ENUM_DATA *)lParam; DWORD dwSyncScheduleFlags; SCHED_LIST_DATA *psld = NULL;
if (SUCCEEDED(pSyncSchedule->GetFlags(&dwSyncScheduleFlags))) { // This checks to make sure we only add a publisher's schedule to the
// list if it belongs to this item.
if ((!(dwSyncScheduleFlags & SYNCSCHEDINFO_FLAGS_READONLY)) || (*pSchedCookie == psed->customSchedule)) { psld = new SCHED_LIST_DATA;
if (NULL != psld) { WCHAR wszName[MAX_PATH]; DWORD cchName = ARRAYSIZE(wszName);
if (SUCCEEDED(pSyncSchedule->GetScheduleName(&cchName, wszName))) { TCHAR szName[MAX_PATH];
MyOleStrToStrN(szName, ARRAYSIZE(szName), wszName);
psld->SchedCookie = *pSchedCookie; psld->bStartChecked = IsCookieOnSchedule(pSyncSchedule, &psed->pBuf->m_Cookie); psld->bChecked = psld->bStartChecked;
if (psld->bStartChecked) { psed->bHasAtLeastOneSchedule = TRUE; }
LV_ITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.iItem = (*pSchedCookie == psed->customSchedule) ? 0 : 0x7FFFFFFF; lvItem.lParam = (LPARAM)psld; lvItem.pszText = szName;
int index = ListView_InsertItem(psed->hwndSchedList, &lvItem);
if (index != -1) { ListView_SetItemState(psed->hwndSchedList, index, psld->bStartChecked ? COMP_CHECKED : COMP_UNCHECKED, LVIS_STATEIMAGEMASK); ListView_SetColumnWidth(psed->hwndSchedList, 0, LVSCW_AUTOSIZE); bAdded = TRUE; } } } } }
if (!bAdded) { SAFEDELETE(psld); } return TRUE; }
BOOL Sched_FillScheduleList(HWND hdlg, POOEBuf pBuf) { SCHED_ENUM_DATA sed;
sed.hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST); sed.pBuf = pBuf;
sed.customSchedule = GUID_NULL; ISubscriptionItem *psi; if (SUCCEEDED(SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi))) { SUBSCRIPTIONITEMINFO sii;
sii.cbSize = sizeof(SUBSCRIPTIONITEMINFO);
if (SUCCEEDED(psi->GetSubscriptionItemInfo(&sii))) { sed.customSchedule = sii.ScheduleGroup; } psi->Release(); } sed.bHasAtLeastOneSchedule = FALSE;
EnumSchedules(Sched_EnumCallback, (LPARAM)&sed);
return sed.bHasAtLeastOneSchedule; }
BOOL Sched_NewSchedule(HWND hdlg) { NEWSCHED_DATA nsd;
INT_PTR nResult = DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_NEW_SCHEDULE), hdlg, NewScheduleDlgProc, (LPARAM)&nsd);
if (IDOK == nResult) { SCHED_LIST_DATA *psld; LV_FINDINFO lvfi = { 0 }; HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
lvfi.flags = LVFI_STRING; lvfi.psz = nsd.szSchedName;
int index = ListView_FindItem(hwndSchedList, -1, &lvfi);
if (index == -1) {
psld = new SCHED_LIST_DATA; if (NULL != psld) { psld->SchedCookie = nsd.SchedCookie; psld->bChecked = TRUE; psld->bStartChecked = FALSE;
LV_ITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.iItem = 0; lvItem.lParam = (LPARAM)psld; lvItem.pszText = nsd.szSchedName;
index = ListView_InsertItem(hwndSchedList, &lvItem); } } else { psld = SchedList_GetData(hwndSchedList, index); if (NULL != psld) { psld->bChecked = TRUE; } }
if (index != -1) { ListView_SetItemState(hwndSchedList, index, COMP_CHECKED, LVIS_STATEIMAGEMASK); ListView_SetColumnWidth(hwndSchedList, 0, LVSCW_AUTOSIZE); CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, IDC_SCHEDULED_SYNC); SchedList_Select(hwndSchedList, index); Sched_EnableScheduleButtons(hdlg); }
}
SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hdlg, IDC_SCHEDULE_LIST), TRUE);
return nResult == IDOK; }
BOOL Sched_EditSchedule(HWND hdlg, POOEBuf pBuf) { HRESULT hr; ISyncScheduleMgr *pSyncScheduleMgr;
ASSERT(NULL != pBuf);
hr = CoInitialize(NULL);
if (SUCCEEDED(hr)) {
hr = CoCreateInstance(CLSID_SyncMgr, NULL, CLSCTX_ALL, IID_ISyncScheduleMgr, (void **)&pSyncScheduleMgr);
if (SUCCEEDED(hr)) { HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST); int index = ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED); SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, index);
if (NULL != psld) { ISyncSchedule *pSyncSchedule;
hr = pSyncScheduleMgr->OpenSchedule(&psld->SchedCookie, 0, &pSyncSchedule);
if (SUCCEEDED(hr)) { if (psld->bChecked) { hr = pSyncSchedule->SetItemCheck(CLSID_WebCheckOfflineSync, &pBuf->m_Cookie, SYNCMGRITEMSTATE_CHECKED); } hr = pSyncSchedule->EditSyncSchedule(hdlg, 0);
if (S_OK == hr) { psld->bChecked = IsCookieOnSchedule(pSyncSchedule, &pBuf->m_Cookie);
if (psld->bChecked) { CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, IDC_SCHEDULED_SYNC); }
ListView_SetItemState(hwndSchedList, index, psld->bChecked ? COMP_CHECKED : COMP_UNCHECKED, LVIS_STATEIMAGEMASK); }
WCHAR wszScheduleName[MAX_PATH]; DWORD cchScheduleName = ARRAYSIZE(wszScheduleName);
if (SUCCEEDED(pSyncSchedule->GetScheduleName(&cchScheduleName, wszScheduleName))) { SchedList_SetName(hwndSchedList, index, wszScheduleName);
ListView_SetColumnWidth(hwndSchedList, 0, LVSCW_AUTOSIZE); }
SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndSchedList, TRUE);
pSyncSchedule->Release(); } pSyncScheduleMgr->Release(); } } CoUninitialize(); }
// This is not undoable by hitting cancel so don't say we changed.
return FALSE; }
BOOL Sched_RemoveSchedule(HWND hdlg) { HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST); int index = ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED);
if (index >= 0) { SCHED_LIST_DATA *psld = SchedList_GetData(GetDlgItem(hdlg, IDC_SCHEDULE_LIST), index);
if (NULL != psld) { TCHAR szSchedName[MAX_PATH];
SchedList_GetName(hwndSchedList, index, szSchedName, ARRAYSIZE(szSchedName));
if (WCMessageBox(hdlg, IDS_CONFIRM_SCHEDULE_DELETE, IDS_SCHEDULE_DELETE_CAPTION, MB_YESNO | MB_ICONQUESTION, szSchedName) == IDYES) { HRESULT hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { ISyncScheduleMgr *pSyncScheduleMgr; hr = CoCreateInstance(CLSID_SyncMgr, NULL, CLSCTX_ALL, IID_ISyncScheduleMgr, (void **)&pSyncScheduleMgr);
if (SUCCEEDED(hr)) { hr = pSyncScheduleMgr->RemoveSchedule(&psld->SchedCookie);
ASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr)) { SchedList_DeleteData(hwndSchedList, -1, TRUE); SchedList_Select(hwndSchedList, 0); }
pSyncScheduleMgr->Release(); } CoUninitialize(); } }
SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hdlg, IDC_SCHEDULE_LIST), TRUE); } } // This is not undoable by hitting cancel so don't say we changed.
return FALSE; }
BOOL Sched_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl) { BOOL bHandled = TRUE; BOOL bChanged = FALSE; POOEBuf pBuf = GetBuf(hdlg);
if (NULL != pBuf) {
switch (wID) { case IDC_MANUAL_SYNC: case IDC_SCHEDULED_SYNC: // case IDC_IDLE_ONLY:
if (wNotifyCode == BN_CLICKED) { bChanged = TRUE; } break; case IDC_SCHEDULE_NEW: if (wNotifyCode == BN_CLICKED) { bChanged = Sched_NewSchedule(hdlg); } break;
case IDC_SCHEDULE_EDIT: if (wNotifyCode == BN_CLICKED) { bChanged = Sched_EditSchedule(hdlg, pBuf); } break;
case IDC_SCHEDULE_REMOVE: if (wNotifyCode == BN_CLICKED) { bChanged = Sched_RemoveSchedule(hdlg); } break;
default: bHandled = FALSE; break; } }
if (bChanged) { PropSheet_Changed(GetParent(hdlg), hdlg); }
return bHandled; }
BOOL Sched_Validate(HWND hdlg, POOEBuf pBuf) { /*
if (IsDlgButtonChecked(hdlg, IDC_IDLE_ONLY)) { pBuf->grfTaskTrigger |= TASK_FLAG_START_ONLY_IF_IDLE; } else { pBuf->grfTaskTrigger &= ~TASK_FLAG_START_ONLY_IF_IDLE; } */
if (IsDlgButtonChecked(hdlg, IDC_SCHEDULED_SYNC)) { HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST); int count = ListView_GetItemCount(hwndSchedList);
BOOL bHaveASchedule = FALSE; for (int i = 0; i < count; i++) { SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, i);
if (NULL != psld && psld->bChecked) { bHaveASchedule = TRUE; break; } }
if (!bHaveASchedule) { CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, IDC_MANUAL_SYNC); } }
return TRUE; }
BOOL Sched_ApplyProps(HWND hdlg, POOEBuf pBuf) { BOOL bResult; HRESULT hr;
pBuf->dwFlags = PROP_WEBCRAWL_ALL;
bResult = SUCCEEDED(SaveBufferChange(pBuf, TRUE));
if (bResult) { if (IsDlgButtonChecked(hdlg, IDC_MANUAL_SYNC)) { SchedList_UncheckAll(GetDlgItem(hdlg, IDC_SCHEDULE_LIST)); hr = RemoveItemFromAllSchedules(&pBuf->m_Cookie);
ASSERT(SUCCEEDED(hr)); } else { HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST); int count = ListView_GetItemCount(hwndSchedList); for (int i = 0; i < count; i++) { SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, i);
ASSERT(NULL != psld);
if (NULL != psld) { if (psld->bChecked != psld->bStartChecked) { if (psld->bChecked) { ISubscriptionItem *psi;
if (SUCCEEDED(SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi))) { SYNC_HANDLER_ITEM_INFO shii;
shii.handlerID = CLSID_WebCheckOfflineSync; shii.itemID = pBuf->m_Cookie; shii.hIcon = NULL; MyStrToOleStrN(shii.wszItemName, ARRAYSIZE(shii.wszItemName), pBuf->m_Name); shii.dwCheckState = SYNCMGRITEMSTATE_CHECKED;
AddScheduledItem(&shii, &psld->SchedCookie); } } else { RemoveScheduledItem(&pBuf->m_Cookie, &psld->SchedCookie); } psld->bStartChecked = psld->bChecked; } } } } }
return bResult; }
BOOL Sched_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh) { BOOL bHandled = TRUE; POOEBuf pBuf = GetBuf(hdlg); ASSERT(pBuf); switch (pnmh->code) { case PSN_KILLACTIVE: if (!Sched_Validate(hdlg, pBuf)) { SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE); } break;
case PSN_APPLY: Sched_ApplyProps(hdlg, pBuf); break;
case NM_DBLCLK: if (IDC_SCHEDULE_LIST == pnmh->idFrom) { Sched_EditSchedule(hdlg, pBuf); } break; case LVN_ITEMCHANGED: { NM_LISTVIEW *pnmlv = (NM_LISTVIEW *)pnmh; if ((pnmlv->iItem != -1) && (pnmlv->uChanged & LVIF_STATE) && ((pnmlv->uNewState ^ pnmlv->uOldState) & COMP_CHECKED))
{ SCHED_LIST_DATA *psld = SchedList_GetData(pnmh->hwndFrom, pnmlv->iItem);
if (NULL != psld) { psld->bChecked = (pnmlv->uNewState & COMP_CHECKED) ? TRUE : FALSE;
if (psld->bChecked) { CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, IDC_SCHEDULED_SYNC); } PropSheet_Changed(GetParent(hdlg), hdlg); } }
if ((pnmlv->uChanged & LVIF_STATE) && ((pnmlv->uNewState ^ pnmlv->uOldState) & LVIS_SELECTED)) { Sched_EnableScheduleButtons(hdlg); } break; }
default: bHandled = FALSE; break; }
return bHandled; }
void Sched_OnDestroy(HWND hdlg) { HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
SchedList_DeleteAllData(hwndSchedList); }
BOOL Sched_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam) { ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)); ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr(hdlg, DWLP_USER, ((LPPROPSHEETPAGE)lParam)->lParam);
// Now read in values and populate the dialog
POOEBuf pBuf = (POOEBuf)((LPPROPSHEETPAGE)lParam)->lParam;
/* CheckDlgButton(hdlg, IDC_IDLE_ONLY,
pBuf->grfTaskTrigger & TASK_FLAG_START_ONLY_IF_IDLE ? 1 : 0); */
HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST); ListView_SetExtendedListViewStyle(hwndSchedList, LVS_EX_CHECKBOXES);
LV_COLUMN lvc; lvc.mask = LVCF_FMT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = 0; ListView_InsertColumn(hwndSchedList, 0, &lvc);
// Now handle restrictions
SetPropSheetFlags(pBuf, SHRestricted2W(REST_NoScheduledUpdates, NULL, 0), PSF_NO_SCHEDULED_UPDATES); SetPropSheetFlags(pBuf, SHRestricted2W(REST_NoEditingScheduleGroups, NULL, 0), PSF_NO_EDITING_SCHEDULES);
BOOL bHasSchedules = Sched_FillScheduleList(hdlg, pBuf); if (pBuf->m_dwPropSheetFlags & PSF_NO_SCHEDULED_UPDATES) { EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_LIST), FALSE); EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULED_SYNC), FALSE); CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, IDC_MANUAL_SYNC); } else { CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, bHasSchedules ? IDC_SCHEDULED_SYNC : IDC_MANUAL_SYNC); }
SchedList_Select(hwndSchedList, 0);
// Finally, do the enable/disable controls thing...
Sched_EnableScheduleButtons(hdlg);
return TRUE; }
INT_PTR CALLBACK SchedulePropDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bHandled = FALSE;
switch (message) { case WM_INITDIALOG: bHandled = Sched_OnInitDialog(hdlg, (HWND)wParam, lParam); break;
case WM_COMMAND: bHandled = Sched_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
case WM_NOTIFY: bHandled = Sched_OnNotify(hdlg, (int)wParam, (LPNMHDR)lParam); break;
case WM_DESTROY: Sched_OnDestroy(hdlg); // return 0
break;
case WM_HELP: SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile, HELP_WM_HELP, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break;
case WM_CONTEXTMENU: SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break; } return bHandled; }
/********************************************************************************
Download property sheet code *********************************************************************************/
void Download_EnableFollowLinks(HWND hdlg) { BOOL bTranslate; int i = GetDlgItemInt(hdlg, IDC_LEVELS, &bTranslate, FALSE);
EnableWindow(GetDlgItem(hdlg, IDC_FOLLOW_LINKS), (bTranslate && i)); }
void Download_EnableLimitSpaceControls(HWND hdlg) { static const int IDs[] = { IDC_LIMIT_SPACE_EDIT, IDC_LIMIT_SPACE_SPIN, IDC_LIMIT_SPACE_TEXT }; EnableControls(hdlg, IDs, ARRAYSIZE(IDs), IsDlgButtonChecked(hdlg, IDC_LIMIT_SPACE_CHECK)); }
void Download_EnableEmailControls(HWND hdlg) { static const int IDs[] = { IDC_EMAIL_ADDRESS_TEXT, IDC_EMAIL_ADDRESS, IDC_EMAIL_SERVER_TEXT, IDC_EMAIL_SERVER }; EnableControls(hdlg, IDs, ARRAYSIZE(IDs), IsDlgButtonChecked(hdlg, IDC_EMAIL_NOTIFY)); }
BOOL Download_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam) { POOEBuf pBuf;
ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)); ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr(hdlg, DWLP_USER, ((LPPROPSHEETPAGE)lParam)->lParam);
// First do basic control setup
HWND hwndLimitSpin = GetDlgItem(hdlg, IDC_LIMIT_SPACE_SPIN); SendMessage(hwndLimitSpin, UDM_SETRANGE, 0, MAKELONG(MAX_DOWNLOAD_K, MIN_DOWNLOAD_K));
UDACCEL ua[] = { {0, 1}, {1, 10}, {2, 100}, {3, 1000} }; SendMessage(hwndLimitSpin, UDM_SETACCEL, ARRAYSIZE(ua), (LPARAM)ua);
Edit_LimitText(GetDlgItem(hdlg, IDC_LIMIT_SPACE_EDIT), 5);
// Now read in values and populate the dialog
pBuf = (POOEBuf)((LPPROPSHEETPAGE)lParam)->lParam;
SUBSCRIPTIONTYPE subType = GetItemCategory(pBuf); switch (subType) { case SUBSTYPE_CHANNEL: case SUBSTYPE_DESKTOPCHANNEL: CheckRadioButton(hdlg, IDC_DOWNLOAD_ALL, IDC_DOWNLOAD_MIN, pBuf->fChannelFlags & CHANNEL_AGENT_PRECACHE_ALL ? IDC_DOWNLOAD_ALL : IDC_DOWNLOAD_MIN); break;
case SUBSTYPE_URL: case SUBSTYPE_DESKTOPURL: case SUBSTYPE_EXTERNAL: { HWND hwndLevelsSpin = GetDlgItem(hdlg, IDC_LEVELS_SPIN); SendMessage(hwndLevelsSpin, UDM_SETRANGE, 0, MAKELONG(MAX_WEBCRAWL_LEVELS, 0)); SendMessage(hwndLevelsSpin, UDM_SETPOS, 0, pBuf->m_RecurseLevels); CheckDlgButton(hdlg, IDC_FOLLOW_LINKS, (pBuf->m_RecurseFlags & WEBCRAWL_LINKS_ELSEWHERE) || (0 == pBuf->m_RecurseLevels) ? 1 : 0); Download_EnableFollowLinks(hdlg); break; } }
SendMessage(hwndLimitSpin, UDM_SETPOS, 0, pBuf->m_SizeLimit ? pBuf->m_SizeLimit : DEF_DOWNLOAD_K); CheckDlgButton(hdlg, IDC_LIMIT_SPACE_CHECK, pBuf->m_SizeLimit ? 1 : 0);
CheckDlgButton(hdlg, IDC_EMAIL_NOTIFY, pBuf->bMail ? 1 : 0);
TCHAR szText[MAX_PATH];
ReadDefaultEmail(szText, ARRAYSIZE(szText)); Edit_LimitText(GetDlgItem(hdlg, IDC_EMAIL_ADDRESS), MAX_PATH - 1); SetDlgItemText(hdlg, IDC_EMAIL_ADDRESS, szText);
ReadDefaultSMTPServer(szText, ARRAYSIZE(szText)); Edit_LimitText(GetDlgItem(hdlg, IDC_EMAIL_SERVER), MAX_PATH - 1); SetDlgItemText(hdlg, IDC_EMAIL_SERVER, szText);
// Now handle restrictions
if (SHRestricted2W(REST_NoSubscriptionPasswords, NULL, 0)) { EnableWindow(GetDlgItem(hdlg, IDC_LOGIN), FALSE); }
// Finally, do the enable/disable controls thing...
Download_EnableLimitSpaceControls(hdlg); Download_EnableEmailControls(hdlg);
return TRUE; }
BOOL Download_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl) { BOOL bHandled = TRUE; BOOL bChanged = FALSE; POOEBuf pBuf = GetBuf(hdlg);
if (NULL != pBuf) { switch (wID) { case IDC_LIMIT_SPACE_EDIT: if (wNotifyCode == EN_CHANGE) { if (pBuf->m_SizeLimit != LOWORD(SendDlgItemMessage(hdlg, IDC_LIMIT_SPACE_SPIN, UDM_GETPOS, 0, 0))) { bChanged = TRUE; } } else if (wNotifyCode == EN_KILLFOCUS) { KeepSpinNumberInRange(hdlg, IDC_LIMIT_SPACE_EDIT, IDC_LIMIT_SPACE_SPIN, MIN_DOWNLOAD_K, MAX_DOWNLOAD_K); } break; case IDC_LEVELS: if (wNotifyCode == EN_UPDATE) { int levels = KeepSpinNumberInRange(hdlg, IDC_LEVELS, IDC_LEVELS_SPIN, 0, MAX_WEBCRAWL_LEVELS);
if (pBuf->m_RecurseLevels != levels) { bChanged = TRUE; } Download_EnableFollowLinks(hdlg); } break;
case IDC_LIMIT_SPACE_CHECK: if (wNotifyCode == BN_CLICKED) { Download_EnableLimitSpaceControls(hdlg); bChanged = TRUE; } break; case IDC_FOLLOW_LINKS: if (wNotifyCode == BN_CLICKED) { bChanged = TRUE; } break;
case IDC_EMAIL_NOTIFY: if (wNotifyCode == BN_CLICKED) { Download_EnableEmailControls(hdlg); bChanged = TRUE; } break; case IDC_EMAIL_ADDRESS: case IDC_EMAIL_SERVER: if (wNotifyCode == EN_CHANGE) { bChanged = TRUE; } break;
case IDC_LOGIN: if ((wNotifyCode == BN_CLICKED) && (DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_SUBSPROPS_LOGIN), hdlg, LoginOptionDlgProc, (LPARAM)pBuf) == IDOK)) { bChanged = TRUE; } break;
case IDC_ADVANCED: if ((wNotifyCode == BN_CLICKED) && (DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_SUBSPROPS_ADVANCED), hdlg, AdvancedDownloadDlgProc, (LPARAM)pBuf) == IDOK)) { bChanged = TRUE; } break;
default: bHandled = FALSE; break; } }
if (bChanged) { PropSheet_Changed(GetParent(hdlg), hdlg); }
return bHandled; }
BOOL Download_Validate(HWND hdlg, POOEBuf pBuf) { pBuf->bMail = IsDlgButtonChecked(hdlg, IDC_EMAIL_NOTIFY);
if (pBuf->bMail) { TCHAR szEmail[MAX_PATH]; TCHAR szServer[MAX_PATH];
GetDlgItemText(hdlg, IDC_EMAIL_ADDRESS, szEmail, ARRAYSIZE(szEmail)); GetDlgItemText(hdlg, IDC_EMAIL_SERVER, szServer, ARRAYSIZE(szServer));
if (!szEmail[0] || !szServer[0]) { SGMessageBox(hdlg, IDS_EMAIL_INCOMPLETE, MB_ICONWARNING); return FALSE; } }
SUBSCRIPTIONTYPE subType = GetItemCategory(pBuf); switch (subType) { case SUBSTYPE_CHANNEL: case SUBSTYPE_DESKTOPCHANNEL: pBuf->fChannelFlags &= ~(CHANNEL_AGENT_PRECACHE_SOME | CHANNEL_AGENT_PRECACHE_ALL); if (IsDlgButtonChecked(hdlg, IDC_DOWNLOAD_ALL)) { pBuf->fChannelFlags |= CHANNEL_AGENT_PRECACHE_ALL; } else { pBuf->fChannelFlags |= CHANNEL_AGENT_PRECACHE_SOME; } break;
case SUBSTYPE_URL: case SUBSTYPE_DESKTOPURL: case SUBSTYPE_EXTERNAL: { if (IsDlgButtonChecked(hdlg, IDC_FOLLOW_LINKS)) { pBuf->m_RecurseFlags |= WEBCRAWL_LINKS_ELSEWHERE; } else { pBuf->m_RecurseFlags &= ~WEBCRAWL_LINKS_ELSEWHERE; }
pBuf->m_RecurseLevels = LOWORD(SendDlgItemMessage(hdlg, IDC_LEVELS_SPIN, UDM_GETPOS, 0, 0));
ASSERT((pBuf->m_RecurseLevels >= 0) && (pBuf->m_RecurseLevels <= MAX_WEBCRAWL_LEVELS)); } }
pBuf->m_SizeLimit = IsDlgButtonChecked(hdlg, IDC_LIMIT_SPACE_CHECK) ? (LONG)SendDlgItemMessage(hdlg, IDC_LIMIT_SPACE_SPIN, UDM_GETPOS, 0, 0) : 0; ASSERT((0 == pBuf->m_SizeLimit) || ((pBuf->m_SizeLimit >= MIN_DOWNLOAD_K) && (pBuf->m_SizeLimit <= MAX_DOWNLOAD_K)));
return TRUE; }
BOOL Download_ApplyProps(HWND hdlg, POOEBuf pBuf) { pBuf->dwFlags = PROP_WEBCRAWL_ALL;
if (IsDlgButtonChecked(hdlg, IDC_EMAIL_NOTIFY)) { TCHAR szText[MAX_PATH];
GetDlgItemText(hdlg, IDC_EMAIL_ADDRESS, szText, ARRAYSIZE(szText)); WriteDefaultEmail(szText); GetDlgItemText(hdlg, IDC_EMAIL_SERVER, szText, ARRAYSIZE(szText)); WriteDefaultSMTPServer(szText); }
if (pBuf->bChannel) { pBuf->dwFlags |= PROP_WEBCRAWL_CHANNELFLAGS; }
return SUCCEEDED(SaveBufferChange(pBuf, TRUE)); }
BOOL Download_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh) { BOOL bHandled = TRUE; POOEBuf pBuf = GetBuf(hdlg); ASSERT(pBuf); switch (pnmh->code) { case PSN_KILLACTIVE: if (!Download_Validate(hdlg, pBuf)) { SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE); } break;
case PSN_APPLY: Download_ApplyProps(hdlg, pBuf); break;
default: bHandled = FALSE; break; }
return bHandled; }
INT_PTR CALLBACK DownloadPropDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bHandled = FALSE;
switch (message) { case WM_INITDIALOG: bHandled = Download_OnInitDialog(hdlg, (HWND)wParam, lParam); break;
case WM_COMMAND: bHandled = Download_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
case WM_NOTIFY: bHandled = Download_OnNotify(hdlg, (int)wParam, (LPNMHDR)lParam); break;
case WM_HELP: SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile, HELP_WM_HELP, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break;
case WM_CONTEXTMENU: SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break; } return bHandled; }
/********************************************************************************
New schedule popup code *********************************************************************************/
BOOL NewSched_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl) { BOOL bHandled = FALSE; switch (wID) { case IDC_SCHEDULE_DAYS: if (wNotifyCode == EN_UPDATE) { KeepSpinNumberInRange(hdlg, IDC_SCHEDULE_DAYS, IDC_SCHEDULE_DAYS_SPIN, 1, 99); } #ifdef NEWSCHED_AUTONAME
else if (wNotifyCode == EN_CHANGE) { NewSched_AutoNameHelper(hdlg); } #endif
bHandled = TRUE; break;
case IDOK: { TASK_TRIGGER trig; NEWSCHED_DATA *pnsd = (NEWSCHED_DATA*) GetWindowLongPtr(hdlg, DWLP_USER);
ASSERT(NULL != pnsd); if (NewSched_ResolveNameConflictHelper(hdlg, &trig, &pnsd->SchedCookie)) { NewSched_CreateScheduleHelper(hdlg, &trig, &pnsd->SchedCookie);
GetDlgItemText(hdlg, IDC_SCHEDULE_NAME, pnsd->szSchedName, ARRAYSIZE(pnsd->szSchedName)); EndDialog(hdlg, IDOK); } break; }
case IDCANCEL: EndDialog(hdlg, IDCANCEL); break;
default: break; }
return bHandled; }
#ifdef NEWSCHED_AUTONAME
BOOL NewSched_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh) { BOOL bHandled = TRUE;
switch (pnmh->code) { case DTN_DATETIMECHANGE: NewSched_AutoNameHelper(hdlg); break; default: bHandled = FALSE; break; }
return bHandled; } #endif
INT_PTR CALLBACK NewScheduleDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bHandled = FALSE;
switch (message) { case WM_INITDIALOG: { SetWindowLongPtr(hdlg, DWLP_USER, lParam); NewSched_OnInitDialogHelper(hdlg); bHandled = TRUE; break; }
case WM_COMMAND: bHandled = NewSched_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
#ifdef NEWSCHED_AUTONAME
case WM_NOTIFY: bHandled = NewSched_OnNotify(hdlg, wParam, (LPNMHDR)lParam); break; #endif
case WM_HELP: SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile, HELP_WM_HELP, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break;
case WM_CONTEXTMENU: SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break; }
return bHandled; }
/********************************************************************************
Advanced properties code *********************************************************************************/
BOOL Advanced_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam) { POOEBuf pBuf;
ASSERT(NULL != (POOEBuf)lParam);
SetWindowLongPtr(hdlg, DWLP_USER, lParam);
pBuf = (POOEBuf)lParam;
UINT flags = pBuf->m_RecurseFlags; CheckDlgButton(hdlg, IDC_DOWNLOAD_IMAGES, flags & WEBCRAWL_GET_IMAGES); CheckDlgButton(hdlg, IDC_DOWNLOAD_APPLETS, flags & WEBCRAWL_GET_CONTROLS); CheckDlgButton(hdlg, IDC_DOWNLOAD_MEDIA, flags & (WEBCRAWL_GET_BGSOUNDS | WEBCRAWL_GET_VIDEOS));
CheckDlgButton(hdlg, IDC_DOWNLOAD_ONLY_HTML_LINKS, flags & WEBCRAWL_ONLY_LINKS_TO_HTML);
return TRUE; }
void Advanced_SetFlag(HWND hdlg, POOEBuf pBuf, int ID, LONG flags) { if (IsDlgButtonChecked(hdlg, ID)) { pBuf->m_RecurseFlags |= flags; } else { pBuf->m_RecurseFlags &= ~flags; } }
BOOL Advanced_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl) { BOOL bHandled = TRUE; POOEBuf pBuf = GetBuf(hdlg); ASSERT(pBuf);
switch (wID) { case IDOK: Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_IMAGES, WEBCRAWL_GET_IMAGES); Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_APPLETS, WEBCRAWL_GET_CONTROLS); Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_MEDIA, WEBCRAWL_GET_BGSOUNDS | WEBCRAWL_GET_VIDEOS); Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_ONLY_HTML_LINKS, WEBCRAWL_ONLY_LINKS_TO_HTML); EndDialog(hdlg, IDOK); break;
case IDCANCEL: EndDialog(hdlg, IDCANCEL); break;
case IDC_DOWNLOAD_IMAGES: case IDC_DOWNLOAD_APPLETS: case IDC_DOWNLOAD_MEDIA: case IDC_DOWNLOAD_ONLY_HTML_LINKS: break;
default: bHandled = FALSE; break; }
return bHandled; }
INT_PTR CALLBACK AdvancedDownloadDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bHandled = FALSE;
switch (message) {
case WM_INITDIALOG: bHandled = Advanced_OnInitDialog(hdlg, (HWND)wParam, lParam); break;
case WM_COMMAND: bHandled = Advanced_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break; case WM_HELP: SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile, HELP_WM_HELP, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break;
case WM_CONTEXTMENU: SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break; } return bHandled; }
/********************************************************************************
Login properties code *********************************************************************************/
BOOL Login_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam) { POOEBuf pBuf;
ASSERT(NULL != (POOEBuf)lParam);
SetWindowLongPtr(hdlg, DWLP_USER, lParam);
pBuf = (POOEBuf)lParam;
Edit_LimitText(GetDlgItem(hdlg, IDC_USERNAME), ARRAYSIZE(pBuf->username) - 1); SetDlgItemText(hdlg, IDC_USERNAME, pBuf->username);
Edit_LimitText(GetDlgItem(hdlg, IDC_PASSWORD), ARRAYSIZE(pBuf->password) - 1); SetDlgItemText(hdlg, IDC_PASSWORD, pBuf->password);
Edit_LimitText(GetDlgItem(hdlg, IDC_PASSWORDCONFIRM), ARRAYSIZE(pBuf->password) - 1); SetDlgItemText(hdlg, IDC_PASSWORDCONFIRM, pBuf->password);
return TRUE; }
BOOL Login_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl) { BOOL bHandled = TRUE; POOEBuf pBuf = GetBuf(hdlg); ASSERT(pBuf);
switch (wID) { case IDOK: { TCHAR szUsername[ARRAYSIZE(pBuf->username) + 1]; TCHAR szPassword[ARRAYSIZE(pBuf->password) + 1]; TCHAR szPasswordConfirm[ARRAYSIZE(pBuf->password) + 1];
GetDlgItemText(hdlg, IDC_USERNAME, szUsername, ARRAYSIZE(szUsername)); GetDlgItemText(hdlg, IDC_PASSWORD, szPassword, ARRAYSIZE(szPassword)); GetDlgItemText(hdlg, IDC_PASSWORDCONFIRM, szPasswordConfirm, ARRAYSIZE(szPasswordConfirm));
if (!szUsername[0] && (szPassword[0] || szPasswordConfirm[0])) { SGMessageBox(hdlg, (pBuf->bChannel ? IDS_NEEDCHANNELUSERNAME : IDS_NEEDUSERNAME), MB_ICONWARNING); } else if (szUsername[0] && !szPassword[0]) { SGMessageBox(hdlg, (pBuf->bChannel ? IDS_NEEDCHANNELPASSWORD : IDS_NEEDPASSWORD), MB_ICONWARNING); } else if (StrCmp(szPassword, szPasswordConfirm) != 0) { SGMessageBox(hdlg, IDS_MISMATCHED_PASSWORDS, MB_ICONWARNING); } else { StrCpyN(pBuf->username, szUsername, ARRAYSIZE(pBuf->username)); StrCpyN(pBuf->password, szPassword, ARRAYSIZE(pBuf->password)); pBuf->dwFlags |= (PROP_WEBCRAWL_UNAME | PROP_WEBCRAWL_PSWD); EndDialog(hdlg, IDOK); } break; } case IDCANCEL: EndDialog(hdlg, IDCANCEL); break;
default: bHandled = FALSE; break; }
return bHandled; }
INT_PTR CALLBACK LoginOptionDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bHandled = FALSE;
switch (message) {
case WM_INITDIALOG: bHandled = Login_OnInitDialog(hdlg, (HWND)wParam, lParam); break;
case WM_COMMAND: bHandled = Login_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
case WM_HELP: SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile, HELP_WM_HELP, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break;
case WM_CONTEXTMENU: SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs); bHandled = TRUE; break; } return bHandled; }
//
// Read the users default email address and smtp from the Athena Account Mgr
//
// Expects lpszEmailAddress and lpszSMTPServer to pt to char buffers of
// CCHMAX_EMAIL_ADDRESS and CCHMAX_SERVER_NAME size, resp.
//
BOOL ReadAthenaMailSettings(LPSTR lpszEmailAddress, LPSTR lpszSMTPServer) { //
// This api gets called from threads that haven't used COM before so wrap
// in CoInitialize/CoUninitialize
//
HRESULT hr = CoInitialize(NULL); ASSERT(SUCCEEDED(hr));
//
// Create an Internet Mail and News Account Manager
//
IImnAccountManager * pAccountManager; hr = CoCreateInstance( CLSID_ImnAccountManager, NULL, // no aggregation
CLSCTX_INPROC_SERVER, // inproc server implemented in webcheck.dll
IID_IImnAccountManager, //
(void **)&pAccountManager);
if (SUCCEEDED(hr)) { hr = pAccountManager->Init(NULL);
if (SUCCEEDED(hr)) { //
// Get the default SMTP account
//
IImnAccount * pAccount; hr = pAccountManager->GetDefaultAccount(ACCT_MAIL, &pAccount);
if (hr == S_OK) { //
// Get the SMTP_SERVER name for this account
//
if (NULL != lpszSMTPServer) { hr = pAccount->GetPropSz( AP_SMTP_SERVER, lpszSMTPServer, CCHMAX_SERVER_NAME); } //
// Get the Users email address for this account
//
if (NULL != lpszEmailAddress) { hr |= pAccount->GetPropSz( AP_SMTP_EMAIL_ADDRESS, lpszEmailAddress, CCHMAX_EMAIL_ADDRESS); }
pAccount->Release(); // done with IImnAccount
} } pAccountManager->Release(); // done with IImnAccountManager
}
//
// This api gets called from threads that haven't used COM before so wrap
// in CoInitialize/CoUninitialize
//
CoUninitialize();
if (hr == S_OK) return TRUE; else return FALSE; }
void ReadDefaultEmail(LPTSTR szBuf, UINT cch) { ASSERT(szBuf);
szBuf[0] = (TCHAR)0; if(ReadRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefEmail, szBuf, cch * sizeof(TCHAR))) return;
// TODO: Look for eudora/netscape as well
CHAR szEmailAddress[CCHMAX_EMAIL_ADDRESS]; if (ReadAthenaMailSettings(szEmailAddress, NULL)) { SHAnsiToTChar(szEmailAddress, szBuf, cch); } }
void WriteDefaultEmail(LPTSTR szBuf) { ASSERT(szBuf); WriteRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefEmail, szBuf, (lstrlen(szBuf) + 1) * sizeof(TCHAR), REG_SZ); }
void ReadDefaultSMTPServer(LPTSTR szBuf, UINT cch) { ASSERT(szBuf);
szBuf[0] = (TCHAR)0; if(ReadRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefServer, szBuf, cch * sizeof(TCHAR))) return;
// TODO: Look for eudora/netscape as well
CHAR szSMTPServer[CCHMAX_SERVER_NAME]; if (ReadAthenaMailSettings(NULL, szSMTPServer)) { SHAnsiToTChar(szSMTPServer, szBuf, cch); } }
void WriteDefaultSMTPServer(LPTSTR szBuf) { ASSERT(szBuf); WriteRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefServer, szBuf, (lstrlen(szBuf) + 1) * sizeof(TCHAR), REG_SZ); }
|