propshts.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 62k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "private.h"
  2. #include "offl_cpp.h"
  3. #include "propshts.h"
  4. #include "subsmgrp.h"
  5. #include <iehelpid.h>
  6. #include <mluisupp.h>
  7. #define INITGUID
  8. #include <initguid.h>
  9. #include "imnact.h"
  10. #include "helper.h"
  11. void WriteDefaultEmail(LPTSTR szBuf);
  12. void WriteDefaultSMTPServer(LPTSTR szBuf);
  13. const TCHAR c_szDefEmail[] = TEXT("DefaultEmail");
  14. const TCHAR c_szDefServer[] = TEXT("DefaultSMTPServer");
  15. TCHAR c_szHelpFile[] = TEXT("iexplore.hlp");
  16. struct NEWSCHED_DATA
  17. {
  18.     SYNCSCHEDULECOOKIE SchedCookie;
  19.     TCHAR szSchedName[MAX_PATH];
  20. };
  21. #define MIN_DOWNLOAD_K  50
  22. #define MAX_DOWNLOAD_K  UD_MAXVAL
  23. #define DEF_DOWNLOAD_K  500
  24. DWORD aHelpIDs[] = {
  25. //  Schedule page
  26.     IDC_SCHEDULE_TEXT,              IDH_GROUPBOX,
  27.     IDC_MANUAL_SYNC,                IDH_SUBPROPS_SCHEDTAB_MANUAL_SCHEDULE,
  28.     IDC_SCHEDULED_SYNC,             IDH_SUBPROPS_SCHEDTAB_CUSTOM_SCHEDULE,
  29.     IDC_SCHEDULE_LIST,              IDH_SUBPROPS_SCHEDTAB_SCHEDDESC,
  30.     IDC_SCHEDULE_NEW,               IDH_NEW_OFFLINE_SCHED,
  31.     IDC_SCHEDULE_EDIT,              IDH_EDIT_OFFLINE_SCHED,
  32.     IDC_SCHEDULE_REMOVE,            IDH_REMOVE_OFFLINE_SCHED,
  33. //    IDC_IDLE_ONLY,                  IDH_SUBPROPS_SCHED_DONTUPDATE,
  34. //  Download page
  35.     IDC_CONTENT_GROUPBOX,           IDH_GROUPBOX,
  36.     IDC_DOWNLOAD_PAGES_LABEL1,      IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP,
  37.     IDC_LEVELS,                     IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP,
  38.     IDC_LEVELS_SPIN,                IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP,
  39.     IDC_DOWNLOAD_PAGES_LABEL2,      IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_PAGES_DEEP,
  40.     IDC_FOLLOW_LINKS,               IDH_SUBPROPS_RECTAB_ADVOPTS_FOLLOW_LINKS,
  41.     IDC_LIMIT_SPACE_CHECK,          IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD,
  42.     IDC_LIMIT_SPACE_EDIT,           IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD,
  43.     IDC_LIMIT_SPACE_SPIN,           IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD,
  44.     IDC_LIMIT_SPACE_TEXT,           IDH_SUBPROPS_RECTAB_ADVOPTS_MAX_DOWNLOAD,   
  45.     IDC_ADVANCED,                   IDH_SUBPROPS_RECTAB_ADVANCED,
  46.     IDC_EMAIL_GROUPBOX,             IDH_SUBPROPS_RECTAB_EMAIL_NOTIFICATION,
  47.     IDC_EMAIL_NOTIFY,               IDH_SUBPROPS_RECTAB_EMAIL_NOTIFICATION,
  48.     IDC_EMAIL_ADDRESS_TEXT,         IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_ADDRESS,
  49.     IDC_EMAIL_ADDRESS,              IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_ADDRESS,
  50.     IDC_EMAIL_SERVER_TEXT,          IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_SERVER,
  51.     IDC_EMAIL_SERVER,               IDH_SUBPROPS_RECTAB_MAILOPTS_EMAIL_SERVER,
  52.     IDC_LOGIN_LABEL,                IDH_SUBPROPS_RECTAB_CHANNEL_LOGIN,
  53.     IDC_LOGIN,                      IDH_SUBPROPS_RECTAB_CHANNEL_LOGIN,
  54.     IDC_DOWNLOAD_ALL,               IDH_CHANNEL_DOWNLOAD_ALL,
  55.     IDC_DOWNLOAD_MIN,               IDH_CHANNEL_DOWNLOAD_COVER_N_TOC,
  56.     //  Advanced popup
  57.     IDC_ADVANCED_GROUPBOX,          IDH_GROUPBOX,
  58.     IDC_DOWNLOAD_IMAGES,            IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_IMAGES,
  59.     IDC_DOWNLOAD_MEDIA,             IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_SOUND,
  60.     IDC_DOWNLOAD_APPLETS,           IDH_SUBPROPS_RECTAB_ADVOPTS_DOWNLOAD_ACTIVEX,
  61.     IDC_DOWNLOAD_ONLY_HTML_LINKS,   IDH_SUBPROPS_RECTAB_ADVOPTS_ONLY_HTML_LINKS,
  62.     //  Login popup
  63.     IDC_USERNAME_LABEL,             IDH_SUBPROPS_RECTAB_LOGINOPTS_USER_ID,
  64.     IDC_USERNAME,                   IDH_SUBPROPS_RECTAB_LOGINOPTS_USER_ID,
  65.     IDC_PASSWORD_LABEL,             IDH_SUBPROPS_RECTAB_LOGINOPTS_PASSWORD,
  66.     IDC_PASSWORD,                   IDH_SUBPROPS_RECTAB_LOGINOPTS_PASSWORD,
  67.     //  New schedule popup
  68.     IDC_SCHEDULE_LABEL1,            IDH_NEWSCHED_EVERY_AT_TIME,
  69.     IDC_SCHEDULE_DAYS,              IDH_NEWSCHED_EVERY_AT_TIME,
  70.     IDC_SCHEDULE_DAYS_SPIN,         IDH_NEWSCHED_EVERY_AT_TIME,
  71.     IDC_SCHEDULE_LABEL2,            IDH_NEWSCHED_EVERY_AT_TIME,
  72.     IDC_SCHEDULE_TIME,              IDH_NEWSCHED_EVERY_AT_TIME,
  73.     IDC_SCHEDULE_NAME_TEXT,         IDH_NEWSCHED_NAME,
  74.     IDC_SCHEDULE_NAME,              IDH_NEWSCHED_NAME,
  75.     IDC_SCHEDULE_LABEL3,            IDH_NEWSCHED_EVERY_AT_TIME,
  76.     //  Summary page
  77.     IDC_NAME,                   IDH_SUBPROPS_SUBTAB_SUBSCRIBED_NAME,
  78.     IDC_URL_TEXT,               IDH_SUBPROPS_SUBTAB_SUBSCRIBED_URL,
  79.     IDC_URL,                    IDH_SUBPROPS_SUBTAB_SUBSCRIBED_URL,
  80.     IDC_VISITS_TEXT,            IDH_WEBDOC_VISITS,
  81.     IDC_VISITS,                 IDH_WEBDOC_VISITS,
  82.     IDC_MAKE_OFFLINE,           IDH_MAKE_AVAIL_OFFLINE,
  83.     IDC_SUMMARY,                IDH_GROUPBOX,
  84.     IDC_LAST_SYNC_TEXT,         IDH_SUBPROPS_SUBTAB_LAST,
  85.     IDC_LAST_SYNC,              IDH_SUBPROPS_SUBTAB_LAST,
  86.     IDC_DOWNLOAD_SIZE_TEXT,     IDH_SUBPROPS_DLSIZE,
  87.     IDC_DOWNLOAD_SIZE,          IDH_SUBPROPS_DLSIZE,
  88.     IDC_DOWNLOAD_RESULT_TEXT,   IDH_SUBPROPS_SUBTAB_RESULT,
  89.     IDC_DOWNLOAD_RESULT,        IDH_SUBPROPS_SUBTAB_RESULT,
  90.     //  dah end
  91.     0,                              0
  92. };
  93. /********************************************************************************
  94.     Property sheet helpers
  95. *********************************************************************************/
  96. inline POOEBuf GetBuf(HWND hdlg)
  97. {
  98.     POOEBuf pBuf = (POOEBuf) GetWindowLongPtr(hdlg, DWLP_USER);
  99.     return pBuf;
  100. }
  101. void EnableControls(HWND hdlg, const int *pIDs, int nIDs, BOOL bEnable)
  102. {
  103.     for (int i = 0; i < nIDs; i++)
  104.     {
  105.         EnableWindow(GetDlgItem(hdlg, *pIDs++), bEnable);
  106.     }
  107. }
  108. /********************************************************************************
  109.     Summary property sheet code
  110. *********************************************************************************/
  111. inline POOEBuf Summary_GetBuf(HWND hdlg)
  112. {
  113.     CSubscriptionMgr *pSubsMgr = (CSubscriptionMgr*) GetWindowLongPtr(hdlg, DWLP_USER);
  114.     ASSERT(NULL != pSubsMgr);
  115.     return (NULL != pSubsMgr) ? pSubsMgr->m_pBuf : NULL;
  116. }
  117. void Summary_ShowOfflineSummary(HWND hdlg, POOEBuf pBuf, BOOL bShow)
  118. {
  119.     static const int offSumIDs[] =
  120.     {
  121.         IDC_SUMMARY,
  122.         IDC_LAST_SYNC_TEXT,
  123.         IDC_LAST_SYNC,
  124.         IDC_DOWNLOAD_SIZE_TEXT,
  125.         IDC_DOWNLOAD_SIZE,
  126.         IDC_DOWNLOAD_RESULT,
  127.         IDC_DOWNLOAD_RESULT_TEXT,
  128.         IDC_FREESPACE_TEXT
  129.     };
  130.     if (bShow)
  131.     {
  132.         TCHAR szLastSync[128];
  133.         TCHAR szDownloadSize[128];
  134.         TCHAR szDownloadResult[128];
  135.         MLLoadString(IDS_VALUE_UNKNOWN, szLastSync, ARRAYSIZE(szLastSync));
  136.         StrCpyN(szDownloadSize, szLastSync, ARRAYSIZE(szDownloadSize));
  137.         StrCpyN(szDownloadResult, szLastSync, ARRAYSIZE(szDownloadResult));
  138.         ISubscriptionItem *psi;
  139.             
  140.         if (SUCCEEDED(SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi)))
  141.         {
  142.             enum { spLastSync, spDownloadSize, spDownloadResult };
  143.             static const LPCWSTR pProps[] =
  144.             { 
  145.                 c_szPropCompletionTime,
  146.                 c_szPropCrawlActualSize,
  147.                 c_szPropStatusString
  148.             };
  149.             VARIANT vars[ARRAYSIZE(pProps)];
  150.             if (SUCCEEDED(psi->ReadProperties(ARRAYSIZE(pProps), pProps, vars)))
  151.             {
  152.                 if (VT_DATE == vars[spLastSync].vt)
  153.                 {
  154.                     FILETIME ft, ft2;
  155.                     DWORD dwFlags = FDTF_DEFAULT;
  156.                     
  157.                     VariantTimeToFileTime(vars[spLastSync].date, ft);
  158.                     LocalFileTimeToFileTime(&ft, &ft2);
  159.                     SHFormatDateTime(&ft2, &dwFlags, szLastSync, ARRAYSIZE(szLastSync));
  160.                 }
  161.                 if (VT_I4 == vars[spDownloadSize].vt)
  162.                 {
  163.                     StrFormatByteSize(vars[spDownloadSize].lVal * 1024, 
  164.                                       szDownloadSize, ARRAYSIZE(szDownloadSize));
  165.                 }
  166.                 if (VT_BSTR == vars[spDownloadResult].vt)
  167.                 {
  168.                 #ifdef UNICODE
  169.                     wnsprintf(szDownloadResult, ARRAYSIZE(szDownloadResult),
  170.                               TEXT("%s"), vars[spDownloadResult].bstrVal);
  171.                 #else
  172.                     wnsprintf(szDownloadResult, ARRAYSIZE(szDownloadResult),
  173.                               TEXT("%S"), vars[spDownloadResult].bstrVal);
  174.                 #endif
  175.                 }
  176.                 for (int i = 0; i < ARRAYSIZE(pProps); i++)
  177.                 {
  178.                     VariantClear(&vars[i]);
  179.                 }
  180.             }
  181.             psi->Release();
  182.         }
  183.         SetDlgItemText(hdlg, IDC_LAST_SYNC, szLastSync);
  184.         SetDlgItemText(hdlg, IDC_DOWNLOAD_SIZE, szDownloadSize);
  185.         SetDlgItemText(hdlg, IDC_DOWNLOAD_RESULT, szDownloadResult);
  186.     }
  187.     for (int i = 0; i < ARRAYSIZE(offSumIDs); i++)
  188.     {
  189.         ShowWindow(GetDlgItem(hdlg, offSumIDs[i]), bShow ? SW_SHOW : SW_HIDE);
  190.     }
  191. }
  192. BOOL Summary_AddPageCallback(HPROPSHEETPAGE hpage, LPARAM lParam)
  193. {
  194.     return PropSheet_AddPage((HWND)lParam, hpage) ? TRUE : FALSE;
  195. }
  196. BOOL Summary_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  197. {
  198.     BOOL bResult = FALSE;
  199.     BOOL bChanged = FALSE;
  200.     POOEBuf pBuf = Summary_GetBuf(hdlg);
  201.     switch (wID)
  202.     {
  203.         case IDC_MAKE_OFFLINE:
  204.             if (BN_CLICKED == wNotifyCode)
  205.             {
  206.                 CSubscriptionMgr *pSubsMgr = (CSubscriptionMgr*) GetWindowLongPtr(hdlg, DWLP_USER);
  207.                 BOOL bShow = IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE);
  208.                 Summary_ShowOfflineSummary(hdlg, pBuf, bShow);
  209.                 
  210.                 if (NULL != pSubsMgr)
  211.                 {
  212.                     if (bShow)
  213.                     {
  214.                         pSubsMgr->AddPages(Summary_AddPageCallback, (LPARAM)GetParent(hdlg));
  215.                     }
  216.                     else
  217.                     {
  218.                         pSubsMgr->RemovePages(GetParent(hdlg));
  219.                     }
  220.                 }
  221.                 bChanged = TRUE;
  222.             }
  223.             bResult = TRUE;
  224.             break;
  225.     }
  226.     if (bChanged)
  227.     {
  228.         PropSheet_Changed(GetParent(hdlg), hdlg);        
  229.     }
  230.     return bResult;
  231. }
  232. BOOL Summary_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh)
  233. {
  234.     BOOL bResult = TRUE;
  235.     switch (pnmh->code)
  236.     {
  237.         case PSN_APPLY:
  238.         {
  239.             CSubscriptionMgr *pSubsMgr = (CSubscriptionMgr*) GetWindowLongPtr(hdlg, DWLP_USER);
  240.             POOEBuf pBuf = Summary_GetBuf(hdlg);
  241.             ASSERT(NULL != pSubsMgr);
  242.             ASSERT(NULL != pBuf);
  243.             
  244.             if ((NULL != pSubsMgr) && (NULL != pBuf))
  245.             {
  246.                 if (IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE))
  247.                 {
  248.                     pBuf->dwFlags = PROP_WEBCRAWL_ALL;
  249.                     SaveBufferChange(pBuf, TRUE);
  250.                 }
  251.                 else
  252.                 {                
  253.                     WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
  254.                     MyStrToOleStrN(wszURL, ARRAYSIZE(wszURL), pBuf->m_URL);
  255.                     pSubsMgr->DeleteSubscription(wszURL, NULL); 
  256.                 }
  257.             }
  258.             break;
  259.         }
  260.             
  261.         default:
  262.             bResult = FALSE;
  263.             break;
  264.     }
  265.     return bResult;
  266. }
  267. BOOL Summary_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
  268. {
  269.     ASSERT(NULL != ((LPPROPSHEETPAGE)lParam));
  270.     ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)->lParam);
  271.     SetWindowLongPtr(hdlg, DWLP_USER, ((LPPROPSHEETPAGE)lParam)->lParam);
  272.     //  Now read in values and populate the dialog
  273.     POOEBuf pBuf = Summary_GetBuf(hdlg);
  274.     ISubscriptionItem *psi;
  275.     HICON hicon;
  276.     BOOL bSubscribed;
  277.     HRESULT hr = SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi);
  278.     if (SUCCEEDED(hr))
  279.     {
  280.         bSubscribed = TRUE;
  281.         hicon = LoadItemIcon(psi, TRUE);
  282.         psi->Release();
  283.     }
  284.     else
  285.     {
  286.         bSubscribed = FALSE;
  287.         hicon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_WEBDOC));
  288.     }
  289.     SendDlgItemMessage(hdlg, IDC_ICONEX2, STM_SETICON, (WPARAM)hicon, 0);
  290.     if ((!IsHTTPPrefixed(pBuf->m_URL)) ||
  291.         (bSubscribed && SHRestricted2(REST_NoRemovingSubscriptions, pBuf->m_URL, 0)) ||
  292.         (!bSubscribed && SHRestricted2(REST_NoAddingSubscriptions, pBuf->m_URL, 0)))
  293.     {
  294.         EnableWindow(GetDlgItem(hdlg, IDC_MAKE_OFFLINE), FALSE);
  295.     }
  296.         
  297.     SetDlgItemText(hdlg, IDC_NAME, pBuf->m_Name);
  298.     SetDlgItemText(hdlg, IDC_URL, pBuf->m_URL);
  299.     CheckDlgButton(hdlg, IDC_MAKE_OFFLINE, bSubscribed);
  300.     TCHAR szVisits[256];
  301.     BYTE cei[MY_MAX_CACHE_ENTRY_INFO];
  302.     LPINTERNET_CACHE_ENTRY_INFO pcei = (LPINTERNET_CACHE_ENTRY_INFO)cei;
  303.     DWORD cbcei = sizeof(cei);
  304.     if (GetUrlCacheEntryInfo(pBuf->m_URL, pcei, &cbcei))
  305.     {
  306.         wnsprintf(szVisits, ARRAYSIZE(szVisits), TEXT("%d"), 
  307.                   pcei->dwHitRate);
  308.     }
  309.     else
  310.     {
  311.         MLLoadString(IDS_VALUE_UNKNOWN, szVisits, 
  312.                    ARRAYSIZE(szVisits));
  313.     }
  314.     SetDlgItemText(hdlg, IDC_VISITS, szVisits);
  315.     Summary_ShowOfflineSummary(hdlg, pBuf, bSubscribed);
  316.     return TRUE;
  317. }
  318. void Summary_OnDestroy(HWND hdlg)
  319. {
  320.     POOEBuf pBuf = Summary_GetBuf(hdlg);
  321.     if ((!(pBuf->m_dwPropSheetFlags & PSF_IS_ALREADY_SUBSCRIBED)) && 
  322.         (IsDlgButtonChecked(hdlg, IDC_MAKE_OFFLINE)))
  323.     {
  324.         SendUpdateRequests(NULL, &pBuf->m_Cookie, 1);
  325.     }
  326. }
  327. INT_PTR CALLBACK SummaryPropDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
  328. {
  329.     BOOL bHandled = FALSE;
  330.     switch (message)
  331.     {
  332.         case WM_INITDIALOG:
  333.             bHandled = Summary_OnInitDialog(hdlg, (HWND)wParam, lParam);
  334.             break;
  335.         case WM_COMMAND:
  336.             bHandled = Summary_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  337.             break;
  338.         case WM_DESTROY:
  339.             Summary_OnDestroy(hdlg);
  340.             break;
  341.             
  342.         case WM_NOTIFY:
  343.             bHandled = Summary_OnNotify(hdlg, (int)wParam, (LPNMHDR)lParam);
  344.             break;
  345.         case WM_HELP:
  346.             SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
  347.                     HELP_WM_HELP, (DWORD_PTR)aHelpIDs);
  348.             bHandled = TRUE;
  349.             break;
  350.         case WM_CONTEXTMENU:
  351.             SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
  352.             bHandled = TRUE;
  353.             break;
  354.     }
  355.     
  356.     return bHandled;
  357. }
  358. /********************************************************************************
  359.     Schedule property sheet code
  360. *********************************************************************************/
  361. void Sched_EnableScheduleButtons(HWND hdlg)
  362. {
  363.     POOEBuf pBuf = GetBuf(hdlg);
  364.     ASSERT(pBuf);
  365.     BOOL bEditAllowed = !(pBuf->m_dwPropSheetFlags & 
  366.                             (PSF_NO_EDITING_SCHEDULES | PSF_NO_SCHEDULED_UPDATES));
  367.     BOOL bEnable = (bEditAllowed) &&
  368.                    ListView_GetSelectedCount(GetDlgItem(hdlg, IDC_SCHEDULE_LIST));
  369.     EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_NEW), bEditAllowed);
  370.     EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_EDIT), bEnable);
  371.     //  TODO: Don't enable remove for publisher's schedule
  372.     EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_REMOVE), bEnable);
  373. }
  374. struct SCHED_ENUM_DATA
  375. {
  376.     HWND hwndSchedList;
  377.     POOEBuf pBuf;
  378.     SYNCSCHEDULECOOKIE customSchedule;
  379.     BOOL bHasAtLeastOneSchedule;
  380. };
  381. struct SCHED_LIST_DATA
  382. {
  383.     SYNCSCHEDULECOOKIE SchedCookie;
  384.     BOOL bChecked;
  385.     BOOL bStartChecked;
  386. };
  387. inline int SchedList_GetIndex(HWND hwndSchedList, int index)
  388. {
  389.     return (index != -1) ? index :
  390.            ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED);
  391. }
  392. void SchedList_GetName(HWND hwndSchedList, int index, TCHAR *pszSchedName, int cchSchedName)
  393. {
  394.     LV_ITEM lvi = {0};
  395.     lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
  396.     if (lvi.iItem != -1)
  397.     {
  398.         lvi.mask = LVIF_TEXT;
  399.         lvi.pszText = pszSchedName;
  400.         lvi.cchTextMax = cchSchedName;
  401.         ListView_GetItem(hwndSchedList, &lvi);
  402.     }
  403. }
  404. void SchedList_SetName(HWND hwndSchedList, int index, LPTSTR pszSchedName)
  405. {
  406.     LV_ITEM lvi = {0};
  407.     lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
  408.     if (lvi.iItem != -1)
  409.     {
  410.         lvi.mask = LVIF_TEXT;
  411.         lvi.pszText = pszSchedName;
  412.         ListView_SetItem(hwndSchedList, &lvi);
  413.     }
  414. }
  415. SCHED_LIST_DATA *SchedList_GetData(HWND hwndSchedList, int index)
  416. {
  417.     SCHED_LIST_DATA *psld = NULL;
  418.     LV_ITEM lvi = {0};
  419.     lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
  420.     if (lvi.iItem != -1)
  421.     {
  422.         lvi.mask = LVIF_PARAM;
  423.         if (ListView_GetItem(hwndSchedList, &lvi))
  424.         {
  425.             psld = (SCHED_LIST_DATA *)lvi.lParam;
  426.         }
  427.     }
  428.     return psld;
  429. }
  430. void SchedList_UncheckAll(HWND hwndSchedList)
  431. {
  432.     int count = ListView_GetItemCount(hwndSchedList);
  433.     
  434.     for (int i = 0; i < count; i++)
  435.     {
  436.         SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, i);
  437.         psld->bChecked = 0;
  438.         ListView_SetItemState(hwndSchedList, i, COMP_UNCHECKED, LVIS_STATEIMAGEMASK);
  439.     }
  440. }
  441. void SchedList_Select(HWND hwndSchedList, int index)
  442. {
  443.     int curIndex = ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED);
  444.     if (curIndex != index)
  445.     {
  446.         ListView_SetItemState(hwndSchedList, curIndex, 0, LVIS_SELECTED | LVIS_FOCUSED);
  447.         ListView_SetItemState(hwndSchedList, index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
  448.     }
  449. }
  450. void SchedList_DeleteData(HWND hwndSchedList, int index, BOOL bDeleteItem)
  451. {
  452.     LV_ITEM lvi = {0};
  453.     lvi.iItem = SchedList_GetIndex(hwndSchedList, index);
  454.     if (lvi.iItem != -1)
  455.     {
  456.         SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, lvi.iItem);
  457.         lvi.mask = LVIF_PARAM;
  458.         lvi.lParam = NULL;
  459.         if ((NULL != psld) && ListView_SetItem(hwndSchedList, &lvi))
  460.         {
  461.             delete psld;
  462.         }
  463.         if (bDeleteItem)
  464.         {
  465.             ListView_DeleteItem(hwndSchedList, lvi.iItem);
  466.         }
  467.     }
  468. }
  469. void SchedList_DeleteAllData(HWND hwndSchedList)
  470. {
  471.     int count = ListView_GetItemCount(hwndSchedList);
  472.     
  473.     for (int i = 0; i < count; i++)
  474.     {
  475.         SchedList_DeleteData(hwndSchedList, i, FALSE);
  476.     }
  477. }
  478. BOOL Sched_EnumCallback(ISyncSchedule *pSyncSchedule, 
  479.                         SYNCSCHEDULECOOKIE *pSchedCookie,
  480.                         LPARAM lParam)
  481. {
  482.     BOOL bAdded = FALSE;
  483.     SCHED_ENUM_DATA *psed = (SCHED_ENUM_DATA *)lParam;
  484.     DWORD dwSyncScheduleFlags;
  485.     SCHED_LIST_DATA *psld = NULL;
  486.     if (SUCCEEDED(pSyncSchedule->GetFlags(&dwSyncScheduleFlags)))
  487.     {
  488.         //  This checks to make sure we only add a publisher's schedule to the
  489.         //  list if it belongs to this item.
  490.         if ((!(dwSyncScheduleFlags & SYNCSCHEDINFO_FLAGS_READONLY)) ||
  491.             (*pSchedCookie == psed->customSchedule))
  492.         {
  493.             psld = new SCHED_LIST_DATA;
  494.             if (NULL != psld)
  495.             {
  496.                 WCHAR wszName[MAX_PATH];
  497.                 DWORD cchName = ARRAYSIZE(wszName);
  498.                 if (SUCCEEDED(pSyncSchedule->GetScheduleName(&cchName, wszName)))
  499.                 {
  500.                     TCHAR szName[MAX_PATH];
  501.                     MyOleStrToStrN(szName, ARRAYSIZE(szName), wszName);
  502.                     psld->SchedCookie = *pSchedCookie;
  503.                     psld->bStartChecked = IsCookieOnSchedule(pSyncSchedule, &psed->pBuf->m_Cookie);
  504.                     psld->bChecked = psld->bStartChecked;
  505.                     if (psld->bStartChecked)
  506.                     {
  507.                         psed->bHasAtLeastOneSchedule = TRUE;
  508.                     }
  509.                     LV_ITEM lvItem = { 0 };
  510.                     lvItem.mask = LVIF_TEXT | LVIF_PARAM;
  511.                     lvItem.iItem = (*pSchedCookie == psed->customSchedule) ? 0 : 0x7FFFFFFF;
  512.                     lvItem.lParam = (LPARAM)psld;
  513.                     lvItem.pszText = szName;
  514.                     int index = ListView_InsertItem(psed->hwndSchedList, &lvItem);
  515.                     if (index != -1)
  516.                     {
  517.                             
  518.                         ListView_SetItemState(psed->hwndSchedList, index, 
  519.                                               psld->bStartChecked ? COMP_CHECKED : COMP_UNCHECKED, 
  520.                                               LVIS_STATEIMAGEMASK);
  521.                         ListView_SetColumnWidth(psed->hwndSchedList, 0, LVSCW_AUTOSIZE);
  522.                         bAdded = TRUE;
  523.                     }
  524.                 }
  525.             }
  526.         }
  527.     }
  528.     if (!bAdded)
  529.     {
  530.         SAFEDELETE(psld);
  531.     }
  532.     
  533.     return TRUE;
  534. }
  535. BOOL Sched_FillScheduleList(HWND hdlg, POOEBuf pBuf)
  536. {
  537.     SCHED_ENUM_DATA sed;
  538.     sed.hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  539.     sed.pBuf = pBuf;
  540.     sed.customSchedule = GUID_NULL;
  541.     
  542.     ISubscriptionItem *psi;
  543.     if (SUCCEEDED(SubscriptionItemFromCookie(FALSE, &pBuf->m_Cookie, &psi)))
  544.     {
  545.         SUBSCRIPTIONITEMINFO sii;
  546.         sii.cbSize = sizeof(SUBSCRIPTIONITEMINFO);
  547.         if (SUCCEEDED(psi->GetSubscriptionItemInfo(&sii)))
  548.         {
  549.             sed.customSchedule = sii.ScheduleGroup;
  550.         }
  551.         psi->Release();
  552.     }
  553.     sed.bHasAtLeastOneSchedule = FALSE;
  554.     EnumSchedules(Sched_EnumCallback, (LPARAM)&sed);
  555.     return sed.bHasAtLeastOneSchedule;
  556. }
  557. BOOL Sched_NewSchedule(HWND hdlg)
  558. {
  559.     NEWSCHED_DATA nsd;
  560.     INT_PTR nResult = DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_NEW_SCHEDULE),
  561.                                  hdlg, NewScheduleDlgProc, (LPARAM)&nsd);
  562.     if (IDOK == nResult)
  563.     {
  564.         SCHED_LIST_DATA *psld;
  565.         LV_FINDINFO lvfi = { 0 };
  566.         HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  567.         lvfi.flags = LVFI_STRING;
  568.         lvfi.psz = nsd.szSchedName;
  569.         int index = ListView_FindItem(hwndSchedList, -1, &lvfi);
  570.         if (index == -1)
  571.         {
  572.             psld = new SCHED_LIST_DATA;           
  573.             
  574.             if (NULL != psld)
  575.             {
  576.                 psld->SchedCookie = nsd.SchedCookie;
  577.                 psld->bChecked = TRUE;
  578.                 psld->bStartChecked = FALSE;
  579.                 LV_ITEM lvItem = { 0 };
  580.                 lvItem.mask = LVIF_TEXT | LVIF_PARAM;
  581.                 lvItem.iItem = 0;
  582.                 lvItem.lParam = (LPARAM)psld;
  583.                 lvItem.pszText = nsd.szSchedName;
  584.                 index = ListView_InsertItem(hwndSchedList, &lvItem);
  585.             }
  586.         }
  587.         else
  588.         {
  589.             psld = SchedList_GetData(hwndSchedList, index);
  590.             if (NULL != psld)
  591.             {
  592.                 psld->bChecked = TRUE;
  593.             }
  594.         }
  595.         if (index != -1)
  596.         {
  597.             ListView_SetItemState(hwndSchedList, index, COMP_CHECKED, LVIS_STATEIMAGEMASK);
  598.             ListView_SetColumnWidth(hwndSchedList, 0, LVSCW_AUTOSIZE);
  599.             CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, 
  600.                              IDC_SCHEDULED_SYNC);
  601.             SchedList_Select(hwndSchedList, index);
  602.             Sched_EnableScheduleButtons(hdlg);
  603.         }
  604.     }
  605.     SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hdlg, IDC_SCHEDULE_LIST), TRUE);
  606.     return nResult == IDOK;
  607. }
  608. BOOL Sched_EditSchedule(HWND hdlg, POOEBuf pBuf)
  609. {
  610.     HRESULT hr;
  611.     ISyncScheduleMgr *pSyncScheduleMgr;
  612.     ASSERT(NULL != pBuf);
  613.     hr = CoInitialize(NULL);
  614.     if (SUCCEEDED(hr))
  615.     {
  616.         hr = CoCreateInstance(CLSID_SyncMgr, NULL, CLSCTX_ALL, 
  617.                               IID_ISyncScheduleMgr, (void **)&pSyncScheduleMgr);
  618.         if (SUCCEEDED(hr))
  619.         {   
  620.             HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  621.             int index = ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED);
  622.             SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, index);
  623.             ISyncSchedule *pSyncSchedule;
  624.             hr = pSyncScheduleMgr->OpenSchedule(&psld->SchedCookie, 0, &pSyncSchedule);
  625.             if (SUCCEEDED(hr))
  626.             {
  627.                 if (psld->bChecked)
  628.                 {
  629.                     hr = pSyncSchedule->SetItemCheck(CLSID_WebCheckOfflineSync,
  630.                                                      &pBuf->m_Cookie,
  631.                                                      SYNCMGRITEMSTATE_CHECKED);
  632.                 }
  633.                 
  634.                 hr = pSyncSchedule->EditSyncSchedule(hdlg, 0);
  635.                 if (S_OK == hr)
  636.                 {
  637.                     psld->bChecked = IsCookieOnSchedule(pSyncSchedule, &pBuf->m_Cookie);
  638.                     if (psld->bChecked)
  639.                     {
  640.                         CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, 
  641.                                          IDC_SCHEDULED_SYNC);
  642.                     }
  643.                     ListView_SetItemState(hwndSchedList, index, 
  644.                                           psld->bChecked ? COMP_CHECKED : COMP_UNCHECKED, 
  645.                                           LVIS_STATEIMAGEMASK);
  646.                 }
  647.                 WCHAR wszScheduleName[MAX_PATH];
  648.                 DWORD cchScheduleName = ARRAYSIZE(wszScheduleName);
  649.                 if (SUCCEEDED(pSyncSchedule->GetScheduleName(&cchScheduleName, wszScheduleName)))
  650.                 {
  651.                 #ifdef UNICODE
  652.                     SchedList_SetName(hwndSchedList, index, wszScheduleName);
  653.                 #else
  654.                     char szScheduleName[MAX_PATH];
  655.                     SHUnicodeToAnsi(wszScheduleName, szScheduleName, ARRAYSIZE(szScheduleName));
  656.                     SchedList_SetName(hwndSchedList, index, wszScheduleName);
  657.                 #endif
  658.                     ListView_SetColumnWidth(hwndSchedList, 0, LVSCW_AUTOSIZE);
  659.                 }
  660.                 SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndSchedList, TRUE);
  661.                 pSyncSchedule->Release();
  662.             }
  663.             pSyncScheduleMgr->Release();
  664.         }
  665.         CoUninitialize();
  666.     }
  667.     //  This is not undoable by hitting cancel so don't say we changed.
  668.     return FALSE;
  669. }
  670. BOOL Sched_RemoveSchedule(HWND hdlg)
  671. {
  672.     HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  673.     int index = ListView_GetNextItem(hwndSchedList, -1, LVNI_ALL | LVNI_SELECTED);
  674.     if (index >= 0)
  675.     {
  676.         SCHED_LIST_DATA *psld = SchedList_GetData(GetDlgItem(hdlg, IDC_SCHEDULE_LIST), index);
  677.         if (NULL != psld)
  678.         {
  679.             TCHAR szSchedName[MAX_PATH];
  680.             SchedList_GetName(hwndSchedList, index, szSchedName, ARRAYSIZE(szSchedName));
  681.             if (WCMessageBox(hdlg, IDS_CONFIRM_SCHEDULE_DELETE,
  682.                             IDS_SCHEDULE_DELETE_CAPTION, MB_YESNO | MB_ICONQUESTION,
  683.                             szSchedName) == IDYES)
  684.             {
  685.                 HRESULT hr = CoInitialize(NULL);
  686.                 if (SUCCEEDED(hr))
  687.                 {
  688.                     ISyncScheduleMgr *pSyncScheduleMgr;
  689.                     hr = CoCreateInstance(CLSID_SyncMgr, NULL, CLSCTX_ALL, 
  690.                                           IID_ISyncScheduleMgr, (void **)&pSyncScheduleMgr);
  691.                     if (SUCCEEDED(hr))
  692.                     {                
  693.                         hr = pSyncScheduleMgr->RemoveSchedule(&psld->SchedCookie);
  694.                         ASSERT(SUCCEEDED(hr));
  695.                         if (SUCCEEDED(hr))
  696.                         {
  697.                             SchedList_DeleteData(hwndSchedList, -1, TRUE);
  698.                             SchedList_Select(hwndSchedList, 0);
  699.                         }
  700.                         pSyncScheduleMgr->Release();
  701.                     }
  702.                     CoUninitialize();
  703.                 }
  704.             }
  705.             SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hdlg, IDC_SCHEDULE_LIST), TRUE);
  706.         }
  707.     }
  708.     //  This is not undoable by hitting cancel so don't say we changed.
  709.     return FALSE;
  710. }
  711. BOOL Sched_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  712. {
  713.     BOOL bHandled = TRUE;
  714.     BOOL bChanged = FALSE;
  715.     POOEBuf pBuf = GetBuf(hdlg);
  716.     if (NULL != pBuf)
  717.     {
  718.         switch (wID)
  719.         {
  720.             case IDC_MANUAL_SYNC:
  721.             case IDC_SCHEDULED_SYNC:
  722. //            case IDC_IDLE_ONLY:
  723.                 if (wNotifyCode == BN_CLICKED)
  724.                 {
  725.                     bChanged = TRUE;
  726.                 }
  727.                 break;
  728.             
  729.             case IDC_SCHEDULE_NEW:
  730.                 if (wNotifyCode == BN_CLICKED)
  731.                 {
  732.                     bChanged = Sched_NewSchedule(hdlg);
  733.                 }
  734.                 break;
  735.             case IDC_SCHEDULE_EDIT:
  736.                 if (wNotifyCode == BN_CLICKED)
  737.                 {
  738.                     bChanged = Sched_EditSchedule(hdlg, pBuf);
  739.                 }
  740.                 break;
  741.             case IDC_SCHEDULE_REMOVE:
  742.                 if (wNotifyCode == BN_CLICKED)
  743.                 {
  744.                     bChanged = Sched_RemoveSchedule(hdlg);
  745.                 }
  746.                 break;
  747.             default:
  748.                 bHandled = FALSE;
  749.                 break;
  750.         }
  751.     }
  752.     if (bChanged)
  753.     {
  754.         PropSheet_Changed(GetParent(hdlg), hdlg);        
  755.     }
  756.     return bHandled;
  757. }
  758. BOOL Sched_Validate(HWND hdlg, POOEBuf pBuf)
  759. {
  760. /*
  761.     if (IsDlgButtonChecked(hdlg, IDC_IDLE_ONLY))
  762.     {
  763.         pBuf->grfTaskTrigger |= TASK_FLAG_START_ONLY_IF_IDLE;
  764.     }
  765.     else
  766.     {
  767.         pBuf->grfTaskTrigger &= ~TASK_FLAG_START_ONLY_IF_IDLE;
  768.     }
  769. */
  770.     if (IsDlgButtonChecked(hdlg, IDC_SCHEDULED_SYNC))
  771.     {
  772.         HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  773.         int count = ListView_GetItemCount(hwndSchedList);
  774.         BOOL bHaveASchedule = FALSE;
  775.         
  776.         for (int i = 0; i < count; i++)
  777.         {
  778.             SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, i);
  779.             if (psld->bChecked)
  780.             {
  781.                 bHaveASchedule = TRUE;
  782.                 break;
  783.             }
  784.         }
  785.         if (!bHaveASchedule)
  786.         {
  787.             CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, 
  788.                              IDC_MANUAL_SYNC);
  789.         }
  790.     }
  791.     return TRUE;
  792. }
  793. BOOL Sched_ApplyProps(HWND hdlg, POOEBuf pBuf)
  794. {
  795.     BOOL bResult;
  796.     HRESULT hr;
  797.     pBuf->dwFlags = PROP_WEBCRAWL_ALL;
  798.     bResult = SUCCEEDED(SaveBufferChange(pBuf, TRUE));
  799.     if (bResult)
  800.     {
  801.         
  802.         if (IsDlgButtonChecked(hdlg, IDC_MANUAL_SYNC))
  803.         {
  804.             SchedList_UncheckAll(GetDlgItem(hdlg, IDC_SCHEDULE_LIST));
  805.             hr = RemoveItemFromAllSchedules(&pBuf->m_Cookie);
  806.             ASSERT(SUCCEEDED(hr));
  807.         }
  808.         else
  809.         {
  810.             HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  811.             int count = ListView_GetItemCount(hwndSchedList);
  812.             
  813.             for (int i = 0; i < count; i++)
  814.             {
  815.                 SCHED_LIST_DATA *psld = SchedList_GetData(hwndSchedList, i);
  816.                 ASSERT(NULL != psld);
  817.                 if (NULL != psld)
  818.                 {
  819.                     if (psld->bChecked != psld->bStartChecked)
  820.                     {
  821.                         if (psld->bChecked)
  822.                         {
  823.                             ISubscriptionItem *psi;
  824.                             if (SUCCEEDED(SubscriptionItemFromCookie(FALSE, 
  825.                                                                      &pBuf->m_Cookie,
  826.                                                                      &psi)))
  827.                             {
  828.                                 SYNC_HANDLER_ITEM_INFO shii;
  829.                                 shii.handlerID = CLSID_WebCheckOfflineSync;
  830.                                 shii.itemID = pBuf->m_Cookie;
  831.                                 shii.hIcon = NULL;
  832.                                 MyStrToOleStrN(shii.wszItemName, 
  833.                                                ARRAYSIZE(shii.wszItemName),
  834.                                                pBuf->m_Name);
  835.                                 shii.dwCheckState = SYNCMGRITEMSTATE_CHECKED;
  836.                                 AddScheduledItem(&shii, &psld->SchedCookie);
  837.                             }
  838.                         }
  839.                         else
  840.                         {
  841.                             RemoveScheduledItem(&pBuf->m_Cookie, &psld->SchedCookie);
  842.                         }
  843.                         psld->bStartChecked = psld->bChecked;
  844.                     }
  845.                 }
  846.             }
  847.         }
  848.     }
  849.     return bResult;
  850. }
  851. BOOL Sched_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh)
  852. {
  853.     BOOL bHandled = TRUE;
  854.     POOEBuf pBuf = GetBuf(hdlg);
  855.     ASSERT(pBuf);
  856.     
  857.     switch (pnmh->code)
  858.     {
  859.         case PSN_KILLACTIVE:
  860.             if (!Sched_Validate(hdlg, pBuf))
  861.             {
  862.                 SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
  863.             }
  864.             break;
  865.         case PSN_APPLY:
  866.             Sched_ApplyProps(hdlg, pBuf);
  867.             break;
  868.         case NM_DBLCLK:
  869.             if (IDC_SCHEDULE_LIST == pnmh->idFrom)
  870.             {
  871.                 Sched_EditSchedule(hdlg, pBuf);
  872.             }
  873.             break;
  874.             
  875.         case LVN_ITEMCHANGED:
  876.         {
  877.             NM_LISTVIEW *pnmlv = (NM_LISTVIEW *)pnmh;
  878.             if ((pnmlv->iItem != -1) && 
  879.                 (pnmlv->uChanged & LVIF_STATE) &&
  880.                 ((pnmlv->uNewState ^ pnmlv->uOldState) & COMP_CHECKED))
  881.             {
  882.                 SCHED_LIST_DATA *psld = SchedList_GetData(pnmh->hwndFrom, pnmlv->iItem);
  883.                 if (NULL != psld)
  884.                 {
  885.                     psld->bChecked = (pnmlv->uNewState & COMP_CHECKED) ? TRUE : FALSE;
  886.                     if (psld->bChecked)
  887.                     {
  888.                         CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, 
  889.                                          IDC_SCHEDULED_SYNC);
  890.                     }
  891.                     PropSheet_Changed(GetParent(hdlg), hdlg);
  892.                 }
  893.             }
  894.             if ((pnmlv->uChanged & LVIF_STATE) &&
  895.                 ((pnmlv->uNewState ^ pnmlv->uOldState) & LVIS_SELECTED))
  896.             {
  897.                 Sched_EnableScheduleButtons(hdlg);
  898.             }
  899.             break;
  900.         }
  901.         default:
  902.             bHandled = FALSE;
  903.             break;
  904.     }
  905.     return bHandled;
  906. }
  907. void Sched_OnDestroy(HWND hdlg)
  908. {
  909.     HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  910.     SchedList_DeleteAllData(hwndSchedList);
  911. }
  912. BOOL Sched_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
  913. {
  914.     ASSERT(NULL != ((LPPROPSHEETPAGE)lParam));
  915.     ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)->lParam);
  916.     SetWindowLongPtr(hdlg, DWLP_USER, ((LPPROPSHEETPAGE)lParam)->lParam);
  917.     //  Now read in values and populate the dialog
  918.     POOEBuf pBuf = (POOEBuf)((LPPROPSHEETPAGE)lParam)->lParam;
  919. /*    CheckDlgButton(hdlg, IDC_IDLE_ONLY, 
  920.                    pBuf->grfTaskTrigger & TASK_FLAG_START_ONLY_IF_IDLE ?
  921.                    1 : 0);
  922. */
  923.     HWND hwndSchedList = GetDlgItem(hdlg, IDC_SCHEDULE_LIST);
  924.     ListView_SetExtendedListViewStyle(hwndSchedList, LVS_EX_CHECKBOXES);
  925.     LV_COLUMN lvc;
  926.     lvc.mask = LVCF_FMT | LVCF_SUBITEM;
  927.     lvc.fmt = LVCFMT_LEFT;
  928.     lvc.iSubItem = 0;
  929.     ListView_InsertColumn(hwndSchedList, 0, &lvc);
  930.     //  Now handle restrictions
  931.     SetPropSheetFlags(pBuf, SHRestricted2W(REST_NoScheduledUpdates, NULL, 0), PSF_NO_SCHEDULED_UPDATES);
  932.     SetPropSheetFlags(pBuf, SHRestricted2W(REST_NoEditingScheduleGroups, NULL, 0), PSF_NO_EDITING_SCHEDULES);
  933.     BOOL bHasSchedules = Sched_FillScheduleList(hdlg, pBuf);
  934.     
  935.     if (pBuf->m_dwPropSheetFlags & PSF_NO_SCHEDULED_UPDATES)
  936.     {
  937.         EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULE_LIST), FALSE);
  938.         EnableWindow(GetDlgItem(hdlg, IDC_SCHEDULED_SYNC), FALSE);
  939.         CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, IDC_MANUAL_SYNC);
  940.     }
  941.     else
  942.     {
  943.         CheckRadioButton(hdlg, IDC_MANUAL_SYNC, IDC_SCHEDULED_SYNC, 
  944.                          bHasSchedules ? IDC_SCHEDULED_SYNC : IDC_MANUAL_SYNC);
  945.     }
  946.     SchedList_Select(hwndSchedList, 0);
  947.     //  Finally, do the enable/disable controls thing...
  948.     Sched_EnableScheduleButtons(hdlg);
  949.     return TRUE;
  950. }
  951. INT_PTR CALLBACK SchedulePropDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
  952. {
  953.     BOOL bHandled = FALSE;
  954.     switch (message)
  955.     {
  956.         case WM_INITDIALOG:
  957.             bHandled = Sched_OnInitDialog(hdlg, (HWND)wParam, lParam);
  958.             break;
  959.         case WM_COMMAND:
  960.             bHandled = Sched_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  961.             break;
  962.         case WM_NOTIFY:
  963.             bHandled = Sched_OnNotify(hdlg, (int)wParam, (LPNMHDR)lParam);
  964.             break;
  965.         case WM_DESTROY:
  966.             Sched_OnDestroy(hdlg);
  967.             //  return 0
  968.             break;
  969.         case WM_HELP:
  970.             SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
  971.                     HELP_WM_HELP, (DWORD_PTR)aHelpIDs);
  972.             bHandled = TRUE;
  973.             break;
  974.         case WM_CONTEXTMENU:
  975.             SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
  976.             bHandled = TRUE;
  977.             break;
  978.     }
  979.     
  980.     return bHandled;
  981. }
  982. /********************************************************************************
  983.     Download property sheet code
  984. *********************************************************************************/
  985. void Download_EnableFollowLinks(HWND hdlg)
  986. {
  987.     BOOL bTranslate;
  988.     int i = GetDlgItemInt(hdlg, IDC_LEVELS, &bTranslate, FALSE);
  989.     EnableWindow(GetDlgItem(hdlg, IDC_FOLLOW_LINKS), (bTranslate && i));
  990. }
  991. void Download_EnableLimitSpaceControls(HWND hdlg)
  992. {
  993.     static const int IDs[] = { IDC_LIMIT_SPACE_EDIT, IDC_LIMIT_SPACE_SPIN, IDC_LIMIT_SPACE_TEXT };
  994.     EnableControls(hdlg, IDs, ARRAYSIZE(IDs), IsDlgButtonChecked(hdlg, IDC_LIMIT_SPACE_CHECK));
  995. }
  996. void Download_EnableEmailControls(HWND hdlg)
  997. {
  998.     static const int IDs[] = { IDC_EMAIL_ADDRESS_TEXT, IDC_EMAIL_ADDRESS, 
  999.                                IDC_EMAIL_SERVER_TEXT, IDC_EMAIL_SERVER };
  1000.     EnableControls(hdlg, IDs, ARRAYSIZE(IDs), IsDlgButtonChecked(hdlg, IDC_EMAIL_NOTIFY));
  1001. }
  1002. BOOL Download_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
  1003. {
  1004.     POOEBuf pBuf;
  1005.     ASSERT(NULL != ((LPPROPSHEETPAGE)lParam));
  1006.     ASSERT(NULL != ((LPPROPSHEETPAGE)lParam)->lParam);
  1007.     SetWindowLongPtr(hdlg, DWLP_USER, ((LPPROPSHEETPAGE)lParam)->lParam);
  1008.     //  First do basic control setup
  1009.     HWND hwndLimitSpin = GetDlgItem(hdlg, IDC_LIMIT_SPACE_SPIN);
  1010.     SendMessage(hwndLimitSpin, UDM_SETRANGE, 0, 
  1011.                 MAKELONG(MAX_DOWNLOAD_K, MIN_DOWNLOAD_K));
  1012.     UDACCEL ua[] = { {0, 1}, {1, 10}, {2, 100}, {3, 1000} };
  1013.     SendMessage(hwndLimitSpin, UDM_SETACCEL, ARRAYSIZE(ua), (LPARAM)ua);
  1014.     Edit_LimitText(GetDlgItem(hdlg, IDC_LIMIT_SPACE_EDIT), 5);
  1015.     //  Now read in values and populate the dialog
  1016.     pBuf = (POOEBuf)((LPPROPSHEETPAGE)lParam)->lParam;
  1017.     SUBSCRIPTIONTYPE subType = GetItemCategory(pBuf);
  1018.     switch (subType)
  1019.     {
  1020.         case SUBSTYPE_CHANNEL:
  1021.         case SUBSTYPE_DESKTOPCHANNEL:
  1022.             CheckRadioButton(hdlg, IDC_DOWNLOAD_ALL, IDC_DOWNLOAD_MIN,
  1023.                              pBuf->fChannelFlags & CHANNEL_AGENT_PRECACHE_ALL ? 
  1024.                              IDC_DOWNLOAD_ALL : IDC_DOWNLOAD_MIN);
  1025.             break;
  1026.         case SUBSTYPE_URL:
  1027.         case SUBSTYPE_DESKTOPURL:
  1028.         case SUBSTYPE_EXTERNAL:
  1029.         {
  1030.             HWND hwndLevelsSpin = GetDlgItem(hdlg, IDC_LEVELS_SPIN);
  1031.             SendMessage(hwndLevelsSpin, UDM_SETRANGE, 0, MAKELONG(MAX_WEBCRAWL_LEVELS, 0));
  1032.             SendMessage(hwndLevelsSpin, UDM_SETPOS, 0, pBuf->m_RecurseLevels);
  1033.             CheckDlgButton(hdlg, IDC_FOLLOW_LINKS, 
  1034.                            (pBuf->m_RecurseFlags & WEBCRAWL_LINKS_ELSEWHERE) || (0 == pBuf->m_RecurseLevels)
  1035.                            ? 1 : 0);
  1036.             Download_EnableFollowLinks(hdlg);
  1037.             break;
  1038.         }
  1039.     }
  1040.     SendMessage(hwndLimitSpin, UDM_SETPOS, 0, pBuf->m_SizeLimit ? pBuf->m_SizeLimit : DEF_DOWNLOAD_K);
  1041.     CheckDlgButton(hdlg, IDC_LIMIT_SPACE_CHECK, pBuf->m_SizeLimit ? 1 : 0);
  1042.     CheckDlgButton(hdlg, IDC_EMAIL_NOTIFY, pBuf->bMail ? 1 : 0);
  1043.     TCHAR szText[MAX_PATH];
  1044.     ReadDefaultEmail(szText, ARRAYSIZE(szText));
  1045.     Edit_LimitText(GetDlgItem(hdlg, IDC_EMAIL_ADDRESS), MAX_PATH - 1);
  1046.     SetDlgItemText(hdlg, IDC_EMAIL_ADDRESS, szText);
  1047.     ReadDefaultSMTPServer(szText, ARRAYSIZE(szText));
  1048.     Edit_LimitText(GetDlgItem(hdlg, IDC_EMAIL_SERVER), MAX_PATH - 1);
  1049.     SetDlgItemText(hdlg, IDC_EMAIL_SERVER, szText);
  1050.     //  Now handle restrictions
  1051.     if (SHRestricted2W(REST_NoSubscriptionPasswords, NULL, 0))
  1052.     {
  1053.         EnableWindow(GetDlgItem(hdlg, IDC_LOGIN), FALSE);
  1054.     }
  1055.     //  Finally, do the enable/disable controls thing...
  1056.     Download_EnableLimitSpaceControls(hdlg);
  1057.     Download_EnableEmailControls(hdlg);
  1058.     return TRUE;
  1059. }
  1060. BOOL Download_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  1061. {
  1062.     BOOL bHandled = TRUE;
  1063.     BOOL bChanged = FALSE;
  1064.     POOEBuf pBuf = GetBuf(hdlg);
  1065.     if (NULL != pBuf)
  1066.     {
  1067.         switch (wID)
  1068.         {
  1069.             case IDC_LIMIT_SPACE_EDIT:
  1070.                 if (wNotifyCode == EN_CHANGE)
  1071.                 {
  1072.                     if (pBuf->m_SizeLimit != 
  1073.                         LOWORD(SendDlgItemMessage(hdlg, IDC_LIMIT_SPACE_SPIN, UDM_GETPOS, 0, 0)))
  1074.                     {
  1075.                         bChanged = TRUE;
  1076.                     }
  1077.                 }
  1078.                 else if (wNotifyCode == EN_KILLFOCUS)
  1079.                 {
  1080.                     KeepSpinNumberInRange(hdlg, IDC_LIMIT_SPACE_EDIT, 
  1081.                                           IDC_LIMIT_SPACE_SPIN, 
  1082.                                           MIN_DOWNLOAD_K, MAX_DOWNLOAD_K);
  1083.                 }
  1084.                 break;
  1085.             
  1086.             case IDC_LEVELS:
  1087.                 if (wNotifyCode == EN_UPDATE)
  1088.                 {
  1089.                     int levels = KeepSpinNumberInRange(hdlg, IDC_LEVELS, 
  1090.                                     IDC_LEVELS_SPIN, 0, MAX_WEBCRAWL_LEVELS);
  1091.                     if (pBuf->m_RecurseLevels != levels)
  1092.                     {
  1093.                         bChanged = TRUE;
  1094.                     }
  1095.                     Download_EnableFollowLinks(hdlg);
  1096.                 }
  1097.                 break;
  1098.             case IDC_LIMIT_SPACE_CHECK:
  1099.                 if (wNotifyCode == BN_CLICKED)
  1100.                 {
  1101.                     Download_EnableLimitSpaceControls(hdlg);
  1102.                     bChanged = TRUE;
  1103.                 }
  1104.                 break;
  1105.                 
  1106.             case IDC_FOLLOW_LINKS:
  1107.                 if (wNotifyCode == BN_CLICKED)
  1108.                 {
  1109.                     bChanged = TRUE;
  1110.                 }
  1111.                 break;
  1112.             case IDC_EMAIL_NOTIFY:
  1113.                 if (wNotifyCode == BN_CLICKED)
  1114.                 {
  1115.                     Download_EnableEmailControls(hdlg);
  1116.                     bChanged = TRUE;
  1117.                 }
  1118.                 break;
  1119.                 
  1120.             case IDC_EMAIL_ADDRESS:
  1121.             case IDC_EMAIL_SERVER:
  1122.                 if (wNotifyCode == EN_CHANGE)
  1123.                 {
  1124.                     bChanged = TRUE;
  1125.                 }
  1126.                 break;
  1127.             case IDC_LOGIN:
  1128.                 if ((wNotifyCode == BN_CLICKED) &&
  1129.                     (DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_SUBSPROPS_LOGIN),
  1130.                                     hdlg, LoginOptionDlgProc, (LPARAM)pBuf) == IDOK))
  1131.                 {
  1132.                     bChanged = TRUE;
  1133.                 }
  1134.                 break;
  1135.             case IDC_ADVANCED:
  1136.                 if ((wNotifyCode == BN_CLICKED) &&
  1137.                     (DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_SUBSPROPS_ADVANCED),
  1138.                                     hdlg, AdvancedDownloadDlgProc, (LPARAM)pBuf) == IDOK))
  1139.                 {
  1140.                     bChanged = TRUE;
  1141.                 }
  1142.                 break;
  1143.             default:
  1144.                 bHandled = FALSE;
  1145.                 break;
  1146.         }
  1147.     }
  1148.     if (bChanged)
  1149.     {
  1150.         PropSheet_Changed(GetParent(hdlg), hdlg);        
  1151.     }
  1152.     return bHandled;
  1153. }
  1154. BOOL Download_Validate(HWND hdlg, POOEBuf pBuf)
  1155. {
  1156.     pBuf->bMail = IsDlgButtonChecked(hdlg, IDC_EMAIL_NOTIFY);
  1157.     if (pBuf->bMail)
  1158.     {
  1159.         TCHAR szEmail[MAX_PATH];
  1160.         TCHAR szServer[MAX_PATH];
  1161.         GetDlgItemText(hdlg, IDC_EMAIL_ADDRESS, szEmail, ARRAYSIZE(szEmail));
  1162.         GetDlgItemText(hdlg, IDC_EMAIL_SERVER, szServer, ARRAYSIZE(szServer));
  1163.         if (!szEmail[0] || !szServer[0])
  1164.         {
  1165.             SGMessageBox(hdlg, IDS_EMAIL_INCOMPLETE, MB_ICONWARNING);
  1166.             return FALSE;
  1167.         }
  1168.     }
  1169.     SUBSCRIPTIONTYPE subType = GetItemCategory(pBuf);
  1170.     switch (subType)
  1171.     {
  1172.         case SUBSTYPE_CHANNEL:
  1173.         case SUBSTYPE_DESKTOPCHANNEL:
  1174.             pBuf->fChannelFlags &= ~(CHANNEL_AGENT_PRECACHE_SOME | CHANNEL_AGENT_PRECACHE_ALL);
  1175.             if (IsDlgButtonChecked(hdlg, IDC_DOWNLOAD_ALL))
  1176.             {
  1177.                 pBuf->fChannelFlags |= CHANNEL_AGENT_PRECACHE_ALL;
  1178.             }
  1179.             else
  1180.             {
  1181.                 pBuf->fChannelFlags |= CHANNEL_AGENT_PRECACHE_SOME;
  1182.             }
  1183.             break;
  1184.         case SUBSTYPE_URL:
  1185.         case SUBSTYPE_DESKTOPURL:
  1186.         case SUBSTYPE_EXTERNAL:
  1187.         {
  1188.             if (IsDlgButtonChecked(hdlg, IDC_FOLLOW_LINKS))
  1189.             {
  1190.                 pBuf->m_RecurseFlags |= WEBCRAWL_LINKS_ELSEWHERE;
  1191.             }
  1192.             else
  1193.             {
  1194.                 pBuf->m_RecurseFlags &= ~WEBCRAWL_LINKS_ELSEWHERE;
  1195.             }
  1196.             pBuf->m_RecurseLevels = LOWORD(SendDlgItemMessage(hdlg, 
  1197.                                            IDC_LEVELS_SPIN, UDM_GETPOS, 0, 0));
  1198.             ASSERT((pBuf->m_RecurseLevels >= 0) &&
  1199.                    (pBuf->m_RecurseLevels <= MAX_WEBCRAWL_LEVELS));
  1200.         }
  1201.     }
  1202.     pBuf->m_SizeLimit = IsDlgButtonChecked(hdlg, IDC_LIMIT_SPACE_CHECK) ? 
  1203.                         (LONG)SendDlgItemMessage(hdlg, IDC_LIMIT_SPACE_SPIN,
  1204.                                            UDM_GETPOS, 0, 0) : 
  1205.                         0;
  1206.     ASSERT((0 == pBuf->m_SizeLimit) ||
  1207.            ((pBuf->m_SizeLimit >= MIN_DOWNLOAD_K) && 
  1208.             (pBuf->m_SizeLimit <= MAX_DOWNLOAD_K)));
  1209.     return TRUE;
  1210. }
  1211. BOOL Download_ApplyProps(HWND hdlg, POOEBuf pBuf)
  1212. {
  1213.     pBuf->dwFlags = PROP_WEBCRAWL_ALL;
  1214.     if (IsDlgButtonChecked(hdlg, IDC_EMAIL_NOTIFY))
  1215.     {
  1216.         TCHAR szText[MAX_PATH];
  1217.         GetDlgItemText(hdlg, IDC_EMAIL_ADDRESS, szText, ARRAYSIZE(szText));
  1218.         WriteDefaultEmail(szText);
  1219.         GetDlgItemText(hdlg, IDC_EMAIL_SERVER, szText, ARRAYSIZE(szText));
  1220.         WriteDefaultSMTPServer(szText);
  1221.     }
  1222.     if (pBuf->bChannel)
  1223.     {
  1224.         pBuf->dwFlags |= PROP_WEBCRAWL_CHANNELFLAGS;
  1225.     }
  1226.     return SUCCEEDED(SaveBufferChange(pBuf, TRUE));
  1227. }
  1228. BOOL Download_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh)
  1229. {
  1230.     BOOL bHandled = TRUE;
  1231.     POOEBuf pBuf = GetBuf(hdlg);
  1232.     ASSERT(pBuf);
  1233.     
  1234.     switch (pnmh->code)
  1235.     {
  1236.         case PSN_KILLACTIVE:
  1237.             if (!Download_Validate(hdlg, pBuf))
  1238.             {
  1239.                 SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
  1240.             }
  1241.             break;
  1242.         case PSN_APPLY:
  1243.             Download_ApplyProps(hdlg, pBuf);
  1244.             break;
  1245.         default:
  1246.             bHandled = FALSE;
  1247.             break;
  1248.     }
  1249.     return bHandled;
  1250. }
  1251. INT_PTR CALLBACK DownloadPropDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
  1252. {
  1253.     BOOL bHandled = FALSE;
  1254.     switch (message)
  1255.     {
  1256.         case WM_INITDIALOG:
  1257.             bHandled = Download_OnInitDialog(hdlg, (HWND)wParam, lParam);
  1258.             break;
  1259.         case WM_COMMAND:
  1260.             bHandled = Download_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  1261.             break;
  1262.         case WM_NOTIFY:
  1263.             bHandled = Download_OnNotify(hdlg, (int)wParam, (LPNMHDR)lParam);
  1264.             break;
  1265.         case WM_HELP:
  1266.             SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
  1267.                     HELP_WM_HELP, (DWORD_PTR)aHelpIDs);
  1268.             bHandled = TRUE;
  1269.             break;
  1270.         case WM_CONTEXTMENU:
  1271.             SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
  1272.             bHandled = TRUE;
  1273.             break;
  1274.     }
  1275.     
  1276.     return bHandled;
  1277. }
  1278. /********************************************************************************
  1279.     New schedule popup code
  1280. *********************************************************************************/
  1281. BOOL NewSched_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  1282. {
  1283.     BOOL bHandled = FALSE;
  1284.     
  1285.     switch (wID)
  1286.     {
  1287.         case IDC_SCHEDULE_DAYS:
  1288.             if (wNotifyCode == EN_UPDATE)
  1289.             {
  1290.                 KeepSpinNumberInRange(hdlg, IDC_SCHEDULE_DAYS, 
  1291.                                       IDC_SCHEDULE_DAYS_SPIN, 1, 99);
  1292.             }
  1293. #ifdef NEWSCHED_AUTONAME
  1294.             else if (wNotifyCode == EN_CHANGE)
  1295.             {
  1296.                 NewSched_AutoNameHelper(hdlg);
  1297.             }
  1298. #endif
  1299.             bHandled = TRUE;
  1300.             break;
  1301.         case IDOK:
  1302.         {
  1303.             TASK_TRIGGER trig;
  1304.             NEWSCHED_DATA *pnsd = (NEWSCHED_DATA*) GetWindowLongPtr(hdlg, DWLP_USER);
  1305.             ASSERT(NULL != pnsd);
  1306.             
  1307.             if (NewSched_ResolveNameConflictHelper(hdlg, &trig, &pnsd->SchedCookie))
  1308.             {
  1309.                 NewSched_CreateScheduleHelper(hdlg, &trig, &pnsd->SchedCookie);
  1310.                 GetDlgItemText(hdlg, IDC_SCHEDULE_NAME, 
  1311.                                pnsd->szSchedName, ARRAYSIZE(pnsd->szSchedName));
  1312.                 EndDialog(hdlg, IDOK);
  1313.             }
  1314.             break;
  1315.         }
  1316.         case IDCANCEL:
  1317.             EndDialog(hdlg, IDCANCEL);
  1318.             break;
  1319.         default:
  1320.             break;
  1321.     }
  1322.     return bHandled;
  1323. }
  1324. #ifdef NEWSCHED_AUTONAME
  1325. BOOL NewSched_OnNotify(HWND hdlg, int idCtrl, LPNMHDR pnmh)
  1326. {
  1327.     BOOL bHandled = TRUE;
  1328.     switch (pnmh->code)
  1329.     {
  1330.         case DTN_DATETIMECHANGE:
  1331.             NewSched_AutoNameHelper(hdlg);
  1332.             break;
  1333.             
  1334.         default:
  1335.             bHandled = FALSE;
  1336.             break;
  1337.     }
  1338.     return bHandled;
  1339. }
  1340. #endif
  1341. INT_PTR CALLBACK NewScheduleDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
  1342. {
  1343.     BOOL bHandled = FALSE;
  1344.     switch (message)
  1345.     {
  1346.         case WM_INITDIALOG:
  1347.         {
  1348.             SetWindowLongPtr(hdlg, DWLP_USER, lParam);
  1349.             NewSched_OnInitDialogHelper(hdlg);
  1350.             bHandled = TRUE;
  1351.             break;
  1352.         }
  1353.         case WM_COMMAND:
  1354.             bHandled = NewSched_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  1355.             break;
  1356. #ifdef NEWSCHED_AUTONAME
  1357.         case WM_NOTIFY:
  1358.             bHandled = NewSched_OnNotify(hdlg, wParam, (LPNMHDR)lParam);
  1359.             break;            
  1360. #endif
  1361.         case WM_HELP:
  1362.             SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
  1363.                     HELP_WM_HELP, (DWORD_PTR)aHelpIDs);
  1364.             bHandled = TRUE;
  1365.             break;
  1366.         case WM_CONTEXTMENU:
  1367.             SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
  1368.             bHandled = TRUE;
  1369.             break;
  1370.     }
  1371.     return bHandled;
  1372. }
  1373. /********************************************************************************
  1374.     Advanced properties code
  1375. *********************************************************************************/
  1376. BOOL Advanced_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
  1377. {
  1378.     POOEBuf pBuf;
  1379.     ASSERT(NULL != (POOEBuf)lParam);
  1380.     SetWindowLongPtr(hdlg, DWLP_USER, lParam);
  1381.     pBuf = (POOEBuf)lParam;
  1382.     UINT flags = pBuf->m_RecurseFlags;
  1383.     CheckDlgButton(hdlg, IDC_DOWNLOAD_IMAGES, flags & WEBCRAWL_GET_IMAGES);
  1384.     CheckDlgButton(hdlg, IDC_DOWNLOAD_APPLETS, flags & WEBCRAWL_GET_CONTROLS);
  1385.     CheckDlgButton(hdlg, IDC_DOWNLOAD_MEDIA, 
  1386.                    flags & (WEBCRAWL_GET_BGSOUNDS | WEBCRAWL_GET_VIDEOS));
  1387.     CheckDlgButton(hdlg, IDC_DOWNLOAD_ONLY_HTML_LINKS, flags & WEBCRAWL_ONLY_LINKS_TO_HTML);
  1388.     return TRUE;
  1389. }
  1390. void Advanced_SetFlag(HWND hdlg, POOEBuf pBuf, int ID, LONG flags)
  1391. {
  1392.     if (IsDlgButtonChecked(hdlg, ID))
  1393.     {
  1394.         pBuf->m_RecurseFlags |= flags;
  1395.     }
  1396.     else
  1397.     {
  1398.         pBuf->m_RecurseFlags &= ~flags;
  1399.     }
  1400. }
  1401. BOOL Advanced_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  1402. {
  1403.     BOOL bHandled = TRUE;
  1404.     POOEBuf pBuf = GetBuf(hdlg);
  1405.     ASSERT(pBuf);
  1406.     switch (wID)
  1407.     {
  1408.         case IDOK:
  1409.             Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_IMAGES, WEBCRAWL_GET_IMAGES);
  1410.             Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_APPLETS, WEBCRAWL_GET_CONTROLS);
  1411.             Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_MEDIA, 
  1412.                              WEBCRAWL_GET_BGSOUNDS | WEBCRAWL_GET_VIDEOS);
  1413.             Advanced_SetFlag(hdlg, pBuf, IDC_DOWNLOAD_ONLY_HTML_LINKS, WEBCRAWL_ONLY_LINKS_TO_HTML);
  1414.             EndDialog(hdlg, IDOK);
  1415.             break;
  1416.         case IDCANCEL:
  1417.             EndDialog(hdlg, IDCANCEL);
  1418.             break;
  1419.         case IDC_DOWNLOAD_IMAGES:
  1420.         case IDC_DOWNLOAD_APPLETS:
  1421.         case IDC_DOWNLOAD_MEDIA:
  1422.         case IDC_DOWNLOAD_ONLY_HTML_LINKS:
  1423.             break;
  1424.         default:
  1425.             bHandled = FALSE;
  1426.             break;
  1427.     }
  1428.     return bHandled;
  1429. }
  1430. INT_PTR CALLBACK AdvancedDownloadDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
  1431. {
  1432.     BOOL bHandled = FALSE;
  1433.     switch (message)
  1434.     {
  1435.         case WM_INITDIALOG:
  1436.             bHandled = Advanced_OnInitDialog(hdlg, (HWND)wParam, lParam);
  1437.             break;
  1438.         case WM_COMMAND:
  1439.             bHandled = Advanced_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  1440.             break;
  1441.             
  1442.         case WM_HELP:
  1443.             SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
  1444.                     HELP_WM_HELP, (DWORD_PTR)aHelpIDs);
  1445.             bHandled = TRUE;
  1446.             break;
  1447.         case WM_CONTEXTMENU:
  1448.             SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
  1449.             bHandled = TRUE;
  1450.             break;
  1451.     }
  1452.     
  1453.     return bHandled;
  1454. }
  1455. /********************************************************************************
  1456.     Login properties code
  1457. *********************************************************************************/
  1458. BOOL Login_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
  1459. {
  1460.     POOEBuf pBuf;
  1461.     ASSERT(NULL != (POOEBuf)lParam);
  1462.     SetWindowLongPtr(hdlg, DWLP_USER, lParam);
  1463.     pBuf = (POOEBuf)lParam;
  1464.     Edit_LimitText(GetDlgItem(hdlg, IDC_USERNAME), ARRAYSIZE(pBuf->username) - 1);
  1465.     SetDlgItemText(hdlg, IDC_USERNAME, pBuf->username);
  1466.     Edit_LimitText(GetDlgItem(hdlg, IDC_PASSWORD), ARRAYSIZE(pBuf->password) - 1);
  1467.     SetDlgItemText(hdlg, IDC_PASSWORD, pBuf->password);
  1468.     Edit_LimitText(GetDlgItem(hdlg, IDC_PASSWORDCONFIRM), ARRAYSIZE(pBuf->password) - 1);
  1469.     SetDlgItemText(hdlg, IDC_PASSWORDCONFIRM, pBuf->password);
  1470.     return TRUE;
  1471. }
  1472. BOOL Login_OnCommand(HWND hdlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  1473. {
  1474.     BOOL bHandled = TRUE;
  1475.     POOEBuf pBuf = GetBuf(hdlg);
  1476.     ASSERT(pBuf);
  1477.     switch (wID)
  1478.     {
  1479.         case IDOK:
  1480.         {
  1481.             TCHAR szUsername[ARRAYSIZE(pBuf->username) + 1];
  1482.             TCHAR szPassword[ARRAYSIZE(pBuf->password) + 1];
  1483.             TCHAR szPasswordConfirm[ARRAYSIZE(pBuf->password) + 1];
  1484.             GetDlgItemText(hdlg, IDC_USERNAME, szUsername, ARRAYSIZE(szUsername));
  1485.             GetDlgItemText(hdlg, IDC_PASSWORD, szPassword, ARRAYSIZE(szPassword));
  1486.             GetDlgItemText(hdlg, IDC_PASSWORDCONFIRM, szPasswordConfirm, ARRAYSIZE(szPasswordConfirm));
  1487.             if (!szUsername[0] && (szPassword[0] || szPasswordConfirm[0]))
  1488.             {
  1489.                 SGMessageBox(hdlg, 
  1490.                             (pBuf->bChannel ? IDS_NEEDCHANNELUSERNAME : IDS_NEEDUSERNAME), 
  1491.                             MB_ICONWARNING);
  1492.             }
  1493.             else if (szUsername[0] && !szPassword[0])
  1494.             {
  1495.                 SGMessageBox(hdlg, 
  1496.                             (pBuf->bChannel ? IDS_NEEDCHANNELPASSWORD : IDS_NEEDPASSWORD), 
  1497.                             MB_ICONWARNING);
  1498.             }
  1499.             else if (StrCmp(szPassword, szPasswordConfirm) != 0)
  1500.             {
  1501.                 SGMessageBox(hdlg, IDS_MISMATCHED_PASSWORDS, MB_ICONWARNING);
  1502.             }
  1503.             else
  1504.             {
  1505.                 StrCpyN(pBuf->username, szUsername, ARRAYSIZE(pBuf->username));
  1506.                 StrCpyN(pBuf->password, szPassword, ARRAYSIZE(pBuf->password));
  1507.                 pBuf->dwFlags |= (PROP_WEBCRAWL_UNAME | PROP_WEBCRAWL_PSWD);
  1508.                 EndDialog(hdlg, IDOK);
  1509.             }
  1510.             break;
  1511.         }
  1512.  
  1513.         case IDCANCEL:
  1514.             EndDialog(hdlg, IDCANCEL);
  1515.             break;
  1516.         default:
  1517.             bHandled = FALSE;
  1518.             break;
  1519.     }
  1520.     return bHandled;
  1521. }
  1522. INT_PTR CALLBACK LoginOptionDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
  1523. {
  1524.     BOOL bHandled = FALSE;
  1525.     switch (message)
  1526.     {
  1527.         case WM_INITDIALOG:
  1528.             bHandled = Login_OnInitDialog(hdlg, (HWND)wParam, lParam);
  1529.             break;
  1530.         case WM_COMMAND:
  1531.             bHandled = Login_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  1532.             break;
  1533.         case WM_HELP:
  1534.             SHWinHelpOnDemandWrap((HWND)((LPHELPINFO) lParam)->hItemHandle, c_szHelpFile,
  1535.                     HELP_WM_HELP, (DWORD_PTR)aHelpIDs);
  1536.             bHandled = TRUE;
  1537.             break;
  1538.         case WM_CONTEXTMENU:
  1539.             SHWinHelpOnDemandWrap((HWND)wParam, c_szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)aHelpIDs);
  1540.             bHandled = TRUE;
  1541.             break;
  1542.     }
  1543.     
  1544.     return bHandled;
  1545. }
  1546. //
  1547. // Read the users default email address and smtp from the Athena Account Mgr
  1548. //
  1549. // Expects lpszEmailAddress and lpszSMTPServer to pt to char buffers of 
  1550. // CCHMAX_EMAIL_ADDRESS and CCHMAX_SERVER_NAME size, resp.
  1551. //
  1552. BOOL ReadAthenaMailSettings(LPSTR lpszEmailAddress, LPSTR lpszSMTPServer)
  1553. {
  1554.     //
  1555.     // This api gets called from threads that haven't used COM before so wrap
  1556.     // in CoInitialize/CoUninitialize
  1557.     //
  1558.     HRESULT hr = CoInitialize(NULL);
  1559.     ASSERT(SUCCEEDED(hr));
  1560.     //
  1561.     // Create an Internet Mail and News Account Manager
  1562.     //
  1563.     IImnAccountManager * pAccountManager;
  1564.     hr = CoCreateInstance(
  1565.         CLSID_ImnAccountManager,
  1566.         NULL,                       // no aggregation
  1567.         CLSCTX_INPROC_SERVER,       // inproc server implemented in webcheck.dll
  1568.         IID_IImnAccountManager,     //
  1569.         (void **)&pAccountManager);
  1570.     if (SUCCEEDED(hr)) {
  1571.         hr = pAccountManager->Init(NULL);
  1572.         if (SUCCEEDED(hr)) {
  1573.             //
  1574.             // Get the default SMTP account
  1575.             //
  1576.             IImnAccount * pAccount;
  1577.             hr = pAccountManager->GetDefaultAccount(ACCT_MAIL, &pAccount);
  1578.             if (hr == S_OK) {               
  1579.                 //
  1580.                 // Get the SMTP_SERVER name for this account
  1581.                 //
  1582.                 if (NULL != lpszSMTPServer)
  1583.                 {
  1584.                     hr = pAccount->GetPropSz(
  1585.                         AP_SMTP_SERVER, 
  1586.                         lpszSMTPServer,
  1587.                         CCHMAX_SERVER_NAME);
  1588.                 }
  1589.                 
  1590.                 //
  1591.                 // Get the Users email address for this account
  1592.                 //
  1593.                 if (NULL != lpszEmailAddress)
  1594.                 {
  1595.                     hr |= pAccount->GetPropSz(
  1596.                         AP_SMTP_EMAIL_ADDRESS, 
  1597.                         lpszEmailAddress,
  1598.                         CCHMAX_EMAIL_ADDRESS);
  1599.                 }
  1600.                 pAccount->Release();    // done with IImnAccount
  1601.             }
  1602.         }
  1603.         pAccountManager->Release();     // done with IImnAccountManager
  1604.     }
  1605.     //
  1606.     // This api gets called from threads that haven't used COM before so wrap
  1607.     // in CoInitialize/CoUninitialize
  1608.     //
  1609.     CoUninitialize();
  1610.     if (hr == S_OK)
  1611.         return TRUE;
  1612.     else
  1613.         return FALSE;
  1614. }
  1615. void ReadDefaultEmail(LPTSTR szBuf, UINT cch)
  1616. {
  1617.     ASSERT(szBuf);
  1618.     szBuf[0] = (TCHAR)0;
  1619.     if(ReadRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefEmail, szBuf, cch * sizeof(TCHAR)))
  1620.         return;
  1621.     //  TODO: Look for eudora/netscape as well
  1622.     CHAR szEmailAddress[CCHMAX_EMAIL_ADDRESS];
  1623.     if (ReadAthenaMailSettings(szEmailAddress, NULL))
  1624.     {
  1625.         SHAnsiToTChar(szEmailAddress, szBuf, cch);
  1626.     }
  1627. }
  1628. void WriteDefaultEmail(LPTSTR szBuf)
  1629. {
  1630.     ASSERT(szBuf);
  1631.     WriteRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefEmail, szBuf, (lstrlen(szBuf) + 1) * sizeof(TCHAR), REG_SZ);
  1632. }
  1633. void ReadDefaultSMTPServer(LPTSTR szBuf, UINT cch)
  1634. {
  1635.     ASSERT(szBuf);
  1636.     szBuf[0] = (TCHAR)0;
  1637.     if(ReadRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefServer, szBuf, cch * sizeof(TCHAR)))
  1638.         return;
  1639.     //  TODO: Look for eudora/netscape as well
  1640.     CHAR szSMTPServer[CCHMAX_SERVER_NAME];
  1641.     if (ReadAthenaMailSettings(NULL, szSMTPServer))
  1642.     {
  1643.         SHAnsiToTChar(szSMTPServer, szBuf, cch);
  1644.     }
  1645. }
  1646. void WriteDefaultSMTPServer(LPTSTR szBuf)
  1647. {
  1648.     ASSERT(szBuf);
  1649.     WriteRegValue(HKEY_CURRENT_USER, c_szRegKey, c_szDefServer, szBuf, (lstrlen(szBuf) + 1) * sizeof(TCHAR), REG_SZ);
  1650. }