Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4695 lines
162 KiB

  1. /*
  2. * o p t i o n s . c p p
  3. *
  4. * Purpose:
  5. * Implements options propsheets
  6. *
  7. * Owner:
  8. * t-anthda.
  9. * brettm.
  10. *
  11. * Copyright (C) Microsoft Corp. 1993, 1994.
  12. */
  13. #include "pch.hxx"
  14. #include <wininet.h>
  15. #include "resource.h"
  16. #include "options.h"
  17. #include "optres.h"
  18. #include <goptions.h>
  19. #include "strconst.h"
  20. #include "mailnews.h"
  21. #include <error.h>
  22. #include "fonts.h"
  23. #include <regutil.h>
  24. #include <secutil.h>
  25. #include <inetreg.h>
  26. #include "mimeutil.h"
  27. #include <ipab.h>
  28. #include "xpcomm.h"
  29. #include "conman.h"
  30. #include <shlwapi.h>
  31. #include <shlwapip.h>
  32. #include <wininet.h>
  33. #include <thumb.h>
  34. #include <statnery.h>
  35. #include <url.h>
  36. #include "spell.h"
  37. #include "htmlhelp.h"
  38. #include "shared.h"
  39. #include <sigs.h>
  40. #include "instance.h"
  41. #include <layout.h>
  42. #include "statwiz.h"
  43. #include "storfldr.h"
  44. #include "storutil.h"
  45. #include "cleanup.h"
  46. #include "receipts.h"
  47. #include "demand.h"
  48. #include "multiusr.h"
  49. #include "fontnsc.h"
  50. #include "menuutil.h"
  51. #ifdef SMIME_V3
  52. #include "seclabel.h"
  53. #endif // SMIME_V3
  54. ASSERTDATA
  55. #define MAX_SHOWNAME 25
  56. #define DEFAULT_FONTPIXELSIZE 9
  57. #define SZ_REGKEY_AUTODISCOVERY TEXT("SOFTWARE\\Microsoft\\Outlook Express\\5.0")
  58. #define SZ_REGKEY_AUTODISCOVERY_POLICY TEXT("SOFTWARE\\Policies\\Microsoft\\Windows")
  59. #define SZ_REGVALUE_AUTODISCOVERY TEXT("AutoDiscovery")
  60. #define SZ_REGVALUE_AUTODISCOVERY_POLICY TEXT("AutoDiscovery Policy")
  61. void SendTridentOptionsChange();
  62. INT_PTR CALLBACK AdvSecurityDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  63. INT_PTR CALLBACK FChooseFontHookProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  64. BOOL FGetAdvSecOptions(HWND hwndParent, OPTINFO *opie);
  65. #ifdef SMIME_V3
  66. BOOL FGetSecLabel(HWND hwndParent, OPTINFO *opie);
  67. BOOL FGetSecRecOptions(HWND hwndParent, OPTINFO *opie);
  68. INT_PTR CALLBACK SecurityReceiptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
  69. #endif // SMIME_V3
  70. LRESULT CALLBACK FontSampleSubProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  71. void HtmlOptFromMailOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi);
  72. void MailOptFromPlainOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi);
  73. void PlainOptFromMailOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi);
  74. void MailOptFromHtmlOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi);
  75. void PaintFontSample(HWND hwnd, HDC hdc, OPTINFO *poi);
  76. void EnableStationeryWindows(HWND hwnd);
  77. void _SetThisStationery(HWND hwnd, BOOL fMail, LPWSTR pwsz, OPTINFO* pmoi);
  78. enum {
  79. SAMPLE_MAIL = 0,
  80. SAMPLE_NEWS = 1
  81. };
  82. void _SetComposeFontSample(HWND hwndDlg, DWORD dwType, OPTINFO *pmoi);
  83. void NewsOptFromPlainOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi);
  84. void NewsOptFromHtmlOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi);
  85. void HtmlOptFromNewsOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi);
  86. void PlainOptFromNewsOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi);
  87. BOOL AdvSec_GetEncryptWarnCombo(HWND hwnd, OPTINFO *poi);
  88. BOOL AdvSec_FillEncWarnCombo(HWND hwnd, OPTINFO *poi);
  89. BOOL ChangeSendFontSettings(OPTINFO *pmoi, BOOL fMail, HWND hwnd);
  90. void FreeIcon(HWND hwnd, int idc);
  91. WCHAR g_wszNewsStationery[MAX_PATH];
  92. WCHAR g_wszMailStationery[MAX_PATH];
  93. const OPTPAGES c_rgOptPages[] =
  94. {
  95. { GeneralDlgProc, iddOpt_General },
  96. { ReadDlgProc, iddOpt_Read },
  97. { ReceiptsDlgProc, iddOpt_Receipts },
  98. { SendDlgProc, iddOpt_Send },
  99. { ComposeDlgProc, iddOpt_Compose },
  100. { SigDlgProc, iddOpt_Signature },
  101. { SpellingPageProc, iddOpt_Spelling },
  102. { SecurityDlgProc, iddOpt_Security },
  103. { DialUpDlgProc, iddOpt_DialUp },
  104. { MaintenanceDlgProc, iddOpt_Advanced }
  105. };
  106. TCHAR szDialAlways[CCHMAX_STRINGRES];
  107. TCHAR szDialIfNotOffline[CCHMAX_STRINGRES];
  108. TCHAR szDoNotDial[CCHMAX_STRINGRES];
  109. //These static won't hurt switching identities because they need not be initialized when switching the
  110. //identities. These need to be persistent across identities.
  111. static BOOL fRasInstalled = FALSE;
  112. BOOL IsRasInstalled()
  113. {
  114. //These static won't hurt switching identities because they need not be initialized when switching the
  115. //identities. These need to be persistent across identities.
  116. static BOOL fCheckedRasInstalled = FALSE;
  117. if (!fCheckedRasInstalled)
  118. {
  119. if (g_OSInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  120. {
  121. // Check Win9x key
  122. char szSmall[3]; // there should be a "1" or a "0" only
  123. DWORD cb;
  124. HKEY hkey;
  125. long lRes;
  126. lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_RNACOMPONENT,
  127. NULL, KEY_READ, &hkey);
  128. if(ERROR_SUCCESS == lRes)
  129. {
  130. cb = sizeof(szSmall);
  131. // REGSTR_VAL_RNAINSTALLED is defined with TEXT() macro so
  132. // if wininet is ever compiled unicode this will be a compile
  133. // error.
  134. lRes = RegQueryValueExA(hkey, REGSTR_VAL_RNAINSTALLED, NULL,
  135. NULL, (LPBYTE)szSmall, &cb);
  136. if(ERROR_SUCCESS == lRes) {
  137. if((szSmall[0] == '1') && (szSmall[1] == 0)) {
  138. // 1 means ras installed
  139. fRasInstalled = TRUE;
  140. }
  141. }
  142. RegCloseKey(hkey);
  143. }
  144. }
  145. else if (g_OSInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
  146. {
  147. // Ask NT service manager if RemoteAccess service is installed
  148. //
  149. SC_HANDLE hscm;
  150. hscm = OpenSCManager(NULL, NULL, GENERIC_READ);
  151. /*
  152. if(hscm)
  153. {
  154. SC_HANDLE hras;
  155. hras = OpenService(hscm, TEXT("RemoteAccess"), GENERIC_READ);
  156. if(hras)
  157. {
  158. // service exists - ras is installed
  159. fRasInstalled = TRUE;
  160. CloseServiceHandle(hras);
  161. }
  162. CloseServiceHandle(hscm);
  163. }
  164. */
  165. if(hscm)
  166. {
  167. SC_HANDLE hras;
  168. ENUM_SERVICE_STATUS essServices[16];
  169. DWORD dwError, dwResume = 0, i;
  170. DWORD cbNeeded = 1, csReturned;
  171. while(FALSE == fRasInstalled && cbNeeded > 0)
  172. {
  173. // Get the next chunk of services
  174. dwError = 0;
  175. if(FALSE == EnumServicesStatus(hscm, SERVICE_WIN32, SERVICE_ACTIVE,
  176. essServices, sizeof(essServices), &cbNeeded, &csReturned,
  177. &dwResume))
  178. {
  179. dwError = GetLastError();
  180. }
  181. if(dwError && dwError != ERROR_MORE_DATA)
  182. {
  183. // unknown error - bail
  184. break;
  185. }
  186. for(i=0; i<csReturned; i++)
  187. {
  188. if(0 == lstrcmp(essServices[i].lpServiceName, TEXT("RasMan")))
  189. {
  190. // service exists. RAS is installed.
  191. fRasInstalled = TRUE;
  192. break;
  193. }
  194. }
  195. }
  196. CloseServiceHandle(hscm);
  197. }
  198. }
  199. fCheckedRasInstalled = TRUE;
  200. }
  201. return fRasInstalled;
  202. }
  203. BOOL InitOptInfo(DWORD type, OPTINFO **ppoi)
  204. {
  205. BOOL fRet;
  206. OPTINFO *poi;
  207. Assert(type == ATHENA_OPTIONS || type == SPELL_OPTIONS);
  208. Assert(ppoi != NULL);
  209. fRet = FALSE;
  210. *ppoi = NULL;
  211. if (!MemAlloc((void **)&poi, sizeof(OPTINFO)))
  212. return(FALSE);
  213. ZeroMemory(poi, sizeof(OPTINFO));
  214. poi->himl = ImageList_LoadBitmap(g_hLocRes, MAKEINTRESOURCE(idbOptions), 32, 0,
  215. RGB(255, 0, 255));
  216. Assert(poi->himl);
  217. // TODO: we may want to make a copy of g_pOptBcktEx and use that instead?????
  218. Assert(g_pOpt != NULL);
  219. poi->pOpt = g_pOpt;
  220. poi->pOpt->AddRef();
  221. // poi->pOpt->EnableNotification(FALSE);
  222. fRet = TRUE;
  223. if (!fRet)
  224. {
  225. DeInitOptInfo(poi);
  226. poi = NULL;
  227. }
  228. *ppoi = poi;
  229. return(fRet);
  230. }
  231. void DeInitOptInfo(OPTINFO *poi)
  232. {
  233. Assert(poi != NULL);
  234. if (poi->himl)
  235. {
  236. ImageList_Destroy(poi->himl);
  237. }
  238. if (poi->pOpt != NULL)
  239. {
  240. // poi->pOpt->EnableNotification(TRUE);
  241. poi->pOpt->Release();
  242. }
  243. MemFree(poi);
  244. }
  245. BOOL ShowOptions(HWND hwndParent, DWORD type, UINT nStartPage, IAthenaBrowser *pBrowser)
  246. {
  247. LPARAM lParam;
  248. PROPSHEETHEADERW psh;
  249. OPTINFO *poi;
  250. int i,
  251. cPage;
  252. OPTPAGES *pPages;
  253. BOOL fRet;
  254. PROPSHEETPAGEW *ppsp,
  255. psp[ARRAYSIZE(c_rgOptPages)];
  256. Assert(type == ATHENA_OPTIONS || type == SPELL_OPTIONS);
  257. if (!InitOptInfo(type, &poi))
  258. return(FALSE);
  259. fRet = FALSE;
  260. pPages = (OPTPAGES *)c_rgOptPages;
  261. cPage = ARRAYSIZE(c_rgOptPages);
  262. psh.nPages = 0;
  263. // Fill out the PROPSHEETPAGE structs
  264. for (i = 0, ppsp = psp; i < cPage; i++, pPages++)
  265. {
  266. lParam = (LPARAM)poi;
  267. if (pPages->uTemplate == iddOpt_Spelling)
  268. {
  269. if (!FCheckSpellAvail())
  270. continue;
  271. if (type == SPELL_OPTIONS)
  272. nStartPage = psh.nPages;
  273. }
  274. else if (pPages->uTemplate == iddViewLayout)
  275. {
  276. if (pBrowser == NULL)
  277. continue;
  278. lParam = (LPARAM)pBrowser;
  279. }
  280. ppsp->dwSize = sizeof(*ppsp);
  281. ppsp->dwFlags = PSP_DEFAULT;
  282. ppsp->hInstance = g_hLocRes;
  283. ppsp->pszTemplate = MAKEINTRESOURCEW(pPages->uTemplate);
  284. ppsp->pszIcon = 0;
  285. ppsp->pfnDlgProc = pPages->pfnDlgProc;
  286. ppsp->pszTitle = 0;
  287. ppsp->lParam = lParam;
  288. ppsp->pfnCallback = NULL;
  289. psh.nPages++;
  290. ppsp++;
  291. }
  292. // Adjust start page if greater than number of pages
  293. if ((int)nStartPage > psh.nPages)
  294. {
  295. AssertSz(FALSE, "Start page is too high.");
  296. nStartPage = 0;
  297. }
  298. psh.dwSize = sizeof(psh);
  299. psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USEPAGELANG;
  300. psh.hwndParent = hwndParent;
  301. psh.hInstance = g_hLocRes;
  302. psh.pszCaption = MAKEINTRESOURCEW(idsOptions);
  303. psh.nStartPage = nStartPage;
  304. psh.pszIcon = MAKEINTRESOURCEW(idiMailNews);
  305. psh.ppsp = (LPCPROPSHEETPAGEW)&psp;
  306. if (-1 != PropertySheetW(&psh))
  307. fRet = TRUE;
  308. DeInitOptInfo(poi);
  309. return(fRet);
  310. }
  311. void InitDlgEdit(HWND hwnd, int id, int max, TCHAR *sz)
  312. {
  313. HWND hwndT;
  314. hwndT = GetDlgItem(hwnd, id);
  315. Edit_LimitText(hwndT, max);
  316. if (sz != NULL)
  317. Edit_SetText(hwndT, sz);
  318. }
  319. void InitCheckCounterFromOptInfo(HWND hwnd, int idcCheck, int idcEdit, int idcSpin, OPTINFO *poi, PROPID id)
  320. {
  321. BOOL f;
  322. int digit;
  323. DWORD dw;
  324. HRESULT hr;
  325. PROPINFO info;
  326. Assert(poi != NULL);
  327. Assert(idcEdit != 0);
  328. Assert(idcSpin != 0);
  329. info.cbSize = sizeof(PROPINFO);
  330. hr = poi->pOpt->GetPropertyInfo(id, &info, 0);
  331. Assert(hr == S_OK);
  332. Assert(info.vt == VT_UI4);
  333. dw = IDwGetOption(poi->pOpt, id);
  334. f = (dw != OPTION_OFF);
  335. if (!f)
  336. dw = IDwGetOptionDefault(poi->pOpt, id);
  337. Assert(info.uMin <= (int)dw);
  338. Assert(info.uMax >= (int)dw);
  339. if (id == OPT_POLLFORMSGS)
  340. {
  341. // convert to minutes from millisecs
  342. dw = dw / (60 * 1000);
  343. info.uMin = info.uMin / (60 * 1000);
  344. info.uMax = info.uMax / (60 * 1000);
  345. }
  346. if (idcCheck != 0)
  347. {
  348. CheckDlgButton(hwnd, idcCheck, f ? BST_CHECKED : BST_UNCHECKED);
  349. }
  350. else
  351. {
  352. Assert(f);
  353. }
  354. SendDlgItemMessage(hwnd, idcSpin, UDM_SETRANGE, 0, MAKELONG(info.uMax, info.uMin));
  355. digit = 1;
  356. while (info.uMax >= 10)
  357. {
  358. info.uMax = info.uMax / 10;
  359. digit++;
  360. }
  361. SendDlgItemMessage(hwnd, idcEdit, EM_LIMITTEXT, (WPARAM)digit, 0);
  362. SetDlgItemInt(hwnd, idcEdit, dw, FALSE);
  363. EnableWindow(GetDlgItem(hwnd, idcEdit), f);
  364. EnableWindow(GetDlgItem(hwnd, idcSpin), f);
  365. }
  366. BOOL GetCheckCounter(DWORD *pdw, HWND hwnd, int idcCheck, int idcEdit, int idcSpin)
  367. {
  368. BOOL f, fRet;
  369. DWORD dw, range;
  370. f = (idcCheck == 0 || IsDlgButtonChecked(hwnd, idcCheck) == BST_CHECKED);
  371. if (!f)
  372. {
  373. dw = OPTION_OFF;
  374. fRet = TRUE;
  375. }
  376. else
  377. {
  378. dw = GetDlgItemInt(hwnd, idcEdit, &fRet, FALSE);
  379. if (fRet)
  380. {
  381. range = (DWORD) SendDlgItemMessage(hwnd, idcSpin, UDM_GETRANGE, 0, 0);
  382. if (dw < HIWORD(range) || dw > LOWORD(range))
  383. fRet = FALSE;
  384. }
  385. }
  386. *pdw = dw;
  387. return(fRet);
  388. }
  389. void SetPageDirty(OPTINFO *poi, HWND hwnd, DWORD page)
  390. {
  391. Assert(poi != NULL);
  392. PropSheet_Changed(GetParent(hwnd), hwnd);
  393. }
  394. /////////////////////////////////////////////////////////////////////////////
  395. // General Tab
  396. //
  397. static const HELPMAP g_rgCtxMapMailGeneral[] = {
  398. {IDC_LAUNCH_INBOX, IDH_OPTIONS_GO_TO_INBOX},
  399. {IDC_NOTIFY_NEW_GROUPS, IDH_NEWS_OPT_READ_NOTIFY_NEW_NEWS},
  400. {IDC_SOUND_CHECK, IDH_MAIL_OPT_READ_PLYSND},
  401. {IDC_AUTOCHECK_EDIT, IDH_MAIL_OPT_READ_CHECK_4NEW},
  402. {IDC_AUTOCHECK_SPIN, IDH_MAIL_OPT_READ_CHECK_4NEW},
  403. {IDC_AUTOCHECK_CHECK, IDH_MAIL_OPT_READ_CHECK_4NEW},
  404. {IDC_MAILHANDSTAT, IDH_MAIL_SEND_IM_DEFAULT},
  405. {IDC_DEFMAIL, IDH_MAIL_SEND_IM_DEFAULT},
  406. {IDC_NEWSHANDSTAT, IDH_NEWS_OPT_READ_DEFAULT},
  407. {IDC_DEFNEWS, IDH_NEWS_OPT_READ_DEFAULT},
  408. {IDC_EXPANDUNREAD_CHECK, 502000},
  409. {IDC_POLLING_DIAL_OPTIONS, 25252507},
  410. {IDC_BUDDYLIST_CHECK, 502004},
  411. {IDC_SEND_RECEIVE_ON_START, 502005},
  412. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  413. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  414. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  415. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  416. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  417. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  418. {IDC_GENERAL_ICON, IDH_NEWS_COMM_GROUPBOX},
  419. {IDC_SEND_RECEIVE_ICON, IDH_NEWS_COMM_GROUPBOX},
  420. {IDC_DEFAULT_ICON, IDH_NEWS_COMM_GROUPBOX},
  421. {0, 0}
  422. };
  423. INT_PTR CALLBACK GeneralDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  424. {
  425. LRESULT lResult;
  426. switch (message)
  427. {
  428. case WM_INITDIALOG:
  429. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, General_OnInitDialog);
  430. case WM_HELP:
  431. case WM_CONTEXTMENU:
  432. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapMailGeneral);
  433. case WM_COMMAND:
  434. HANDLE_WM_COMMAND(hwnd, wParam, lParam, General_OnCommand);
  435. return (TRUE);
  436. case WM_NOTIFY:
  437. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, General_OnNotify);
  438. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  439. return (TRUE);
  440. case WM_DESTROY:
  441. FreeIcon(hwnd, IDC_GENERAL_ICON);
  442. FreeIcon(hwnd, IDC_SEND_RECEIVE_ICON);
  443. FreeIcon(hwnd, IDC_DEFAULT_ICON);
  444. return (TRUE);
  445. }
  446. return(FALSE);
  447. }
  448. void FillPollingDialCombo(HWND hwndPollDialCombo, OPTINFO *pmoi)
  449. {
  450. DWORD dw;
  451. UINT iSel;
  452. LoadString(g_hLocRes, idsDoNotDial, szDoNotDial, ARRAYSIZE(szDoNotDial));
  453. ComboBox_AddString(hwndPollDialCombo, szDoNotDial);
  454. LoadString(g_hLocRes, idsDialIfNotOffline, szDialIfNotOffline, ARRAYSIZE(szDialIfNotOffline));
  455. ComboBox_AddString(hwndPollDialCombo, szDialIfNotOffline);
  456. LoadString(g_hLocRes, idsDialAlways, szDialAlways, ARRAYSIZE(szDialAlways));
  457. GetLastError();
  458. ComboBox_AddString(hwndPollDialCombo, szDialAlways);
  459. dw = IDwGetOption(pmoi->pOpt, OPT_DIAL_DURING_POLL);
  460. switch (dw)
  461. {
  462. case DIAL_ALWAYS:
  463. iSel = ComboBox_FindStringExact(hwndPollDialCombo, -1, szDialAlways);
  464. break;
  465. case DIAL_IF_NOT_OFFLINE:
  466. iSel = ComboBox_FindStringExact(hwndPollDialCombo, -1, szDialIfNotOffline);
  467. break;
  468. case DO_NOT_DIAL:
  469. default:
  470. iSel = ComboBox_FindStringExact(hwndPollDialCombo, -1, szDoNotDial);
  471. break;
  472. }
  473. ComboBox_SetCurSel(hwndPollDialCombo, iSel);
  474. }
  475. //
  476. // FUNCTION: General_OnInitDialog()
  477. //
  478. // PURPOSE: Handles the WM_INITDIALOG for the General Tab on the options
  479. // property sheet.
  480. //
  481. BOOL General_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  482. {
  483. OPTINFO *pmoi = 0;
  484. TCHAR szRes[CCHMAX_STRINGRES] = "";
  485. BOOL fEnable = FALSE;
  486. DWORD id;
  487. DWORD dw;
  488. HWND hwndPollDialCombo;
  489. // Get the passed in options pointer
  490. Assert(pmoi == NULL);
  491. pmoi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  492. Assert(pmoi != NULL);
  493. // Set the check boxes and counters
  494. ButtonChkFromOptInfo(hwnd, IDC_LAUNCH_INBOX, pmoi, OPT_LAUNCH_INBOX);
  495. ButtonChkFromOptInfo(hwnd, IDC_NOTIFY_NEW_GROUPS, pmoi, OPT_NOTIFYGROUPS);
  496. ButtonChkFromOptInfo(hwnd, IDC_EXPANDUNREAD_CHECK, pmoi, OPT_EXPAND_UNREAD);
  497. if ((g_dwHideMessenger == BL_HIDE) || (g_dwHideMessenger == BL_DISABLE))
  498. ShowWindow(GetDlgItem(hwnd, IDC_BUDDYLIST_CHECK), SW_HIDE);
  499. else
  500. {
  501. GetDlgItemText(hwnd, IDC_BUDDYLIST_CHECK, szRes, CCHMAX_STRINGRES);
  502. MenuUtil_BuildMessengerString(szRes, ARRAYSIZE(szRes));
  503. SetDlgItemText(hwnd, IDC_BUDDYLIST_CHECK, szRes);
  504. ButtonChkFromOptInfo(hwnd, IDC_BUDDYLIST_CHECK, pmoi, OPT_BUDDYLIST_CHECK);
  505. }
  506. ButtonChkFromOptInfo(hwnd, IDC_SOUND_CHECK, pmoi, OPT_NEWMAILSOUND);
  507. ButtonChkFromOptInfo(hwnd, IDC_SEND_RECEIVE_ON_START, pmoi, OPT_POLLFORMSGS_ATSTARTUP);
  508. InitCheckCounterFromOptInfo(hwnd, IDC_AUTOCHECK_CHECK, IDC_AUTOCHECK_EDIT, IDC_AUTOCHECK_SPIN,
  509. pmoi, OPT_POLLFORMSGS);
  510. fEnable = (IsDlgButtonChecked(hwnd, IDC_AUTOCHECK_CHECK) == BST_CHECKED);
  511. hwndPollDialCombo = GetDlgItem(hwnd, IDC_POLLING_DIAL_OPTIONS);
  512. EnableWindow(hwndPollDialCombo, fEnable);
  513. //Fill the combo box and select the right option
  514. FillPollingDialCombo(hwndPollDialCombo, pmoi);
  515. // Check to see if we're the default mail handler
  516. if (FIsDefaultMailConfiged())
  517. {
  518. LoadString(g_hLocRes, idsCurrentlyDefMail, szRes, ARRAYSIZE(szRes));
  519. EnableWindow(GetDlgItem(hwnd, IDC_DEFMAIL), FALSE);
  520. }
  521. else
  522. {
  523. LoadString(g_hLocRes, idsNotDefMail, szRes, ARRAYSIZE(szRes));
  524. EnableWindow(GetDlgItem(hwnd, IDC_DEFMAIL), TRUE);
  525. }
  526. SetWindowText(GetDlgItem(hwnd, IDC_MAILHANDSTAT), szRes);
  527. // In news only mode...
  528. if (g_dwAthenaMode & MODE_NEWSONLY)
  529. {
  530. EnableWindow(GetDlgItem(hwnd, IDC_MAILHANDSTAT), FALSE);
  531. EnableWindow(GetDlgItem(hwnd, IDC_DEFMAIL), FALSE);
  532. // Hide other mail options
  533. EnableWindow(GetDlgItem(hwnd, IDC_SOUND_CHECK), FALSE);
  534. EnableWindow(GetDlgItem(hwnd, IDC_LAUNCH_INBOX), FALSE);
  535. EnableWindow(GetDlgItem(hwnd, IDC_BUDDYLIST_CHECK), FALSE);
  536. }
  537. // Check to see if we're the default news handler
  538. szRes[0] = 0;
  539. if (FIsDefaultNewsConfiged(g_dwAthenaMode & MODE_OUTLOOKNEWS ? DEFAULT_OUTNEWS : 0))
  540. {
  541. LoadString(g_hLocRes, idsCurrentlyDefNews, szRes, ARRAYSIZE(szRes));
  542. EnableWindow(GetDlgItem(hwnd, IDC_DEFNEWS), FALSE);
  543. }
  544. else
  545. {
  546. LoadString(g_hLocRes, idsNotDefNews, szRes, ARRAYSIZE(szRes));
  547. EnableWindow(GetDlgItem(hwnd, IDC_DEFNEWS), TRUE);
  548. }
  549. SetWindowText(GetDlgItem(hwnd, IDC_NEWSHANDSTAT), szRes);
  550. // Default to taking no action
  551. pmoi->fMakeDefaultMail = pmoi->fMakeDefaultNews = FALSE;
  552. // Pictures
  553. HICON hIcon;
  554. hIcon = ImageList_GetIcon(pmoi->himl, ID_OPTIONS_GENERAL, ILD_TRANSPARENT);
  555. SendDlgItemMessage(hwnd, IDC_GENERAL_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  556. hIcon = ImageList_GetIcon(pmoi->himl, ID_SEND_RECEIEVE, ILD_TRANSPARENT);
  557. SendDlgItemMessage(hwnd, IDC_SEND_RECEIVE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  558. hIcon = ImageList_GetIcon(pmoi->himl, ID_DEFAULT_PROGRAMS, ILD_TRANSPARENT);
  559. SendDlgItemMessage(hwnd, IDC_DEFAULT_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  560. // Stash the pointer
  561. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pmoi);
  562. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  563. return (TRUE);
  564. }
  565. //
  566. // FUNCTION: General_OnCommand()
  567. //
  568. // PURPOSE: Command handler for the General tab on the Options
  569. // property sheet.
  570. //
  571. void General_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  572. {
  573. OPTINFO *pmoi = 0;
  574. BOOL f;
  575. TCHAR szRes[CCHMAX_STRINGRES];
  576. // Get our stored options info
  577. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  578. if (pmoi == NULL)
  579. return;
  580. switch (id)
  581. {
  582. case IDC_AUTOCHECK_CHECK:
  583. if (codeNotify == BN_CLICKED)
  584. {
  585. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  586. EnableWindow(GetDlgItem(hwnd, IDC_AUTOCHECK_EDIT), f);
  587. EnableWindow(GetDlgItem(hwnd, IDC_AUTOCHECK_SPIN), f);
  588. EnableWindow(GetDlgItem(hwnd, IDC_POLLING_DIAL_OPTIONS), f);
  589. SetPageDirty(pmoi, hwnd, PAGE_GEN);
  590. }
  591. break;
  592. case IDC_POLLING_DIAL_OPTIONS:
  593. if (codeNotify == CBN_SELENDOK)
  594. SetPageDirty(pmoi, hwnd, PAGE_GEN);
  595. break;
  596. case IDC_AUTOCHECK_EDIT:
  597. if (codeNotify == EN_CHANGE)
  598. SetPageDirty(pmoi, hwnd, PAGE_GEN);
  599. break;
  600. case IDC_SEND_RECEIVE_ON_START:
  601. case IDC_SOUND_CHECK:
  602. case IDC_NOTIFY_NEW_GROUPS:
  603. case IDC_LAUNCH_INBOX:
  604. case IDC_EXPANDUNREAD_CHECK:
  605. case IDC_BUDDYLIST_CHECK:
  606. if (codeNotify == BN_CLICKED)
  607. SetPageDirty(pmoi, hwnd, PAGE_GEN);
  608. break;
  609. case IDC_DEFMAIL:
  610. szRes[0] = 0;
  611. LoadString(g_hLocRes, idsCurrentlyDefMail, szRes, ARRAYSIZE(szRes));
  612. SetWindowText(GetDlgItem(hwnd, IDC_MAILHANDSTAT), szRes);
  613. EnableWindow(GetDlgItem(hwnd, IDC_DEFMAIL), FALSE);
  614. SetPageDirty(pmoi, hwnd, PAGE_GEN);
  615. pmoi->fMakeDefaultMail = TRUE;
  616. break;
  617. case IDC_DEFNEWS:
  618. szRes[0] = 0;
  619. LoadString(g_hLocRes, idsCurrentlyDefNews, szRes, ARRAYSIZE(szRes));
  620. SetWindowText(GetDlgItem(hwnd, IDC_NEWSHANDSTAT), szRes);
  621. EnableWindow(GetDlgItem(hwnd, IDC_DEFNEWS), FALSE);
  622. SetPageDirty(pmoi, hwnd, PAGE_GEN);
  623. pmoi->fMakeDefaultNews = TRUE;
  624. break;
  625. }
  626. }
  627. //
  628. // FUNCTION: General_OnNotify()
  629. //
  630. // PURPOSE: Handles the PSN_APPLY notification for the General Tab.
  631. //
  632. LRESULT General_OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
  633. {
  634. OPTINFO *pmoi = 0;
  635. BOOL f;
  636. DWORD dw;
  637. HWND hwndCombo;
  638. TCHAR szEntryName[CCHMAX_STRINGRES];
  639. UINT iSel;
  640. // The only notification we care about is Apply
  641. if (PSN_APPLY == pnmhdr->code)
  642. {
  643. // Get our stored options info
  644. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  645. if (pmoi == NULL)
  646. return (PSNRET_INVALID_NOCHANGEPAGE);
  647. // General options
  648. ButtonChkToOptInfo(hwnd, IDC_LAUNCH_INBOX, pmoi, OPT_LAUNCH_INBOX);
  649. ButtonChkToOptInfo(hwnd, IDC_NOTIFY_NEW_GROUPS, pmoi, OPT_NOTIFYGROUPS);
  650. ButtonChkToOptInfo(hwnd, IDC_EXPANDUNREAD_CHECK, pmoi, OPT_EXPAND_UNREAD);
  651. if (!((g_dwHideMessenger == BL_HIDE) || (g_dwHideMessenger == BL_DISABLE)))
  652. ButtonChkToOptInfo(hwnd, IDC_BUDDYLIST_CHECK, pmoi, OPT_BUDDYLIST_CHECK);
  653. // Send / Receive options
  654. ButtonChkToOptInfo(hwnd, IDC_SOUND_CHECK, pmoi, OPT_NEWMAILSOUND);
  655. if (!GetCheckCounter(&dw, hwnd, IDC_AUTOCHECK_CHECK, IDC_AUTOCHECK_EDIT, IDC_AUTOCHECK_SPIN))
  656. return(InvalidOptionProp(hwnd, IDC_AUTOCHECK_EDIT, idsEnterPollTime, iddOpt_General));
  657. if (dw != OPTION_OFF)
  658. dw = dw * 60 * 1000;
  659. ISetDwOption(pmoi->pOpt, OPT_POLLFORMSGS, dw, NULL, 0);
  660. hwndCombo = GetDlgItem(hwnd, IDC_POLLING_DIAL_OPTIONS);
  661. iSel = ComboBox_GetCurSel(hwndCombo);
  662. if (iSel != CB_ERR)
  663. {
  664. ComboBox_GetLBText(hwndCombo, iSel, szEntryName);
  665. if (lstrcmp(szDialAlways, szEntryName) == 0)
  666. dw = DIAL_ALWAYS;
  667. else
  668. if (lstrcmp(szDialIfNotOffline, szEntryName) == 0)
  669. dw = DIAL_IF_NOT_OFFLINE;
  670. else
  671. dw = DO_NOT_DIAL;
  672. }
  673. ISetDwOption(pmoi->pOpt, OPT_DIAL_DURING_POLL, dw, NULL, 0);
  674. ButtonChkToOptInfo(hwnd, IDC_SEND_RECEIVE_ON_START, pmoi, OPT_POLLFORMSGS_ATSTARTUP);
  675. // Default client
  676. if (pmoi->fMakeDefaultMail)
  677. SetDefaultMailHandler(0);
  678. if (pmoi->fMakeDefaultNews)
  679. SetDefaultNewsHandler(g_dwAthenaMode & MODE_OUTLOOKNEWS ? DEFAULT_OUTNEWS : 0);
  680. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  681. return (PSNRET_NOERROR);
  682. }
  683. return (FALSE);
  684. }
  685. /////////////////////////////////////////////////////////////////////////////
  686. // Send Page
  687. //
  688. const static HELPMAP g_rgCtxMapSendMail[] =
  689. {
  690. {IDC_SAVE_CHECK, IDH_MAIL_SEND_SAVE_COPY},
  691. {IDC_SENDIMMEDIATE_CHECK, IDH_NEWSMAIL_SEND_ADVSET_SEND_IMMED},
  692. {IDC_AUTOWAB_CHECK, IDH_OPTIONS_ADD_REPLIES},
  693. {IDC_INCLUDE_CHECK, IDH_NEWS_SEND_MESS_IN_REPLY},
  694. {IDC_REPLY_IN_ORIGFMT, IDH_OPTIONS_REPLY_USING_SENT_FORMAT},
  695. {idrbMailHTML, IDH_SEND_HTML},
  696. {idrbMailPlain, IDH_SEND_PLAINTEXT},
  697. {idbtnMailHTML, 353718},
  698. {idbtnMailPlain, IDH_SEND_SETTINGS},
  699. {idrbNewsHTML, IDH_SEND_HTML},
  700. {idrbNewsPlain, IDH_SEND_PLAINTEXT},
  701. {idbtnNewsHTML, 353718},
  702. {idbtnNewsPlain, IDH_SEND_SETTINGS},
  703. {idbtnSendIntl, IDH_SEND_SETTINGS},
  704. {IDC_USEAUTOCOMPLETE_CHECK, 502065},
  705. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  706. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  707. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  708. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  709. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  710. {IDC_MAILFORMAT_GROUP, IDH_NEWS_COMM_GROUPBOX},
  711. {IDC_SEND_ICON, IDH_NEWS_COMM_GROUPBOX},
  712. {IDC_MAIL_FORMAT_ICON, IDH_NEWS_COMM_GROUPBOX},
  713. {IDC_NEWS_FORMAT_ICON, IDH_NEWS_COMM_GROUPBOX},
  714. {0, 0}
  715. };
  716. INT_PTR CALLBACK SendDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  717. {
  718. LRESULT lResult;
  719. switch (message)
  720. {
  721. case WM_INITDIALOG:
  722. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Send_OnInitDialog);
  723. case WM_HELP:
  724. case WM_CONTEXTMENU:
  725. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapSendMail);
  726. case WM_COMMAND:
  727. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Send_OnCommand);
  728. return (TRUE);
  729. case WM_NOTIFY:
  730. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Send_OnNotify);
  731. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  732. return (TRUE);
  733. case WM_DESTROY:
  734. FreeIcon(hwnd, IDC_SEND_ICON);
  735. FreeIcon(hwnd, IDC_MAIL_FORMAT_ICON);
  736. FreeIcon(hwnd, IDC_NEWS_FORMAT_ICON);
  737. return (TRUE);
  738. }
  739. return (FALSE);
  740. }
  741. //
  742. // FUNCTION: Send_OnInitDialog()
  743. //
  744. // PURPOSE: Handles the WM_INITDIALOG for the Send Tab on the options
  745. // property sheet.
  746. //
  747. BOOL Send_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  748. {
  749. OPTINFO *pmoi = 0;
  750. DWORD dw;
  751. Assert(pmoi == NULL);
  752. pmoi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  753. Assert(pmoi != NULL);
  754. // Send Options
  755. ButtonChkFromOptInfo(hwnd, IDC_SAVE_CHECK, pmoi, OPT_SAVESENTMSGS);
  756. ButtonChkFromOptInfo(hwnd, IDC_SENDIMMEDIATE_CHECK, pmoi, OPT_SENDIMMEDIATE);
  757. ButtonChkFromOptInfo(hwnd, IDC_AUTOWAB_CHECK, pmoi, OPT_MAIL_AUTOADDTOWABONREPLY);
  758. ButtonChkFromOptInfo(hwnd, IDC_USEAUTOCOMPLETE_CHECK, pmoi, OPT_USEAUTOCOMPLETE);
  759. ButtonChkFromOptInfo(hwnd, IDC_INCLUDE_CHECK, pmoi, OPT_INCLUDEMSG);
  760. ButtonChkFromOptInfo(hwnd, IDC_REPLY_IN_ORIGFMT, pmoi, OPT_REPLYINORIGFMT);
  761. // Mail Format
  762. dw = IDwGetOption(pmoi->pOpt, OPT_MAIL_SEND_HTML);
  763. CheckDlgButton(hwnd, dw ? idrbMailHTML : idrbMailPlain, BST_CHECKED);
  764. // News Format
  765. dw = IDwGetOption(pmoi->pOpt, OPT_NEWS_SEND_HTML);
  766. CheckDlgButton(hwnd, dw ? idrbNewsHTML : idrbNewsPlain, BST_CHECKED);
  767. // Hide these controls in news-only mode
  768. if (g_dwAthenaMode & MODE_NEWSONLY)
  769. {
  770. EnableWindow(GetDlgItem(hwnd, IDC_MAILFORMAT_GROUP), FALSE);
  771. EnableWindow(GetDlgItem(hwnd, IDC_MAILFORMAT_STATIC), FALSE);
  772. EnableWindow(GetDlgItem(hwnd, idrbMailHTML), FALSE);
  773. EnableWindow(GetDlgItem(hwnd, idrbMailPlain), FALSE);
  774. EnableWindow(GetDlgItem(hwnd, idbtnMailHTML), FALSE);
  775. EnableWindow(GetDlgItem(hwnd, idbtnMailPlain), FALSE);
  776. EnableWindow(GetDlgItem(hwnd, idcStatic3), FALSE);
  777. EnableWindow(GetDlgItem(hwnd, idcStatic4), FALSE);
  778. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_FORMAT_ICON), FALSE);
  779. EnableWindow(GetDlgItem(hwnd, idbtnSendIntl), FALSE);
  780. EnableWindow(GetDlgItem(hwnd, IDC_AUTOWAB_CHECK), FALSE);
  781. }
  782. // Pictures
  783. HICON hIcon;
  784. hIcon = ImageList_GetIcon(pmoi->himl, ID_SENDING, ILD_TRANSPARENT);
  785. SendDlgItemMessage(hwnd, IDC_SEND_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  786. hIcon = ImageList_GetIcon(pmoi->himl, ID_MAIL_FORMAT, ILD_TRANSPARENT);
  787. SendDlgItemMessage(hwnd, IDC_MAIL_FORMAT_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  788. hIcon = ImageList_GetIcon(pmoi->himl, ID_NEWS_FORMAT, ILD_TRANSPARENT);
  789. SendDlgItemMessage(hwnd, IDC_NEWS_FORMAT_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  790. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pmoi);
  791. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  792. return (TRUE);
  793. }
  794. //
  795. // FUNCTION: Send_OnCommand()
  796. //
  797. // PURPOSE: Command handler for the Send tab on the Options
  798. // property sheet.
  799. //
  800. void Send_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  801. {
  802. OPTINFO *pmoi = 0;
  803. HTMLOPT rHtmlOpt;
  804. PLAINOPT rPlainOpt;
  805. // Get our stored options info
  806. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  807. if (pmoi == NULL)
  808. return;
  809. switch (id)
  810. {
  811. case IDC_SAVE_CHECK:
  812. case IDC_SENDIMMEDIATE_CHECK:
  813. case IDC_AUTOWAB_CHECK:
  814. case IDC_USEAUTOCOMPLETE_CHECK:
  815. case IDC_INCLUDE_CHECK:
  816. case IDC_REPLY_IN_ORIGFMT:
  817. if (codeNotify == BN_CLICKED)
  818. SetPageDirty(pmoi, hwnd, PAGE_SEND);
  819. break;
  820. case idbtnMailHTML:
  821. if (codeNotify == BN_CLICKED)
  822. {
  823. ZeroMemory(&rHtmlOpt, sizeof(rHtmlOpt));
  824. HtmlOptFromMailOpt(&rHtmlOpt, pmoi);
  825. if(FGetHTMLOptions(hwnd, &rHtmlOpt))
  826. {
  827. MailOptFromHtmlOpt(&rHtmlOpt, pmoi);
  828. SetPageDirty(pmoi, hwnd, PAGE_SEND);
  829. }
  830. }
  831. break;
  832. case idbtnSendIntl:
  833. if (codeNotify == BN_CLICKED)
  834. SetSendCharSetDlg(hwnd);
  835. break;
  836. case idbtnMailPlain:
  837. if (codeNotify == BN_CLICKED)
  838. {
  839. ZeroMemory(&rPlainOpt, sizeof(PLAINOPT));
  840. PlainOptFromMailOpt(&rPlainOpt, pmoi);
  841. if(FGetPlainOptions(hwnd, &rPlainOpt))
  842. {
  843. MailOptFromPlainOpt(&rPlainOpt, pmoi);
  844. SetPageDirty(pmoi, hwnd, PAGE_SEND);
  845. }
  846. }
  847. break;
  848. case idbtnNewsHTML:
  849. if (codeNotify == BN_CLICKED)
  850. {
  851. ZeroMemory(&rHtmlOpt, sizeof(rHtmlOpt));
  852. HtmlOptFromNewsOpt(&rHtmlOpt, pmoi);
  853. if(FGetHTMLOptions(hwnd, &rHtmlOpt))
  854. {
  855. NewsOptFromHtmlOpt(&rHtmlOpt, pmoi);
  856. SetPageDirty(pmoi, hwnd, PAGE_SEND);
  857. }
  858. }
  859. break;
  860. case idbtnNewsPlain:
  861. if (codeNotify == BN_CLICKED)
  862. {
  863. ZeroMemory(&rPlainOpt, sizeof(PLAINOPT));
  864. PlainOptFromNewsOpt(&rPlainOpt, pmoi);
  865. if(FGetPlainOptions(hwnd, &rPlainOpt))
  866. {
  867. NewsOptFromPlainOpt(&rPlainOpt, pmoi);
  868. SetPageDirty(pmoi, hwnd, PAGE_SEND);
  869. }
  870. }
  871. break;
  872. case idrbMailHTML:
  873. case idrbMailPlain:
  874. case idrbNewsHTML:
  875. case idrbNewsPlain:
  876. if (codeNotify == BN_CLICKED)
  877. SetPageDirty(pmoi, hwnd, PAGE_SEND);
  878. break;
  879. }
  880. }
  881. //
  882. // FUNCTION: Send_OnNotify()
  883. //
  884. // PURPOSE: Handles the PSN_APPLY notification for the Send Tab.
  885. //
  886. LRESULT Send_OnNotify(HWND hwnd, int id, NMHDR *pnmhdr)
  887. {
  888. OPTINFO *pmoi = 0;
  889. DWORD dw, dwOld;
  890. if (PSN_APPLY == pnmhdr->code)
  891. {
  892. // Get our stored options info
  893. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  894. Assert(pmoi != NULL);
  895. // Send Options
  896. ButtonChkToOptInfo(hwnd, IDC_SAVE_CHECK, pmoi, OPT_SAVESENTMSGS);
  897. ButtonChkToOptInfo(hwnd, IDC_AUTOWAB_CHECK, pmoi, OPT_MAIL_AUTOADDTOWABONREPLY);
  898. ButtonChkToOptInfo(hwnd, IDC_USEAUTOCOMPLETE_CHECK, pmoi, OPT_USEAUTOCOMPLETE);
  899. ButtonChkToOptInfo(hwnd, IDC_INCLUDE_CHECK, pmoi, OPT_INCLUDEMSG);
  900. ButtonChkToOptInfo(hwnd, IDC_REPLY_IN_ORIGFMT, pmoi, OPT_REPLYINORIGFMT);
  901. // see if the send immediate option has changed from true->false, if so we
  902. // blow away the dontshow registry for sending to the outbox.
  903. dwOld = IDwGetOption(pmoi->pOpt, OPT_SENDIMMEDIATE);
  904. dw = (IsDlgButtonChecked(hwnd, IDC_SENDIMMEDIATE_CHECK) == BST_CHECKED);
  905. ISetDwOption(pmoi->pOpt, OPT_SENDIMMEDIATE, dw, NULL, 0);
  906. if (dwOld && !dw)
  907. SetDontShowAgain(0, (LPSTR) c_szDSSendMail);
  908. // Mail / News format
  909. ButtonChkToOptInfo(hwnd, idrbMailHTML, pmoi, OPT_MAIL_SEND_HTML);
  910. ButtonChkToOptInfo(hwnd, idrbNewsHTML, pmoi, OPT_NEWS_SEND_HTML);
  911. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  912. return (PSNRET_NOERROR);
  913. }
  914. return (0);
  915. }
  916. /////////////////////////////////////////////////////////////////////////////
  917. // Read Page
  918. //
  919. static const HELPMAP g_rgCtxMapMailRead[] =
  920. {
  921. {IDC_PREVIEW_CHECK, IDH_MAIL_OPT_READ_MARK_READ},
  922. {IDC_MARKASREAD_EDIT, IDH_MAIL_OPT_READ_MARK_READ},
  923. {IDC_MARKASREAD_SPIN, IDH_MAIL_OPT_READ_MARK_READ},
  924. {idcStatic2, IDH_MAIL_OPT_READ_MARK_READ},
  925. {idcDownloadChunks, IDH_NEWS_OPT_READ_DOWNLOAD_SUBJ},
  926. {idcStatic1, IDH_NEWS_OPT_READ_DOWNLOAD_SUBJ},
  927. {idcNumSubj, IDH_NEWS_OPT_READ_DOWNLOAD_SUBJ},
  928. {idcSpinNumSubj, IDH_NEWS_OPT_READ_DOWNLOAD_SUBJ},
  929. {idcAutoExpand, IDH_NEWS_OPT_READ_AUTO_EXPAND},
  930. {idcAutoFillPreview, IDH_NEWS_OPT_IN_PREVIEW},
  931. {idcMarkAllRead, IDH_NEWS_OPT_READ_MARK_ALL_EXIT},
  932. {idcAutoInline, IDH_OPTIONS_READ_SHOW_PICTURE_ATTACHMENTS},
  933. {idcAutoInlineSlide, IDH_OPTIONS_READ_SHOW_SLIDESHOW},
  934. {IDC_FONTSETTINGS, IDH_OPTIONS_READ_FONT_SETTINGS},
  935. {idcIntlButton, IDH_OPTIONS_READ_INTL_SETTINGS},
  936. {idcTooltips, 502050},
  937. {IDC_WATCHED_COLOR, 35526},
  938. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  939. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  940. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  941. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  942. {idcStatic7, IDH_NEWS_COMM_GROUPBOX},
  943. {idcStatic8, IDH_NEWS_COMM_GROUPBOX},
  944. {idcStatic9, IDH_NEWS_COMM_GROUPBOX},
  945. {IDC_READ_ICON, IDH_NEWS_COMM_GROUPBOX},
  946. {IDC_READ_NEWS_ICON, IDH_NEWS_COMM_GROUPBOX},
  947. {IDC_FONTS_ICON, IDH_NEWS_COMM_GROUPBOX},
  948. {0, 0}
  949. };
  950. INT_PTR CALLBACK ReadDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  951. {
  952. LRESULT lResult;
  953. switch (message)
  954. {
  955. case WM_INITDIALOG:
  956. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Read_OnInitDialog);
  957. case WM_HELP:
  958. case WM_CONTEXTMENU:
  959. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapMailRead);
  960. case WM_COMMAND:
  961. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Read_OnCommand);
  962. return (TRUE);
  963. case WM_NOTIFY:
  964. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Read_OnNotify);
  965. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  966. return (TRUE);
  967. case WM_DRAWITEM:
  968. Color_WMDrawItem((LPDRAWITEMSTRUCT) lParam, iColorCombo);
  969. return (FALSE);
  970. case WM_MEASUREITEM:
  971. {
  972. LPMEASUREITEMSTRUCT pmis = (LPMEASUREITEMSTRUCT) lParam;
  973. HWND hwndColor = GetDlgItem(hwnd, IDC_WATCHED_COLOR);
  974. HDC hdc = GetDC(hwndColor);
  975. if (hdc)
  976. {
  977. Color_WMMeasureItem(hdc, pmis, iColorCombo);
  978. ReleaseDC(hwndColor, hdc);
  979. }
  980. return (TRUE);
  981. }
  982. case WM_DESTROY:
  983. FreeIcon(hwnd, IDC_READ_ICON);
  984. FreeIcon(hwnd, IDC_READ_NEWS_ICON);
  985. FreeIcon(hwnd, IDC_FONTS_ICON);
  986. return (TRUE);
  987. }
  988. return(FALSE);
  989. }
  990. //
  991. // FUNCTION: Read_OnInitDialog()
  992. //
  993. // PURPOSE: Handles the WM_INITDIALOG for the Read Tab on the options
  994. // property sheet.
  995. //
  996. BOOL Read_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  997. {
  998. DWORD dw;
  999. OPTINFO *pmoi = 0;
  1000. Assert(pmoi == NULL);
  1001. pmoi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  1002. Assert(pmoi != NULL);
  1003. // Preview pane timer
  1004. InitCheckCounterFromOptInfo(hwnd, IDC_PREVIEW_CHECK, IDC_MARKASREAD_EDIT,
  1005. IDC_MARKASREAD_SPIN, pmoi, OPT_MARKASREAD);
  1006. ButtonChkFromOptInfo(hwnd, idcAutoExpand, pmoi, OPT_AUTOEXPAND);
  1007. ButtonChkFromOptInfo(hwnd, idcAutoFillPreview, pmoi, OPT_AUTOFILLPREVIEW);
  1008. ButtonChkFromOptInfo(hwnd, idcTooltips, pmoi, OPT_MESSAGE_LIST_TIPS);
  1009. ButtonChkFromOptInfo(hwnd, IDC_READ_IN_TEXT_ONLY, pmoi, OPT_READ_IN_TEXT_ONLY);
  1010. // Watched color
  1011. DWORD dwColor = DwGetOption(OPT_WATCHED_COLOR);
  1012. HWND hwndColor = GetDlgItem(hwnd, IDC_WATCHED_COLOR);
  1013. SetIntlFont(hwndColor);
  1014. // Create the color control
  1015. HrCreateComboColor(hwndColor);
  1016. Assert(dwColor <= 16);
  1017. ComboBox_SetCurSel(hwndColor, dwColor);
  1018. // Download 300 headers at a time
  1019. InitCheckCounterFromOptInfo(hwnd, idcDownloadChunks, idcNumSubj, idcSpinNumSubj,
  1020. pmoi, OPT_DOWNLOADCHUNKS);
  1021. ButtonChkFromOptInfo(hwnd, idcMarkAllRead, pmoi, OPT_MARKALLREAD);
  1022. // Pictures
  1023. HICON hIcon;
  1024. hIcon = ImageList_GetIcon(pmoi->himl, ID_READING, ILD_TRANSPARENT);
  1025. SendDlgItemMessage(hwnd, IDC_READ_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1026. hIcon = ImageList_GetIcon(pmoi->himl, ID_READ_NEWS, ILD_TRANSPARENT);
  1027. SendDlgItemMessage(hwnd, IDC_READ_NEWS_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1028. hIcon = ImageList_GetIcon(pmoi->himl, ID_FONTS, ILD_TRANSPARENT);
  1029. SendDlgItemMessage(hwnd, IDC_FONTS_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1030. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pmoi);
  1031. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1032. return(TRUE);
  1033. }
  1034. //
  1035. // FUNCTION: Read_OnCommand()
  1036. //
  1037. // PURPOSE: Command handler for the Read tab on the Options
  1038. // property sheet.
  1039. //
  1040. void Read_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  1041. {
  1042. DWORD dw, dwPreview, dwDownload;
  1043. OPTINFO *pmoi = 0;
  1044. BOOL f;
  1045. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1046. if (pmoi == NULL)
  1047. return;
  1048. switch (id)
  1049. {
  1050. case IDC_PREVIEW_CHECK:
  1051. if (codeNotify == BN_CLICKED)
  1052. {
  1053. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  1054. EnableWindow(GetDlgItem(hwnd, IDC_MARKASREAD_EDIT), f);
  1055. EnableWindow(GetDlgItem(hwnd, IDC_MARKASREAD_SPIN), f);
  1056. SetPageDirty(pmoi, hwnd, PAGE_READ);
  1057. }
  1058. break;
  1059. case idcAutoExpand:
  1060. case idcAutoFillPreview:
  1061. case idcMarkAllRead:
  1062. case idcAutoInlineSlide:
  1063. case idcTooltips:
  1064. case IDC_READ_IN_TEXT_ONLY:
  1065. if (codeNotify == BN_CLICKED)
  1066. SetPageDirty(pmoi, hwnd, PAGE_READ);
  1067. break;
  1068. case idcDownloadChunks:
  1069. if (codeNotify == BN_CLICKED)
  1070. {
  1071. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  1072. EnableWindow(GetDlgItem(hwnd, idcNumSubj), f);
  1073. EnableWindow(GetDlgItem(hwnd, idcSpinNumSubj), f);
  1074. SetPageDirty(pmoi, hwnd, PAGE_READ);
  1075. }
  1076. break;
  1077. case IDC_MARKASREAD_EDIT:
  1078. case idcNumSubj:
  1079. if (codeNotify == EN_CHANGE)
  1080. SetPageDirty(pmoi, hwnd, PAGE_READ);
  1081. break;
  1082. case IDC_FONTSETTINGS:
  1083. ChangeFontSettings(hwnd);
  1084. break;
  1085. case idcIntlButton:
  1086. if (codeNotify == BN_CLICKED)
  1087. IntlCharsetMapDialogBox(hwnd);
  1088. break;
  1089. case IDC_WATCHED_COLOR:
  1090. if (codeNotify == CBN_SELENDOK)
  1091. SetPageDirty(pmoi, hwnd, PAGE_READ);
  1092. break;
  1093. }
  1094. }
  1095. //
  1096. // FUNCTION: Read_OnNotify()
  1097. //
  1098. // PURPOSE: Handles the PSN_APPLY notification for the Read Tab.
  1099. //
  1100. LRESULT Read_OnNotify(HWND hwnd, int id, NMHDR *pnmhdr)
  1101. {
  1102. DWORD dw, dwPreview, dwDownload;
  1103. WORD code;
  1104. OPTINFO *pmoi = 0;
  1105. BOOL f;
  1106. if (PSN_APPLY == pnmhdr->code)
  1107. {
  1108. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1109. Assert(pmoi != NULL);
  1110. if (!GetCheckCounter(&dwPreview, hwnd, IDC_PREVIEW_CHECK, IDC_MARKASREAD_EDIT, IDC_MARKASREAD_SPIN))
  1111. return (InvalidOptionProp(hwnd, IDC_MARKASREAD_EDIT, idsEnterPreviewTime, iddOpt_Read));
  1112. if (!GetCheckCounter(&dwDownload, hwnd, idcDownloadChunks, idcNumSubj, idcSpinNumSubj))
  1113. return (InvalidOptionProp(hwnd, idcNumSubj, idsEnterDownloadChunks, iddOpt_Read));
  1114. ISetDwOption(pmoi->pOpt, OPT_MARKASREAD, dwPreview, NULL, 0);
  1115. ISetDwOption(pmoi->pOpt, OPT_DOWNLOADCHUNKS, dwDownload, NULL, 0);
  1116. ButtonChkToOptInfo(hwnd, idcAutoExpand, pmoi, OPT_AUTOEXPAND);
  1117. ButtonChkToOptInfo(hwnd, idcAutoFillPreview, pmoi, OPT_AUTOFILLPREVIEW);
  1118. ButtonChkToOptInfo(hwnd, idcMarkAllRead, pmoi, OPT_MARKALLREAD);
  1119. ButtonChkToOptInfo(hwnd, idcTooltips, pmoi, OPT_MESSAGE_LIST_TIPS);
  1120. ButtonChkToOptInfo(hwnd, IDC_READ_IN_TEXT_ONLY, pmoi, OPT_READ_IN_TEXT_ONLY);
  1121. if (CB_ERR != (dw = ComboBox_GetCurSel(GetDlgItem(hwnd, IDC_WATCHED_COLOR))))
  1122. ISetDwOption(pmoi->pOpt, OPT_WATCHED_COLOR, dw, NULL, 0);
  1123. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1124. return (PSNRET_NOERROR);
  1125. }
  1126. return (0);
  1127. }
  1128. /////////////////////////////////////////////////////////////////////////////
  1129. // Security Page
  1130. //
  1131. const static HELPMAP g_rgCtxMapSec[] =
  1132. {
  1133. {IDC_SIGN_CHECK, IDH_OPTIONS_ADD_DIGITAL_SIGNATURE},
  1134. {IDC_ENCRYPT_CHECK, IDH_OPTIONS_ENCRYPT_MESSAGES},
  1135. {IDC_ADVSETTINGS_BUTTON, IDH_OPTIONS_SECURITY_ADVANCED},
  1136. {IDC_INTERNET_ZONE, IDH_SECURITY_ZONES_SETTINGS},
  1137. {IDC_RESTRICTED_ZONE, IDH_SECURITY_ZONES_SETTINGS},
  1138. {IDC_SENDMAIL_WARN_CHECK, IDH_SECURITY_SENDMAIL_WARN},
  1139. {IDC_SAFE_ATTACHMENT_CHECK, IDH_SECURITY_SAFE_ATTACHMENTS},
  1140. {idbtnDigitalID, IDH_GET_DIGITAL_ID},
  1141. {idbtnMoreInfo, IDH_MORE_ON_CERTIFICATES},
  1142. {idbtnIDs, 355544},
  1143. {IDC_SEC_LABEL, IDH_SECURITY_LABEL},
  1144. {IDC_SELECT_LABEL, IDH_SECURITY_SETLABEL},
  1145. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  1146. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  1147. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  1148. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  1149. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  1150. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  1151. {idcStatic7, IDH_NEWS_COMM_GROUPBOX},
  1152. {idcStatic8, IDH_NEWS_COMM_GROUPBOX},
  1153. {IDC_SECURITY_ZONE_ICON, IDH_NEWS_COMM_GROUPBOX},
  1154. {IDC_SECURE_MAIL_ICON, IDH_NEWS_COMM_GROUPBOX},
  1155. {0, 0}
  1156. };
  1157. INT_PTR CALLBACK SecurityDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  1158. {
  1159. LRESULT lResult;
  1160. switch (message)
  1161. {
  1162. case WM_INITDIALOG:
  1163. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Security_OnInitDialog);
  1164. case WM_HELP:
  1165. case WM_CONTEXTMENU:
  1166. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapSec);
  1167. case WM_COMMAND:
  1168. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Security_OnCommand);
  1169. return (TRUE);
  1170. case WM_NOTIFY:
  1171. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Security_OnNotify);
  1172. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  1173. return (TRUE);
  1174. case WM_DESTROY:
  1175. FreeIcon(hwnd, IDC_SECURITY_ZONE_ICON);
  1176. FreeIcon(hwnd, IDC_SECURE_MAIL_ICON);
  1177. return (TRUE);
  1178. }
  1179. return(FALSE);
  1180. }
  1181. //
  1182. // FUNCTION: Security_OnInitDialog()
  1183. //
  1184. // PURPOSE: Handles the WM_INITDIALOG for the Security Tab on the options
  1185. // property sheet.
  1186. //
  1187. BOOL Security_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  1188. {
  1189. OPTINFO *poi = 0;
  1190. DWORD dw;
  1191. Assert(poi == NULL);
  1192. poi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  1193. Assert(poi != NULL);
  1194. ButtonChkFromOptInfo(hwnd, IDC_SIGN_CHECK, poi, OPT_MAIL_DIGSIGNMESSAGES);
  1195. ButtonChkFromOptInfo(hwnd, IDC_ENCRYPT_CHECK, poi, OPT_MAIL_ENCRYPTMESSAGES);
  1196. ButtonChkFromOptInfo(hwnd, IDC_SENDMAIL_WARN_CHECK, poi, OPT_SECURITY_MAPI_SEND);
  1197. ButtonChkFromOptInfo(hwnd, IDC_SAFE_ATTACHMENT_CHECK, poi, OPT_SECURITY_ATTACHMENT);
  1198. #ifdef FORCE_UNTRUSTED
  1199. dw = URLZONE_UNTRUSTED;
  1200. #else // FORCE_UNTRUSTED
  1201. dw = IDwGetOption(poi->pOpt, OPT_SECURITYZONE);
  1202. #endif // FORCE_UNTRUSTED
  1203. CheckDlgButton(hwnd, dw == URLZONE_INTERNET ? IDC_INTERNET_ZONE : IDC_RESTRICTED_ZONE, BST_CHECKED);
  1204. if (DwGetOption(OPT_SECURITYZONELOCKED) != 0)
  1205. {
  1206. EnableWindow(GetDlgItem(hwnd, IDC_INTERNET_ZONE), FALSE);
  1207. EnableWindow(GetDlgItem(hwnd, IDC_RESTRICTED_ZONE), FALSE);
  1208. }
  1209. if (DwGetOption(OPT_SECURITY_MAPI_SEND_LOCKED) != 0)
  1210. {
  1211. EnableWindow(GetDlgItem(hwnd, IDC_SENDMAIL_WARN_CHECK), FALSE);
  1212. }
  1213. if (DwGetOption(OPT_SECURITY_ATTACHMENT_LOCKED) != 0)
  1214. {
  1215. EnableWindow(GetDlgItem(hwnd, IDC_SAFE_ATTACHMENT_CHECK), FALSE);
  1216. }
  1217. // Hide these controls in news-only mode
  1218. if (g_dwAthenaMode & MODE_NEWSONLY)
  1219. {
  1220. EnableWindow(GetDlgItem(hwnd, IDC_SECURITYSETTINGS_GROUP), FALSE);
  1221. EnableWindow(GetDlgItem(hwnd, IDC_SECURITYSETTINGS_STATIC), FALSE);
  1222. EnableWindow(GetDlgItem(hwnd, IDC_SIGN_CHECK), FALSE);
  1223. EnableWindow(GetDlgItem(hwnd, IDC_ENCRYPT_CHECK), FALSE);
  1224. EnableWindow(GetDlgItem(hwnd, IDC_ADVSETTINGS_BUTTON), FALSE);
  1225. #ifdef SMIME_V3
  1226. EnableWindow(GetDlgItem(hwnd, IDC_SELECT_LABEL), FALSE);
  1227. EnableWindow(GetDlgItem(hwnd, IDC_SEC_LABEL), FALSE);
  1228. #endif // SMIME_V3
  1229. EnableWindow(GetDlgItem(hwnd, IDC_DIGITALIDS_GROUP), FALSE);
  1230. EnableWindow(GetDlgItem(hwnd, IDC_DIGITALIDS_STATIC), FALSE);
  1231. EnableWindow(GetDlgItem(hwnd, idbtnDigitalID), FALSE);
  1232. EnableWindow(GetDlgItem(hwnd, idbtnIDs), FALSE);
  1233. EnableWindow(GetDlgItem(hwnd, idbtnMoreInfo), FALSE);
  1234. EnableWindow(GetDlgItem(hwnd, idcStatic2), FALSE);
  1235. EnableWindow(GetDlgItem(hwnd, idcStatic3), FALSE);
  1236. EnableWindow(GetDlgItem(hwnd, idcStatic4), FALSE);
  1237. EnableWindow(GetDlgItem(hwnd, idcStatic5), FALSE);
  1238. EnableWindow(GetDlgItem(hwnd, idcStatic6), FALSE);
  1239. EnableWindow(GetDlgItem(hwnd, IDC_SECURE_MAIL_ICON), FALSE);
  1240. }
  1241. // Pictures
  1242. HICON hIcon;
  1243. hIcon = ImageList_GetIcon(poi->himl, ID_SECURITY_ZONE, ILD_TRANSPARENT);
  1244. SendDlgItemMessage(hwnd, IDC_SECURITY_ZONE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1245. hIcon = ImageList_GetIcon(poi->himl, ID_SECURE_MAIL, ILD_TRANSPARENT);
  1246. SendDlgItemMessage(hwnd, IDC_SECURE_MAIL_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1247. #ifdef SMIME_V3
  1248. if (!FPresentPolicyRegInfo())
  1249. {
  1250. ShowWindow(GetDlgItem(hwnd, IDC_SEC_LABEL), SW_HIDE);
  1251. ShowWindow(GetDlgItem(hwnd, IDC_SELECT_LABEL), SW_HIDE);
  1252. }
  1253. else
  1254. ButtonChkFromOptInfo(hwnd, IDC_SEC_LABEL, poi, OPT_USE_LABELS);
  1255. #endif // SMIME_V3
  1256. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)poi);
  1257. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1258. return(TRUE);
  1259. }
  1260. //
  1261. // FUNCTION: Security_OnCommand()
  1262. //
  1263. // PURPOSE: Command handler for the Security tab on the Options
  1264. // property sheet.
  1265. //
  1266. void Security_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  1267. {
  1268. OPTINFO *poi = 0;
  1269. poi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1270. if (poi == NULL)
  1271. return;
  1272. switch (id)
  1273. {
  1274. case idbtnDigitalID:
  1275. GetDigitalIDs(NULL);
  1276. break;
  1277. case idbtnIDs:
  1278. ShowDigitalIDs(hwnd);
  1279. break;
  1280. case idbtnMoreInfo:
  1281. if (codeNotify == BN_CLICKED)
  1282. {
  1283. OEHtmlHelp(hwnd, "%SYSTEMROOT%\\help\\msoe.chm>large_context", HH_DISPLAY_TOPIC, (DWORD_PTR) (LPCSTR) "mail_overview_send_secure_messages.htm");
  1284. }
  1285. break;
  1286. case IDC_INTERNET_ZONE:
  1287. case IDC_RESTRICTED_ZONE:
  1288. case IDC_SENDMAIL_WARN_CHECK:
  1289. case IDC_SAFE_ATTACHMENT_CHECK:
  1290. case IDC_SIGN_CHECK:
  1291. #ifdef SMIME_V3
  1292. case IDC_SEC_LABEL:
  1293. #endif // SMIME_V3
  1294. case IDC_ENCRYPT_CHECK:
  1295. if (codeNotify == BN_CLICKED)
  1296. PropSheet_Changed(GetParent(hwnd), hwnd);
  1297. break;
  1298. #ifdef SMIME_V3
  1299. case IDC_SELECT_LABEL:
  1300. if (codeNotify == BN_CLICKED)
  1301. {
  1302. FGetSecLabel(hwnd, poi);
  1303. }
  1304. break;
  1305. #endif // SMIME_V3
  1306. case IDC_ADVSETTINGS_BUTTON:
  1307. if (codeNotify == BN_CLICKED)
  1308. FGetAdvSecOptions(hwnd, poi);
  1309. break;
  1310. }
  1311. }
  1312. //
  1313. // FUNCTION: Security_OnNotify()
  1314. //
  1315. // PURPOSE: Handles the PSN_APPLY notification for the Security Tab.
  1316. //
  1317. LRESULT Security_OnNotify(HWND hwnd, int id, NMHDR *pnmhdr)
  1318. {
  1319. OPTINFO *poi;
  1320. if (pnmhdr->code == PSN_APPLY)
  1321. {
  1322. // make sure something has changed
  1323. poi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1324. Assert(poi != NULL);
  1325. // update the global options based on states of the controls
  1326. ButtonChkToOptInfo(hwnd, IDC_SIGN_CHECK, poi, OPT_MAIL_DIGSIGNMESSAGES);
  1327. ButtonChkToOptInfo(hwnd, IDC_ENCRYPT_CHECK, poi, OPT_MAIL_ENCRYPTMESSAGES);
  1328. if (IsWindowEnabled(GetDlgItem(hwnd, IDC_SENDMAIL_WARN_CHECK)))
  1329. ButtonChkToOptInfo(hwnd, IDC_SENDMAIL_WARN_CHECK, poi, OPT_SECURITY_MAPI_SEND);
  1330. if (IsWindowEnabled(GetDlgItem(hwnd, IDC_SAFE_ATTACHMENT_CHECK)))
  1331. ButtonChkToOptInfo(hwnd, IDC_SAFE_ATTACHMENT_CHECK, poi, OPT_SECURITY_ATTACHMENT);
  1332. #ifdef SMIME_V3
  1333. ButtonChkToOptInfo(hwnd, IDC_SEC_LABEL, poi, OPT_USE_LABELS);
  1334. #endif
  1335. #ifdef FORCE_UNTRUSTED
  1336. DWORD dwZone = URLZONE_UNTRUSTED;
  1337. #else // FORCE_UNTRUSTED
  1338. DWORD dwZone = URLZONE_INTERNET;
  1339. if (IsDlgButtonChecked(hwnd, IDC_RESTRICTED_ZONE))
  1340. {
  1341. dwZone = URLZONE_UNTRUSTED;
  1342. }
  1343. #endif // FORCE_UNTRUSTED
  1344. ISetDwOption(poi->pOpt, OPT_SECURITYZONE, dwZone, NULL, 0);
  1345. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1346. return (PSNRET_NOERROR);
  1347. }
  1348. return (0);
  1349. }
  1350. BOOL FGetAdvSecOptions(HWND hwndParent, OPTINFO *opie)
  1351. {
  1352. return (DialogBoxParam(g_hLocRes, MAKEINTRESOURCE(iddAdvSecurity),
  1353. hwndParent, AdvSecurityDlgProc, (LPARAM)opie)==IDOK);
  1354. }
  1355. #ifdef SMIME_V3
  1356. BOOL FGetSecLabel(HWND hwndParent, OPTINFO *opie)
  1357. {
  1358. PSMIME_SECURITY_LABEL plabel = NULL;
  1359. BOOL fRes = FALSE;
  1360. HRESULT hr = HrGetOELabel(&plabel);
  1361. if(DialogBoxParamWrapW(g_hLocRes, MAKEINTRESOURCEW(iddSelectLabel),
  1362. hwndParent, SecurityLabelsDlgProc, (LPARAM) ((hr == S_OK) ? &plabel : NULL)) == IDOK)
  1363. {
  1364. hr = HrSetOELabel(plabel);
  1365. if(hr == S_OK)
  1366. fRes = TRUE;
  1367. }
  1368. // These two calls are temporary.
  1369. SecPolicyFree(plabel);
  1370. HrUnloadPolicyRegInfo(0);
  1371. return (fRes);
  1372. }
  1373. #endif // SMIME_V3
  1374. /////////////////////////////////////////////////////////////////////////////
  1375. // Connection Page
  1376. //
  1377. static const HELPMAP g_rgCtxMapDialup[] =
  1378. {
  1379. {idcNoConnectionRadio, IDH_OPTIONS_DIALUP_DONT_CONNECT},
  1380. {idcDialUpCombo, IDH_OPTIONS_DIALUP_CONNECTION_NUMBER},
  1381. {idcDialRadio, IDH_OPTIONS_DIALUP_CONNECTION_NUMBER},
  1382. {idcPromptRadio, IDH_OPTIONS_DIALUP_ASK},
  1383. {idcSwitchCheck, IDH_OPTIONS_DIALUP_WARN_BEFORE_SWITCHING},
  1384. {idcHangupCheck, IDH_OPTIONS_DIALUP_HANG_UP},
  1385. {idcDialupButton, 25252596},
  1386. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  1387. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  1388. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  1389. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  1390. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  1391. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  1392. {IDC_DIAL_START_ICON, IDH_NEWS_COMM_GROUPBOX},
  1393. {IDC_INTERNET_DIAL_ICON, IDH_NEWS_COMM_GROUPBOX},
  1394. {0, 0}
  1395. };
  1396. INT_PTR CALLBACK DialUpDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  1397. {
  1398. LRESULT lResult;
  1399. HWND hwndChangeButton;
  1400. OPTINFO *pmoi;
  1401. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1402. hwndChangeButton = GetDlgItem(hwnd, idcDialupButton);
  1403. switch (message)
  1404. {
  1405. case WM_INITDIALOG:
  1406. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Dial_OnInitDialog);
  1407. case WM_HELP:
  1408. case WM_CONTEXTMENU:
  1409. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapDialup);
  1410. case WM_COMMAND:
  1411. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Dial_OnCommand);
  1412. return (TRUE);
  1413. case WM_NOTIFY:
  1414. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Dial_OnNotify);
  1415. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  1416. return (TRUE);
  1417. case WM_DESTROY:
  1418. FreeIcon(hwnd, IDC_DIAL_START_ICON);
  1419. FreeIcon(hwnd, IDC_INTERNET_DIAL_ICON);
  1420. FreeIcon(hwnd, IDC_DIAL_ICON);
  1421. if (IsWindow(GetDlgItem(hwnd, IDC_AUTODISCOVERY_ICON)))
  1422. {
  1423. FreeIcon(hwnd, IDC_AUTODISCOVERY_ICON);
  1424. }
  1425. return (TRUE);
  1426. }
  1427. return(FALSE);
  1428. }
  1429. // FUNCTION: Dial_OnInitDialog()
  1430. //
  1431. // PURPOSE: Handles the WM_INITDIALOG for the Dial Tab on the options
  1432. // property sheet.
  1433. #define FEATURE_AUTODISCOVERY_DEFAULT FALSE
  1434. BOOL Dial_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  1435. {
  1436. OPTINFO *pmoi = 0;
  1437. DWORD dwEnableAutodial = 0, dwsize = sizeof(DWORD);
  1438. HICON hIcon;
  1439. pmoi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  1440. Assert(pmoi != NULL);
  1441. ButtonChkFromOptInfo(hwnd, idcSwitchCheck, pmoi, OPT_DIALUP_WARN_SWITCH);
  1442. ButtonChkFromOptInfo(hwnd, idcHangupCheck, pmoi, OPT_DIALUP_HANGUP_DONE);
  1443. EnableWindow(GetDlgItem(hwnd, idcSwitchCheck), IsRasInstalled());
  1444. EnableWindow(GetDlgItem(hwnd, idcHangupCheck), IsRasInstalled());
  1445. // Pictures
  1446. hIcon = ImageList_GetIcon(pmoi->himl, ID_CONNECTION_START, ILD_TRANSPARENT);
  1447. SendDlgItemMessage(hwnd, IDC_DIAL_START_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1448. hIcon = ImageList_GetIcon(pmoi->himl, ID_CONNECTION_INTERNET, ILD_TRANSPARENT);
  1449. SendDlgItemMessage(hwnd, IDC_INTERNET_DIAL_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1450. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pmoi);
  1451. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1452. #ifdef FEATURE_AUTODISCOVERY
  1453. // Is the AutoDiscovery feature available?
  1454. if (SHRegGetBoolUSValue(SZ_REGKEY_AUTODISCOVERY_POLICY, SZ_REGVALUE_AUTODISCOVERY_POLICY, FALSE, TRUE))
  1455. {
  1456. // Yes, so load the state into the controls.
  1457. SendDlgItemMessage(hwnd, IDC_AUTODISCOVERY_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1458. CheckDlgButton(hwnd, idcAutoDiscovery, SHRegGetBoolUSValue(SZ_REGKEY_AUTODISCOVERY, SZ_REGVALUE_AUTODISCOVERY, FALSE, FEATURE_AUTODISCOVERY_DEFAULT));
  1459. }
  1460. else
  1461. {
  1462. // No so remove the UI.
  1463. DestroyWindow(GetDlgItem(hwnd, idcStatic7));
  1464. DestroyWindow(GetDlgItem(hwnd, idcStatic8));
  1465. DestroyWindow(GetDlgItem(hwnd, IDC_AUTODISCOVERY_ICON));
  1466. DestroyWindow(GetDlgItem(hwnd, idcAutoDiscovery));
  1467. }
  1468. #endif FEATURE_AUTODISCOVERY
  1469. return(TRUE);
  1470. }
  1471. //
  1472. // FUNCTION: Dial_OnCommand()
  1473. //
  1474. // PURPOSE: Command handler for the Dial tab on the Options
  1475. // property sheet.
  1476. //
  1477. void Dial_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  1478. {
  1479. OPTINFO *pmoi = 0;
  1480. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1481. if (pmoi == NULL)
  1482. return;
  1483. switch (id)
  1484. {
  1485. case idcSwitchCheck:
  1486. case idcHangupCheck:
  1487. case idcAutoDiscovery:
  1488. if (codeNotify == BN_CLICKED)
  1489. SetPageDirty(pmoi, hwnd, PAGE_DIALUP);
  1490. break;
  1491. case idcDialupButton:
  1492. {
  1493. AssertSz(!!LaunchConnectionDialog, TEXT("LoadLibrary failed on INETCPL.CPL"));
  1494. if (LaunchConnectionDialog != NULL)
  1495. {
  1496. LaunchConnectionDialog(hwnd);
  1497. }
  1498. break;
  1499. }
  1500. }
  1501. }
  1502. //
  1503. // FUNCTION: Dial_OnNotify()
  1504. //
  1505. // PURPOSE: Handles the PSN_APPLY notification for the Dial Tab.
  1506. //
  1507. LRESULT Dial_OnNotify(HWND hwnd, int id, NMHDR *pnmhdr)
  1508. {
  1509. OPTINFO *pmoi = 0;
  1510. if (PSN_APPLY == pnmhdr->code)
  1511. {
  1512. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1513. Assert(pmoi != NULL);
  1514. ButtonChkToOptInfo(hwnd, idcSwitchCheck, pmoi, OPT_DIALUP_WARN_SWITCH);
  1515. ButtonChkToOptInfo(hwnd, idcHangupCheck, pmoi, OPT_DIALUP_HANGUP_DONE);
  1516. #ifdef FEATURE_AUTODISCOVERY
  1517. // Is the AutoDiscovery feature available?
  1518. if (SHRegGetBoolUSValue(SZ_REGKEY_AUTODISCOVERY_POLICY, SZ_REGVALUE_AUTODISCOVERY_POLICY, FALSE, TRUE))
  1519. {
  1520. // Yes, so set the AutoDiscovery Option
  1521. BOOL fAutoDiscoveryOn = IsDlgButtonChecked(hwnd, idcAutoDiscovery);
  1522. LPCTSTR pszValue = (fAutoDiscoveryOn ? TEXT("TRUE") : TEXT("FALSE"));
  1523. DWORD cbSize = ((lstrlen(pszValue) + 1) * sizeof(pszValue[0]));
  1524. SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_AUTODISCOVERY, SZ_REGVALUE_AUTODISCOVERY, REG_SZ, (LPCVOID) pszValue, cbSize);
  1525. }
  1526. #endif FEATURE_AUTODISCOVERY
  1527. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1528. return (PSNRET_NOERROR);
  1529. }
  1530. return (0);
  1531. }
  1532. /////////////////////////////////////////////////////////////////////////////
  1533. // Maintenance Page
  1534. //
  1535. const static HELPMAP g_rgCtxMapNOAdvnaced[] =
  1536. {
  1537. {idchDeleteMsgs, IDH_DELETE_AFTER_XXDAYS},
  1538. {idcStatic1, IDH_DELETE_AFTER_XXDAYS},
  1539. {ideDays, IDH_DELETE_AFTER_XXDAYS},
  1540. {idspDays, IDH_DELETE_AFTER_XXDAYS},
  1541. {idchDontCacheRead, IDH_DELETE_READ},
  1542. {ideCompactPer, IDH_COMPACT_WHEN_WASTED},
  1543. {idcStatic2, IDH_COMPACT_WHEN_WASTED},
  1544. {idcStatic3, IDH_COMPACT_WHEN_WASTED},
  1545. {idspCompactPer, IDH_COMPACT_WHEN_WASTED},
  1546. {idbManualCleanUp, IDH_CLEAN_UP_BUTTON},
  1547. {idcLogMailXport, IDH_OPTIONS_MAIL_TRANSPORT},
  1548. {idcLogNewsXport, IDH_OPTIONS_NEWS_TRANSPORT},
  1549. {idcLogNewsOffline, IDH_OPTIONS_OFFLINE_LOG},
  1550. {idcLogImapXport, IDH_OPTIONS_IMAP_TRANSPORT},
  1551. {idcLogHTTPMailXport, 355567},
  1552. {IDC_STORE_LOCATION, IDH_ADVANCED_STORE_FOLDER},
  1553. {IDC_EMPTY_CHECK, IDH_MAIL_OPT_READ_EMPTY_DELETED},
  1554. {idcIMAPPurge, 502001},
  1555. {IDC_BACKGROUND_COMPACTION, 502002},
  1556. {IDC_STORE_LOCATION, 502003},
  1557. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  1558. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  1559. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  1560. {idcStatic7, IDH_NEWS_COMM_GROUPBOX},
  1561. {idcStatic8, IDH_NEWS_COMM_GROUPBOX},
  1562. {idcStatic9, IDH_NEWS_COMM_GROUPBOX},
  1563. {idcStatic10, IDH_NEWS_COMM_GROUPBOX},
  1564. {idcStatic11, IDH_NEWS_COMM_GROUPBOX},
  1565. {IDC_CLEANUP_ICON, IDH_NEWS_COMM_GROUPBOX},
  1566. {IDC_TROUBLE_ICON, IDH_NEWS_COMM_GROUPBOX},
  1567. {0, 0}
  1568. };
  1569. INT_PTR CALLBACK MaintenanceDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1570. {
  1571. LRESULT lResult;
  1572. switch (uMsg)
  1573. {
  1574. case WM_INITDIALOG:
  1575. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Maintenance_OnInitDialog);
  1576. case WM_HELP:
  1577. case WM_CONTEXTMENU:
  1578. return OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapNOAdvnaced);
  1579. case WM_COMMAND:
  1580. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Maintenance_OnCommand);
  1581. return (TRUE);
  1582. case WM_NOTIFY:
  1583. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Maintenance_OnNotify);
  1584. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  1585. return (TRUE);
  1586. case WM_DESTROY:
  1587. FreeIcon(hwnd, IDC_CLEANUP_ICON);
  1588. FreeIcon(hwnd, IDC_TROUBLE_ICON);
  1589. return (TRUE);
  1590. }
  1591. return 0;
  1592. }
  1593. //
  1594. // FUNCTION: Maintenance_OnInitDialog()
  1595. //
  1596. // PURPOSE: Handles the WM_INITDIALOG for the Maintenance Tab on the options
  1597. // property sheet.
  1598. //
  1599. BOOL Maintenance_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  1600. {
  1601. OPTINFO *poi = 0;
  1602. HICON hIcon;
  1603. poi = (OPTINFO *)((PROPSHEETPAGE *)lParam)->lParam;
  1604. Assert(poi != NULL);
  1605. ButtonChkFromOptInfo(hwnd, IDC_EMPTY_CHECK, poi, OPT_PURGEWASTE);
  1606. ButtonChkFromOptInfo(hwnd, idcIMAPPurge, poi, OPT_IMAPPURGE);
  1607. ButtonChkFromOptInfo(hwnd, IDC_BACKGROUND_COMPACTION, poi, OPT_BACKGROUNDCOMPACT);
  1608. ButtonChkFromOptInfo(hwnd, idchDontCacheRead, poi, OPT_CACHEREAD);
  1609. InitCheckCounterFromOptInfo(hwnd, idchDeleteMsgs, ideDays, idspDays,
  1610. poi, OPT_CACHEDELETEMSGS);
  1611. InitCheckCounterFromOptInfo(hwnd, 0, ideCompactPer, idspCompactPer,
  1612. poi, OPT_CACHECOMPACTPER);
  1613. if (0 == IDwGetOption(poi->pOpt, OPT_BACKGROUNDCOMPACT))
  1614. {
  1615. EnableWindow(GetDlgItem(hwnd, idchDontCacheRead), FALSE);
  1616. EnableWindow(GetDlgItem(hwnd, idchDeleteMsgs), FALSE);
  1617. EnableWindow(GetDlgItem(hwnd, ideDays), FALSE);
  1618. EnableWindow(GetDlgItem(hwnd, idspDays), FALSE);
  1619. EnableWindow(GetDlgItem(hwnd, idcStatic1), FALSE);
  1620. EnableWindow(GetDlgItem(hwnd, idcStatic2), FALSE);
  1621. EnableWindow(GetDlgItem(hwnd, ideCompactPer), FALSE);
  1622. EnableWindow(GetDlgItem(hwnd, idspCompactPer), FALSE);
  1623. EnableWindow(GetDlgItem(hwnd, idcStatic3), FALSE);
  1624. }
  1625. ButtonChkFromOptInfo(hwnd, idcLogMailXport, poi, OPT_MAILLOG);
  1626. ButtonChkFromOptInfo(hwnd, idcLogNewsXport, poi, OPT_NEWS_XPORT_LOG);
  1627. ButtonChkFromOptInfo(hwnd, idcLogImapXport, poi, OPT_MAIL_LOGIMAP4);
  1628. ButtonChkFromOptInfo(hwnd, idcLogHTTPMailXport, poi, OPT_MAIL_LOGHTTPMAIL);
  1629. // Hide these controls in news-only mode
  1630. if (g_dwAthenaMode & MODE_NEWSONLY)
  1631. {
  1632. EnableWindow(GetDlgItem(hwnd, idcLogMailXport), FALSE);
  1633. EnableWindow(GetDlgItem(hwnd, idcLogImapXport), FALSE);
  1634. EnableWindow(GetDlgItem(hwnd, idcIMAPPurge), FALSE);
  1635. EnableWindow(GetDlgItem(hwnd, idcLogHTTPMailXport), FALSE);
  1636. }
  1637. // Hide these controls in mail-only mode
  1638. if (g_dwAthenaMode & MODE_MAILONLY)
  1639. {
  1640. EnableWindow(GetDlgItem(hwnd, idcLogNewsXport), FALSE);
  1641. EnableWindow(GetDlgItem(hwnd, idchDeleteMsgs), FALSE);
  1642. EnableWindow(GetDlgItem(hwnd, ideDays), FALSE);
  1643. EnableWindow(GetDlgItem(hwnd, idspDays), FALSE);
  1644. EnableWindow(GetDlgItem(hwnd, idcStatic1), FALSE);
  1645. EnableWindow(GetDlgItem(hwnd, idchDontCacheRead), FALSE);
  1646. EnableWindow(GetDlgItem(hwnd, ideCompactPer), FALSE);
  1647. EnableWindow(GetDlgItem(hwnd, idcStatic2), FALSE);
  1648. EnableWindow(GetDlgItem(hwnd, idspCompactPer), FALSE);
  1649. EnableWindow(GetDlgItem(hwnd, idcStatic3), FALSE);
  1650. EnableWindow(GetDlgItem(hwnd, idbManualCleanUp), FALSE);
  1651. EnableWindow(GetDlgItem(hwnd, idcStatic4), FALSE);
  1652. EnableWindow(GetDlgItem(hwnd, idcStatic5), FALSE);
  1653. EnableWindow(GetDlgItem(hwnd, idcStatic6), FALSE);
  1654. }
  1655. // HTTPMail accounts not visible unless the secret reg key exists
  1656. if (!IsHTTPMailEnabled())
  1657. ShowWindow(GetDlgItem(hwnd, idcLogHTTPMailXport), SW_HIDE);
  1658. // Pictures
  1659. hIcon = ImageList_GetIcon(poi->himl, ID_MAINTENANCE, ILD_TRANSPARENT);
  1660. SendDlgItemMessage(hwnd, IDC_CLEANUP_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1661. hIcon = ImageList_GetIcon(poi->himl, ID_TROUBLESHOOTING, ILD_TRANSPARENT);
  1662. SendDlgItemMessage(hwnd, IDC_TROUBLE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1663. // Done
  1664. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)poi);
  1665. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1666. return(TRUE);
  1667. }
  1668. //
  1669. // FUNCTION: Maintenance_OnCommand()
  1670. //
  1671. // PURPOSE: Command handler for the Maintenance tab on the Options
  1672. // property sheet.
  1673. //
  1674. void Maintenance_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  1675. {
  1676. OPTINFO *poi;
  1677. DWORD dw;
  1678. poi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1679. if (poi == NULL)
  1680. return;
  1681. switch(id)
  1682. {
  1683. case IDC_STORE_LOCATION:
  1684. if (codeNotify == BN_CLICKED)
  1685. DoStoreLocationDlg(hwnd);
  1686. break;
  1687. case idbManualCleanUp:
  1688. if (codeNotify == BN_CLICKED)
  1689. DialogBox(g_hLocRes, MAKEINTRESOURCE(iddCacheMan), hwnd, CacheCleanUpDlgProc);
  1690. break;
  1691. case IDC_EMPTY_CHECK:
  1692. if (codeNotify == BN_CLICKED)
  1693. SetPageDirty(poi, hwnd, PAGE_ADV);
  1694. break;
  1695. case idchDeleteMsgs:
  1696. if (codeNotify == BN_CLICKED)
  1697. {
  1698. dw = BST_CHECKED == IsDlgButtonChecked(hwnd, id);
  1699. EnableWindow(GetDlgItem (hwnd, ideDays), dw);
  1700. EnableWindow(GetDlgItem (hwnd, idspDays), dw);
  1701. SetPageDirty(poi, hwnd, PAGE_ADV);
  1702. }
  1703. break;
  1704. case ideCompactPer:
  1705. case ideDays:
  1706. if (codeNotify == EN_CHANGE)
  1707. SetPageDirty(poi, hwnd, PAGE_ADV);
  1708. break;
  1709. case IDC_BACKGROUND_COMPACTION:
  1710. if (codeNotify == BN_CLICKED)
  1711. {
  1712. dw = IsDlgButtonChecked(hwnd, id);
  1713. EnableWindow(GetDlgItem(hwnd, idchDontCacheRead), dw);
  1714. EnableWindow(GetDlgItem(hwnd, idchDeleteMsgs), dw);
  1715. EnableWindow(GetDlgItem(hwnd, ideDays), dw && IsDlgButtonChecked(hwnd, idchDeleteMsgs));
  1716. EnableWindow(GetDlgItem(hwnd, idspDays), dw && IsDlgButtonChecked(hwnd, idchDeleteMsgs));
  1717. EnableWindow(GetDlgItem(hwnd, idcStatic1), dw);
  1718. EnableWindow(GetDlgItem(hwnd, idcStatic2), dw);
  1719. EnableWindow(GetDlgItem(hwnd, ideCompactPer), dw);
  1720. EnableWindow(GetDlgItem(hwnd, idspCompactPer), dw);
  1721. EnableWindow(GetDlgItem(hwnd, idcStatic3), dw);
  1722. SetPageDirty(poi, hwnd, PAGE_ADV);
  1723. }
  1724. break;
  1725. case idchDontCacheRead:
  1726. case idcLogNewsXport:
  1727. case idcLogMailXport:
  1728. case idcLogImapXport:
  1729. case idcLogHTTPMailXport:
  1730. case idcIMAPPurge:
  1731. if (codeNotify == BN_CLICKED)
  1732. SetPageDirty(poi, hwnd, PAGE_ADV);
  1733. break;
  1734. }
  1735. }
  1736. //
  1737. // FUNCTION: Maintenance_OnNotify()
  1738. //
  1739. // PURPOSE: Handles the PSN_APPLY notification for the Maintenance Tab.
  1740. //
  1741. LRESULT Maintenance_OnNotify(HWND hwnd, int id, NMHDR *pnmhdr)
  1742. {
  1743. OPTINFO *poi;
  1744. DWORD dwCompact, dwDelete;
  1745. if (PSN_APPLY == pnmhdr->code)
  1746. {
  1747. poi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1748. Assert(poi != NULL);
  1749. ButtonChkToOptInfo(hwnd, IDC_BACKGROUND_COMPACTION, poi, OPT_BACKGROUNDCOMPACT);
  1750. // Startup or Shutdown background compaction!
  1751. if (DwGetOption(OPT_BACKGROUNDCOMPACT))
  1752. SideAssert(SUCCEEDED(StartBackgroundStoreCleanup(1)));
  1753. else
  1754. SideAssert(SUCCEEDED(CloseBackgroundStoreCleanup()));
  1755. // Delete messages
  1756. if (!GetCheckCounter(&dwDelete, hwnd, idchDeleteMsgs, ideDays, idspDays))
  1757. return(InvalidOptionProp(hwnd, ideDays, idsEnterDays, iddOpt_Advanced));
  1758. // Disk space usage
  1759. if (!GetCheckCounter(&dwCompact, hwnd, 0, ideCompactPer, idspCompactPer))
  1760. return(InvalidOptionProp(hwnd, ideCompactPer, idsEnterCompactPer, iddOpt_Advanced));
  1761. ISetDwOption(poi->pOpt, OPT_CACHEDELETEMSGS, dwDelete, NULL, 0);
  1762. ISetDwOption(poi->pOpt, OPT_CACHECOMPACTPER, dwCompact, NULL, 0);
  1763. // Cache read articles ?
  1764. ISetDwOption(poi->pOpt, OPT_CACHEREAD, IsDlgButtonChecked(hwnd, idchDontCacheRead), NULL, 0);
  1765. // IMAP Purge ?
  1766. ISetDwOption(poi->pOpt, OPT_IMAPPURGE, IsDlgButtonChecked(hwnd, idcIMAPPurge), NULL, 0);
  1767. // Logging?
  1768. ButtonChkToOptInfo(hwnd, idcLogMailXport, poi, OPT_MAILLOG);
  1769. ButtonChkToOptInfo(hwnd, idcLogNewsXport, poi, OPT_NEWS_XPORT_LOG);
  1770. ButtonChkToOptInfo(hwnd, idcLogImapXport, poi, OPT_MAIL_LOGIMAP4);
  1771. ButtonChkToOptInfo(hwnd, idcLogHTTPMailXport, poi, OPT_MAIL_LOGHTTPMAIL);
  1772. ButtonChkToOptInfo(hwnd, IDC_EMPTY_CHECK, poi, OPT_PURGEWASTE);
  1773. // Done
  1774. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1775. return (PSNRET_NOERROR);
  1776. }
  1777. return (0);
  1778. }
  1779. /////////////////////////////////////////////////////////////////////////////
  1780. // Compose Tab
  1781. //
  1782. static const HELPMAP g_rgCtxMapCompose[] = {
  1783. {IDC_MAIL_FONT_DEMO, 35585},
  1784. {IDC_NEWS_FONT_DEMO, 35585},
  1785. {IDC_MAIL_FONT_SETTINGS, 35560},
  1786. {IDC_NEWS_FONT_SETTINGS, 35560},
  1787. {IDC_USE_MAIL_STATIONERY, 35587},
  1788. {IDC_USE_NEWS_STATIONERY, 35587},
  1789. {IDC_MAIL_STATIONERY, 35586},
  1790. {IDC_NEWS_STATIONERY, 35586},
  1791. {IDC_SELECT_MAIL, 35575},
  1792. {IDC_SELECT_NEWS, 35575},
  1793. {IDC_DOWNLOAD_MORE, 35650},
  1794. {IDC_MAIL_VCARD, 35611},
  1795. {IDC_NEWS_VCARD, 35611},
  1796. {IDC_EDIT_MAIL_VCARD, 35620},
  1797. {IDC_EDIT_NEWS_VCARD, 35620},
  1798. {IDC_CREATE_NEW, 35632},
  1799. {IDC_MAIL_VCARD_SELECT, 35630},
  1800. {IDC_NEWS_VCARD_SELECT, 35630},
  1801. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  1802. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  1803. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  1804. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  1805. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  1806. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  1807. {idcStatic7, IDH_NEWS_COMM_GROUPBOX},
  1808. {idcStatic8, IDH_NEWS_COMM_GROUPBOX},
  1809. {IDC_FONT_ICON, IDH_NEWS_COMM_GROUPBOX},
  1810. {IDC_STATIONERY_ICON, IDH_NEWS_COMM_GROUPBOX},
  1811. {IDC_VCARD_ICON, IDH_NEWS_COMM_GROUPBOX},
  1812. {0, 0}
  1813. };
  1814. INT_PTR CALLBACK ComposeDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  1815. {
  1816. LRESULT lResult;
  1817. switch (message)
  1818. {
  1819. case WM_INITDIALOG:
  1820. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Compose_OnInitDialog);
  1821. case WM_HELP:
  1822. case WM_CONTEXTMENU:
  1823. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapCompose);
  1824. case WM_COMMAND:
  1825. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Compose_OnCommand);
  1826. return (TRUE);
  1827. case WM_NOTIFY:
  1828. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Compose_OnNotify);
  1829. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  1830. return (TRUE);
  1831. case WM_DESTROY:
  1832. FreeIcon(hwnd, IDC_FONT_ICON);
  1833. FreeIcon(hwnd, IDC_STATIONERY_ICON);
  1834. FreeIcon(hwnd, IDC_VCARD_ICON);
  1835. return (TRUE);
  1836. }
  1837. return(FALSE);
  1838. }
  1839. //
  1840. // FUNCTION: Compose_OnInitDialog()
  1841. //
  1842. // PURPOSE: Handles the WM_INITDIALOG for the Compose Tab on the options
  1843. // property sheet.
  1844. //
  1845. BOOL Compose_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  1846. {
  1847. OPTINFO *pmoi = 0;
  1848. TCHAR szBuf[CCHMAX_STRINGRES] = "";
  1849. DWORD dw;
  1850. DWORD cch;
  1851. HWND hwndT;
  1852. FARPROC pfnFontSampleWndProc;
  1853. HRESULT hr;
  1854. // Get the passed in options pointer
  1855. Assert(pmoi == NULL);
  1856. pmoi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  1857. Assert(pmoi != NULL);
  1858. // Stash the pointer
  1859. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pmoi);
  1860. // Compose Font Settings
  1861. hwndT = GetDlgItem(hwnd, IDC_MAIL_FONT_DEMO);
  1862. pfnFontSampleWndProc = (FARPROC) SetWindowLongPtrAthW(hwndT, GWLP_WNDPROC, (LPARAM) FontSampleSubProc);
  1863. SetWindowLongPtr(hwndT, GWLP_USERDATA, (LPARAM) pfnFontSampleWndProc);
  1864. hwndT = GetDlgItem(hwnd, IDC_NEWS_FONT_DEMO);
  1865. pfnFontSampleWndProc = (FARPROC) SetWindowLongPtrAthW(hwndT, GWLP_WNDPROC, (LPARAM) FontSampleSubProc);
  1866. SetWindowLongPtr(hwndT, GWLP_USERDATA, (LPARAM) pfnFontSampleWndProc);
  1867. // Mail Stationery
  1868. dw = IDwGetOption(pmoi->pOpt, OPT_MAIL_USESTATIONERY);
  1869. SendDlgItemMessage(hwnd, IDC_USE_MAIL_STATIONERY, BM_SETCHECK, !!dw ? BM_SETCHECK : 0, 0);
  1870. EnableWindow(GetDlgItem(hwnd, IDC_SELECT_MAIL), !!dw);
  1871. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_STATIONERY), !!dw);
  1872. hr = GetDefaultStationeryName(TRUE, g_wszMailStationery);
  1873. _SetThisStationery(hwnd, TRUE, SUCCEEDED(hr) ? g_wszMailStationery : NULL, pmoi);
  1874. // News Stationery
  1875. dw = IDwGetOption(pmoi->pOpt, OPT_NEWS_USESTATIONERY);
  1876. SendDlgItemMessage(hwnd, IDC_USE_NEWS_STATIONERY, BM_SETCHECK, !!dw ? BM_SETCHECK : 0, 0);
  1877. EnableWindow(GetDlgItem(hwnd, IDC_SELECT_NEWS), !!dw);
  1878. EnableWindow(GetDlgItem(hwnd, IDC_NEWS_STATIONERY), !!dw);
  1879. hr = GetDefaultStationeryName(FALSE, g_wszNewsStationery);
  1880. _SetThisStationery(hwnd, FALSE, SUCCEEDED(hr) ? g_wszNewsStationery : NULL, pmoi);
  1881. // Mail VCard
  1882. hwndT = GetDlgItem(hwnd, IDC_MAIL_VCARD_SELECT);
  1883. dw = IDwGetOption(pmoi->pOpt, OPT_MAIL_ATTACHVCARD);
  1884. IGetOption(pmoi->pOpt, OPT_MAIL_VCARDNAME, szBuf, sizeof(szBuf));
  1885. SetIntlFont(hwndT);
  1886. LoadVCardList(hwndT, szBuf);
  1887. cch = GetWindowTextLength(hwndT);
  1888. if (cch == 0)
  1889. dw = 0;
  1890. SendDlgItemMessage(hwnd, IDC_MAIL_VCARD, BM_SETCHECK, !!dw ? BM_SETCHECK : 0, 0);
  1891. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_VCARD_SELECT), !!dw);
  1892. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_MAIL_VCARD), (cch && dw));
  1893. // News VCard
  1894. hwndT = GetDlgItem(hwnd, IDC_NEWS_VCARD_SELECT);
  1895. dw = IDwGetOption(pmoi->pOpt, OPT_NEWS_ATTACHVCARD);
  1896. IGetOption(pmoi->pOpt, OPT_NEWS_VCARDNAME, szBuf, sizeof(szBuf));
  1897. SetIntlFont(hwndT);
  1898. LoadVCardList(hwndT, szBuf);
  1899. cch = GetWindowTextLength(hwndT);
  1900. if (cch == 0)
  1901. dw = 0;
  1902. SendDlgItemMessage(hwnd, IDC_NEWS_VCARD, BM_SETCHECK, !!dw ? BM_SETCHECK : 0, 0);
  1903. EnableWindow(GetDlgItem(hwnd, IDC_NEWS_VCARD_SELECT), !!dw);
  1904. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_NEWS_VCARD), (cch && dw));
  1905. // Pictures
  1906. HICON hIcon;
  1907. hIcon = ImageList_GetIcon(pmoi->himl, ID_FONTS, ILD_TRANSPARENT);
  1908. SendDlgItemMessage(hwnd, IDC_FONT_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1909. hIcon = ImageList_GetIcon(pmoi->himl, ID_STATIONERY_ICON, ILD_TRANSPARENT);
  1910. SendDlgItemMessage(hwnd, IDC_STATIONERY_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1911. hIcon = ImageList_GetIcon(pmoi->himl, ID_VCARD, ILD_TRANSPARENT);
  1912. SendDlgItemMessage(hwnd, IDC_VCARD_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  1913. // if(!!(g_dwAthenaMode & MODE_OUTLOOKNEWS))
  1914. if(!!(g_dwAthenaMode & MODE_NEWSONLY))
  1915. {
  1916. //Disable all the mail stuff
  1917. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_FONT_DEMO), FALSE);
  1918. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_FONT_SETTINGS), FALSE);
  1919. EnableWindow(GetDlgItem(hwnd, IDC_USE_MAIL_STATIONERY), FALSE);
  1920. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_STATIONERY), FALSE);
  1921. EnableWindow(GetDlgItem(hwnd, IDC_SELECT_MAIL), FALSE);
  1922. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_VCARD), FALSE);
  1923. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_VCARD_SELECT), FALSE);
  1924. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_MAIL_VCARD), FALSE);
  1925. }
  1926. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  1927. return (TRUE);
  1928. }
  1929. //
  1930. // FUNCTION: Compose_OnCommand()
  1931. //
  1932. // PURPOSE: Command handler for the Compose tab on the Options
  1933. // property sheet.
  1934. //
  1935. void Compose_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  1936. {
  1937. OPTINFO *pmoi = 0;
  1938. BOOL f;
  1939. HWND hwndT;
  1940. TCHAR szBuf[MAX_PATH];
  1941. WCHAR wszBuf[MAX_PATH];
  1942. DWORD cch = 0;
  1943. int i;
  1944. BOOL f2;
  1945. TCHAR szURL[2048];
  1946. *szBuf = 0;
  1947. *wszBuf = 0;
  1948. // Get our stored options info
  1949. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  1950. if (pmoi == NULL)
  1951. return;
  1952. switch (id)
  1953. {
  1954. case IDC_MAIL_FONT_SETTINGS:
  1955. case IDC_NEWS_FONT_SETTINGS:
  1956. if (ChangeSendFontSettings(pmoi, id == IDC_MAIL_FONT_SETTINGS, hwnd))
  1957. {
  1958. hwndT = GetDlgItem(hwnd, id == IDC_MAIL_FONT_SETTINGS ? IDC_MAIL_FONT_DEMO : IDC_NEWS_FONT_DEMO);
  1959. InvalidateRect(hwndT, NULL, TRUE);
  1960. PropSheet_Changed(GetParent(hwnd), hwnd);
  1961. }
  1962. break;
  1963. case IDC_USE_MAIL_STATIONERY:
  1964. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  1965. if( !f )
  1966. {
  1967. SetWindowTextWrapW(GetDlgItem(hwnd,IDC_MAIL_STATIONERY), c_wszEmpty);
  1968. StrCpyNW(g_wszMailStationery, c_wszEmpty, ARRAYSIZE(g_wszMailStationery));
  1969. }
  1970. EnableWindow(GetDlgItem(hwnd, IDC_SELECT_MAIL), f);
  1971. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_STATIONERY), f);
  1972. PropSheet_Changed(GetParent(hwnd), hwnd);
  1973. break;
  1974. case IDC_USE_NEWS_STATIONERY:
  1975. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  1976. if( !f )
  1977. {
  1978. SetWindowTextWrapW(GetDlgItem(hwnd,IDC_NEWS_STATIONERY), c_wszEmpty);
  1979. StrCpyNW(g_wszNewsStationery, c_wszEmpty, ARRAYSIZE(g_wszNewsStationery));
  1980. }
  1981. EnableWindow(GetDlgItem(hwnd, IDC_SELECT_NEWS), f);
  1982. EnableWindow(GetDlgItem(hwnd, IDC_NEWS_STATIONERY), f);
  1983. PropSheet_Changed(GetParent(hwnd), hwnd);
  1984. break;
  1985. case IDC_SELECT_MAIL:
  1986. hwndT = GetDlgItem(hwnd, IDC_MAIL_STATIONERY);
  1987. cch = GetWindowTextWrapW(hwndT, wszBuf, ARRAYSIZE(wszBuf)-1);
  1988. wszBuf[cch] = 0;
  1989. if( HR_SUCCEEDED(HrGetMoreStationeryFileName( hwnd, g_wszMailStationery)) )
  1990. {
  1991. GetStationeryFullName(g_wszMailStationery);
  1992. _SetThisStationery(hwnd, TRUE, g_wszMailStationery, pmoi);
  1993. PropSheet_Changed(GetParent(hwnd), hwnd);
  1994. }
  1995. break;
  1996. case IDC_SELECT_NEWS:
  1997. hwndT = GetDlgItem(hwnd, IDC_NEWS_STATIONERY);
  1998. cch = GetWindowText(hwndT, szBuf, sizeof(szBuf)-1);
  1999. szBuf[cch] = 0;
  2000. if( HR_SUCCEEDED(HrGetMoreStationeryFileName(hwnd, g_wszNewsStationery)) )
  2001. {
  2002. GetStationeryFullName(g_wszNewsStationery);
  2003. _SetThisStationery(hwnd, FALSE, g_wszNewsStationery, pmoi);
  2004. PropSheet_Changed(GetParent(hwnd), hwnd);
  2005. }
  2006. break;
  2007. case IDC_MAIL_VCARD:
  2008. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  2009. f2 = (SendDlgItemMessage(hwnd, IDC_MAIL_VCARD_SELECT, CB_GETCURSEL, 0, 0) != CB_ERR);
  2010. EnableWindow(GetDlgItem(hwnd, IDC_MAIL_VCARD_SELECT), f);
  2011. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_MAIL_VCARD), f2 && f);
  2012. PropSheet_Changed(GetParent(hwnd), hwnd);
  2013. break;
  2014. case IDC_NEWS_VCARD:
  2015. f = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  2016. f2 = (SendDlgItemMessage(hwnd, IDC_NEWS_VCARD_SELECT, CB_GETCURSEL, 0, 0) != CB_ERR);
  2017. EnableWindow(GetDlgItem(hwnd, IDC_NEWS_VCARD_SELECT), f);
  2018. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_NEWS_VCARD), f && f2);
  2019. PropSheet_Changed(GetParent(hwnd), hwnd);
  2020. break;
  2021. case IDC_MAIL_VCARD_SELECT:
  2022. if (codeNotify == CBN_SELENDOK)
  2023. {
  2024. f = (SendMessage(hwndCtl, CB_GETCURSEL, 0, 0) != CB_ERR);
  2025. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_MAIL_VCARD), f);
  2026. PropSheet_Changed(GetParent(hwnd), hwnd);
  2027. }
  2028. break;
  2029. case IDC_NEWS_VCARD_SELECT:
  2030. if (codeNotify == CBN_SELENDOK)
  2031. {
  2032. f = (SendMessage(hwndCtl, CB_GETCURSEL, 0, 0) != CB_ERR);
  2033. EnableWindow(GetDlgItem(hwnd, IDC_EDIT_NEWS_VCARD), f);
  2034. PropSheet_Changed(GetParent(hwnd), hwnd);
  2035. }
  2036. break;
  2037. case IDC_EDIT_MAIL_VCARD:
  2038. VCardEdit(hwnd, IDC_MAIL_VCARD_SELECT, IDC_NEWS_VCARD_SELECT);
  2039. break;
  2040. case IDC_EDIT_NEWS_VCARD:
  2041. VCardEdit(hwnd, IDC_NEWS_VCARD_SELECT, IDC_MAIL_VCARD_SELECT);
  2042. break;
  2043. case IDC_DOWNLOAD_MORE:
  2044. if (SUCCEEDED(URLSubLoadStringA(idsShopMoreStationery, szURL, ARRAYSIZE(szURL), URLSUB_ALL, NULL)))
  2045. ShellExecute(NULL, "open", szURL, NULL, NULL, SW_SHOWNORMAL);
  2046. break;
  2047. case IDC_CREATE_NEW:
  2048. CStatWiz* pStatWiz = 0;
  2049. pStatWiz = new CStatWiz();
  2050. if (pStatWiz)
  2051. {
  2052. pStatWiz->DoWizard(hwnd);
  2053. ReleaseObj(pStatWiz);
  2054. }
  2055. break;
  2056. }
  2057. }
  2058. //
  2059. // FUNCTION: Compose_OnNotify()
  2060. //
  2061. // PURPOSE: Handles the PSN_APPLY notification for the Compose Tab.
  2062. //
  2063. LRESULT Compose_OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
  2064. {
  2065. OPTINFO *pmoi = 0;
  2066. TCHAR szBuf[MAX_PATH];
  2067. DWORD cch;
  2068. if (PSN_SETACTIVE == pnmhdr->code)
  2069. {
  2070. InvalidateRect(GetDlgItem(hwnd, IDC_MAIL_FONT_DEMO), NULL, TRUE);
  2071. InvalidateRect(GetDlgItem(hwnd, IDC_NEWS_FONT_DEMO), NULL, TRUE);
  2072. return TRUE;
  2073. }
  2074. // The only notification we care about is Apply
  2075. if (PSN_APPLY == pnmhdr->code)
  2076. {
  2077. // Get our stored options info
  2078. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  2079. if (pmoi == NULL)
  2080. return (PSNRET_INVALID_NOCHANGEPAGE);
  2081. // Stationery options
  2082. if (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_USE_MAIL_STATIONERY))
  2083. {
  2084. // Make sure the user has selected some stationery
  2085. if (0 == GetDlgItemText(hwnd, IDC_MAIL_STATIONERY, szBuf, sizeof(szBuf)))
  2086. {
  2087. AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsStationery),
  2088. MAKEINTRESOURCEW(idsSelectStationery),
  2089. NULL, MB_OK | MB_ICONEXCLAMATION);
  2090. SetFocus(GetDlgItem(hwnd, IDC_SELECT_MAIL));
  2091. return (PSNRET_INVALID_NOCHANGEPAGE);
  2092. }
  2093. }
  2094. if (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_USE_NEWS_STATIONERY))
  2095. {
  2096. if (0 == GetDlgItemText(hwnd, IDC_NEWS_STATIONERY, szBuf, sizeof(szBuf)))
  2097. {
  2098. AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsStationery),
  2099. MAKEINTRESOURCEW(idsSelectStationery),
  2100. NULL, MB_OK | MB_ICONEXCLAMATION);
  2101. SetFocus(GetDlgItem(hwnd, IDC_SELECT_NEWS));
  2102. return (PSNRET_INVALID_NOCHANGEPAGE);
  2103. }
  2104. }
  2105. if (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_MAIL_VCARD))
  2106. {
  2107. cch = GetWindowTextLength(GetDlgItem(hwnd, IDC_MAIL_VCARD_SELECT));
  2108. if (cch == 0)
  2109. {
  2110. AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsChooseName),
  2111. NULL, MB_OK | MB_ICONEXCLAMATION);
  2112. SetFocus(GetDlgItem(hwnd, IDC_MAIL_VCARD_SELECT));
  2113. return (PSNRET_INVALID_NOCHANGEPAGE);
  2114. }
  2115. }
  2116. if (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_NEWS_VCARD))
  2117. {
  2118. cch = GetWindowTextLength(GetDlgItem(hwnd, IDC_NEWS_VCARD_SELECT));
  2119. if (cch == 0)
  2120. {
  2121. AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsChooseName),
  2122. NULL, MB_OK | MB_ICONEXCLAMATION);
  2123. SetFocus(GetDlgItem(hwnd, IDC_NEWS_VCARD_SELECT));
  2124. return (PSNRET_INVALID_NOCHANGEPAGE);
  2125. }
  2126. }
  2127. SetDefaultStationeryName(TRUE, g_wszMailStationery);
  2128. ButtonChkToOptInfo(hwnd, IDC_USE_MAIL_STATIONERY, pmoi, OPT_MAIL_USESTATIONERY);
  2129. SetDefaultStationeryName(FALSE, g_wszNewsStationery);
  2130. ButtonChkToOptInfo(hwnd, IDC_USE_NEWS_STATIONERY, pmoi, OPT_NEWS_USESTATIONERY);
  2131. UpdateVCardOptions(hwnd, TRUE, pmoi);
  2132. UpdateVCardOptions(hwnd, FALSE, pmoi);
  2133. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  2134. return (PSNRET_NOERROR);
  2135. }
  2136. return (FALSE);
  2137. }
  2138. void InitIndentOptions(CHAR chIndent, HWND hwnd, UINT idCheck, UINT idCombo)
  2139. {
  2140. TCHAR szQuote[2], *sz;
  2141. BOOL f;
  2142. int isel;
  2143. HWND hDlg=GetDlgItem(hwnd, idCombo);
  2144. f = (chIndent != INDENTCHAR_NONE);
  2145. CheckDlgButton(hwnd, idCheck, f ? BST_CHECKED : BST_UNCHECKED);
  2146. EnableWindow(hDlg, f);
  2147. // initialize the quote char combo
  2148. if (!f)
  2149. chIndent = DEF_INDENTCHAR;
  2150. isel = 0;
  2151. szQuote[1] = 0;
  2152. sz = (TCHAR *)c_szQuoteChars;
  2153. while (*sz != NULL)
  2154. {
  2155. *szQuote = *sz;
  2156. SendMessage(hDlg, CB_ADDSTRING, 0, (LPARAM)szQuote);
  2157. if (*szQuote == chIndent)
  2158. SendMessage(hDlg, CB_SETCURSEL, (WPARAM)isel, 0);
  2159. isel++;
  2160. sz++;
  2161. }
  2162. }
  2163. void FillEncodeCombo(HWND hwnd, BOOL fHTML, ENCODINGTYPE ietEncoding)
  2164. {
  2165. TCHAR sz[CCHMAX_STRINGRES];
  2166. INT i;
  2167. // $$TODO$ Someday we should allow NONE as a text encoding type for HTML, but we must fix our line wrapping first.
  2168. // None
  2169. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  2170. if (!fHTML)
  2171. #endif
  2172. {
  2173. LoadString(g_hLocRes, idsNone, sz, CCHMAX_STRINGRES);
  2174. i = (INT) SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)sz);
  2175. SendMessage(hwnd, CB_SETITEMDATA, i, (LPARAM)IET_7BIT);
  2176. }
  2177. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  2178. else
  2179. Assert(ietEncoding != IET_7BIT);
  2180. #endif
  2181. // QuotedPrintable
  2182. LoadString(g_hLocRes, idsQuotedPrintable, sz, CCHMAX_STRINGRES);
  2183. i = (INT) SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)sz);
  2184. SendMessage(hwnd, CB_SETITEMDATA, i, (LPARAM)IET_QP);
  2185. // Base64
  2186. LoadString(g_hLocRes, idsBase64, sz, CCHMAX_STRINGRES);
  2187. i = (INT) SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)sz);
  2188. SendMessage(hwnd, CB_SETITEMDATA, i, (LPARAM)IET_BASE64);
  2189. // Select current - will default to QP if HTML is TRUE
  2190. if (ietEncoding == IET_7BIT)
  2191. SendMessage(hwnd, CB_SETCURSEL, (WPARAM)0, 0);
  2192. else if (ietEncoding == IET_QP)
  2193. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  2194. SendMessage(hwnd, CB_SETCURSEL, (WPARAM)fHTML ? 0 : 1, 0);
  2195. #else
  2196. SendMessage(hwnd, CB_SETCURSEL, (WPARAM)1, 0);
  2197. #endif
  2198. if (ietEncoding == IET_BASE64)
  2199. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  2200. SendMessage(hwnd, CB_SETCURSEL, (WPARAM)fHTML ? 0 : 2, 0);
  2201. #else
  2202. SendMessage(hwnd, CB_SETCURSEL, (WPARAM)2, 0);
  2203. #endif
  2204. }
  2205. VOID MailEnableWraps(HWND hwnd, BOOL fEnable)
  2206. {
  2207. EnableWindow(GetDlgItem(hwnd, IDC_MAILWRAP_TEXT1), fEnable);
  2208. EnableWindow(GetDlgItem(hwnd, IDC_MAILWRAP_TEXT2), fEnable);
  2209. EnableWindow(GetDlgItem(hwnd, IDC_MAILWRAP_EDIT), fEnable);
  2210. EnableWindow(GetDlgItem(hwnd, IDC_MAILWRAP_SPIN), fEnable);
  2211. }
  2212. const static int c_rgidsFilter[] =
  2213. {
  2214. idsTextFileFilter,
  2215. idsHtmlFileFilter,
  2216. idsAllFilesFilter
  2217. };
  2218. #define CSIGFILTER (sizeof(c_rgidsFilter) / sizeof(int))
  2219. ///Signature tab
  2220. const static HELPMAP g_rgCtxMapStationery[] = {
  2221. {IDC_SENDFONTSETTINGS, IDH_STATIONERY_FONT_SETTINGS},
  2222. {IDC_RADIOMYFONT, IDH_STATIONERY_MY_FONT},
  2223. {IDC_RADIOUSETHIS, IDH_STATIONERY_USE_STATIONERY},
  2224. {IDC_SELECT, IDH_STATIONERY_SELECT},
  2225. {IDC_VCARD_CHECK, IDH_STATIONERY_ATTACH_BUSINESS_CARD},
  2226. {IDC_VCARD_COMBO, IDH_STATIONERY_ENTER_BUSINESS_CARD},
  2227. {IDC_VCARD_BUTTON_EDIT, IDH_STATIONERY_EDIT_BUSINESS_CARD},
  2228. {IDC_VCARD_BUTTON_NEW, IDH_STATIONERY_NEW_BUSINESS_CARD},
  2229. {0, 0}};
  2230. LRESULT CALLBACK FontSampleSubProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  2231. {
  2232. OPTINFO *pmoi;
  2233. WNDPROC pfn;
  2234. HDC hdc;
  2235. PAINTSTRUCT ps;
  2236. pmoi = (OPTINFO *)GetWindowLongPtr(GetParent(hwnd), DWLP_USER);
  2237. Assert(pmoi);
  2238. if (msg == WM_PAINT)
  2239. {
  2240. hdc=BeginPaint (hwnd, &ps);
  2241. PaintFontSample(hwnd, hdc, pmoi);
  2242. EndPaint (hwnd, &ps);
  2243. return(0);
  2244. }
  2245. pfn = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA);
  2246. Assert(pfn != NULL);
  2247. return(CallWindowProcWrapW(pfn, hwnd, msg, wParam, lParam));
  2248. }
  2249. typedef struct tagFONTOPTIONS
  2250. {
  2251. PROPID color;
  2252. PROPID size;
  2253. PROPID bold;
  2254. PROPID italic;
  2255. PROPID underline;
  2256. PROPID face;
  2257. } FONTOPTIONS;
  2258. static const FONTOPTIONS c_rgFontOptions[2] =
  2259. {
  2260. {
  2261. OPT_MAIL_FONTCOLOR,
  2262. OPT_MAIL_FONTSIZE,
  2263. OPT_MAIL_FONTBOLD,
  2264. OPT_MAIL_FONTITALIC,
  2265. OPT_MAIL_FONTUNDERLINE,
  2266. OPT_MAIL_FONTFACE
  2267. },
  2268. {
  2269. OPT_NEWS_FONTCOLOR,
  2270. OPT_NEWS_FONTSIZE,
  2271. OPT_NEWS_FONTBOLD,
  2272. OPT_NEWS_FONTITALIC,
  2273. OPT_NEWS_FONTUNDERLINE,
  2274. OPT_NEWS_FONTFACE
  2275. }
  2276. };
  2277. void PaintFontSample(HWND hwnd, HDC hdc, OPTINFO *pmoi)
  2278. {
  2279. int dcSave=SaveDC(hdc);
  2280. RECT rc;
  2281. const FONTOPTIONS *pfo;
  2282. SIZE rSize;
  2283. INT x, y, cbSample;
  2284. HFONT hFont, hOldFont;
  2285. LOGFONT lf={0};
  2286. TCHAR szBuf[LF_FACESIZE+1];
  2287. WCHAR wszRes[CCHMAX_STRINGRES],
  2288. wsz[CCHMAX_STRINGRES],
  2289. wszFontFace[CCHMAX_STRINGRES];
  2290. DWORD dw, dwSize;
  2291. BOOL fBold=FALSE,
  2292. fItalic=FALSE,
  2293. fUnderline=FALSE;
  2294. BOOL fMail;
  2295. *szBuf = 0;
  2296. *wszRes = 0;
  2297. *wsz = 0;
  2298. fMail = GetWindowLong(hwnd, GWL_ID) == IDC_MAIL_FONT_DEMO;
  2299. pfo = fMail ? &c_rgFontOptions[0] : &c_rgFontOptions[1];
  2300. dwSize = IDwGetOption(pmoi->pOpt, pfo->size);
  2301. if (dwSize < 8 || dwSize > 72)
  2302. {
  2303. ISetDwOption(pmoi->pOpt, pfo->size, DEFAULT_FONTPIXELSIZE, NULL, 0);
  2304. dwSize = DEFAULT_FONTPIXELSIZE;
  2305. }
  2306. INT yPerInch = GetDeviceCaps(hdc, LOGPIXELSY);
  2307. lf.lfHeight =-(INT)((9*10*2*yPerInch)/1440);
  2308. fBold = IDwGetOption(pmoi->pOpt, pfo->bold);
  2309. fItalic = IDwGetOption(pmoi->pOpt, pfo->italic);
  2310. fUnderline = IDwGetOption(pmoi->pOpt, pfo->underline);
  2311. lf.lfWeight = fBold ? FW_BOLD : FW_NORMAL;
  2312. lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
  2313. lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  2314. lf.lfQuality = DRAFT_QUALITY;
  2315. lf.lfCharSet = DEFAULT_CHARSET;
  2316. lf.lfItalic = !!fItalic;
  2317. lf.lfUnderline = !!fUnderline;
  2318. IGetOption(pmoi->pOpt, pfo->face, szBuf, sizeof(szBuf));
  2319. if (*szBuf != 0)
  2320. {
  2321. StrCpyN(lf.lfFaceName, szBuf, ARRAYSIZE(lf.lfFaceName));
  2322. }
  2323. else
  2324. {
  2325. if(LoadString(g_hLocRes, idsComposeFontFace, szBuf, LF_FACESIZE))
  2326. {
  2327. StrCpyN(lf.lfFaceName, szBuf, ARRAYSIZE(lf.lfFaceName));
  2328. ISetOption(pmoi->pOpt, pfo->face, szBuf, lstrlen(szBuf) + 1, NULL, 0);
  2329. }
  2330. }
  2331. hFont=CreateFontIndirect(&lf);
  2332. hOldFont = (HFONT)SelectObject (hdc, hFont);
  2333. GetClientRect(hwnd, &rc);
  2334. FillRect (hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
  2335. // pull in the drawing rect by 2 pixels all around
  2336. InflateRect(&rc, -2, -2);
  2337. SetBkMode (hdc, TRANSPARENT); // So the background shows through the text.
  2338. dw = IDwGetOption(pmoi->pOpt, pfo->color);
  2339. SetTextColor (hdc, dw);
  2340. LoadStringWrapW(g_hLocRes, idsFontSampleFmt, wszRes, ARRAYSIZE(wszRes));
  2341. *wszFontFace = 0;
  2342. MultiByteToWideChar(CP_ACP, 0, lf.lfFaceName, -1, wszFontFace, ARRAYSIZE(wszFontFace));
  2343. wnsprintfW(wsz, ARRAYSIZE(wsz), wszRes, dwSize, wszFontFace);
  2344. GetTextExtentPoint32AthW(hdc, wsz, lstrlenW(wsz), &rSize, NOFLAGS);
  2345. x = rc.left + (((rc.right-rc.left) / 2) - (rSize.cx / 2));
  2346. y = rc.top + (((rc.bottom-rc.top) / 2) - (rSize.cy / 2));
  2347. ExtTextOutWrapW(hdc, x, y, ETO_CLIPPED, &rc, wsz, lstrlenW(wsz), NULL);
  2348. DeleteObject(SelectObject (hdc, hOldFont));
  2349. RestoreDC(hdc, dcSave);
  2350. }
  2351. VOID LoadVCardList(HWND hwndCombo, LPTSTR lpszDisplayName)
  2352. {
  2353. HRESULT hr = NOERROR;
  2354. LPWAB lpWab = NULL;
  2355. int cRows = 0;
  2356. DWORD dwIndex=0;
  2357. if(hwndCombo==0)
  2358. return;
  2359. ComboBox_ResetContent(hwndCombo);
  2360. hr = HrCreateWabObject(&lpWab);
  2361. if(FAILED(hr))
  2362. goto error;
  2363. //load names into the combobox from personal address book
  2364. hr = lpWab->HrFillComboWithPABNames(hwndCombo, &cRows);
  2365. if(FAILED(hr))
  2366. goto error;
  2367. if(lpszDisplayName)
  2368. dwIndex = ComboBox_SelectString(hwndCombo, -1, lpszDisplayName);
  2369. error:
  2370. ReleaseObj(lpWab);
  2371. }
  2372. BOOL UpdateVCardOptions(HWND hwnd, BOOL fMail, OPTINFO* pmoi)
  2373. {
  2374. HWND hDlg;
  2375. DWORD dw;
  2376. int cch;
  2377. TCHAR* sz;
  2378. dw = ButtonChkToOptInfo(hwnd, fMail ? IDC_MAIL_VCARD : IDC_NEWS_VCARD, pmoi, fMail ? OPT_MAIL_ATTACHVCARD : OPT_NEWS_ATTACHVCARD);
  2379. hDlg = GetDlgItem(hwnd, fMail ? IDC_MAIL_VCARD_SELECT : IDC_NEWS_VCARD_SELECT);
  2380. cch = GetWindowTextLength(hDlg);
  2381. Assert(dw == 0 || cch > 0);
  2382. cch++;
  2383. if (!MemAlloc((void **)&sz, cch * sizeof(TCHAR)))
  2384. return(TRUE);
  2385. cch = ComboBox_GetText(hDlg, sz, cch) + 1;
  2386. ISetOption(pmoi->pOpt, fMail ? OPT_MAIL_VCARDNAME : OPT_NEWS_VCARDNAME, sz, cch, NULL, 0);
  2387. MemFree(sz);
  2388. return(FALSE);
  2389. }
  2390. // The rest of file is in options2.cpp
  2391. HRESULT VCardNewEntry(HWND hwnd)
  2392. {
  2393. HRESULT hr = NOERROR;
  2394. LPWAB lpWab = NULL;
  2395. TCHAR szName[MAX_PATH] = {0};
  2396. HWND hwndCombo = NULL;
  2397. UINT cb = 0;
  2398. hwndCombo = GetDlgItem(hwnd, IDC_VCARD_COMBO);
  2399. hr = HrCreateWabObject(&lpWab);
  2400. if(FAILED(hr))
  2401. goto error;
  2402. //load names into the combobox from personal address book
  2403. hr = lpWab->HrNewEntry(hwnd, szName, ARRAYSIZE(szName));
  2404. if(FAILED(hr))
  2405. goto error;
  2406. // reload the vcard list.
  2407. LoadVCardList(hwndCombo, szName);
  2408. error:
  2409. ReleaseObj(lpWab);
  2410. return hr;
  2411. }
  2412. HRESULT VCardEdit(HWND hwnd, DWORD idc, DWORD idcOther)
  2413. {
  2414. HWND hwndCombo, hwndOther;
  2415. HRESULT hr;
  2416. LPWAB lpWab = NULL;
  2417. TCHAR szName[MAX_PATH], szPrev[MAX_PATH], szOther[MAX_PATH];
  2418. UINT cb;
  2419. hwndCombo = GetDlgItem(hwnd, idc);
  2420. cb = GetWindowText(hwndCombo, szName, sizeof(szName));
  2421. Assert(cb > 0);
  2422. StrCpyN(szPrev, szName, ARRAYSIZE(szPrev));
  2423. hr = HrCreateWabObject(&lpWab);
  2424. if(FAILED(hr))
  2425. return(hr);
  2426. //load names into the combobox from personal address book
  2427. hr = lpWab->HrEditEntry(hwnd, szName, ARRAYSIZE(szName));
  2428. if(SUCCEEDED(hr))
  2429. {
  2430. if (0 != lstrcmp(szName, szPrev))
  2431. {
  2432. hwndOther = GetDlgItem(hwnd, idcOther);
  2433. cb = GetWindowText(hwndOther, szOther, ARRAYSIZE(szOther));
  2434. if (cb > 0)
  2435. {
  2436. if (0 == lstrcmp(szOther, szPrev))
  2437. LoadVCardList(hwndOther, szName);
  2438. else
  2439. LoadVCardList(hwndOther, szOther);
  2440. }
  2441. else
  2442. {
  2443. LoadVCardList(hwndOther, NULL);
  2444. }
  2445. // reload the vcard list.
  2446. LoadVCardList(hwndCombo, szName);
  2447. }
  2448. }
  2449. ReleaseObj(lpWab);
  2450. return hr;
  2451. }
  2452. void _SetThisStationery(HWND hwnd, BOOL fMail, LPWSTR wsz, OPTINFO* pmoi)
  2453. {
  2454. HWND hDlg;
  2455. WCHAR wszBuf[MAX_PATH];
  2456. WCHAR wszCompact[MAX_SHOWNAME+1];
  2457. *wszBuf = 0;
  2458. *wszCompact = 0;
  2459. hDlg = GetDlgItem(hwnd, fMail ? IDC_MAIL_STATIONERY : IDC_NEWS_STATIONERY);
  2460. SetIntlFont(hDlg);
  2461. if (wsz != NULL)
  2462. {
  2463. StrCpyNW(wszBuf, wsz, ARRAYSIZE(wszBuf));
  2464. GetStationeryFullName(wszBuf);
  2465. if (*wszBuf == 0)
  2466. goto reset;
  2467. StripStationeryDir(wszBuf);
  2468. PathRemoveExtensionW(wszBuf);
  2469. PathCompactPathExW(wszCompact, wszBuf, MAX_SHOWNAME, 0);
  2470. SetWindowTextWrapW(hDlg, wszCompact);
  2471. return;
  2472. }
  2473. reset:
  2474. SetDefaultStationeryName(fMail, wszBuf);
  2475. ISetDwOption(pmoi->pOpt, fMail ? OPT_MAIL_USESTATIONERY : OPT_NEWS_USESTATIONERY,
  2476. FALSE, NULL, 0);
  2477. SetWindowText(hDlg, "");
  2478. return;
  2479. }
  2480. INT_PTR CALLBACK CacheCleanUpDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2481. {
  2482. FOLDERINFO Folder;
  2483. FOLDERID idFolder;
  2484. RECURSEFLAGS dwRecurse=RECURSE_INCLUDECURRENT | RECURSE_ONLYSUBSCRIBED | RECURSE_SUBFOLDERS | RECURSE_NOLOCALSTORE;
  2485. switch (uMsg)
  2486. {
  2487. case WM_INITDIALOG:
  2488. // Initialzie the Folder Combo Box
  2489. InitFolderPickerEdit(GetDlgItem(hwnd, IDC_CACHE_FOLDER), FOLDERID_ROOT);
  2490. // Display Folder Size Info
  2491. DisplayFolderSizeInfo(hwnd, dwRecurse, FOLDERID_ROOT);
  2492. // Done
  2493. return 1;
  2494. case WM_DESTROY:
  2495. return 0;
  2496. case WM_CLOSE:
  2497. EndDialog(hwnd, IDOK);
  2498. return 1;
  2499. case WM_COMMAND:
  2500. switch(GET_WM_COMMAND_ID(wParam,lParam))
  2501. {
  2502. case IDCANCEL:
  2503. SendMessage (hwnd, WM_CLOSE, 0, 0);
  2504. return 1;
  2505. case IDC_FOLDER_BROWSE:
  2506. if (GET_WM_COMMAND_CMD(wParam,lParam) == BN_CLICKED)
  2507. {
  2508. // Pick a Folder
  2509. if (SUCCEEDED(PickFolderInEdit(hwnd, GetDlgItem(hwnd, IDC_CACHE_FOLDER), TREEVIEW_NOLOCAL, NULL, NULL, &idFolder)))
  2510. {
  2511. // Display Folder Size Info
  2512. DisplayFolderSizeInfo(hwnd, dwRecurse, idFolder);
  2513. }
  2514. }
  2515. return 1;
  2516. case idbCompactCache:
  2517. if (SUCCEEDED(g_pStore->GetFolderInfo(GetFolderIdFromEdit(GetDlgItem(hwnd, IDC_CACHE_FOLDER)), &Folder)))
  2518. {
  2519. CleanupFolder(hwnd, dwRecurse, Folder.idFolder, CLEANUP_COMPACT);
  2520. DisplayFolderSizeInfo(hwnd, dwRecurse, Folder.idFolder);
  2521. g_pStore->FreeRecord(&Folder);
  2522. }
  2523. return 1;
  2524. case idbRemove:
  2525. case idbDelete:
  2526. case idbReset:
  2527. if (SUCCEEDED(g_pStore->GetFolderInfo(GetFolderIdFromEdit(GetDlgItem(hwnd, IDC_CACHE_FOLDER)), &Folder)))
  2528. {
  2529. // Locals
  2530. CHAR szRes[255];
  2531. CHAR szMsg[255 + 255];
  2532. // Get Command
  2533. UINT idCommand=GET_WM_COMMAND_ID(wParam, lParam);
  2534. UINT idString;
  2535. CLEANUPFOLDERTYPE tyCleanup;
  2536. // Remove
  2537. if (idbRemove == idCommand)
  2538. tyCleanup = CLEANUP_REMOVEBODIES;
  2539. else if (idbDelete == idCommand)
  2540. tyCleanup = CLEANUP_DELETE;
  2541. else
  2542. tyCleanup = CLEANUP_RESET;
  2543. // Root
  2544. if (FOLDERID_ROOT == Folder.idFolder)
  2545. {
  2546. // Determine Warning String
  2547. if (idbRemove == idCommand)
  2548. idString = idsConfirmDelBodiesAll;
  2549. else if (idbDelete == idCommand)
  2550. idString = idsConfirmDelMsgsAll;
  2551. else
  2552. idString = idsConfirmResetAll;
  2553. // Confirm
  2554. if (IDNO == AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idString), NULL, MB_YESNO | MB_ICONEXCLAMATION))
  2555. return(1);
  2556. }
  2557. // Server
  2558. else if (ISFLAGSET(Folder.dwFlags, FOLDER_SERVER))
  2559. {
  2560. // Determine Warning String
  2561. if (idbRemove == idCommand)
  2562. idString = idsConfirmDelBodiesStore;
  2563. else if (idbDelete == idCommand)
  2564. idString = idsConfirmDelMsgsStore;
  2565. else
  2566. idString = idsConfirmResetStore;
  2567. // Load the String
  2568. AthLoadString(idString, szRes, ARRAYSIZE(szRes));
  2569. // Format with the Folder Name
  2570. wnsprintf(szMsg, ARRAYSIZE(szMsg), szRes, Folder.pszName);
  2571. // Confirm
  2572. if (IDNO == AthMessageBox(hwnd, MAKEINTRESOURCE(idsAthena), szMsg, NULL, MB_YESNO | MB_ICONEXCLAMATION))
  2573. return(1);
  2574. }
  2575. // Folder
  2576. else
  2577. {
  2578. // Determine Warning String
  2579. if (idbRemove == idCommand)
  2580. idString = idsConfirmDelBodies;
  2581. else if (idbDelete == idCommand)
  2582. idString = idsConfirmDelMsgs;
  2583. else
  2584. idString = idsConfirmReset;
  2585. // Load the String
  2586. AthLoadString(idString, szRes, ARRAYSIZE(szRes));
  2587. // Format with the Folder Name
  2588. wnsprintf(szMsg, ARRAYSIZE(szMsg), szRes, Folder.pszName);
  2589. // Confirm
  2590. if (IDNO == AthMessageBox(hwnd, MAKEINTRESOURCE(idsAthena), szMsg, NULL, MB_YESNO | MB_ICONEXCLAMATION))
  2591. return(1);
  2592. }
  2593. // Recurse
  2594. CleanupFolder(hwnd, dwRecurse, Folder.idFolder, tyCleanup);
  2595. // Display Folder Size Info
  2596. DisplayFolderSizeInfo(hwnd, dwRecurse, (FOLDERID)Folder.idFolder);
  2597. // Cleanup
  2598. g_pStore->FreeRecord(&Folder);
  2599. }
  2600. return 1;
  2601. case IDOK:
  2602. EndDialog(hwnd, IDOK);
  2603. return 1;
  2604. }
  2605. break;
  2606. }
  2607. return 0;
  2608. }
  2609. // before calling always ensure poi contains valid HTML settings
  2610. // else we assert...
  2611. void HtmlOptFromMailOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi)
  2612. {
  2613. Assert(pHtmlOpt);
  2614. Assert(poi);
  2615. pHtmlOpt->ietEncoding = (ENCODINGTYPE)IDwGetOption(poi->pOpt, OPT_MAIL_MSG_HTML_ENCODE);
  2616. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  2617. AssertSz(pHtmlOpt->ietEncoding == IET_QP || pHtmlOpt->ietEncoding == IET_BASE64, "Illegal HTML encoding type");
  2618. #endif
  2619. pHtmlOpt->f8Bit = IDwGetOption(poi->pOpt, OPT_MAIL_MSG_HTML_ALLOW_8BIT);
  2620. pHtmlOpt->fSendImages = IDwGetOption(poi->pOpt, OPT_MAIL_SENDINLINEIMAGES);
  2621. pHtmlOpt->uWrap = IDwGetOption(poi->pOpt, OPT_MAIL_MSG_HTML_LINE_WRAP);
  2622. pHtmlOpt->fIndentReply = IDwGetOption(poi->pOpt, OPT_MAIL_MSG_HTML_INDENT_REPLY);
  2623. }
  2624. void MailOptFromHtmlOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi)
  2625. {
  2626. Assert(pHtmlOpt);
  2627. Assert(poi);
  2628. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_HTML_ENCODE, (DWORD)pHtmlOpt->ietEncoding, NULL, 0);
  2629. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_HTML_ALLOW_8BIT, pHtmlOpt->f8Bit, NULL, 0);
  2630. ISetDwOption(poi->pOpt, OPT_MAIL_SENDINLINEIMAGES, pHtmlOpt->fSendImages, NULL, 0);
  2631. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_HTML_LINE_WRAP, pHtmlOpt->uWrap, NULL, 0);
  2632. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_HTML_INDENT_REPLY, pHtmlOpt->fIndentReply, NULL, 0);
  2633. }
  2634. void PlainOptFromMailOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi)
  2635. {
  2636. Assert(pPlainOpt);
  2637. Assert(poi);
  2638. pPlainOpt->fMime = IDwGetOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_MIME);
  2639. pPlainOpt->ietEncoding = (ENCODINGTYPE)IDwGetOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_ENCODE);
  2640. pPlainOpt->f8Bit = IDwGetOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_ALLOW_8BIT);
  2641. pPlainOpt->uWrap = IDwGetOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_LINE_WRAP);
  2642. pPlainOpt->chQuote = (CHAR)IDwGetOption(poi->pOpt, OPT_MAILINDENT);
  2643. }
  2644. void MailOptFromPlainOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi)
  2645. {
  2646. Assert(pPlainOpt);
  2647. Assert(poi);
  2648. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_MIME, pPlainOpt->fMime, NULL, 0);
  2649. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_ENCODE, (DWORD)pPlainOpt->ietEncoding, NULL, 0);
  2650. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_ALLOW_8BIT, pPlainOpt->f8Bit, NULL, 0);
  2651. ISetDwOption(poi->pOpt, OPT_MAIL_MSG_PLAIN_LINE_WRAP, pPlainOpt->uWrap, NULL, 0);
  2652. ISetDwOption(poi->pOpt, OPT_MAILINDENT, pPlainOpt->chQuote, NULL, 0);
  2653. }
  2654. // before calling always ensure poi contains valid HTML settings
  2655. // else we assert...
  2656. void HtmlOptFromNewsOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi)
  2657. {
  2658. Assert(pHtmlOpt);
  2659. Assert(poi);
  2660. pHtmlOpt->ietEncoding = (ENCODINGTYPE)IDwGetOption(poi->pOpt, OPT_NEWS_MSG_HTML_ENCODE);
  2661. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  2662. Assert(pHtmlOpt->ietEncoding == IET_QP || pHtmlOpt->ietEncoding == IET_BASE64);
  2663. #endif
  2664. pHtmlOpt->f8Bit = IDwGetOption(poi->pOpt, OPT_NEWS_MSG_HTML_ALLOW_8BIT);
  2665. pHtmlOpt->fSendImages = IDwGetOption(poi->pOpt, OPT_NEWS_SENDINLINEIMAGES);
  2666. pHtmlOpt->uWrap = IDwGetOption(poi->pOpt, OPT_NEWS_MSG_HTML_LINE_WRAP);
  2667. pHtmlOpt->fIndentReply = IDwGetOption(poi->pOpt, OPT_NEWS_MSG_HTML_INDENT_REPLY);
  2668. }
  2669. void NewsOptFromHtmlOpt(LPHTMLOPT pHtmlOpt, OPTINFO *poi)
  2670. {
  2671. Assert(pHtmlOpt);
  2672. Assert(poi);
  2673. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_HTML_ENCODE, (DWORD)pHtmlOpt->ietEncoding, NULL, 0);
  2674. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_HTML_ALLOW_8BIT, pHtmlOpt->f8Bit, NULL, 0);
  2675. ISetDwOption(poi->pOpt, OPT_NEWS_SENDINLINEIMAGES, pHtmlOpt->fSendImages, NULL, 0);
  2676. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_HTML_LINE_WRAP, pHtmlOpt->uWrap, NULL, 0);
  2677. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_HTML_INDENT_REPLY, pHtmlOpt->fIndentReply, NULL, 0);
  2678. }
  2679. void PlainOptFromNewsOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi)
  2680. {
  2681. Assert(pPlainOpt);
  2682. Assert(poi);
  2683. pPlainOpt->fMime = IDwGetOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_MIME);
  2684. pPlainOpt->ietEncoding = (ENCODINGTYPE)IDwGetOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_ENCODE);
  2685. pPlainOpt->f8Bit = IDwGetOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_ALLOW_8BIT);
  2686. pPlainOpt->uWrap = IDwGetOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_LINE_WRAP);
  2687. pPlainOpt->chQuote = (CHAR)IDwGetOption(poi->pOpt, OPT_NEWSINDENT);
  2688. }
  2689. void NewsOptFromPlainOpt(LPPLAINOPT pPlainOpt, OPTINFO *poi)
  2690. {
  2691. Assert(pPlainOpt);
  2692. Assert(poi);
  2693. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_MIME, pPlainOpt->fMime, NULL, 0);
  2694. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_ENCODE, (DWORD)pPlainOpt->ietEncoding, NULL, 0);
  2695. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_ALLOW_8BIT, pPlainOpt->f8Bit, NULL, 0);
  2696. ISetDwOption(poi->pOpt, OPT_NEWS_MSG_PLAIN_LINE_WRAP, pPlainOpt->uWrap, NULL, 0);
  2697. ISetDwOption(poi->pOpt, OPT_NEWSINDENT, pPlainOpt->chQuote, NULL, 0);
  2698. }
  2699. BOOL FGetHTMLOptions(HWND hwndParent, LPHTMLOPT pHtmlOpt)
  2700. {
  2701. return (DialogBoxParam(g_hLocRes, MAKEINTRESOURCE(iddHTMLSettings),
  2702. hwndParent, HTMLSettingsDlgProc, (LPARAM)pHtmlOpt)==IDOK);
  2703. }
  2704. BOOL FGetPlainOptions(HWND hwndParent, LPPLAINOPT pPlainOpt)
  2705. {
  2706. return (DialogBoxParam(g_hLocRes, MAKEINTRESOURCE(iddPlainSettings),
  2707. hwndParent, PlainSettingsDlgProc, (LPARAM)pPlainOpt)==IDOK);
  2708. }
  2709. const static HELPMAP g_rgCtxMapSettings[] = {
  2710. {IDC_MIME_RADIO, IDH_NEWSMAIL_SEND_ADVSET_MIME},
  2711. {IDC_UUENCODE_RADIO, IDH_NEWSMAIL_SEND_ADVSET_UUENCODE},
  2712. {IDC_MAILWRAP_EDIT, IDH_NEWSMAIL_SEND_ADVSET_WRAP_80_CHAR},
  2713. {IDC_MAILWRAP_SPIN, IDH_NEWSMAIL_SEND_ADVSET_WRAP_80_CHAR},
  2714. {IDC_ENCODE_COMBO, IDH_NEWSMAIL_SEND_ADVSET_ENCODE_WITH},
  2715. {IDC_8BIT_HEADER, IDH_SEND_SETTING_8BIT_HEADINGS},
  2716. {IDC_MAILWRAP_TEXT1, IDH_NEWSMAIL_SEND_ADVSET_WRAP_80_CHAR},
  2717. {IDC_MAILWRAP_TEXT2, IDH_NEWSMAIL_SEND_ADVSET_WRAP_80_CHAR},
  2718. {IDC_SENDIMAGES, IDH_OPTIONS_SEND_SETTINGS_SEND_PICTURE},
  2719. {IDC_INDENTREPLY_CHECK, 502066},
  2720. {idcStatic1, 353540},
  2721. {IDC_INDENT_CHECK, 502067},
  2722. {IDC_INDENT_COMBO, 502067},
  2723. {idcStaticReplying, 502067},
  2724. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  2725. {0,0}};
  2726. INT_PTR CALLBACK PlainSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2727. {
  2728. DWORD dw;
  2729. BOOL fMime;
  2730. HWND hwndT;
  2731. UINT id, code;
  2732. LPPLAINOPT pPlainOpt;
  2733. ENCODINGTYPE ietEncoding;
  2734. pPlainOpt = (LPPLAINOPT)GetWindowLongPtr(hwnd, DWLP_USER);
  2735. switch (uMsg)
  2736. {
  2737. case WM_INITDIALOG:
  2738. CenterDialog(hwnd);
  2739. Assert(pPlainOpt == NULL);
  2740. pPlainOpt = (LPPLAINOPT)lParam;
  2741. Assert(pPlainOpt);
  2742. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pPlainOpt);
  2743. if (pPlainOpt->fMime && (pPlainOpt->ietEncoding == IET_QP || pPlainOpt->ietEncoding == IET_BASE64))
  2744. MailEnableWraps(hwnd, FALSE);
  2745. hwndT = GetDlgItem(hwnd, IDC_ENCODE_COMBO);
  2746. FillEncodeCombo(hwndT, FALSE, pPlainOpt->ietEncoding);
  2747. CheckDlgButton(hwnd, pPlainOpt->fMime ? IDC_MIME_RADIO : IDC_UUENCODE_RADIO, BST_CHECKED);
  2748. InitIndentOptions(pPlainOpt->chQuote, hwnd, IDC_INDENT_CHECK, IDC_INDENT_COMBO);
  2749. CheckDlgButton (hwnd, IDC_8BIT_HEADER, pPlainOpt->f8Bit ? 1 : 0);
  2750. if (pPlainOpt->fMime == FALSE)
  2751. {
  2752. EnableWindow (GetDlgItem (hwnd, IDC_8BIT_HEADER), FALSE);
  2753. EnableWindow (GetDlgItem (hwnd, IDC_ENCODE_COMBO), FALSE);
  2754. EnableWindow (GetDlgItem (hwnd, idcStatic1), FALSE);
  2755. }
  2756. dw = pPlainOpt->uWrap;
  2757. // this is to handle change in option... it was previously true/false
  2758. // now it is a count of columns for wrapping or OPTION_OFF
  2759. if (dw == 0 || dw == 1 || dw == OPTION_OFF)
  2760. dw = DEF_AUTOWRAP;
  2761. SendDlgItemMessage(hwnd, IDC_MAILWRAP_SPIN, UDM_SETRANGE, 0, MAKELONG(AUTOWRAP_MAX, AUTOWRAP_MIN));
  2762. SendDlgItemMessage(hwnd, IDC_MAILWRAP_EDIT, EM_LIMITTEXT, 3, 0);
  2763. SetDlgItemInt(hwnd, IDC_MAILWRAP_EDIT, dw, FALSE);
  2764. return(TRUE);
  2765. case WM_HELP:
  2766. case WM_CONTEXTMENU:
  2767. return OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapSettings);
  2768. case WM_COMMAND:
  2769. id = GET_WM_COMMAND_ID(wParam,lParam);
  2770. code = GET_WM_COMMAND_CMD(wParam, lParam);
  2771. switch (id)
  2772. {
  2773. case IDC_ENCODE_COMBO:
  2774. if (code == CBN_SELCHANGE)
  2775. {
  2776. dw = (DWORD) SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETCURSEL, 0, 0);
  2777. ENCODINGTYPE ietEncoding = (ENCODINGTYPE)SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETITEMDATA, dw, 0);
  2778. if (ietEncoding == IET_QP || ietEncoding == IET_BASE64)
  2779. MailEnableWraps(hwnd, FALSE);
  2780. else
  2781. MailEnableWraps(hwnd, TRUE);
  2782. }
  2783. break;
  2784. case IDC_INDENT_CHECK:
  2785. if (code == BN_CLICKED)
  2786. {
  2787. EnableWindow(GetDlgItem(hwnd, IDC_INDENT_COMBO),
  2788. SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED);
  2789. }
  2790. break;
  2791. case idcIndentReply:
  2792. if (code == BN_CLICKED)
  2793. {
  2794. EnableWindow(GetDlgItem(hwnd, idcIndentChar),
  2795. SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED);
  2796. }
  2797. break;
  2798. case IDC_MIME_RADIO:
  2799. case IDC_UUENCODE_RADIO:
  2800. if (id == IDC_UUENCODE_RADIO)
  2801. {
  2802. EnableWindow (GetDlgItem (hwnd, IDC_8BIT_HEADER), FALSE);
  2803. EnableWindow (GetDlgItem (hwnd, IDC_ENCODE_COMBO), FALSE);
  2804. EnableWindow (GetDlgItem (hwnd, idcStatic1), FALSE);
  2805. MailEnableWraps(hwnd, TRUE);
  2806. }
  2807. else
  2808. {
  2809. EnableWindow (GetDlgItem (hwnd, IDC_8BIT_HEADER), TRUE);
  2810. EnableWindow (GetDlgItem (hwnd, IDC_ENCODE_COMBO), TRUE);
  2811. EnableWindow (GetDlgItem (hwnd, idcStatic1), TRUE);
  2812. dw = (DWORD) SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETCURSEL, 0, 0);
  2813. ietEncoding = (ENCODINGTYPE)SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETITEMDATA, dw, 0);
  2814. if (ietEncoding == IET_QP || ietEncoding == IET_BASE64)
  2815. MailEnableWraps(hwnd, FALSE);
  2816. else
  2817. MailEnableWraps(hwnd, TRUE);
  2818. }
  2819. break;
  2820. case IDOK:
  2821. fMime = (IsDlgButtonChecked(hwnd, IDC_MIME_RADIO) == BST_CHECKED);
  2822. dw = (DWORD) SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETCURSEL, 0, 0);
  2823. ietEncoding = (ENCODINGTYPE)SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETITEMDATA, dw, 0);
  2824. if (!(fMime && (ietEncoding == IET_QP || ietEncoding == IET_BASE64)))
  2825. {
  2826. dw = GetDlgItemInt(hwnd, IDC_MAILWRAP_EDIT, NULL, FALSE);
  2827. if (dw > AUTOWRAP_MAX || dw < AUTOWRAP_MIN)
  2828. {
  2829. AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsOptions), MAKEINTRESOURCEW(idsEnterAutoWrap), NULL, MB_OK | MB_ICONEXCLAMATION);
  2830. SendMessage(GetDlgItem(hwnd, IDC_MAILWRAP_EDIT), EM_SETSEL, 0, -1);
  2831. SetFocus(GetDlgItem(hwnd, IDC_MAILWRAP_EDIT));
  2832. return TRUE;
  2833. }
  2834. pPlainOpt->uWrap = dw;
  2835. }
  2836. pPlainOpt->fMime = fMime;
  2837. pPlainOpt->ietEncoding = ietEncoding;
  2838. pPlainOpt->f8Bit = (IsDlgButtonChecked(hwnd, IDC_8BIT_HEADER) == BST_CHECKED);
  2839. if ((IsDlgButtonChecked(hwnd, IDC_INDENT_CHECK) == BST_CHECKED))
  2840. {
  2841. dw = (DWORD) SendDlgItemMessage(hwnd, IDC_INDENT_COMBO, CB_GETCURSEL, 0, 0);
  2842. pPlainOpt->chQuote = (CHAR)c_szQuoteChars[dw];
  2843. }
  2844. else
  2845. pPlainOpt->chQuote = INDENTCHAR_NONE;
  2846. // fall through...
  2847. case IDCANCEL:
  2848. EndDialog(hwnd, id);
  2849. return(TRUE);
  2850. }
  2851. break;
  2852. case WM_CLOSE:
  2853. SendMessage(hwnd, WM_COMMAND, IDCANCEL, 0L);
  2854. return (TRUE);
  2855. }
  2856. return (FALSE);
  2857. }
  2858. INT_PTR CALLBACK HTMLSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2859. {
  2860. DWORD dw;
  2861. HWND hwndT;
  2862. UINT id;
  2863. LPHTMLOPT pHtmlOpt;
  2864. ENCODINGTYPE ietEncoding;
  2865. pHtmlOpt= (LPHTMLOPT)GetWindowLongPtr(hwnd, DWLP_USER);
  2866. switch (uMsg)
  2867. {
  2868. case WM_INITDIALOG:
  2869. CenterDialog(hwnd);
  2870. Assert(pHtmlOpt==NULL);
  2871. pHtmlOpt = (LPHTMLOPT)lParam;
  2872. Assert(pHtmlOpt);
  2873. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pHtmlOpt);
  2874. hwndT = GetDlgItem(hwnd, IDC_ENCODE_COMBO);
  2875. FillEncodeCombo(hwndT, TRUE, pHtmlOpt->ietEncoding);
  2876. CheckDlgButton (hwnd, IDC_8BIT_HEADER, pHtmlOpt->f8Bit);
  2877. CheckDlgButton (hwnd, IDC_SENDIMAGES, pHtmlOpt->fSendImages);
  2878. CheckDlgButton (hwnd, IDC_INDENTREPLY_CHECK, pHtmlOpt->fIndentReply);
  2879. if (pHtmlOpt->ietEncoding == IET_QP || pHtmlOpt->ietEncoding == IET_BASE64)
  2880. MailEnableWraps(hwnd, FALSE);
  2881. else
  2882. MailEnableWraps(hwnd, TRUE);
  2883. dw = pHtmlOpt->uWrap;
  2884. // this is to handle change in option... it was previously true/false
  2885. // now it is a count of columns for wrapping or OPTION_OFF
  2886. if (dw == 0 || dw == 1 || dw == OPTION_OFF)
  2887. dw = DEF_AUTOWRAP;
  2888. SendDlgItemMessage(hwnd, IDC_MAILWRAP_SPIN, UDM_SETRANGE, 0, MAKELONG(AUTOWRAP_MAX, AUTOWRAP_MIN));
  2889. SendDlgItemMessage(hwnd, IDC_MAILWRAP_EDIT, EM_LIMITTEXT, 3, 0);
  2890. SetDlgItemInt(hwnd, IDC_MAILWRAP_EDIT, dw, FALSE);
  2891. return(TRUE);
  2892. case WM_HELP:
  2893. case WM_CONTEXTMENU:
  2894. return OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapSettings);
  2895. case WM_COMMAND:
  2896. id = GET_WM_COMMAND_ID(wParam,lParam);
  2897. switch (id)
  2898. {
  2899. case IDC_ENCODE_COMBO:
  2900. if (GET_WM_COMMAND_CMD(wParam,lParam) == CBN_SELCHANGE)
  2901. {
  2902. dw = (DWORD) SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETCURSEL, 0, 0);
  2903. ENCODINGTYPE ietEncoding = (ENCODINGTYPE)SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETITEMDATA, dw, 0);
  2904. if (ietEncoding == IET_QP || ietEncoding == IET_BASE64)
  2905. MailEnableWraps(hwnd, FALSE);
  2906. else
  2907. MailEnableWraps(hwnd, TRUE);
  2908. }
  2909. break;
  2910. case IDOK:
  2911. dw = (DWORD) SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETCURSEL, 0, 0);
  2912. ietEncoding = (ENCODINGTYPE)SendDlgItemMessage(hwnd, IDC_ENCODE_COMBO, CB_GETITEMDATA, dw, 0);
  2913. if (!(ietEncoding == IET_QP || ietEncoding == IET_BASE64))
  2914. {
  2915. dw = GetDlgItemInt(hwnd, IDC_MAILWRAP_EDIT, NULL, FALSE);
  2916. if (dw > AUTOWRAP_MAX || dw < AUTOWRAP_MIN)
  2917. {
  2918. AthMessageBoxW(hwnd, MAKEINTRESOURCEW(idsOptions), MAKEINTRESOURCEW(idsEnterAutoWrap), NULL, MB_OK | MB_ICONEXCLAMATION);
  2919. SendMessage(GetDlgItem(hwnd, IDC_MAILWRAP_EDIT), EM_SETSEL, 0, -1);
  2920. SetFocus(GetDlgItem(hwnd, IDC_MAILWRAP_EDIT));
  2921. return TRUE;
  2922. }
  2923. pHtmlOpt->uWrap = dw;
  2924. }
  2925. pHtmlOpt->ietEncoding = ietEncoding;
  2926. pHtmlOpt->f8Bit=(IsDlgButtonChecked(hwnd, IDC_8BIT_HEADER) == BST_CHECKED);
  2927. pHtmlOpt->fSendImages=(IsDlgButtonChecked(hwnd, IDC_SENDIMAGES) == BST_CHECKED);
  2928. pHtmlOpt->fIndentReply=(IsDlgButtonChecked(hwnd, IDC_INDENTREPLY_CHECK) == BST_CHECKED);
  2929. // fall through...
  2930. case IDCANCEL:
  2931. EndDialog(hwnd, id);
  2932. return(TRUE);
  2933. }
  2934. break;
  2935. case WM_CLOSE:
  2936. SendMessage(hwnd, WM_COMMAND, IDCANCEL, 0L);
  2937. return (TRUE);
  2938. }
  2939. return (FALSE);
  2940. }
  2941. const static HELPMAP g_rgCtxMapAdvSec[] =
  2942. {
  2943. {IDC_ENCRYPT_FOR_SELF, IDH_SECURITY_ADVANCED_INCLUDE_SELF},
  2944. {IDC_INCLUDECERT_CHECK, IDH_SECURITY_ADVANCED_INCLUDE_ID},
  2945. {IDC_OPAQUE_SIGN, IDH_SECURITY_ADVANCED_INCLUDE_PKCS},
  2946. {IDC_AUTO_ADD_SENDERS_CERT_TO_WAB, 355528},
  2947. {IDC_ENCRYPT_WARN_COMBO, 355527},
  2948. {IDC_REVOKE_ONLINE_ONLY, 355529},
  2949. {IDC_REVOKE_NEVER, 355531},
  2950. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  2951. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  2952. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  2953. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  2954. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  2955. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  2956. {IDC_ENCRYPT_ICON, IDH_NEWS_COMM_GROUPBOX},
  2957. {IDC_SIGNED_ICON, IDH_NEWS_COMM_GROUPBOX},
  2958. {IDC_CERT_ICON, IDH_NEWS_COMM_GROUPBOX},
  2959. {0,0}
  2960. };
  2961. INT_PTR CALLBACK AdvSecurityDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  2962. {
  2963. OPTINFO *poi;
  2964. poi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  2965. switch (message)
  2966. {
  2967. case WM_INITDIALOG:
  2968. CenterDialog(hwnd);
  2969. // save our cookie pointer
  2970. Assert(poi == NULL);
  2971. poi = (OPTINFO *)lParam;
  2972. Assert(poi != NULL);
  2973. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)poi);
  2974. // Set the images correctly
  2975. HIMAGELIST himl;
  2976. himl = ImageList_LoadBitmap(g_hLocRes, MAKEINTRESOURCE(idbPaneBar32Hot),
  2977. 30, 0, RGB(255, 0, 255));
  2978. if (himl)
  2979. {
  2980. HICON hIcon = ImageList_ExtractIcon(g_hLocRes, himl, 0);
  2981. SendDlgItemMessage(hwnd, IDC_ENCRYPT_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  2982. hIcon = ImageList_ExtractIcon(g_hLocRes, himl, 1);
  2983. SendDlgItemMessage(hwnd, IDC_SIGNED_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  2984. hIcon = ImageList_ExtractIcon(g_hLocRes, himl, 6);
  2985. SendDlgItemMessage(hwnd, IDC_CERT_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  2986. ImageList_Destroy(himl);
  2987. }
  2988. // set initial state of controls
  2989. AdvSec_FillEncWarnCombo(hwnd, poi);
  2990. ButtonChkFromOptInfo(hwnd, IDC_INCLUDECERT_CHECK, poi, OPT_MAIL_INCLUDECERT);
  2991. // Encrypt for myself
  2992. CheckDlgButton(hwnd, IDC_ENCRYPT_FOR_SELF, (0 == IDwGetOption(poi->pOpt, OPT_NO_SELF_ENCRYPT)) ? BST_CHECKED : BST_UNCHECKED);
  2993. // Opaque signing
  2994. ButtonChkFromOptInfo(hwnd, IDC_OPAQUE_SIGN, poi, OPT_OPAQUE_SIGN);
  2995. // Opaque signing
  2996. ButtonChkFromOptInfo(hwnd, IDC_AUTO_ADD_SENDERS_CERT_TO_WAB, poi, OPT_AUTO_ADD_SENDERS_CERT_TO_WAB);
  2997. CheckDlgButton(hwnd, IDC_REVOKE_ONLINE_ONLY, (0 == IDwGetOption(poi->pOpt, OPT_REVOKE_CHECK)) ? BST_UNCHECKED : BST_CHECKED);
  2998. CheckDlgButton(hwnd, IDC_REVOKE_NEVER, (0 != IDwGetOption(poi->pOpt, OPT_REVOKE_CHECK)) ? BST_UNCHECKED : BST_CHECKED);
  2999. return(TRUE);
  3000. case WM_HELP:
  3001. case WM_CONTEXTMENU:
  3002. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapAdvSec);
  3003. case WM_COMMAND:
  3004. if (poi == NULL)
  3005. break;
  3006. switch (LOWORD(wParam))
  3007. {
  3008. case IDOK:
  3009. {
  3010. BOOL fDontEncryptForSelf;
  3011. // update the registry based on states of the controls
  3012. // BUG: #33047, don't use global options now
  3013. ButtonChkToOptInfo(hwnd, IDC_INCLUDECERT_CHECK, poi, OPT_MAIL_INCLUDECERT);
  3014. // Opaque signing is stored in registry
  3015. fDontEncryptForSelf = !(IsDlgButtonChecked(hwnd, IDC_ENCRYPT_FOR_SELF) == BST_CHECKED);
  3016. ISetDwOption(poi->pOpt, OPT_NO_SELF_ENCRYPT, fDontEncryptForSelf, NULL, 0);
  3017. // Opaque signing is stored in registry
  3018. ButtonChkToOptInfo(hwnd, IDC_OPAQUE_SIGN, poi, OPT_OPAQUE_SIGN);
  3019. // Opaque signing is stored in registry
  3020. ButtonChkToOptInfo(hwnd, IDC_AUTO_ADD_SENDERS_CERT_TO_WAB, poi, OPT_AUTO_ADD_SENDERS_CERT_TO_WAB);
  3021. // Revocation checking
  3022. ButtonChkToOptInfo(hwnd, IDC_REVOKE_ONLINE_ONLY, poi, OPT_REVOKE_CHECK);
  3023. // Get encryption warning strenght into registry
  3024. AdvSec_GetEncryptWarnCombo(hwnd, poi);
  3025. }
  3026. // fall through...
  3027. case IDCANCEL:
  3028. EndDialog(hwnd, LOWORD(wParam));
  3029. return(TRUE);
  3030. case IDC_REVOKE_NEVER:
  3031. CheckDlgButton(hwnd, IDC_REVOKE_ONLINE_ONLY, BST_UNCHECKED);
  3032. CheckDlgButton(hwnd, IDC_REVOKE_NEVER, BST_CHECKED);
  3033. break;
  3034. case IDC_REVOKE_ONLINE_ONLY:
  3035. CheckDlgButton(hwnd, IDC_REVOKE_ONLINE_ONLY, BST_CHECKED);
  3036. CheckDlgButton(hwnd, IDC_REVOKE_NEVER, BST_UNCHECKED);
  3037. break;
  3038. }
  3039. break; // wm_command
  3040. case WM_CLOSE:
  3041. SendMessage(hwnd, WM_COMMAND, IDCANCEL, 0L);
  3042. return (TRUE);
  3043. } // message switch
  3044. return(FALSE);
  3045. }
  3046. void ButtonChkFromOptInfo(HWND hwnd, UINT idc, OPTINFO *poi, ULONG opt)
  3047. {
  3048. Assert(poi != NULL);
  3049. CheckDlgButton(hwnd, idc, (!!IDwGetOption(poi->pOpt, opt)) ? BST_CHECKED : BST_UNCHECKED);
  3050. }
  3051. BOOL ButtonChkToOptInfo(HWND hwnd, UINT idc, OPTINFO *poi, ULONG opt)
  3052. {
  3053. register BOOL f = (IsDlgButtonChecked(hwnd, idc) == BST_CHECKED);
  3054. Assert(poi != NULL);
  3055. ISetDwOption(poi->pOpt, opt, f, NULL, 0);
  3056. return(f);
  3057. }
  3058. // These are the bit-strength values that will show up in our drop down.
  3059. const ULONG BitStrengthValues[5] = {
  3060. 168,
  3061. 128,
  3062. 64,
  3063. 56,
  3064. 40
  3065. };
  3066. const ULONG CBitStrengthValues = sizeof(BitStrengthValues) / sizeof(ULONG);
  3067. BOOL AdvSec_FillEncWarnCombo(HWND hwnd, OPTINFO *poi)
  3068. {
  3069. HRESULT hr;
  3070. PROPVARIANT var;
  3071. ULONG ulHighestStrength;
  3072. ULONG ulCurrentStrength = 0;
  3073. ULONG i, j;
  3074. ULONG k = 0;
  3075. // Get the default lcaps blob from the registry
  3076. hr = poi->pOpt->GetProperty(MAKEPROPSTRING(OPT_MAIL_ENCRYPT_WARN_BITS), &var, 0);
  3077. if (SUCCEEDED(hr)) {
  3078. Assert(var.vt == VT_UI4);
  3079. ulCurrentStrength = var.ulVal;
  3080. }
  3081. // Get the available encryption algorithms from the available providers.
  3082. ulHighestStrength = GetHighestEncryptionStrength();
  3083. if (! ulCurrentStrength) { // default to highest available
  3084. ulCurrentStrength = ulHighestStrength;
  3085. }
  3086. for (i = 0; i < CBitStrengthValues; i++)
  3087. {
  3088. if (BitStrengthValues[i] <= ulHighestStrength)
  3089. {
  3090. // Add it to the list
  3091. // LPTSTR lpString = NULL;
  3092. // DWORD rgdw[1] = {BitStrengthValues[i]};
  3093. TCHAR szBuffer[100]; // really ought to be big enough
  3094. TCHAR szTmp[256] = _T("");;
  3095. LoadString(g_hLocRes, idsBitStrength, szBuffer, ARRAYSIZE(szBuffer));
  3096. if (szBuffer[0])
  3097. {
  3098. #ifdef OLD
  3099. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
  3100. FORMAT_MESSAGE_FROM_STRING |
  3101. FORMAT_MESSAGE_ARGUMENT_ARRAY,
  3102. szBuffer,
  3103. 0, 0,
  3104. (LPTSTR)&lpString, 0, (va_list *)rgdw);
  3105. #endif
  3106. wnsprintf(szTmp, ARRAYSIZE(szTmp), szBuffer, BitStrengthValues[i]);
  3107. }
  3108. if (szTmp[0])
  3109. {
  3110. j = (ULONG) SendDlgItemMessageA(hwnd, IDC_ENCRYPT_WARN_COMBO, CB_ADDSTRING, 0, (LPARAM)szTmp/*lpString*/);
  3111. // Item data is the bit strength
  3112. SendDlgItemMessageA(hwnd, IDC_ENCRYPT_WARN_COMBO, CB_SETITEMDATA, j, BitStrengthValues[i]);
  3113. if (ulCurrentStrength == BitStrengthValues[i])
  3114. {
  3115. SendDlgItemMessageA(hwnd, IDC_ENCRYPT_WARN_COMBO, CB_SETCURSEL, (WPARAM)j, 0);
  3116. }
  3117. }
  3118. // LocalFree(lpString);
  3119. // lpString = NULL;
  3120. }
  3121. }
  3122. return(SUCCEEDED(hr));
  3123. }
  3124. BOOL AdvSec_GetEncryptWarnCombo(HWND hwnd, OPTINFO *poi)
  3125. {
  3126. HRESULT hr;
  3127. ULONG i;
  3128. ULONG ulStrength = 0;
  3129. ULONG ulHighestStrength;
  3130. PROPVARIANT var;
  3131. // What item is selected?
  3132. i = (ULONG) SendDlgItemMessageA(hwnd, IDC_ENCRYPT_WARN_COMBO, CB_GETCURSEL, 0, 0);
  3133. if (i != CB_ERR) {
  3134. ulStrength = (ULONG) SendDlgItemMessageA(hwnd, IDC_ENCRYPT_WARN_COMBO, CB_GETITEMDATA, (WPARAM)i, 0);
  3135. }
  3136. // If the strength is the highest available, then set this to the default value.
  3137. ulHighestStrength = GetHighestEncryptionStrength();
  3138. if (ulHighestStrength == ulStrength) {
  3139. ulStrength = 0;
  3140. }
  3141. // Set the default value to the registry
  3142. var.vt = VT_UI4;
  3143. var.ulVal = ulStrength;
  3144. hr = poi->pOpt->SetProperty(MAKEPROPSTRING(OPT_MAIL_ENCRYPT_WARN_BITS), &var, 0);
  3145. return(SUCCEEDED(hr));
  3146. }
  3147. BOOL ChangeSendFontSettings(OPTINFO *pmoi, BOOL fMail, HWND hwnd)
  3148. {
  3149. const FONTOPTIONS *pfo;
  3150. CHOOSEFONT cf;
  3151. LOGFONT logfont;
  3152. HDC hdc;
  3153. LONG yPerInch;
  3154. DWORD dwColor, dwSize;
  3155. BOOL fRet = FALSE,
  3156. fBold,
  3157. fItalic,
  3158. fUnderline;
  3159. Assert(pmoi != NULL);
  3160. Assert(hwnd != NULL);
  3161. ZeroMemory(&logfont, sizeof(LOGFONT));
  3162. pfo = fMail ? &c_rgFontOptions[0] : &c_rgFontOptions[1];
  3163. dwColor = IDwGetOption(pmoi->pOpt, pfo->color);
  3164. dwSize = IDwGetOption(pmoi->pOpt, pfo->size);
  3165. fBold = IDwGetOption(pmoi->pOpt, pfo->bold);
  3166. fItalic = IDwGetOption(pmoi->pOpt, pfo->italic);
  3167. fUnderline = IDwGetOption(pmoi->pOpt, pfo->underline);
  3168. logfont.lfWeight = fBold ? FW_BOLD : FW_NORMAL;
  3169. logfont.lfItalic = !!fItalic;
  3170. logfont.lfUnderline = !!fUnderline;
  3171. IGetOption(pmoi->pOpt, pfo->face, logfont.lfFaceName, sizeof(logfont.lfFaceName));
  3172. hdc = GetDC(hwnd);
  3173. yPerInch = GetDeviceCaps(hdc, LOGPIXELSY);
  3174. ReleaseDC(hwnd, hdc);
  3175. if (dwSize)
  3176. logfont.lfHeight = -(INT)((dwSize*10*2*yPerInch)/1440);
  3177. if (dwColor)
  3178. cf.rgbColors = dwColor;
  3179. cf.lStructSize = sizeof(CHOOSEFONT);
  3180. cf.hwndOwner = hwnd;
  3181. cf.hDC = NULL;
  3182. cf.lpLogFont = &logfont;
  3183. cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_ENABLEHOOK |
  3184. CF_EFFECTS | CF_LIMITSIZE | CF_NOVERTFONTS | CF_NOSCRIPTSEL;
  3185. cf.lCustData = 0;
  3186. cf.lpfnHook = (LPOFNHOOKPROC)FChooseFontHookProc;
  3187. cf.lpTemplateName = NULL;
  3188. cf.hInstance = NULL;
  3189. cf.nFontType = REGULAR_FONTTYPE | SCREEN_FONTTYPE;
  3190. cf.nSizeMin = 8;
  3191. cf.nSizeMax = 36;
  3192. if (fRet = ChooseFont(&cf))
  3193. {
  3194. ISetDwOption(pmoi->pOpt, pfo->color, cf.rgbColors, NULL, 0);
  3195. ISetDwOption(pmoi->pOpt, pfo->size, cf.iPointSize/10, NULL, 0);
  3196. ISetDwOption(pmoi->pOpt, pfo->bold, logfont.lfWeight == FW_BOLD, NULL, 0);
  3197. ISetDwOption(pmoi->pOpt, pfo->italic, !!logfont.lfItalic, NULL, 0);
  3198. ISetDwOption(pmoi->pOpt, pfo->underline, !!logfont.lfUnderline, NULL, 0);
  3199. ISetOption(pmoi->pOpt, pfo->face, logfont.lfFaceName, lstrlen(logfont.lfFaceName) + 1, NULL, 0);
  3200. }
  3201. return fRet;
  3202. }
  3203. INT_PTR CALLBACK FChooseFontHookProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  3204. {
  3205. switch (message)
  3206. {
  3207. case WM_INITDIALOG:
  3208. CenterDialog(hwnd);
  3209. EnableWindow(GetDlgItem(hwnd, 1040), FALSE);
  3210. break;
  3211. }
  3212. return(FALSE);
  3213. }
  3214. static TCHAR s_szUserDefined[] = "\\50000";
  3215. static TCHAR s_szScrUserDefined[] = "\\Scripts\\40";
  3216. BOOL ChangeFontSettings(HWND hwnd)
  3217. {
  3218. LPCTSTR pszRoot;
  3219. TCHAR szIntl[MAX_PATH];
  3220. TCHAR szCodePage[MAX_PATH*2];
  3221. TCHAR szScript[MAX_PATH*2];
  3222. DWORD cb;
  3223. DWORD dwVal;
  3224. DWORD dwType;
  3225. HKEY hKeyCP = NULL;
  3226. HKEY hKeyScr = NULL;
  3227. DWORD dw;
  3228. pszRoot = MU_GetRegRoot();
  3229. if (pszRoot != NULL)
  3230. {
  3231. StrCpyN(szIntl, pszRoot, ARRAYSIZE(szIntl));
  3232. StrCatBuff(szIntl, c_szTridentIntl, ARRAYSIZE(szIntl));
  3233. OpenFontsDialog(hwnd, szIntl);
  3234. // HACK! HACK! HACK! Bug 84378
  3235. StrCpyN(szCodePage, szIntl, ARRAYSIZE(szCodePage));
  3236. StrCatBuff(szCodePage, s_szUserDefined, ARRAYSIZE(szCodePage));
  3237. StrCpyN(szScript, szIntl, ARRAYSIZE(szScript));
  3238. StrCatBuff(szScript, s_szScrUserDefined, ARRAYSIZE(szScript));
  3239. if (RegCreateKeyEx(HKEY_CURRENT_USER, szCodePage, NULL, NULL, NULL, KEY_READ, NULL, &hKeyCP, &dw)
  3240. == ERROR_SUCCESS)
  3241. {
  3242. if (RegCreateKeyEx(HKEY_CURRENT_USER, szScript, NULL, NULL, NULL, KEY_WRITE, NULL, &hKeyScr, &dw)
  3243. == ERROR_SUCCESS)
  3244. {
  3245. TCHAR szFont[MAX_MIMEFACE_NAME];
  3246. cb = MAX_MIMEFACE_NAME * sizeof(szFont[0]);
  3247. if (RegQueryValueEx(hKeyCP, REGSTR_VAL_FIXED_FONT, NULL, NULL,
  3248. (LPBYTE)szFont, &cb) == ERROR_SUCCESS)
  3249. {
  3250. RegSetValueEx(hKeyScr, REGSTR_VAL_FIXED_FONT, NULL, REG_SZ, (LPBYTE)szFont, (lstrlen(szFont)+1)*sizeof(TCHAR));
  3251. }
  3252. cb = MAX_MIMEFACE_NAME * sizeof(szFont[0]);
  3253. if (RegQueryValueEx(hKeyCP, REGSTR_VAL_PROP_FONT, NULL, NULL,
  3254. (LPBYTE)szFont, &cb) == ERROR_SUCCESS)
  3255. {
  3256. RegSetValueEx(hKeyScr, REGSTR_VAL_PROP_FONT, NULL, REG_SZ, (LPBYTE)szFont, (lstrlen(szFont)+1)*sizeof(TCHAR));
  3257. }
  3258. RegCloseKey(hKeyScr);
  3259. }
  3260. RegCloseKey(hKeyCP);
  3261. }
  3262. // END of HACK!!!
  3263. // hack: we should call these only if OpenFontsDialog tells us user has changed the font.
  3264. g_lpIFontCache->OnOptionChange();
  3265. SendTridentOptionsChange();
  3266. // Re-Read Default Character Set
  3267. SetDefaultCharset(NULL);
  3268. // Reset g_uiCodePage
  3269. cb = sizeof(dwVal);
  3270. if (ERROR_SUCCESS == SHGetValue(MU_GetCurrentUserHKey(), c_szRegInternational, REGSTR_VAL_DEFAULT_CODEPAGE, &dwType, &dwVal, &cb))
  3271. g_uiCodePage = (UINT)dwVal;
  3272. }
  3273. return TRUE;
  3274. }
  3275. void GetDefaultOptInfo(LPHTMLOPT prHtmlOpt, LPPLAINOPT prPlainOpt, BOOL *pfHtml, DWORD dwFlags)
  3276. {
  3277. BOOL fMail;
  3278. Assert (prHtmlOpt && prPlainOpt && pfHtml );
  3279. ZeroMemory (prHtmlOpt, sizeof(HTMLOPT));
  3280. ZeroMemory (prPlainOpt, sizeof(PLAINOPT));
  3281. fMail = !!(dwFlags & FMT_MAIL);
  3282. // setup reasonable defaults
  3283. prPlainOpt->uWrap = 76;
  3284. prPlainOpt->ietEncoding = IET_7BIT;
  3285. prHtmlOpt->ietEncoding = IET_QP;
  3286. if (fMail)
  3287. {
  3288. // Mail Options
  3289. if (!!(dwFlags & FMT_FORCE_PLAIN))
  3290. *pfHtml = FALSE;
  3291. else if (!!(dwFlags & FMT_FORCE_HTML))
  3292. *pfHtml = TRUE;
  3293. else
  3294. *pfHtml = !!DwGetOption(OPT_MAIL_SEND_HTML);
  3295. // HTML Options
  3296. prHtmlOpt->ietEncoding = (ENCODINGTYPE)DwGetOption(OPT_MAIL_MSG_HTML_ENCODE);
  3297. prHtmlOpt->f8Bit = !!DwGetOption(OPT_MAIL_MSG_HTML_ALLOW_8BIT);
  3298. prHtmlOpt->fSendImages = !!DwGetOption(OPT_MAIL_SENDINLINEIMAGES);
  3299. prHtmlOpt->uWrap = DwGetOption(OPT_MAIL_MSG_HTML_LINE_WRAP);
  3300. // Plain text options
  3301. prPlainOpt->fMime = !!DwGetOption(OPT_MAIL_MSG_PLAIN_MIME);
  3302. prPlainOpt->f8Bit = !!DwGetOption(OPT_MAIL_MSG_PLAIN_ALLOW_8BIT);
  3303. prPlainOpt->uWrap = DwGetOption(OPT_MAIL_MSG_PLAIN_LINE_WRAP);
  3304. prPlainOpt->ietEncoding = (ENCODINGTYPE)DwGetOption(OPT_MAIL_MSG_PLAIN_ENCODE);
  3305. }
  3306. else
  3307. {
  3308. // News Options
  3309. if (!!(dwFlags & FMT_FORCE_PLAIN))
  3310. *pfHtml = FALSE;
  3311. else if (!!(dwFlags & FMT_FORCE_HTML))
  3312. *pfHtml = TRUE;
  3313. else
  3314. *pfHtml = !!DwGetOption(OPT_NEWS_SEND_HTML);
  3315. // HTML Options
  3316. prHtmlOpt->ietEncoding = (ENCODINGTYPE)DwGetOption(OPT_NEWS_MSG_HTML_ENCODE);
  3317. prHtmlOpt->f8Bit = !!DwGetOption(OPT_NEWS_MSG_HTML_ALLOW_8BIT);
  3318. prHtmlOpt->fSendImages = !!DwGetOption(OPT_NEWS_SENDINLINEIMAGES);
  3319. prHtmlOpt->uWrap = DwGetOption(OPT_NEWS_MSG_HTML_LINE_WRAP);
  3320. prPlainOpt->fMime = !!DwGetOption(OPT_NEWS_MSG_PLAIN_MIME);
  3321. prPlainOpt->f8Bit = !!DwGetOption(OPT_NEWS_MSG_PLAIN_ALLOW_8BIT);
  3322. prPlainOpt->uWrap = DwGetOption(OPT_NEWS_MSG_PLAIN_LINE_WRAP);
  3323. prPlainOpt->ietEncoding = (ENCODINGTYPE)DwGetOption(OPT_NEWS_MSG_PLAIN_ENCODE);
  3324. }
  3325. // Do some validation based on the stuff that may be in the registry
  3326. // Allow 8bit in headers is always on if not a MIME message
  3327. if (!prPlainOpt->fMime)
  3328. prPlainOpt->f8Bit = TRUE;
  3329. // HTML has to be either QP or base-64. If not, then force QP
  3330. #ifdef DONT_ALLOW_HTML_NONE_ENCODING
  3331. if (prHtmlOpt->ietEncoding != IET_QP && prHtmlOpt->ietEncoding != IET_BASE64)
  3332. prHtmlOpt->ietEncoding = IET_QP;
  3333. #else
  3334. // if PLAIN, MIME: then enforce either QP, B64 or 7BIT: Default to 7BIT
  3335. if (prHtmlOpt->ietEncoding != IET_QP && prHtmlOpt->ietEncoding != IET_BASE64 && prHtmlOpt->ietEncoding != IET_7BIT)
  3336. prHtmlOpt->ietEncoding = IET_7BIT;
  3337. #endif
  3338. // if PLAIN, MIME: then enforce either QP, B64 or 7BIT: Default to 7BIT
  3339. if (prPlainOpt->fMime &&
  3340. prPlainOpt->ietEncoding != IET_QP && prPlainOpt->ietEncoding != IET_BASE64 && prPlainOpt->ietEncoding != IET_7BIT)
  3341. prPlainOpt->ietEncoding = IET_7BIT;
  3342. // if PLAIN, UU: then enforce 7BIT.
  3343. if (!prPlainOpt->fMime && prPlainOpt->ietEncoding != IET_7BIT)
  3344. prPlainOpt->ietEncoding = IET_7BIT;
  3345. }
  3346. LRESULT InvalidOptionProp(HWND hwndPage, int idcEdit, int idsError, UINT idPage)
  3347. {
  3348. HWND hwndCurr, hwndParent, hwndEdit;
  3349. Assert(hwndPage != NULL);
  3350. Assert(idPage != 0);
  3351. Assert(idcEdit != 0);
  3352. Assert(idsError != 0);
  3353. hwndParent = GetParent(hwndPage);
  3354. AthMessageBoxW(hwndPage, MAKEINTRESOURCEW(idsOptions), MAKEINTRESOURCEW(idsError), 0, MB_ICONSTOP | MB_OK);
  3355. hwndCurr = PropSheet_GetCurrentPageHwnd(hwndParent);
  3356. if (hwndCurr != hwndPage)
  3357. SendMessage(hwndParent, PSM_SETCURSELID, 0, (LPARAM)idPage);
  3358. hwndEdit = GetDlgItem(hwndPage, idcEdit);
  3359. SendMessage(hwndEdit, EM_SETSEL, 0, -1);
  3360. SetFocus(hwndEdit);
  3361. return (PSNRET_INVALID_NOCHANGEPAGE);
  3362. }
  3363. INT_PTR CALLBACK DefaultClientDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  3364. void DoDefaultClientCheck(HWND hwnd, DWORD dwFlags)
  3365. {
  3366. int iret;
  3367. DWORD dwType, dw, cb;
  3368. BOOL f, bSet = FALSE;
  3369. // Are we handling?
  3370. if (dwFlags & DEFAULT_MAIL)
  3371. {
  3372. if (FIsDefaultMailConfiged())
  3373. return;
  3374. }
  3375. else
  3376. {
  3377. if (FIsDefaultNewsConfiged(dwFlags))
  3378. return;
  3379. }
  3380. // Someone else is a valid handler
  3381. // If we're supposed to be the "outlook newsreader", then we check for "don't ask" in a different place
  3382. cb = sizeof(DWORD);
  3383. if (dwFlags & DEFAULT_OUTNEWS)
  3384. {
  3385. f = (ERROR_SUCCESS != AthUserGetValue(c_szRegOutNewsDefault, c_szNoCheckDefault,
  3386. &dwType, (LPBYTE)&dw, &cb) || dw == 0);
  3387. }
  3388. else
  3389. {
  3390. f = (ERROR_SUCCESS != AthUserGetValue(dwFlags & DEFAULT_MAIL ? c_szRegPathMail : c_szRegPathNews,
  3391. c_szNoCheckDefault, &dwType, (LPBYTE)&dw, &cb) || dw == 0);
  3392. }
  3393. if (f)
  3394. {
  3395. iret = (int) DialogBoxParam(g_hLocRes, MAKEINTRESOURCE(iddAthenaDefault), hwnd, DefaultClientDlgProc, (LPARAM) dwFlags);
  3396. if (HIWORD(iret) != 0)
  3397. {
  3398. dw = 1;
  3399. if (dwFlags & DEFAULT_OUTNEWS)
  3400. {
  3401. AthUserSetValue(c_szRegOutNewsDefault, c_szNoCheckDefault, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD));
  3402. }
  3403. else
  3404. {
  3405. AthUserSetValue(dwFlags & DEFAULT_MAIL ? c_szRegPathMail : c_szRegPathNews,
  3406. c_szNoCheckDefault, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD));
  3407. }
  3408. }
  3409. bSet = (LOWORD(iret) == IDYES);
  3410. }
  3411. if (bSet)
  3412. {
  3413. dwFlags |= DEFAULT_UI;
  3414. if (dwFlags & DEFAULT_MAIL)
  3415. SetDefaultMailHandler(dwFlags);
  3416. else
  3417. SetDefaultNewsHandler(dwFlags);
  3418. }
  3419. }
  3420. INT_PTR CALLBACK DefaultClientDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  3421. {
  3422. WORD id;
  3423. TCHAR sz[CCHMAX_STRINGRES];
  3424. HICON hicon;
  3425. BOOL fRet = TRUE;
  3426. switch (msg)
  3427. {
  3428. case WM_INITDIALOG:
  3429. if (lParam & DEFAULT_OUTNEWS)
  3430. {
  3431. LoadString(g_hLocRes, idsNotDefOutNewsClient, sz, ARRAYSIZE(sz));
  3432. SetDlgItemText(hwnd, IDC_NOTDEFAULT, sz);
  3433. LoadString(g_hLocRes, idsAlwaysCheckOutNews, sz, ARRAYSIZE(sz));
  3434. SetDlgItemText(hwnd, IDC_ALWAYSCHECK, sz);
  3435. }
  3436. else if (lParam & DEFAULT_NEWS)
  3437. {
  3438. LoadString(g_hLocRes, idsNotDefNewsClient, sz, ARRAYSIZE(sz));
  3439. SetDlgItemText(hwnd, IDC_NOTDEFAULT, sz);
  3440. }
  3441. hicon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_EXCLAMATION));
  3442. if (hicon != NULL)
  3443. SendDlgItemMessage(hwnd, IDC_WARNINGICON, STM_SETICON, (WPARAM)hicon, 0);
  3444. CheckDlgButton(hwnd, IDC_ALWAYSCHECK, BST_CHECKED);
  3445. CenterDialog(hwnd);
  3446. PostMessage(hwnd, WM_USER, 0, 0);
  3447. break;
  3448. case WM_USER:
  3449. SetForegroundWindow(hwnd);
  3450. break;
  3451. case WM_COMMAND:
  3452. id = LOWORD(wParam);
  3453. switch (id)
  3454. {
  3455. case IDYES:
  3456. case IDNO:
  3457. EndDialog(hwnd, MAKELONG(id, BST_UNCHECKED == IsDlgButtonChecked(hwnd, IDC_ALWAYSCHECK) ? 1 : 0));
  3458. break;
  3459. }
  3460. break;
  3461. default:
  3462. fRet = FALSE;
  3463. break;
  3464. }
  3465. return(fRet);
  3466. }
  3467. BOOL CALLBACK TridentSearchCB(HWND hwnd, LPARAM lParam)
  3468. {
  3469. DWORD dwProc,
  3470. dwAthenaProc=GetCurrentProcessId();
  3471. TCHAR rgch[MAX_PATH];
  3472. if (GetWindowThreadProcessId(hwnd, &dwProc) && dwProc == dwAthenaProc &&
  3473. GetClassName(hwnd, rgch, ARRAYSIZE(rgch)) &&
  3474. lstrcmp(rgch, "Internet Explorer_Hidden")==0)
  3475. {
  3476. PostMessage(hwnd, WM_USER + 338, 0, 0);
  3477. return FALSE;
  3478. }
  3479. return TRUE;
  3480. }
  3481. void SendTridentOptionsChange()
  3482. {
  3483. // walk the top-level windows in our process, looking for the trident notification window
  3484. // when we find it, post it WM_USER + 338
  3485. EnumWindows(TridentSearchCB, 0);
  3486. }
  3487. void FreeIcon(HWND hwnd, int idc)
  3488. {
  3489. HICON hIcon;
  3490. hIcon = (HICON) SendDlgItemMessage(hwnd, idc, STM_GETIMAGE, IMAGE_ICON, 0);
  3491. SendDlgItemMessage(hwnd, idc, STM_SETIMAGE, IMAGE_ICON, NULL);
  3492. if (hIcon)
  3493. DestroyIcon(hIcon);
  3494. }
  3495. // -----------------------------------------------------------------------------
  3496. // IsHTTPMailEnabled
  3497. // HTTPMail accounts can only be created and accessed when a special
  3498. // registry value exists. This limitation exists during development of
  3499. // OE 5.0, and will probably be removed for release.
  3500. // -----------------------------------------------------------------------------
  3501. BOOL IsHTTPMailEnabled(void)
  3502. {
  3503. #ifdef NOHTTPMAIL
  3504. return FALSE;
  3505. #else
  3506. DWORD cb, bEnabled = FALSE;
  3507. HKEY hkey = NULL;
  3508. // open the OE5.0 key
  3509. if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szRegFlat, 0, KEY_QUERY_VALUE, &hkey))
  3510. {
  3511. cb = sizeof(bEnabled);
  3512. RegQueryValueEx(hkey, c_szEnableHTTPMail, 0, NULL, (LPBYTE)&bEnabled, &cb);
  3513. RegCloseKey(hkey);
  3514. }
  3515. return bEnabled;
  3516. #endif
  3517. }
  3518. const static HELPMAP g_rgCtxMapReceipts[] =
  3519. {
  3520. {IDC_MDN_SEND_REQUEST, IDH_RECEIPTS_REQUEST},
  3521. {IDC_DONOT_REPSONDTO_RCPT, IDH_RECEIPTS_NEVER},
  3522. {IDC_ASKME_FOR_RCPT, IDH_RECEIPTS_ASK},
  3523. {IDC_SEND_AUTO_RCPT, IDH_RECEIPTS_ALWAYS},
  3524. {IDC_TO_CC_LINE_RCPT, IDH_RECEIPTS_EXCEPTIONS},
  3525. {IDC_SECURE_RECEIPT, IDH_RECEIPTS_SECURE},
  3526. {0, 0 }
  3527. };
  3528. INT_PTR CALLBACK ReceiptsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  3529. {
  3530. LRESULT lResult;
  3531. switch (message)
  3532. {
  3533. case WM_INITDIALOG:
  3534. return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, Receipts_OnInitDialog);
  3535. case WM_HELP:
  3536. case WM_CONTEXTMENU:
  3537. return OnContextHelp(hwnd, message, wParam, lParam, g_rgCtxMapReceipts);
  3538. break;
  3539. case WM_COMMAND:
  3540. HANDLE_WM_COMMAND(hwnd, wParam, lParam, Receipts_OnCommand);
  3541. return (TRUE);
  3542. case WM_NOTIFY:
  3543. lResult = HANDLE_WM_NOTIFY(hwnd, wParam, lParam, Receipts_OnNotify);
  3544. SetDlgMsgResult(hwnd, WM_NOTIFY, lResult);
  3545. return (TRUE);
  3546. case WM_DESTROY:
  3547. FreeIcon(hwnd, IDC_RECEIPT);
  3548. FreeIcon(hwnd, IDC_SEND_RECEIVE_ICON);
  3549. if(!IsSMIME3Supported())
  3550. FreeIcon(hwnd, IDC_SEC_REC);
  3551. return (TRUE);
  3552. }
  3553. return (FALSE);
  3554. }
  3555. BOOL Receipts_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  3556. {
  3557. OPTINFO *pmoi = 0;
  3558. BOOL fEnable = FALSE;
  3559. DWORD id;
  3560. DWORD dw;
  3561. DWORD dwLocked = FALSE;
  3562. DWORD dwType;
  3563. DWORD cbData;
  3564. HKEY hKeyLM;
  3565. // Get the passed in options pointer
  3566. Assert(pmoi == NULL);
  3567. pmoi = (OPTINFO *)(((PROPSHEETPAGE *)lParam)->lParam);
  3568. Assert(pmoi != NULL);
  3569. dw = IDwGetOption(pmoi->pOpt, OPT_MDN_SEND_RECEIPT);
  3570. switch (dw)
  3571. {
  3572. case MDN_SENDRECEIPT_AUTO:
  3573. id = IDC_SEND_AUTO_RCPT;
  3574. break;
  3575. case MDN_DONT_SENDRECEIPT:
  3576. id = IDC_DONOT_REPSONDTO_RCPT;
  3577. break;
  3578. default:
  3579. case MDN_PROMPTFOR_SENDRECEIPT:
  3580. id = IDC_ASKME_FOR_RCPT;
  3581. break;
  3582. }
  3583. CheckDlgButton(hwnd, id, BST_CHECKED);
  3584. ButtonChkFromOptInfo(hwnd, IDC_TO_CC_LINE_RCPT, pmoi, OPT_TO_CC_LINE_RCPT);
  3585. cbData = sizeof(DWORD);
  3586. if ((ERROR_SUCCESS != SHGetValue(HKEY_LOCAL_MACHINE, STR_REG_PATH_POLICY, c_szSendMDNLocked, &dwType, (LPBYTE)&dwLocked, &cbData)) &&
  3587. (ERROR_SUCCESS != AthUserGetValue(NULL, c_szSendMDNLocked, &dwType, (LPBYTE)&dwLocked, &cbData)))
  3588. dwLocked = FALSE;
  3589. if (!!dwLocked)
  3590. {
  3591. EnableWindow(GetDlgItem(hwnd, IDC_SEND_AUTO_RCPT), FALSE);
  3592. EnableWindow(GetDlgItem(hwnd, IDC_DONOT_REPSONDTO_RCPT), FALSE);
  3593. EnableWindow(GetDlgItem(hwnd, IDC_ASKME_FOR_RCPT), FALSE);
  3594. }
  3595. cbData = sizeof(DWORD);
  3596. if ((ERROR_SUCCESS != SHGetValue(HKEY_LOCAL_MACHINE, STR_REG_PATH_POLICY, c_szSendReceiptToListLocked, &dwType, (LPBYTE)&dwLocked, &cbData)) &&
  3597. (ERROR_SUCCESS != AthUserGetValue(NULL, c_szSendReceiptToListLocked, &dwType, (LPBYTE)&dwLocked, &cbData)))
  3598. dwLocked = FALSE;
  3599. fEnable = (id == IDC_SEND_AUTO_RCPT);
  3600. if (!fEnable || (!!dwLocked))
  3601. {
  3602. EnableWindow(GetDlgItem(hwnd, IDC_TO_CC_LINE_RCPT), FALSE);
  3603. EnableWindow(GetDlgItem(hwnd, IDC_TO_CC_TEXT), FALSE);
  3604. }
  3605. //Request for Receipt
  3606. ButtonChkFromOptInfo(hwnd, IDC_MDN_SEND_REQUEST, pmoi, OPT_MDN_SEND_REQUEST);
  3607. cbData = sizeof(DWORD);
  3608. if ((ERROR_SUCCESS != SHGetValue(HKEY_LOCAL_MACHINE, STR_REG_PATH_POLICY, c_szRequestMDNLocked, &dwType, (LPBYTE)&dwLocked, &cbData)) &&
  3609. (ERROR_SUCCESS != AthUserGetValue(NULL, c_szRequestMDNLocked, &dwType, (LPBYTE)&dwLocked, &cbData)))
  3610. dwLocked = FALSE;
  3611. if (!!dwLocked)
  3612. {
  3613. EnableWindow(GetDlgItem(hwnd, IDC_MDN_SEND_REQUEST), FALSE);
  3614. }
  3615. HICON hIcon;
  3616. #ifdef SMIME_V3
  3617. if(!IsSMIME3Supported())
  3618. {
  3619. ShowWindow(GetDlgItem(hwnd, IDC_SR_TXT1), SW_HIDE);
  3620. ShowWindow(GetDlgItem(hwnd, IDC_SRES_TXT2), SW_HIDE);
  3621. ShowWindow(GetDlgItem(hwnd, IDC_SECURE_RECEIPT), SW_HIDE);
  3622. ShowWindow(GetDlgItem(hwnd, IDC_SRES_TXT3), SW_HIDE);
  3623. EnableWindow(GetDlgItem(hwnd, IDC_SECURE_RECEIPT), FALSE);
  3624. ShowWindow(GetDlgItem(hwnd, idiSecReceipt), SW_HIDE);
  3625. }
  3626. else
  3627. {
  3628. if (g_dwAthenaMode & MODE_NEWSONLY)
  3629. {
  3630. EnableWindow(GetDlgItem(hwnd, IDC_SECURE_RECEIPT), FALSE);
  3631. }
  3632. hIcon = ImageList_GetIcon(pmoi->himl, ID_SEC_RECEIPT, ILD_TRANSPARENT);
  3633. SendDlgItemMessage(hwnd, IDC_SEC_REC, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  3634. }
  3635. // ButtonChkFromOptInfo(hwnd, IDC_SECURE_RECEIPT, pmoi, OPT_SECURE_READ_RECEIPT);
  3636. #endif // SMIME_V3
  3637. // Pictures
  3638. hIcon = ImageList_GetIcon(pmoi->himl, ID_RECEIPT, ILD_TRANSPARENT);
  3639. SendDlgItemMessage(hwnd, IDC_RECEIPT, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  3640. hIcon = ImageList_GetIcon(pmoi->himl, ID_SEND_RECEIEVE, ILD_TRANSPARENT);
  3641. SendDlgItemMessage(hwnd, IDC_SEND_RECEIVE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  3642. // Stash the pointer
  3643. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pmoi);
  3644. PropSheet_UnChanged(GetParent(hwnd), hwnd);
  3645. return (TRUE);
  3646. }
  3647. void Receipts_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  3648. {
  3649. OPTINFO *pmoi = 0;
  3650. BOOL fEnable;
  3651. // Get our stored options info
  3652. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  3653. if (pmoi == NULL)
  3654. return;
  3655. if (codeNotify == BN_CLICKED)
  3656. {
  3657. switch (id)
  3658. {
  3659. case IDC_SEND_AUTO_RCPT:
  3660. fEnable = (SendMessage(hwndCtl, BM_GETCHECK, 0, 0) == BST_CHECKED);
  3661. EnableWindow(GetDlgItem(hwnd, IDC_TO_CC_LINE_RCPT), fEnable);
  3662. EnableWindow(GetDlgItem(hwnd, IDC_TO_CC_TEXT), fEnable);
  3663. PropSheet_Changed(GetParent(hwnd), hwnd);
  3664. break;
  3665. case IDC_DONOT_REPSONDTO_RCPT:
  3666. case IDC_ASKME_FOR_RCPT:
  3667. EnableWindow(GetDlgItem(hwnd, IDC_TO_CC_LINE_RCPT), FALSE);
  3668. EnableWindow(GetDlgItem(hwnd, IDC_TO_CC_TEXT), FALSE);
  3669. //Fallthrough
  3670. case IDC_MDN_SEND_REQUEST:
  3671. // case IDC_SECURE_RECEIPT:
  3672. case IDC_TO_CC_LINE_RCPT:
  3673. PropSheet_Changed(GetParent(hwnd), hwnd);
  3674. break;
  3675. #ifdef SMIME_V3
  3676. case IDC_SECURE_RECEIPT:
  3677. FGetSecRecOptions(hwnd, pmoi);
  3678. break;
  3679. #endif // SMIME_V3
  3680. }
  3681. }
  3682. }
  3683. LRESULT Receipts_OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
  3684. {
  3685. OPTINFO *pmoi = 0;
  3686. DWORD dw;
  3687. DWORD id;
  3688. // The only notification we care about is Apply
  3689. if (PSN_APPLY == pnmhdr->code)
  3690. {
  3691. // Get our stored options info
  3692. pmoi = (OPTINFO *)GetWindowLongPtr(hwnd, DWLP_USER);
  3693. if (pmoi == NULL)
  3694. return (PSNRET_INVALID_NOCHANGEPAGE);
  3695. // General options
  3696. ButtonChkToOptInfo(hwnd, IDC_MDN_SEND_REQUEST, pmoi, OPT_MDN_SEND_REQUEST);
  3697. // ButtonChkToOptInfo(hwnd, IDC_SECURE_RECEIPT, pmoi, OPT_NOTIFYGROUPS);
  3698. id = IDC_ASKME_FOR_RCPT;
  3699. if (IsDlgButtonChecked(hwnd, IDC_DONOT_REPSONDTO_RCPT) == BST_CHECKED)
  3700. {
  3701. id = IDC_DONOT_REPSONDTO_RCPT;
  3702. }
  3703. else if (IsDlgButtonChecked(hwnd, IDC_SEND_AUTO_RCPT) == BST_CHECKED)
  3704. {
  3705. id = IDC_SEND_AUTO_RCPT;
  3706. }
  3707. switch (id)
  3708. {
  3709. case IDC_SEND_AUTO_RCPT:
  3710. dw = MDN_SENDRECEIPT_AUTO;
  3711. break;
  3712. case IDC_DONOT_REPSONDTO_RCPT:
  3713. dw = MDN_DONT_SENDRECEIPT;
  3714. break;
  3715. default:
  3716. case IDC_ASKME_FOR_RCPT:
  3717. dw = MDN_PROMPTFOR_SENDRECEIPT;
  3718. break;
  3719. }
  3720. ISetDwOption(pmoi->pOpt, OPT_MDN_SEND_RECEIPT, dw, NULL, 0);
  3721. ButtonChkToOptInfo(hwnd, IDC_TO_CC_LINE_RCPT, pmoi, OPT_TO_CC_LINE_RCPT);
  3722. return (PSNRET_NOERROR);
  3723. }
  3724. return (FALSE);
  3725. }
  3726. #ifdef SMIME_V3
  3727. // Security receipts options
  3728. BOOL FGetSecRecOptions(HWND hwndParent, OPTINFO *opie)
  3729. {
  3730. BOOL fRes = FALSE;
  3731. if(DialogBoxParam(g_hLocRes, MAKEINTRESOURCE(iddSecReceipt),
  3732. hwndParent, SecurityReceiptDlgProc, (LPARAM) (opie)) == IDOK)
  3733. {
  3734. // hr = HrSetOELabel(plabel);
  3735. // if(hr == S_OK)
  3736. fRes = TRUE;
  3737. }
  3738. return (fRes);
  3739. }
  3740. // Dlg proc
  3741. static const HELPMAP g_rgCtxMapSecureRec[] = {
  3742. {IDC_SEC_SEND_REQUEST, IDH_SECURERECEIPTS_REQUEST},
  3743. {IDC_DONOT_RESSEC_RCPT, IDH_SECURERECEIPTS_NEVER},
  3744. {IDC_ASKME_FOR_SEC_RCPT, IDH_SECURERECEIPTS_ASK},
  3745. {IDC_SEC_AUTO_RCPT, IDH_SECURERECEIPTS_ALWAYS},
  3746. {IDC_ENCRYPT_RCPT, IDH_SECURERECEIPTS_ENCRYPT},
  3747. {IDC_SECREC_VERIFY, IDH_SECURERECEIPTS_VERIFY},
  3748. {idcStatic1, IDH_NEWS_COMM_GROUPBOX},
  3749. {idcStatic2, IDH_NEWS_COMM_GROUPBOX},
  3750. {idcStatic3, IDH_NEWS_COMM_GROUPBOX},
  3751. {idcStatic4, IDH_NEWS_COMM_GROUPBOX},
  3752. {idcStatic5, IDH_NEWS_COMM_GROUPBOX},
  3753. {idcStatic6, IDH_NEWS_COMM_GROUPBOX},
  3754. {IDC_SEC_REC, IDH_NEWS_COMM_GROUPBOX},
  3755. {IDC_SEND_RECEIVE_ICON, IDH_NEWS_COMM_GROUPBOX},
  3756. {IDC_GENERAL_ICON, IDH_NEWS_COMM_GROUPBOX},
  3757. {0, 0}
  3758. };
  3759. INT_PTR CALLBACK SecurityReceiptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  3760. {
  3761. HRESULT hr;
  3762. LONG_PTR iEntry;
  3763. OPTINFO *pmoi = 0;
  3764. DWORD dw = 0;
  3765. UINT id = 0;
  3766. HICON hIcon = NULL;
  3767. switch ( msg) {
  3768. case WM_INITDIALOG:
  3769. pmoi = (OPTINFO *)(lParam);
  3770. Assert(pmoi != NULL);
  3771. SetWindowLongPtr(hwndDlg, DWLP_USER, (LPARAM) pmoi);
  3772. CenterDialog(hwndDlg);
  3773. hIcon = ImageList_GetIcon(pmoi->himl, ID_SEC_RECEIPT, ILD_TRANSPARENT);;
  3774. SendDlgItemMessage(hwndDlg, IDC_SEC_REC, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  3775. hIcon = ImageList_GetIcon(pmoi->himl, ID_SEND_RECEIEVE, ILD_TRANSPARENT);
  3776. SendDlgItemMessage(hwndDlg, IDC_SEND_RECEIVE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  3777. hIcon = ImageList_GetIcon(pmoi->himl, ID_OPTIONS_GENERAL, ILD_TRANSPARENT);
  3778. SendDlgItemMessage(hwndDlg, IDC_GENERAL_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon);
  3779. ButtonChkFromOptInfo(hwndDlg, IDC_SEC_SEND_REQUEST, pmoi, OPT_SECREC_USE);
  3780. ButtonChkFromOptInfo(hwndDlg, IDC_SECREC_VERIFY, pmoi, OPT_SECREC_VERIFY);
  3781. ButtonChkFromOptInfo(hwndDlg, IDC_ENCRYPT_RCPT, pmoi, OPT_SECREC_ENCRYPT);
  3782. dw = IDwGetOption(pmoi->pOpt, OPT_MDN_SEC_RECEIPT);
  3783. switch (dw)
  3784. {
  3785. case MDN_SENDRECEIPT_AUTO:
  3786. id = IDC_SEC_AUTO_RCPT;
  3787. break;
  3788. case MDN_DONT_SENDRECEIPT:
  3789. id = IDC_DONOT_RESSEC_RCPT;
  3790. break;
  3791. case MDN_PROMPTFOR_SENDRECEIPT:
  3792. default:
  3793. id = IDC_ASKME_FOR_SEC_RCPT;
  3794. break;
  3795. }
  3796. CheckDlgButton(hwndDlg, id, BST_CHECKED);
  3797. if (id != IDC_SEC_AUTO_RCPT)
  3798. EnableWindow(GetDlgItem(hwndDlg, IDC_ENCRYPT_RCPT), FALSE);
  3799. break;
  3800. case WM_COMMAND:
  3801. // Get our stored options info
  3802. pmoi = (OPTINFO *)GetWindowLongPtr(hwndDlg, DWLP_USER);
  3803. if (pmoi == NULL)
  3804. break;
  3805. switch (LOWORD(wParam))
  3806. {
  3807. case IDC_SEC_AUTO_RCPT:
  3808. EnableWindow(GetDlgItem(hwndDlg, IDC_ENCRYPT_RCPT), TRUE);
  3809. break;
  3810. case IDC_DONOT_RESSEC_RCPT:
  3811. case IDC_ASKME_FOR_SEC_RCPT:
  3812. EnableWindow(GetDlgItem(hwndDlg, IDC_ENCRYPT_RCPT), FALSE);
  3813. break;
  3814. case IDOK:
  3815. ButtonChkToOptInfo(hwndDlg, IDC_SEC_SEND_REQUEST, pmoi, OPT_SECREC_USE);
  3816. ButtonChkToOptInfo(hwndDlg, IDC_SECREC_VERIFY, pmoi, OPT_SECREC_VERIFY);
  3817. ButtonChkToOptInfo(hwndDlg, IDC_ENCRYPT_RCPT, pmoi, OPT_SECREC_ENCRYPT);
  3818. dw = MDN_PROMPTFOR_SENDRECEIPT;
  3819. if (IsDlgButtonChecked(hwndDlg, IDC_DONOT_RESSEC_RCPT) == BST_CHECKED)
  3820. dw = MDN_DONT_SENDRECEIPT;
  3821. else if (IsDlgButtonChecked(hwndDlg, IDC_SEC_AUTO_RCPT) == BST_CHECKED)
  3822. dw = MDN_SENDRECEIPT_AUTO;
  3823. ISetDwOption(pmoi->pOpt, OPT_MDN_SEC_RECEIPT, dw, NULL, 0);
  3824. EndDialog(hwndDlg, IDOK);
  3825. break;
  3826. case IDCANCEL:
  3827. EndDialog(hwndDlg, IDCANCEL);
  3828. break;
  3829. default:
  3830. return FALSE;
  3831. }
  3832. break;
  3833. case WM_CONTEXTMENU:
  3834. case WM_HELP:
  3835. return OnContextHelp(hwndDlg, msg, wParam, lParam, g_rgCtxMapSecureRec);
  3836. break;
  3837. case WM_DESTROY:
  3838. FreeIcon(hwndDlg, IDC_SEND_RECEIVE_ICON);
  3839. FreeIcon(hwndDlg, IDC_GENERAL_ICON);
  3840. FreeIcon(hwndDlg, IDC_SEC_REC);
  3841. return (TRUE);
  3842. default:
  3843. return FALSE;
  3844. }
  3845. return TRUE;
  3846. }
  3847. #endif // SMIME_V3