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.

4787 lines
139 KiB

  1. #include "pch.hxx"
  2. #include <docobj.h>
  3. #include "dllmain.h"
  4. #include "strconst.h"
  5. #include "msoert.h"
  6. #include "mimeole.h"
  7. #include "mehost.h"
  8. #include "oleutil.h"
  9. #include "ibodyopt.h"
  10. #include "resource.h"
  11. #include "mshtmcid.h"
  12. #include "thormsgs.h"
  13. #include "msoeprop.h"
  14. #include "goptions.h"
  15. #include "bodyutil.h"
  16. #include "mimeutil.h"
  17. #include "ourguid.h"
  18. #include "shlwapi.h"
  19. #include "shlwapip.h"
  20. #include "ipab.h"
  21. #include "statnery.h"
  22. #include "options.h"
  23. #include "sigs.h"
  24. #include "fonts.h"
  25. #include "url.h"
  26. #include "secutil.h"
  27. #include "sechtml.h"
  28. #include "mimeolep.h"
  29. #include "menuutil.h"
  30. #include "htmlhelp.h"
  31. #include "msgprop.h"
  32. #include "demand.h"
  33. #include <mshtmdid.h>
  34. #include "menures.h"
  35. #include "multiusr.h"
  36. #include "fontnsc.h"
  37. const int idTimerMarkAsRead = 100;
  38. const TCHAR c_szSigPrefix[] = "\r\n-- \r\n";
  39. #define MAKEINDEX(b, l) (((DWORD)l & 0x00ffffff) | ((DWORD)b << 24))
  40. #define GETINDEX(m) (((m & 0xff000000) >> 24) & 0x000000ff)
  41. ASSERTDATA
  42. static const WCHAR c_wszMailTo[] = L"mailto:",
  43. c_wszHttp[] = L"http://",
  44. c_wszFile[] = L"file://";
  45. const DWORD rgrgbColors16[16] = {
  46. RGB( 0, 0, 0), // "BLACK"},
  47. RGB(128, 0, 0), // "MAROON"},
  48. RGB( 0, 128, 0), // "GREEN"},
  49. RGB(128, 128, 0), // "OLIVE"},
  50. RGB( 0, 0, 128), // "NAVY"},
  51. RGB(128, 0, 128), // "PURPLE"},
  52. RGB( 0, 128, 128), // "TEAL"},
  53. RGB(128, 128, 128), // "GREY"},
  54. RGB(192, 192, 192), // "SILVER"},
  55. RGB(255, 0, 0), // "RED"},
  56. RGB( 0, 255, 0), // "LIME"},
  57. RGB(255, 255, 0), // "YELLOW"},
  58. RGB( 0, 0, 255), // "BLUE"},
  59. RGB(255, 0, 255), // "FUSCHIA"},
  60. RGB( 0, 255, 255), // "AQUA"},
  61. RGB(255, 255, 255) // "WHITE"}
  62. };
  63. INT_PTR CALLBACK BkImageDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  64. {
  65. int id;
  66. LPWSTR pwszURL;
  67. HWND hwndCombo = GetDlgItem(hwnd, idTxtBkImage);
  68. LRESULT lr=0;
  69. HRESULT hr;
  70. pwszURL = (LPWSTR)GetWindowLongPtr(hwnd, DWLP_USER);
  71. switch(msg)
  72. {
  73. case WM_INITDIALOG:
  74. Assert(lParam!= NULL);
  75. SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)lParam);
  76. SetIntlFont(hwndCombo);
  77. SendDlgItemMessage(hwnd, idTxtBkImage, EM_LIMITTEXT, MAX_PATH-1, NULL);
  78. SetFocus(hwndCombo);
  79. pwszURL = (LPWSTR)lParam;
  80. HrFillStationeryCombo(hwndCombo, TRUE, pwszURL);
  81. StripStationeryDir(pwszURL);
  82. SetWindowTextWrapW(hwndCombo, pwszURL);
  83. SendMessage(GetWindow(hwndCombo, GW_CHILD), EM_SETSEL, 0, -1);
  84. CenterDialog(hwnd);
  85. return FALSE;
  86. case WM_COMMAND:
  87. switch(id=GET_WM_COMMAND_ID(wParam, lParam))
  88. {
  89. case idBrowsePicture:
  90. HrBrowsePicture(hwnd, GetDlgItem(hwnd, idTxtBkImage));
  91. break;
  92. case IDOK:
  93. Assert(pwszURL);
  94. SendMessageWrapW(hwndCombo, CB_GETLBTEXT, (WPARAM)(SendMessage(hwndCombo, CB_GETCURSEL, 0, 0)), (LPARAM)(pwszURL));
  95. // fall thro'
  96. case IDCANCEL:
  97. EndDialog(hwnd, id);
  98. break;
  99. }
  100. }
  101. return FALSE;
  102. }
  103. //+---------------------------------------------------------------
  104. //
  105. // Member: CMimeEditDocHost
  106. //
  107. // Synopsis:
  108. //
  109. //---------------------------------------------------------------
  110. CMimeEditDocHost::CMimeEditDocHost(DWORD dwBorderFlags)
  111. {
  112. m_hwnd = 0;
  113. m_hwndDocObj = 0;
  114. m_cRef = 1;
  115. m_dwStyle = 0;
  116. m_dwHTMLNotifyCookie = 0;
  117. m_dwBorderFlags = dwBorderFlags;
  118. m_dwDocStyle = MESTYLE_NOHEADER;
  119. m_fUIActive = FALSE;
  120. m_fIsSigned = FALSE;
  121. m_fFixedFont = FALSE;
  122. m_fMarkedRead = FALSE;
  123. m_fSignTrusted = TRUE;
  124. m_fIsEncrypted = FALSE;
  125. m_fSecDispInfo = FALSE;
  126. m_fSecureReceipt = FALSE;
  127. m_fEncryptionOK = TRUE;
  128. m_fBlockingOnSMime = FALSE;
  129. m_fShowingErrorPage = FALSE;
  130. m_fRegisteredForDocEvents = FALSE;
  131. m_pDoc = NULL;
  132. m_pMsg = NULL;
  133. m_pStatus = NULL;
  134. m_pDocView = NULL;
  135. m_lpOleObj = NULL;
  136. m_pPrstMime = NULL;
  137. m_pCmdTarget = NULL;
  138. m_hmenuColor = NULL;
  139. m_hmenuStyle = NULL;
  140. m_pEventSink = NULL;
  141. m_pUnkService = NULL;
  142. m_pBodyOptions = NULL;
  143. m_pSecureMessage = NULL;
  144. m_pInPlaceActiveObj = NULL;
  145. m_pSecurityErrorScreen = NULL;
  146. }
  147. //+---------------------------------------------------------------
  148. //
  149. // Member:
  150. //
  151. // Synopsis:
  152. //
  153. //---------------------------------------------------------------
  154. CMimeEditDocHost::~CMimeEditDocHost()
  155. {
  156. // These should all get feed up when we get a WM_DESTROY and close the docobj
  157. Assert(m_lpOleObj==NULL);
  158. Assert(m_pDocView==NULL);
  159. Assert(m_pInPlaceActiveObj==NULL);
  160. Assert(m_pCmdTarget==NULL);
  161. Assert(m_pPrstMime==NULL);
  162. Assert(m_pMsg==NULL);
  163. Assert(m_pSecurityErrorScreen==NULL);
  164. Assert(m_pSecureMessage==NULL);
  165. if(m_hmenuColor)
  166. DestroyMenu(m_hmenuColor);
  167. if(m_hmenuStyle)
  168. DestroyMenu(m_hmenuStyle);
  169. }
  170. //+---------------------------------------------------------------
  171. //
  172. // Member: AddRef
  173. //
  174. // Synopsis:
  175. //
  176. //---------------------------------------------------------------
  177. ULONG CMimeEditDocHost::AddRef()
  178. {
  179. TraceCall("CMimeEditDocHost::AddRef");
  180. //TraceInfo(_MSG("CMimeEditDocHost::AddRef: cRef==%d", m_cRef+1));
  181. return ++m_cRef;
  182. }
  183. //+---------------------------------------------------------------
  184. //
  185. // Member: Release
  186. //
  187. // Synopsis:
  188. //
  189. //---------------------------------------------------------------
  190. ULONG CMimeEditDocHost::Release()
  191. {
  192. TraceCall("CMimeEditDocHost::Release");
  193. //TraceInfo(_MSG("CMimeEditDocHost::Release: cRef==%d", m_cRef-1));
  194. if (--m_cRef==0)
  195. {
  196. delete this;
  197. return 0;
  198. }
  199. return m_cRef;
  200. }
  201. //+---------------------------------------------------------------
  202. //
  203. // Member: QueryInterface
  204. //
  205. // Synopsis:
  206. //
  207. //---------------------------------------------------------------
  208. HRESULT CMimeEditDocHost::QueryInterface(REFIID riid, LPVOID *lplpObj)
  209. {
  210. TraceCall("CMimeEditDocHost::QueryInterface");
  211. if(!lplpObj)
  212. return E_INVALIDARG;
  213. *lplpObj = NULL; // set to NULL, in case we fail.
  214. if (IsEqualIID(riid, IID_IUnknown))
  215. *lplpObj = (LPVOID)this;
  216. else if (IsEqualIID(riid, IID_IOleInPlaceUIWindow))
  217. *lplpObj = (LPVOID)(IOleInPlaceUIWindow *)this;
  218. else if (IsEqualIID(riid, IID_IOleInPlaceSite))
  219. *lplpObj = (LPVOID)(LPOLEINPLACESITE)this;
  220. else if (IsEqualIID(riid, IID_IOleClientSite))
  221. *lplpObj = (LPVOID)(LPOLECLIENTSITE)this;
  222. else if (IsEqualIID(riid, IID_IOleControlSite))
  223. *lplpObj = (LPVOID)(IOleControlSite *)this;
  224. else if (IsEqualIID(riid, IID_IAdviseSink))
  225. *lplpObj = (LPVOID)(LPADVISESINK)this;
  226. else if (IsEqualIID(riid, IID_IOleDocumentSite))
  227. *lplpObj = (LPVOID)(LPOLEDOCUMENTSITE)this;
  228. else if (IsEqualIID(riid, IID_IOleCommandTarget))
  229. *lplpObj = (LPVOID)(LPOLECOMMANDTARGET)this;
  230. else if (IsEqualIID(riid, IID_IDocHostUIHandler))
  231. *lplpObj = (LPVOID)(IDocHostUIHandler*)this;
  232. else if (IsEqualIID(riid, IID_IBodyObj2))
  233. *lplpObj = (LPVOID)(IBodyObj2*)this;
  234. else if (IsEqualIID(riid, IID_IPersistMime))
  235. *lplpObj = (LPVOID)(IPersistMime*)this;
  236. else if (IsEqualIID(riid, IID_IDispatch))
  237. *lplpObj = (LPVOID)(IDispatch*)this;
  238. else
  239. return E_NOINTERFACE;
  240. AddRef();
  241. return NOERROR;
  242. }
  243. //+---------------------------------------------------------------
  244. //
  245. // Member: ExtWndProc
  246. //
  247. // Synopsis:
  248. //
  249. //---------------------------------------------------------------
  250. LRESULT CALLBACK CMimeEditDocHost::ExtWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  251. {
  252. CMimeEditDocHost *pDocHost;
  253. if (WM_CREATE == msg)
  254. {
  255. pDocHost = (CMimeEditDocHost *)((LPCREATESTRUCT)lParam)->lpCreateParams;
  256. if(!pDocHost)
  257. return -1;
  258. if(FAILED(pDocHost->OnCreate(hwnd)))
  259. return -1;
  260. }
  261. pDocHost = (CMimeEditDocHost *)GetWndThisPtr(hwnd);
  262. if(pDocHost)
  263. return pDocHost->WndProc(hwnd, msg, wParam, lParam);
  264. else
  265. return DefWindowProcWrapW(hwnd, msg, wParam, lParam);
  266. }
  267. //+---------------------------------------------------------------
  268. //
  269. // Member: WndProc
  270. //
  271. // Synopsis:
  272. //
  273. //---------------------------------------------------------------
  274. LRESULT CMimeEditDocHost::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  275. {
  276. switch(msg)
  277. {
  278. case WM_PAINT:
  279. if (!m_lpOleObj)
  280. {
  281. HDC hdc;
  282. PAINTSTRUCT ps;
  283. RECT rc;
  284. HBRUSH hBrush;
  285. GetClientRect(m_hwnd, &rc);
  286. hdc = BeginPaint(hwnd, &ps);
  287. hBrush = SelectBrush(hdc, GetSysColorBrush(COLOR_WINDOW));
  288. PatBlt(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY);
  289. SelectBrush(hdc, hBrush);
  290. EndPaint(hwnd, &ps);
  291. return 0;
  292. }
  293. case WM_COMMAND:
  294. if(WMCommand( GET_WM_COMMAND_HWND(wParam, lParam),
  295. GET_WM_COMMAND_ID(wParam, lParam),
  296. GET_WM_COMMAND_CMD(wParam, lParam)))
  297. return 0;
  298. break;
  299. case WM_SETFOCUS:
  300. return OnFocus(TRUE);
  301. case WM_KILLFOCUS:
  302. return OnFocus(FALSE);
  303. case WM_NOTIFY:
  304. return WMNotify((int) wParam, (NMHDR *)lParam);
  305. case WM_SIZE:
  306. WMSize(LOWORD(lParam), HIWORD(lParam));
  307. return 0;
  308. case WM_CLOSE:
  309. return 0; // prevent alt-f4's
  310. case WM_NCDESTROY:
  311. WMNCDestroy();
  312. break;
  313. case WM_TIMER:
  314. if (wParam == idTimerMarkAsRead)
  315. {
  316. OnWMTimer();
  317. return 0;
  318. }
  319. break;
  320. case WM_WININICHANGE:
  321. case WM_DISPLAYCHANGE:
  322. case WM_SYSCOLORCHANGE:
  323. case WM_QUERYNEWPALETTE:
  324. case WM_PALETTECHANGED:
  325. if (m_hwndDocObj)
  326. return SendMessage(m_hwndDocObj, msg, wParam, lParam);
  327. break;
  328. }
  329. return DefWindowProcWrapW(hwnd, msg, wParam, lParam);
  330. }
  331. BOOL CMimeEditDocHost::WMCreate(HWND hwnd)
  332. {
  333. m_hwnd = hwnd;
  334. SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)this);
  335. AddRef();
  336. return SUCCEEDED(HrSubWMCreate())?TRUE:FALSE;
  337. }
  338. void CMimeEditDocHost::WMNCDestroy()
  339. {
  340. SetWindowLongPtr(m_hwnd, GWLP_USERDATA, NULL);
  341. m_hwnd = NULL;
  342. Release();
  343. }
  344. //+---------------------------------------------------------------
  345. //
  346. // Member: OnNCDestroy
  347. //
  348. // Synopsis:
  349. //
  350. //---------------------------------------------------------------
  351. HRESULT CMimeEditDocHost::OnNCDestroy()
  352. {
  353. TraceCall("CMimeEditDocHost::OnNCDestroy");
  354. SetWindowLongPtr(m_hwnd, GWLP_USERDATA, NULL);
  355. m_hwnd = NULL;
  356. Release();
  357. return S_OK;
  358. }
  359. //+---------------------------------------------------------------
  360. //
  361. // Member: OnDestroy
  362. //
  363. // Synopsis:
  364. //
  365. //---------------------------------------------------------------
  366. HRESULT CMimeEditDocHost::OnDestroy()
  367. {
  368. TraceCall("CMimeEditDocHost::OnDestroy");
  369. return CloseDocObj();
  370. }
  371. //+---------------------------------------------------------------
  372. //
  373. // Member: OnCreate
  374. //
  375. // Synopsis:
  376. //
  377. //---------------------------------------------------------------
  378. HRESULT CMimeEditDocHost::OnCreate(HWND hwnd)
  379. {
  380. TraceCall("CMimeEditDocHost::OnCreate");
  381. m_hwnd = hwnd;
  382. SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)this);
  383. AddRef();
  384. return S_OK;
  385. }
  386. //+---------------------------------------------------------------
  387. //
  388. // Member: CreateDocObj
  389. //
  390. // Synopsis:
  391. //
  392. //---------------------------------------------------------------
  393. HRESULT CMimeEditDocHost::CreateDocObj(LPCLSID pCLSID)
  394. {
  395. HRESULT hr=NOERROR;
  396. TraceCall("CMimeEditDocHost::CreateDocObj");
  397. if(!pCLSID)
  398. return E_INVALIDARG;
  399. Assert(!m_lpOleObj);
  400. Assert(!m_pDocView);
  401. Assert(!m_pCmdTarget);
  402. hr = CoCreateInstance(*pCLSID, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
  403. IID_IOleObject, (LPVOID *)&m_lpOleObj);
  404. if (FAILED(hr))
  405. goto error;
  406. hr = m_lpOleObj->SetClientSite((LPOLECLIENTSITE)this);
  407. if (FAILED(hr))
  408. goto error;
  409. hr = m_lpOleObj->QueryInterface(IID_IOleCommandTarget, (LPVOID *)&m_pCmdTarget);
  410. if (FAILED(hr))
  411. goto error;
  412. hr = m_lpOleObj->QueryInterface(IID_IPersistMime, (LPVOID *)&m_pPrstMime);
  413. if (FAILED(hr))
  414. goto error;
  415. hr = HrInitNew(m_lpOleObj);
  416. error:
  417. return hr;
  418. }
  419. //+---------------------------------------------------------------
  420. //
  421. // Member: Show
  422. //
  423. // Synopsis:
  424. //
  425. //---------------------------------------------------------------
  426. HRESULT CMimeEditDocHost::Show()
  427. {
  428. RECT rc;
  429. HRESULT hr;
  430. TraceCall("CMimeEditDocHost::Show");
  431. GetClientRect(m_hwnd, &rc);
  432. hr=m_lpOleObj->DoVerb(OLEIVERB_SHOW, NULL, (LPOLECLIENTSITE)this, 0, m_hwnd, &rc);
  433. if(FAILED(hr))
  434. goto error;
  435. error:
  436. return hr;
  437. }
  438. //+---------------------------------------------------------------
  439. //
  440. // Member: CloseDocObj
  441. //
  442. // Synopsis:
  443. //
  444. //---------------------------------------------------------------
  445. HRESULT CMimeEditDocHost::CloseDocObj()
  446. {
  447. LPOLEINPLACEOBJECT pInPlaceObj=0;
  448. RegisterForHTMLDocEvents(FALSE);
  449. SafeRelease(m_pCmdTarget);
  450. SafeRelease(m_pPrstMime);
  451. SafeRelease(m_pInPlaceActiveObj);
  452. SafeRelease(m_pDoc);
  453. SafeRelease(m_pMsg);
  454. SafeRelease(m_pSecureMessage);
  455. SafeRelease(m_pSecurityErrorScreen);
  456. SafeRelease(m_pEventSink);
  457. SafeRelease(m_pStatus);
  458. if(m_pDocView)
  459. {
  460. m_pDocView->UIActivate(FALSE);
  461. m_pDocView->CloseView(0);
  462. m_pDocView->SetInPlaceSite(NULL);
  463. m_pDocView->Release();
  464. m_pDocView=NULL;
  465. }
  466. if (m_lpOleObj)
  467. {
  468. // deactivate the docobj
  469. if (!FAILED(m_lpOleObj->QueryInterface(IID_IOleInPlaceObject, (LPVOID*)&pInPlaceObj)))
  470. {
  471. pInPlaceObj->InPlaceDeactivate();
  472. pInPlaceObj->Release();
  473. }
  474. // close the ole object, but blow off changes as we have either extracted
  475. // them ourselves or don't care.
  476. m_lpOleObj->Close(OLECLOSE_NOSAVE);
  477. #ifdef DEBUG
  478. ULONG uRef;
  479. uRef=
  480. #endif
  481. m_lpOleObj->Release();
  482. m_lpOleObj=NULL;
  483. AssertSz(uRef==0, "We leaked a docobject!");
  484. }
  485. m_fUIActive=FALSE;
  486. return NOERROR;
  487. }
  488. // Close DocObj
  489. HRESULT CMimeEditDocHost::HrResetDocument()
  490. {
  491. CloseDocObj();
  492. CreateDocObj((LPCLSID)&CLSID_MimeEdit);
  493. CreateDocView();
  494. return(S_OK);
  495. }
  496. // *** IOleWindow ***
  497. //+---------------------------------------------------------------
  498. //
  499. // Member: GetWindow
  500. //
  501. // Synopsis:
  502. //
  503. //---------------------------------------------------------------
  504. HRESULT CMimeEditDocHost::GetWindow(HWND *phwnd)
  505. {
  506. TraceCall("CMimeEditDocHost::GetWindow");
  507. *phwnd=m_hwnd;
  508. return NOERROR;
  509. }
  510. //+---------------------------------------------------------------
  511. //
  512. // Member: ContextSensitiveHelp
  513. //
  514. // Synopsis:
  515. //
  516. //---------------------------------------------------------------
  517. HRESULT CMimeEditDocHost::ContextSensitiveHelp(BOOL fEnterMode)
  518. {
  519. TraceCall("CMimeEditDocHost::ContextSensitiveHelp");
  520. return E_NOTIMPL;
  521. }
  522. // *** IOleInPlaceUIWindow methods ***
  523. //+---------------------------------------------------------------
  524. //
  525. // Member: GetBorder
  526. //
  527. // Synopsis:
  528. //
  529. //---------------------------------------------------------------
  530. HRESULT CMimeEditDocHost::GetBorder(LPRECT lprectBorder)
  531. {
  532. TraceCall("CMimeEditDocHost::GetBorder");
  533. return E_NOTIMPL;
  534. }
  535. //+---------------------------------------------------------------
  536. //
  537. // Member: RequestBorderSpace
  538. //
  539. // Synopsis:
  540. //
  541. //---------------------------------------------------------------
  542. HRESULT CMimeEditDocHost::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
  543. {
  544. TraceCall("CMimeEditDocHost::RequestBorderSpace");
  545. return NOERROR;
  546. }
  547. //+---------------------------------------------------------------
  548. //
  549. // Member: SetBorderSpace
  550. //
  551. // Synopsis:
  552. //
  553. //---------------------------------------------------------------
  554. HRESULT CMimeEditDocHost::SetBorderSpace(LPCBORDERWIDTHS lpborderwidths)
  555. {
  556. TraceCall("CMimeEditDocHost::IOleInPlaceUIWindow::SetBorderSpace");
  557. return NOERROR;
  558. }
  559. //+---------------------------------------------------------------
  560. //
  561. // Member: SetActiveObject
  562. //
  563. // Synopsis:
  564. //
  565. //---------------------------------------------------------------
  566. HRESULT CMimeEditDocHost::SetActiveObject(IOleInPlaceActiveObject * pActiveObject, LPCOLESTR lpszObjName)
  567. {
  568. TraceCall("CMimeEditDocHost::IOleInPlaceUIWindow::SetActiveObject");
  569. ReplaceInterface(m_pInPlaceActiveObj, pActiveObject);
  570. return S_OK;
  571. }
  572. // *** IOleInPlaceFrame methods ***
  573. //+---------------------------------------------------------------
  574. //
  575. // Member: CMimeEditDocHost::InsertMenus
  576. //
  577. // Synopsis:
  578. //
  579. //---------------------------------------------------------------
  580. HRESULT CMimeEditDocHost::InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS)
  581. {
  582. TraceCall("CMimeEditDocHost::InsertMenus");
  583. return E_NOTIMPL;
  584. }
  585. //+---------------------------------------------------------------
  586. //
  587. // Member: CMimeEditDocHost::SetMenu
  588. //
  589. // Synopsis:
  590. //
  591. //---------------------------------------------------------------
  592. HRESULT CMimeEditDocHost::SetMenu(HMENU, HOLEMENU, HWND)
  593. {
  594. TraceCall("CMimeEditDocHost::SetMenu");
  595. return E_NOTIMPL;
  596. }
  597. //+---------------------------------------------------------------
  598. //
  599. // Member: CMimeEditDocHost::RemoveMenus
  600. //
  601. // Synopsis:
  602. //
  603. //---------------------------------------------------------------
  604. HRESULT CMimeEditDocHost::RemoveMenus(HMENU)
  605. {
  606. TraceCall("CMimeEditDocHost::RemoveMenus");
  607. return E_NOTIMPL;
  608. }
  609. //+---------------------------------------------------------------
  610. //
  611. // Member: CMimeEditDocHost::SetStatusText
  612. //
  613. // Synopsis:
  614. //
  615. //---------------------------------------------------------------
  616. HRESULT CMimeEditDocHost::SetStatusText(LPCOLESTR pszW)
  617. {
  618. TCHAR rgch[CCHMAX_STRINGRES];
  619. TraceCall("CMimeEditDocHost::SetStatusText");
  620. if(!m_pStatus)
  621. return E_NOTIMPL;
  622. *rgch=0;
  623. if(pszW && WideCharToMultiByte(CP_ACP, 0, pszW, -1, rgch, ARRAYSIZE(rgch), NULL, NULL))
  624. m_pStatus->ShowSimpleText(rgch);
  625. if(*rgch==0)
  626. m_pStatus->HideSimpleText();
  627. DOUTL(64, "IOleInPlaceFrame::SetStatusText:'%s'", rgch);
  628. return NOERROR;
  629. }
  630. HRESULT CMimeEditDocHost::TranslateAccelerator(LPMSG, WORD)
  631. {
  632. return E_NOTIMPL;
  633. }
  634. // **** IOleInPlaceSite methods ****
  635. //+---------------------------------------------------------------
  636. //
  637. // Member: CanInPlaceActivate
  638. //
  639. // Synopsis:
  640. //
  641. //---------------------------------------------------------------
  642. HRESULT CMimeEditDocHost::CanInPlaceActivate()
  643. {
  644. TraceCall("CMimeEditDocHost::IOleInPlaceSite::CanInPlaceActivate");
  645. return NOERROR;
  646. }
  647. //+---------------------------------------------------------------
  648. //
  649. // Member: OnInPlaceActivate
  650. //
  651. // Synopsis:
  652. //
  653. //---------------------------------------------------------------
  654. HRESULT CMimeEditDocHost::OnInPlaceActivate()
  655. {
  656. LPOLEINPLACEACTIVEOBJECT pInPlaceActive;
  657. TraceCall("CMimeEditDocHost::OnInPlaceActivate");
  658. Assert(m_lpOleObj);
  659. if (m_lpOleObj->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pInPlaceActive)==S_OK)
  660. {
  661. SideAssert((pInPlaceActive->GetWindow(&m_hwndDocObj)==NOERROR)&& IsWindow(m_hwndDocObj));
  662. pInPlaceActive->Release();
  663. }
  664. return NOERROR;
  665. }
  666. //+---------------------------------------------------------------
  667. //
  668. // Member: OnUIActivate
  669. //
  670. // Synopsis:
  671. //
  672. //---------------------------------------------------------------
  673. HRESULT CMimeEditDocHost::OnUIActivate()
  674. {
  675. TraceCall("CMimeEditDocHost::OnUIActivate");
  676. m_fUIActive=TRUE;
  677. // Notify our parent that we're the one with the focus now.
  678. if (m_pEventSink)
  679. m_pEventSink->EventOccurred(MEHC_UIACTIVATE, NULL);
  680. return NOERROR;
  681. }
  682. //+---------------------------------------------------------------
  683. //
  684. // Member: GetWindowContext
  685. //
  686. // Synopsis:
  687. //
  688. //---------------------------------------------------------------
  689. HRESULT CMimeEditDocHost::GetWindowContext( IOleInPlaceFrame **ppFrame,
  690. IOleInPlaceUIWindow **ppDoc,
  691. LPRECT lprcPosRect,
  692. LPRECT lprcClipRect,
  693. LPOLEINPLACEFRAMEINFO lpFrameInfo)
  694. {
  695. TraceCall("CMimeEditDocHost::IOleInPlaceSite::GetWindowContext");
  696. *ppFrame = (LPOLEINPLACEFRAME)this;
  697. AddRef();
  698. *ppDoc = NULL;
  699. GetClientRect(m_hwnd, lprcPosRect);
  700. *lprcClipRect = *lprcPosRect;
  701. lpFrameInfo->fMDIApp = FALSE;
  702. lpFrameInfo->hwndFrame = m_hwnd;
  703. lpFrameInfo->haccel = NULL;
  704. lpFrameInfo->cAccelEntries = 0;
  705. return NOERROR;
  706. }
  707. //+---------------------------------------------------------------
  708. //
  709. // Member: Scroll
  710. //
  711. // Synopsis:
  712. //
  713. //---------------------------------------------------------------
  714. HRESULT CMimeEditDocHost::Scroll(SIZE scrollExtent)
  715. {
  716. // the docobject consumes the entireview, so scroll requests
  717. // are meaningless. Return NOERROR to indicate that they're scolled
  718. // into view.
  719. TraceCall("CMimeEditDocHost::IOleInPlaceSite::Scroll");
  720. return NOERROR;
  721. }
  722. //+---------------------------------------------------------------
  723. //
  724. // Member: OnUIDeactivate
  725. //
  726. // Synopsis:
  727. //
  728. //---------------------------------------------------------------
  729. HRESULT CMimeEditDocHost::OnUIDeactivate(BOOL fUndoable)
  730. {
  731. TraceCall("CMimeEditDocHost::OnUIDeactivate");
  732. m_fUIActive=FALSE;
  733. return S_OK;
  734. }
  735. //+---------------------------------------------------------------
  736. //
  737. // Member: OnInPlaceDeactivate
  738. //
  739. // Synopsis:
  740. //
  741. //---------------------------------------------------------------
  742. HRESULT CMimeEditDocHost::OnInPlaceDeactivate()
  743. {
  744. TraceCall("CMimeEditDocHost::OnInPlaceDeactivate");
  745. return S_OK;
  746. }
  747. //+---------------------------------------------------------------
  748. //
  749. // Member: DiscardUndoState
  750. //
  751. // Synopsis:
  752. //
  753. //---------------------------------------------------------------
  754. HRESULT CMimeEditDocHost::DiscardUndoState()
  755. {
  756. TraceCall("CMimeEditDocHost::IOleInPlaceSite::DiscardUndoState");
  757. return E_NOTIMPL;
  758. }
  759. //+---------------------------------------------------------------
  760. //
  761. // Member: DeactivateAndUndo
  762. //
  763. // Synopsis:
  764. //
  765. //---------------------------------------------------------------
  766. HRESULT CMimeEditDocHost::DeactivateAndUndo()
  767. {
  768. TraceCall("CMimeEditDocHost::IOleInPlaceSite::DeactivateAndUndo");
  769. return E_NOTIMPL;
  770. }
  771. //+---------------------------------------------------------------
  772. //
  773. // Member: OnPosRectChange
  774. //
  775. // Synopsis:
  776. //
  777. //---------------------------------------------------------------
  778. HRESULT CMimeEditDocHost::OnPosRectChange(LPCRECT lprcPosRect)
  779. {
  780. TraceCall("CMimeEditDocHost::IOleInPlaceSite::OnPosRectChange");
  781. return E_NOTIMPL;
  782. }
  783. // IOleClientSite methods.
  784. //+---------------------------------------------------------------
  785. //
  786. // Member: SaveObject
  787. //
  788. // Synopsis:
  789. //
  790. //---------------------------------------------------------------
  791. HRESULT CMimeEditDocHost::SaveObject()
  792. {
  793. TraceCall("CMimeEditDocHost::IOleClientSite::SaveObject");
  794. return E_NOTIMPL;
  795. }
  796. //+---------------------------------------------------------------
  797. //
  798. // Member: GetMoniker
  799. //
  800. // Synopsis:
  801. //
  802. //---------------------------------------------------------------
  803. HRESULT CMimeEditDocHost::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppmnk)
  804. {
  805. TraceCall("CMimeEditDocHost::IOleClientSite::GetMoniker");
  806. return E_NOTIMPL;
  807. }
  808. //+---------------------------------------------------------------
  809. //
  810. // Member: GetContainer
  811. //
  812. // Synopsis:
  813. //
  814. //---------------------------------------------------------------
  815. HRESULT CMimeEditDocHost::GetContainer(LPOLECONTAINER *ppCont)
  816. {
  817. TraceCall("CMimeEditDocHost::IOleClientSite::GetContainer");
  818. if(ppCont)
  819. *ppCont=NULL;
  820. return E_NOINTERFACE;
  821. }
  822. //+---------------------------------------------------------------
  823. //
  824. // Member: ShowObject
  825. //
  826. // Synopsis:
  827. //
  828. //---------------------------------------------------------------
  829. HRESULT CMimeEditDocHost::ShowObject()
  830. {
  831. // always shown.
  832. // $TODO: do we need to restore the browser here if it is
  833. // minimised?
  834. TraceCall("CMimeEditDocHost::IOleClientSite::ShowObject");
  835. return NOERROR;
  836. }
  837. //+---------------------------------------------------------------
  838. //
  839. // Member: OnShowWindow
  840. //
  841. // Synopsis:
  842. //
  843. //---------------------------------------------------------------
  844. HRESULT CMimeEditDocHost::OnShowWindow(BOOL fShow)
  845. {
  846. TraceCall("CMimeEditDocHost::IOleClientSite::OnShowWindow");
  847. return E_NOTIMPL;
  848. }
  849. //+---------------------------------------------------------------
  850. //
  851. // Member: RequestNewObjectLayout
  852. //
  853. // Synopsis:
  854. //
  855. //---------------------------------------------------------------
  856. HRESULT CMimeEditDocHost::RequestNewObjectLayout()
  857. {
  858. TraceCall("CMimeEditDocHost::IOleClientSite::RequestNewObjectLayout");
  859. return E_NOTIMPL;
  860. }
  861. // IOleDocumentSite
  862. //+---------------------------------------------------------------
  863. //
  864. // Member: ActivateMe
  865. //
  866. // Synopsis:
  867. //
  868. //---------------------------------------------------------------
  869. HRESULT CMimeEditDocHost::ActivateMe(LPOLEDOCUMENTVIEW pViewToActivate)
  870. {
  871. TraceCall("CMimeEditDocHost::IOleDocumentSite::ActivateMe");
  872. return CreateDocView();
  873. }
  874. //+---------------------------------------------------------------
  875. //
  876. // Member: CreateDocView
  877. //
  878. // Synopsis:
  879. //
  880. //---------------------------------------------------------------
  881. HRESULT CMimeEditDocHost::CreateDocView()
  882. {
  883. HRESULT hr;
  884. LPOLEDOCUMENT pOleDoc=NULL;
  885. IServiceProvider *pSP;
  886. TraceCall("CMimeEditDocHost::CreateDocView");
  887. AssertSz(!m_pDocView, "why is this still set??");
  888. AssertSz(m_lpOleObj, "uh? no docobject at this point?");
  889. hr=OleRun(m_lpOleObj);
  890. if(FAILED(hr))
  891. goto Exit;
  892. hr=m_lpOleObj->QueryInterface(IID_IOleDocument, (LPVOID*)&pOleDoc);
  893. if(FAILED(hr))
  894. goto Exit;
  895. hr=pOleDoc->CreateView(this, NULL,0,&m_pDocView);
  896. if(FAILED(hr))
  897. goto CleanUp;
  898. hr=m_pDocView->SetInPlaceSite(this);
  899. if(FAILED(hr))
  900. goto CleanUp;
  901. hr=m_pDocView->Show(TRUE);
  902. if(FAILED(hr))
  903. goto CleanUp;
  904. hr = m_lpOleObj->QueryInterface(IID_IServiceProvider, (LPVOID *)&pSP);
  905. if (!FAILED(hr))
  906. {
  907. hr = pSP->QueryService(IID_IHTMLDocument2, IID_IHTMLDocument2, (LPVOID *)&m_pDoc);
  908. pSP->Release();
  909. }
  910. CleanUp:
  911. pOleDoc->Release();
  912. Exit:
  913. return hr;
  914. }
  915. // This must be greater than the most number of IDs that will ever be passed down
  916. // to MimeEdit for any one group within the CMDSETID_OutlookExpress portion of
  917. // QueryStatus below
  918. const DWORD MAX_MIMEEDIT_CMDS = 20;
  919. // I know this is totally cheesy, but...
  920. // These next macros rely upon variables within the CMDSETID_OutlookExpress
  921. // portion of QueryStatus
  922. #define INC_FORMS(id) _IncrementCmdList(pCmd, rgCmdForms, rgpCmdForms, &cCmdForms, id)
  923. #define INC_STD(id) _IncrementCmdList(pCmd, rgCmdStd, rgpCmdStd, &cCmdStd, id)
  924. #define INC_MIMEEDIT(id) _IncrementCmdList(pCmd, rgCmdMimeEdit, rgpCmdMimeEdit, &cCmdMimeEdit, id)
  925. inline void _IncrementCmdList(OLECMD *pCurCmd, OLECMD *pInCmdList, OLECMD **ppOutCmdList, DWORD *pdwIndex, DWORD cmdID)
  926. {
  927. DWORD dwIndex = *pdwIndex;
  928. AssertSz(dwIndex < MAX_MIMEEDIT_CMDS, "Need to increment MAX_MIMEEDIT_CMDS");
  929. pInCmdList[dwIndex].cmdID = cmdID;
  930. pInCmdList[dwIndex].cmdf = 0;
  931. ppOutCmdList[dwIndex] = pCurCmd;
  932. dwIndex++;
  933. *pdwIndex = dwIndex;
  934. }
  935. //+---------------------------------------------------------------
  936. //
  937. // Member: QueryStatus
  938. //
  939. // Synopsis:
  940. //
  941. //---------------------------------------------------------------
  942. HRESULT CMimeEditDocHost::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pCmdText)
  943. {
  944. TraceCall("CMimeEditDocHost::CMimeEditDocHost::QueryStatus");
  945. HRESULT hr = OLECMDERR_E_UNKNOWNGROUP;
  946. OLECMD *pCmd = rgCmds;
  947. if (!rgCmds)
  948. return E_INVALIDARG;
  949. if (NULL == pguidCmdGroup)
  950. {
  951. // TraceInfo("IOleCmdTarget::QueryStatus - std group");
  952. for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
  953. {
  954. if (0 != pCmd->cmdf)
  955. continue;
  956. switch (pCmd->cmdID)
  957. {
  958. case OLECMDID_UPDATECOMMANDS:
  959. case OLECMDID_SETPROGRESSPOS:
  960. case OLECMDID_SETPROGRESSTEXT:
  961. pCmd->cmdf = MSOCMDF_ENABLED;
  962. break;
  963. }
  964. }
  965. hr = S_OK;
  966. }
  967. // Will be used when sending down command IDs
  968. else if (IsEqualGUID(CMDSETID_OutlookExpress, *pguidCmdGroup))
  969. {
  970. ULONG ulTab = MEST_EDIT;
  971. DWORD cCmdForms = 0,
  972. cCmdStd = 0,
  973. cCmdMimeEdit = 0;
  974. OLECMD rgCmdForms[MAX_MIMEEDIT_CMDS],
  975. rgCmdStd[MAX_MIMEEDIT_CMDS],
  976. rgCmdMimeEdit[MAX_MIMEEDIT_CMDS],
  977. *rgpCmdForms[MAX_MIMEEDIT_CMDS],
  978. *rgpCmdStd[MAX_MIMEEDIT_CMDS],
  979. *rgpCmdMimeEdit[MAX_MIMEEDIT_CMDS];
  980. BOOL fHtml,
  981. fActiveAndHtml,
  982. fEditMode = FALSE,
  983. fFormatMenu = FALSE;
  984. HrIsEditMode(&fEditMode);
  985. if (!fEditMode && m_pMsg)
  986. {
  987. DWORD dwFlags = 0;
  988. m_pMsg->GetFlags(&dwFlags);
  989. fHtml = (dwFlags & IMF_HTML);
  990. }
  991. else
  992. fHtml = (S_OK == HrIsHTMLMode());
  993. fActiveAndHtml = fHtml && m_fUIActive;
  994. ExecGetI4(&CMDSETID_MimeEdit, MECMDID_SETSOURCETAB, &ulTab);
  995. for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
  996. {
  997. ULONG cmdID = pCmd->cmdID;
  998. if (0 != pCmd->cmdf)
  999. continue;
  1000. switch (cmdID)
  1001. {
  1002. case ID_REPLY:
  1003. case ID_REPLY_ALL:
  1004. case ID_REPLY_GROUP:
  1005. case ID_FORWARD:
  1006. case ID_FORWARD_AS_ATTACH:
  1007. // If we have the sec UI showing then the reply, etc shouldn't work. We don't care
  1008. // here in MimeEdit if is isn't displayed. We can allow the other components to
  1009. // decide what happens in that case.
  1010. if(m_fSecDispInfo || m_fShowingErrorPage)
  1011. pCmd->cmdf = QS_ENABLED(FALSE);
  1012. break;
  1013. case ID_FONTS_LARGEST:
  1014. case ID_FONTS_LARGE:
  1015. case ID_FONTS_MEDIUM:
  1016. case ID_FONTS_SMALL:
  1017. case ID_FONTS_SMALLEST:
  1018. INC_FORMS(IDM_BASELINEFONT1 + (cmdID - ID_FONTS_SMALLEST));
  1019. break;
  1020. case ID_FONTS_FIXED:
  1021. pCmd->cmdf = QS_ENABLECHECK(!fHtml, m_fFixedFont);
  1022. break;
  1023. case ID_FIND_TEXT:
  1024. // For some reason, trident always marks this enabled, but if we are in the
  1025. // browser and the list view has focus, then the Exec won't work even though
  1026. // the QueryStatus returns enabled. Therefore, only enable this if active
  1027. // Once trident has fixed there problem here, we can enable calling into trident
  1028. // See RAID 13727
  1029. //INC_STD(OLECMDID_FIND);
  1030. pCmd->cmdf = QS_ENABLED(m_fUIActive);
  1031. break;
  1032. case ID_PRINT:
  1033. case ID_PRINT_NOW:
  1034. if (IsWindowVisible(m_hwnd))
  1035. INC_STD(OLECMDID_PRINT);
  1036. break;
  1037. case ID_POPUP_FONTS:
  1038. case ID_VIEW_MSG_SOURCE:
  1039. case ID_VIEW_SOURCE:
  1040. pCmd->cmdf = QS_ENABLED(TRUE);
  1041. break;
  1042. // This should be disabled if mail
  1043. case ID_UNSCRAMBLE:
  1044. {
  1045. DWORD dwFlags = 0;
  1046. if (m_fSecDispInfo || m_fShowingErrorPage)
  1047. {
  1048. pCmd->cmdf = QS_ENABLED(FALSE);
  1049. }
  1050. else
  1051. {
  1052. m_pBodyOptions->GetFlags(&dwFlags);
  1053. pCmd->cmdf = QS_ENABLED((0 == (dwFlags & BOPT_MAIL)) && !fEditMode);
  1054. }
  1055. break;
  1056. }
  1057. case ID_SAVE_STATIONERY:
  1058. case ID_NOTE_SAVE_STATIONERY:
  1059. {
  1060. DWORD dwFlags = 0;
  1061. m_pBodyOptions->GetFlags(&dwFlags);
  1062. pCmd->cmdf = QS_ENABLED(fHtml && IsWindowVisible(m_hwnd) &&
  1063. (0 == (BOPT_MULTI_MSGS_SELECTED & dwFlags)) && !m_fShowingErrorPage);
  1064. break;
  1065. }
  1066. // This should only be enabled if have attachments
  1067. case ID_SAVE_ATTACHMENTS:
  1068. case ID_NOTE_SAVE_ATTACHMENTS:
  1069. {
  1070. DWORD dwFlags = 0;
  1071. m_pBodyOptions->GetFlags(&dwFlags);
  1072. if (IsWindowVisible(m_hwnd) && (0 == (BOPT_MULTI_MSGS_SELECTED & dwFlags)))
  1073. INC_MIMEEDIT(MECMDID_SAVEATTACHMENTS);
  1074. else
  1075. pCmd->cmdf = QS_ENABLED(FALSE);
  1076. break;
  1077. }
  1078. // We only care what happens with these if we are not in the edit tab. If not in the
  1079. // edit tab, then disable these menu items.
  1080. case ID_MOVE_TO_FOLDER:
  1081. case ID_COPY_TO_FOLDER:
  1082. case ID_NOTE_MOVE_TO_FOLDER:
  1083. case ID_NOTE_COPY_TO_FOLDER:
  1084. case ID_FORMATTING_TOOLBAR:
  1085. case ID_POPUP_LANGUAGE:
  1086. case ID_POPUP_LANGUAGE_DEFERRED:
  1087. if (ulTab != MEST_EDIT)
  1088. pCmd->cmdf = QS_ENABLED(FALSE);
  1089. break;
  1090. case ID_SPELLING:
  1091. INC_STD(OLECMDID_SPELL);
  1092. break;
  1093. case ID_CUT:
  1094. INC_STD(OLECMDID_CUT);
  1095. break;
  1096. case ID_NOTE_COPY:
  1097. case ID_COPY:
  1098. INC_STD(OLECMDID_COPY);
  1099. break;
  1100. case ID_PASTE:
  1101. INC_STD(OLECMDID_PASTE);
  1102. break;
  1103. case ID_SELECT_ALL:
  1104. INC_STD(OLECMDID_SELECTALL);
  1105. break;
  1106. case ID_UNDO:
  1107. INC_STD(OLECMDID_UNDO);
  1108. break;
  1109. case ID_REDO:
  1110. INC_STD(OLECMDID_REDO);
  1111. break;
  1112. case ID_SOURCE_EDIT:
  1113. INC_MIMEEDIT(MECMDID_SHOWSOURCETABS);
  1114. break;
  1115. case ID_DOCDIR_LTR:
  1116. INC_FORMS(IDM_DIRLTR);
  1117. break;
  1118. case ID_DOCDIR_RTL:
  1119. INC_FORMS(IDM_DIRRTL);
  1120. break;
  1121. case ID_INDENT_INCREASE:
  1122. if (fActiveAndHtml)
  1123. INC_FORMS(IDM_INDENT);
  1124. else
  1125. pCmd->cmdf = QS_ENABLED(FALSE);
  1126. break;
  1127. case ID_INDENT_DECREASE:
  1128. if (fActiveAndHtml)
  1129. INC_FORMS(IDM_OUTDENT);
  1130. else
  1131. pCmd->cmdf = QS_ENABLED(FALSE);
  1132. break;
  1133. case ID_FONTS_DIALOG:
  1134. if (fActiveAndHtml)
  1135. INC_FORMS(IDM_FONT);
  1136. else
  1137. pCmd->cmdf = QS_ENABLED(FALSE);
  1138. break;
  1139. case ID_FORMAT_SETTINGS:
  1140. if (fActiveAndHtml)
  1141. INC_FORMS(IDM_BLOCKFMT);
  1142. else
  1143. pCmd->cmdf = QS_ENABLED(FALSE);
  1144. break;
  1145. case ID_INSERT_TEXT:
  1146. if (m_fUIActive)
  1147. INC_MIMEEDIT(MECMDID_INSERTTEXTFILE);
  1148. else
  1149. pCmd->cmdf = QS_ENABLED(FALSE);
  1150. break;
  1151. case ID_FORMAT_PARADLG:
  1152. if (m_fUIActive)
  1153. INC_MIMEEDIT(MECMDID_FORMATPARAGRAPH);
  1154. else
  1155. pCmd->cmdf = QS_ENABLED(FALSE);
  1156. break;
  1157. case ID_POPUP_STYLE:
  1158. pCmd->cmdf = QS_ENABLED(fActiveAndHtml && (ulTab == MEST_EDIT));
  1159. break;
  1160. case ID_BACKGROUND_PICTURE:
  1161. case ID_BACKGROUND_SOUND:
  1162. case ID_POPUP_BACKGROUND_COLOR:
  1163. case ID_POPUP_STATIONERY:
  1164. case ID_POPUP_BACKGROUND:
  1165. pCmd->cmdf = QS_ENABLED(fHtml && (ulTab == MEST_EDIT));
  1166. break;
  1167. case ID_INSERT_PICTURE:
  1168. if (fActiveAndHtml)
  1169. INC_FORMS(IDM_IMAGE);
  1170. else
  1171. pCmd->cmdf = QS_ENABLED(FALSE);
  1172. break;
  1173. case ID_INSERT_LINE:
  1174. if (fActiveAndHtml)
  1175. INC_FORMS(IDM_HORIZONTALLINE);
  1176. else
  1177. pCmd->cmdf = QS_ENABLED(FALSE);
  1178. break;
  1179. case ID_UNLINK:
  1180. if (fActiveAndHtml)
  1181. INC_FORMS(IDM_UNLINK);
  1182. else
  1183. pCmd->cmdf = QS_ENABLED(FALSE);
  1184. break;
  1185. case ID_EDIT_LINK:
  1186. pCmd->cmdf = QS_ENABLED(fActiveAndHtml);
  1187. break;
  1188. case ID_INSERT_SIGNATURE:
  1189. if (m_fUIActive && (ulTab == MEST_EDIT) && m_pBodyOptions && (S_OK == m_pBodyOptions->SignatureEnabled(FALSE)))
  1190. INC_MIMEEDIT(MECMDID_INSERTHTML);
  1191. else
  1192. pCmd->cmdf = QS_ENABLED(FALSE);
  1193. break;
  1194. default:
  1195. if ((ID_FORMAT_FIRST <= cmdID) && (ID_FORMAT_LAST >= cmdID))
  1196. pCmd->cmdf = QS_ENABLED(TRUE);
  1197. break;
  1198. }
  1199. }
  1200. if (cCmdForms)
  1201. {
  1202. DOUTL(8, "cCmdForms = %d", cCmdForms);
  1203. if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_Forms3, cCmdForms, rgCmdForms, NULL))
  1204. {
  1205. OLECMD *pCmds = rgCmdForms,
  1206. **ppCmdsToReturn = rgpCmdForms;
  1207. for (DWORD i = 0; i < cCmdForms; i++, pCmds++, ppCmdsToReturn++)
  1208. (*ppCmdsToReturn)->cmdf = pCmds->cmdf;
  1209. }
  1210. }
  1211. if (cCmdStd)
  1212. {
  1213. DOUTL(8, "cCmdStd = %d", cCmdStd);
  1214. if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(NULL, cCmdStd, rgCmdStd, NULL))
  1215. {
  1216. OLECMD *pCmds = rgCmdStd,
  1217. **ppCmdsToReturn = rgpCmdStd;
  1218. for (DWORD i = 0; i < cCmdStd; i++, pCmds++, ppCmdsToReturn++)
  1219. (*ppCmdsToReturn)->cmdf = pCmds->cmdf;
  1220. }
  1221. }
  1222. if (cCmdMimeEdit)
  1223. {
  1224. DOUTL(8, "cCmdMimeEdit = %d", cCmdMimeEdit);
  1225. if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_MimeEdit, cCmdMimeEdit, rgCmdMimeEdit, NULL))
  1226. {
  1227. OLECMD *pCmds = rgCmdMimeEdit,
  1228. **ppCmdsToReturn = rgpCmdMimeEdit;
  1229. for (DWORD i = 0; i < cCmdMimeEdit; i++, pCmds++, ppCmdsToReturn++)
  1230. (*ppCmdsToReturn)->cmdf = pCmds->cmdf;
  1231. }
  1232. }
  1233. hr = S_OK;
  1234. }
  1235. else if (IsEqualGUID(CMDSETID_MimeEditHost, *pguidCmdGroup))
  1236. {
  1237. for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
  1238. {
  1239. if (0 != pCmd->cmdf)
  1240. continue;
  1241. switch (pCmd->cmdID)
  1242. {
  1243. case MEHOSTCMDID_SAVEATTACH_PATH:
  1244. case MEHOSTCMDID_UNSAFEATTACHMENTS:
  1245. case MEHOSTCMDID_SECURITY_ZONE:
  1246. case MEHOSTCMDID_SIGNATURE_ENABLED:
  1247. case MEHOSTCMDID_SIGNATURE_OPTIONS:
  1248. case MEHOSTCMDID_SIGNATURE:
  1249. case MEHOSTCMDID_HEADER_TYPE:
  1250. case MEHOSTCMDID_FLAGS:
  1251. case MEHOSTCMDID_QUOTE_CHAR:
  1252. case MEHOSTCMDID_REPLY_TICK_COLOR:
  1253. case MEHOSTCMDID_COMPOSE_FONT:
  1254. case MEHOSTCMDID_ADD_TO_ADDRESSBOOK:
  1255. case MEHOSTCMDID_ADD_TO_FAVORITES:
  1256. case MEHOSTCMDID_ONPARSECOMPLETE:
  1257. case MEHOSTCMDID_FONTCACHE:
  1258. case MEHOSTCMDID_BORDERFLAGS:
  1259. pCmd->cmdf = QS_ENABLED(TRUE);
  1260. break;
  1261. }
  1262. }
  1263. hr = S_OK;
  1264. }
  1265. else if (IsEqualGUID(CMDSETID_OESecurity, *pguidCmdGroup))
  1266. {
  1267. for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
  1268. {
  1269. if (0 != pCmd->cmdf)
  1270. continue;
  1271. switch (pCmd->cmdID)
  1272. {
  1273. case OECSECCMD_ENCRYPTED:
  1274. {
  1275. pCmd->cmdf = OLECMDF_SUPPORTED;
  1276. if (m_fIsEncrypted)
  1277. {
  1278. if(m_fSecDispInfo)
  1279. pCmd->cmdf |= OLECMDF_INVISIBLE;
  1280. else if (m_fEncryptionOK)
  1281. pCmd->cmdf |= OLECMDF_ENABLED;
  1282. }
  1283. else
  1284. pCmd->cmdf |= OLECMDF_INVISIBLE;
  1285. break;
  1286. }
  1287. case OECSECCMD_SIGNED:
  1288. {
  1289. pCmd->cmdf = OLECMDF_SUPPORTED;
  1290. if (m_fIsSigned)
  1291. {
  1292. if(m_fSecDispInfo)
  1293. pCmd->cmdf |= OLECMDF_INVISIBLE;
  1294. else if (m_fSignTrusted)
  1295. pCmd->cmdf |= OLECMDF_ENABLED;
  1296. }
  1297. else
  1298. pCmd->cmdf |= OLECMDF_INVISIBLE;
  1299. break;
  1300. }
  1301. }
  1302. }
  1303. hr = S_OK;
  1304. }
  1305. TraceInfoAssert(OLECMDERR_E_UNKNOWNGROUP != hr, "IOleCmdTarget::QueryStatus - unknown group");
  1306. return hr;
  1307. }
  1308. //+---------------------------------------------------------------
  1309. //
  1310. // Member: Exec
  1311. //
  1312. // Synopsis:
  1313. //
  1314. //---------------------------------------------------------------
  1315. HRESULT CMimeEditDocHost::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
  1316. {
  1317. TCHAR rgch[MAX_PATH];
  1318. HRESULT hr = S_OK;
  1319. TraceCall("CMimeEditDocHost::Exec");
  1320. if (NULL == pguidCmdGroup)
  1321. {
  1322. switch(nCmdID)
  1323. {
  1324. case OLECMDID_UPDATECOMMANDS:
  1325. OnUpdateCommands();
  1326. break;
  1327. case OLECMDID_SETPROGRESSPOS:
  1328. // when done downloading trident now hits us with a
  1329. // setprogresspos == -1 to indicate we should remove the "Done"
  1330. if (pvaIn->lVal == -1)
  1331. SetStatusText(NULL);
  1332. break;
  1333. case OLECMDID_SETPROGRESSTEXT:
  1334. if(pvaIn->vt == (VT_BSTR))
  1335. SetStatusText((LPCOLESTR)pvaIn->bstrVal);
  1336. break;
  1337. default:
  1338. hr = OLECMDERR_E_NOTSUPPORTED;
  1339. break;
  1340. }
  1341. }
  1342. // Will be used when sending down command IDs
  1343. else if (IsEqualGUID(CMDSETID_OutlookExpress, *pguidCmdGroup))
  1344. {
  1345. // TraceInfo("IOleCmdTarget::QueryStatus - std group");
  1346. hr = HrWMCommand(m_hwnd, nCmdID, 0);
  1347. }
  1348. else if (IsEqualGUID(CMDSETID_Forms3, *pguidCmdGroup))
  1349. {
  1350. if (nCmdID == IDM_PARSECOMPLETE)
  1351. // add code here to call download complete when 916 comes out.
  1352. OnDocumentReady();
  1353. else if (nCmdID == IDM_DIRRTL)
  1354. return m_pCmdTarget ? m_pCmdTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut) : E_FAIL;
  1355. else
  1356. hr = OLECMDERR_E_NOTSUPPORTED;
  1357. }
  1358. else if (IsEqualGUID(CMDSETID_MimeEdit, *pguidCmdGroup))
  1359. {
  1360. return m_pCmdTarget ? m_pCmdTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut) : E_FAIL;
  1361. }
  1362. else if (IsEqualGUID(CMDSETID_MimeEditHost, *pguidCmdGroup))
  1363. {
  1364. BOOL fCommandHandled = FALSE;
  1365. // CFrontPage doesn't initialize an m_pBodyOptions
  1366. if (m_pBodyOptions)
  1367. {
  1368. fCommandHandled = TRUE;
  1369. switch (nCmdID)
  1370. {
  1371. case MEHOSTCMDID_SOURCEEDIT_FLAGS:
  1372. if (pvaOut)
  1373. {
  1374. pvaOut->vt = VT_I4;
  1375. pvaOut->lVal = 0;
  1376. if (DwGetOption(OPT_SOURCE_EDIT_COLORING))
  1377. pvaOut->lVal |= MESRCFLAGS_COLOR;
  1378. } else
  1379. hr = E_INVALIDARG;
  1380. break;
  1381. case MEHOSTCMDID_SAVEATTACH_PATH:
  1382. {
  1383. if (pvaIn && pvaIn->vt == VT_BSTR && pvaIn->bstrVal)
  1384. {
  1385. if (WideCharToMultiByte(CP_ACP, 0, pvaIn->bstrVal, -1, rgch, ARRAYSIZE(rgch), NULL, NULL))
  1386. SetOption(OPT_SAVEATTACH_PATH, rgch, MAX_PATH, NULL, 0);
  1387. }
  1388. else if (pvaOut)
  1389. {
  1390. pvaOut->vt = VT_BSTR;
  1391. GetOption(OPT_SAVEATTACH_PATH, rgch, MAX_PATH);
  1392. hr = HrLPSZToBSTR(rgch, &pvaOut->bstrVal);
  1393. } else
  1394. hr = E_INVALIDARG;
  1395. break;
  1396. }
  1397. case MEHOSTCMDID_UNSAFEATTACHMENTS:
  1398. if (pvaOut)
  1399. {
  1400. BOOL fEditMode = FALSE;
  1401. pvaOut->vt = VT_I4;
  1402. HrIsEditMode(&fEditMode);
  1403. if (fEditMode) // allow open/save during edit/compose
  1404. pvaOut->lVal = 0;
  1405. else
  1406. pvaOut->lVal = DwGetOption(OPT_SECURITY_ATTACHMENT);
  1407. } else
  1408. hr = E_INVALIDARG;
  1409. break;
  1410. case MEHOSTCMDID_SECURITY_ZONE:
  1411. if (pvaOut)
  1412. {
  1413. pvaOut->vt = VT_I4;
  1414. #ifdef FORCE_UNTRUSTED
  1415. pvaOut->lVal = URLZONE_UNTRUSTED;
  1416. #else // FORCE_UNTRUSTED
  1417. if (DwGetOption(OPT_READ_IN_TEXT_ONLY))
  1418. {
  1419. // In text mode, never let scripts run.
  1420. pvaOut->lVal = URLZONE_UNTRUSTED;
  1421. }
  1422. else
  1423. {
  1424. pvaOut->lVal = DwGetOption(OPT_SECURITYZONE);
  1425. }
  1426. #endif // FORCE_UNTRUSTED
  1427. } else
  1428. hr = E_INVALIDARG;
  1429. break;
  1430. case MEHOSTCMDID_SIGNATURE_ENABLED:
  1431. {
  1432. Assert(pvaIn);
  1433. Assert(V_VT(pvaIn) == VT_I4);
  1434. hr = m_pBodyOptions->SignatureEnabled((V_I4(pvaIn) == MESIG_AUTO) ? TRUE : FALSE);
  1435. break;
  1436. }
  1437. case MEHOSTCMDID_SIGNATURE_OPTIONS:
  1438. {
  1439. DWORD outFlags = 0,
  1440. fBodyFlags = 0;
  1441. Assert(pvaOut);
  1442. V_VT(pvaOut) = VT_I4;
  1443. m_pBodyOptions->GetSignature(NULL, &fBodyFlags, NULL);
  1444. if (fBodyFlags != 0)
  1445. {
  1446. outFlags = (fBodyFlags & SIGOPT_HTML) ? MESIGOPT_HTML : MESIGOPT_PLAIN;
  1447. if (fBodyFlags & SIGOPT_TOP)
  1448. outFlags |= MESIGOPT_TOP;
  1449. if (fBodyFlags & SIGOPT_PREFIX)
  1450. outFlags |= MESIGOPT_PREFIX;
  1451. if (fBodyFlags & SIGOPT_BOTTOM)
  1452. outFlags |= MESIGOPT_BOTTOM;
  1453. }
  1454. V_I4(pvaOut) = outFlags;
  1455. break;
  1456. }
  1457. case MEHOSTCMDID_SPELL_LANGUAGE:
  1458. {
  1459. Assert(pvaOut);
  1460. pvaOut->vt = VT_BSTR;
  1461. if (GetOption(OPT_SPELL_LANGID, rgch, ARRAYSIZE(rgch)))
  1462. {
  1463. hr = HrLPSZToBSTR(rgch, &pvaOut->bstrVal);
  1464. }
  1465. else
  1466. hr = E_FAIL;
  1467. break;
  1468. }
  1469. case MEHOSTCMDID_SPELL_OPTIONS:
  1470. {
  1471. DWORD outFlags = 0;
  1472. Assert(pvaOut);
  1473. V_VT(pvaOut) = VT_I4;
  1474. if (DwGetOption(OPT_SPELLIGNORENUMBER))
  1475. outFlags |= MESPELLOPT_IGNORENUMBER;
  1476. if (DwGetOption(OPT_SPELLIGNOREUPPER))
  1477. outFlags |= MESPELLOPT_IGNOREUPPER;
  1478. if (DwGetOption(OPT_SPELLIGNOREDBCS))
  1479. outFlags |= MESPELLOPT_IGNOREDBCS;
  1480. if (DwGetOption(OPT_SPELLIGNOREPROTECT))
  1481. outFlags |= MESPELLOPT_IGNOREPROTECT;
  1482. if (DwGetOption(OPT_SPELLIGNOREURL))
  1483. outFlags |= MESPELLOPT_IGNOREURL;
  1484. if (DwGetOption(OPT_SPELLALWAYSSUGGEST))
  1485. outFlags |= MESPELLOPT_ALWAYSSUGGEST;
  1486. if (DwGetOption(OPT_SPELLCHECKONSEND))
  1487. outFlags |= MESPELLOPT_CHECKONSEND;
  1488. if (DwGetOption(OPT_SPELLCHECKONTYPE))
  1489. outFlags |= MESPELLOPT_CHECKONTYPE;
  1490. V_I4(pvaOut) = outFlags;
  1491. break;
  1492. }
  1493. case MEHOSTCMDID_SIGNATURE:
  1494. {
  1495. DWORD fFlags;
  1496. Assert(pvaOut);
  1497. V_VT(pvaOut) = VT_BSTR;
  1498. hr = m_pBodyOptions->GetSignature(NULL, &fFlags, &V_BSTR(pvaOut));
  1499. break;
  1500. }
  1501. case MEHOSTCMDID_HEADER_TYPE:
  1502. {
  1503. DWORD dwFlags = 0;
  1504. Assert(pvaOut);
  1505. V_VT(pvaOut) = VT_I4;
  1506. m_pBodyOptions->GetFlags(&dwFlags);
  1507. if (dwFlags & BOPT_USEREPLYHEADER)
  1508. {
  1509. if (dwFlags & BOPT_MAIL)
  1510. {
  1511. V_I4(pvaOut) = MEHEADER_MAIL;
  1512. if (DwGetOption(OPT_HARDCODEDHDRS))
  1513. V_I4(pvaOut) |= MEHEADER_FORCE_ENGLISH;
  1514. }
  1515. else
  1516. V_I4(pvaOut) = MEHEADER_NEWS;
  1517. }
  1518. else
  1519. V_I4(pvaOut) = MEHEADER_NONE;
  1520. break;
  1521. }
  1522. case MEHOSTCMDID_FLAGS:
  1523. {
  1524. DWORD outFlags = 0,
  1525. fBodyFlags;
  1526. Assert(pvaOut);
  1527. V_VT(pvaOut) = VT_I4;
  1528. hr = m_pBodyOptions->GetFlags(&fBodyFlags);
  1529. if (SUCCEEDED(hr))
  1530. {
  1531. if (fBodyFlags & BOPT_INCLUDEMSG)
  1532. outFlags = MEO_FLAGS_INCLUDEMSG;
  1533. if ((fBodyFlags & BOPT_HTML) || m_fSecDispInfo)
  1534. outFlags |= MEO_FLAGS_HTML;
  1535. if (fBodyFlags & BOPT_AUTOINLINE &&
  1536. DwGetOption(OPT_AUTO_IMAGE_INLINE)!=AUTO_INLINE_OFF)
  1537. {
  1538. outFlags |= MEO_FLAGS_AUTOINLINE;
  1539. if (DwGetOption(OPT_AUTO_IMAGE_INLINE) == AUTO_INLINE_SLIDE)
  1540. outFlags |= MEO_FLAGS_SLIDESHOW;
  1541. }
  1542. if (fBodyFlags & BOPT_SENDIMAGES)
  1543. outFlags |= MEO_FLAGS_SENDIMAGES;
  1544. if (fBodyFlags & BOPT_AUTOTEXT)
  1545. outFlags |= MEO_FLAGS_AUTOTEXT;
  1546. if (fBodyFlags & BOPT_BLOCKQUOTE)
  1547. outFlags |= MEO_FLAGS_BLOCKQUOTE;
  1548. if (fBodyFlags & BOPT_SENDEXTERNALS)
  1549. outFlags |= MEO_FLAGS_SENDEXTERNALIMGSRC;
  1550. if (fBodyFlags & BOPT_SPELLINGOREORIGINAL)
  1551. outFlags |= MEO_FLAGS_DONTSPELLCHECKQUOTED;
  1552. }
  1553. V_I4(pvaOut) = outFlags;
  1554. break;
  1555. }
  1556. case MEHOSTCMDID_QUOTE_CHAR:
  1557. {
  1558. BODYOPTINFO boi;
  1559. Assert(pvaOut);
  1560. boi.dwMask = BOPTF_QUOTECHAR;
  1561. hr = m_pBodyOptions->GetInfo(&boi);
  1562. V_VT(pvaOut) = VT_I4;
  1563. V_I4(pvaOut) = boi.chQuote;
  1564. break;
  1565. }
  1566. case MEHOSTCMDID_REPLY_TICK_COLOR:
  1567. {
  1568. BODYOPTINFO boi;
  1569. Assert(pvaOut);
  1570. boi.dwMask = BOPTF_REPLYTICKCOLOR;
  1571. hr = m_pBodyOptions->GetInfo(&boi);
  1572. V_VT(pvaOut) = VT_I4;
  1573. V_I4(pvaOut) = boi.dwReplyTickColor;
  1574. break;
  1575. }
  1576. case MEHOSTCMDID_COMPOSE_FONT:
  1577. {
  1578. BODYOPTINFO boi;
  1579. DWORD fBodyFlags = 0;
  1580. Assert(pvaOut);
  1581. hr = m_pBodyOptions->GetFlags(&fBodyFlags);
  1582. if (SUCCEEDED(hr) && (fBodyFlags & BOPT_NOFONTTAG))
  1583. {
  1584. V_BSTR(pvaOut) = NULL;
  1585. break;
  1586. }
  1587. boi.dwMask = BOPTF_COMPOSEFONT;
  1588. hr = m_pBodyOptions->GetInfo(&boi);
  1589. if (SUCCEEDED(hr))
  1590. {
  1591. V_VT(pvaOut) = VT_BSTR;
  1592. hr = HrLPSZToBSTR(boi.rgchComposeFont, &V_BSTR(pvaOut));
  1593. }
  1594. break;
  1595. }
  1596. case MEHOSTCMDID_IS_READ_IN_TEXT_ONLY:
  1597. {
  1598. if (VT_BOOL == pvaOut->vt)
  1599. {
  1600. if (m_fSecDispInfo || m_fShowingErrorPage || !DwGetOption(OPT_READ_IN_TEXT_ONLY))
  1601. pvaOut->boolVal = VARIANT_FALSE;
  1602. else
  1603. pvaOut->boolVal = VARIANT_TRUE;
  1604. hr = S_OK;
  1605. }
  1606. else
  1607. {
  1608. hr = E_INVALIDARG;
  1609. }
  1610. break;
  1611. }
  1612. case MEHOSTCMDID_HTML_HELP:
  1613. {
  1614. Assert(pvaOut);
  1615. V_VT(pvaOut) = VT_BOOL;
  1616. V_BOOL(pvaOut) = (m_fSecDispInfo || m_fShowingErrorPage)?VARIANT_TRUE:VARIANT_FALSE;
  1617. break;
  1618. }
  1619. default:
  1620. fCommandHandled = FALSE;
  1621. break;
  1622. }
  1623. }
  1624. if (fCommandHandled)
  1625. goto exit;
  1626. switch (nCmdID)
  1627. {
  1628. case MEHOSTCMDID_ADD_TO_ADDRESSBOOK:
  1629. {
  1630. Assert(pvaIn);
  1631. Assert(V_BSTR(pvaIn));
  1632. hr = HrAddToWab(V_BSTR(pvaIn));
  1633. break;
  1634. }
  1635. case MEHOSTCMDID_ADD_TO_FAVORITES:
  1636. {
  1637. BSTR bstrURL=0, bstrDescr=0;
  1638. LONG l;
  1639. Assert(pvaIn);
  1640. l=0;
  1641. IF_FAILEXIT(hr=SafeArrayGetElement(V_ARRAY(pvaIn), &l, &bstrDescr));
  1642. l=1;
  1643. IF_FAILEXIT(hr=SafeArrayGetElement(V_ARRAY(pvaIn), &l, &bstrURL));
  1644. hr = HrAddToFavorites(bstrDescr, bstrURL);
  1645. break;
  1646. }
  1647. case MEHOSTCMDID_SLIDESHOW_DELAY:
  1648. {
  1649. Assert(pvaOut);
  1650. V_VT(pvaOut) = VT_I4;
  1651. V_I4(pvaOut) = 3000; //In milleseconds
  1652. break;
  1653. }
  1654. case MEHOSTCMDID_ONPARSECOMPLETE:
  1655. {
  1656. if (!m_fBlockingOnSMime)
  1657. OnDocumentReady();
  1658. break;
  1659. }
  1660. case MEHOSTCMDID_FONTCACHE:
  1661. {
  1662. Assert(pvaOut);
  1663. if (g_lpIFontCache)
  1664. {
  1665. V_VT(pvaOut) = VT_UNKNOWN;
  1666. V_UNKNOWN(pvaOut) = g_lpIFontCache;
  1667. g_lpIFontCache->AddRef();
  1668. } else
  1669. hr = E_FAIL;
  1670. break;
  1671. }
  1672. case MEHOSTCMDID_BORDERFLAGS:
  1673. {
  1674. Assert(pvaOut);
  1675. V_VT(pvaOut) = VT_I4;
  1676. V_I4(pvaOut) = m_dwBorderFlags;
  1677. break;
  1678. }
  1679. // in the case where m_pBodyOptions is not initialized we're
  1680. // likely in a non-message window so just default to internet zone
  1681. case MEHOSTCMDID_SECURITY_ZONE:
  1682. {
  1683. Assert(pvaOut);
  1684. V_VT(pvaOut) = VT_I4;
  1685. V_I4(pvaOut) = URLZONE_INTERNET;
  1686. break;
  1687. }
  1688. default:
  1689. hr = OLECMDERR_E_NOTSUPPORTED;
  1690. break;
  1691. }
  1692. }
  1693. else if (IsEqualGUID(CMDSETID_OESecurity, *pguidCmdGroup))
  1694. {
  1695. if ((OECSECCMD_ENCRYPTED == nCmdID) || (OECSECCMD_SIGNED == nCmdID))
  1696. {
  1697. if(m_pSecureMessage && (CheckSecReceipt(m_pSecureMessage) == S_OK))
  1698. {
  1699. hr = HrShowSecurityProperty(m_hwnd, m_pSecureMessage);
  1700. }
  1701. else
  1702. hr = HrShowSecurityProperty(m_hwnd, m_pMsg);
  1703. }
  1704. else
  1705. hr = OLECMDERR_E_NOTSUPPORTED;
  1706. } else
  1707. hr = OLECMDERR_E_NOTSUPPORTED;
  1708. exit:
  1709. return hr;
  1710. }
  1711. HRESULT CMimeEditDocHost::HrAddToFavorites(BSTR bstrDescr, BSTR bstrURL)
  1712. {
  1713. HRESULT hr = E_FAIL;
  1714. hr = AddUrlToFavorites(m_hwnd, bstrURL, bstrDescr, TRUE);
  1715. if(FAILED(hr))
  1716. AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthenaMail), MAKEINTRESOURCEW(idsErrFavorites), NULL, MB_OK);
  1717. return (TraceResult(hr));
  1718. }
  1719. HRESULT CMimeEditDocHost::HrAddToWab(BSTR bstr)
  1720. {
  1721. LPWAB lpWab;
  1722. HRESULT hr;
  1723. INT idsErr=0;
  1724. ADRINFO AdrInfo;
  1725. LPSTR psz;
  1726. hr = HrCreateWabObject(&lpWab);
  1727. if (!FAILED(hr))
  1728. {
  1729. if (bstr)
  1730. {
  1731. ZeroMemory(&AdrInfo, sizeof(ADRINFO));
  1732. AdrInfo.lpwszAddress = bstr;
  1733. AdrInfo.lpwszDisplay = bstr;
  1734. hr = lpWab->HrAddToWAB(m_hwnd, &AdrInfo);
  1735. if (FAILED(hr) && hr!=MAPI_E_USER_CANCEL)
  1736. {
  1737. if(hr==MAPI_E_COLLISION)
  1738. idsErr=idsErrAddrDupe;
  1739. else
  1740. idsErr=idsErrAddToWAB;
  1741. }
  1742. if(idsErr)
  1743. AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthenaMail), MAKEINTRESOURCEW(idsErr), NULL, MB_OK);
  1744. }
  1745. lpWab->Release();
  1746. }
  1747. return hr;
  1748. }
  1749. //+---------------------------------------------------------------
  1750. //
  1751. // Member: WMSize
  1752. //
  1753. // Synopsis:
  1754. //
  1755. //---------------------------------------------------------------
  1756. void CMimeEditDocHost::WMSize(int cxBody, int cyBody)
  1757. {
  1758. RECT rc={0};
  1759. TraceCall("CMimeEditDocHost::WMSize");
  1760. if(m_pDocView)
  1761. {
  1762. rc.bottom=cyBody;
  1763. rc.right=cxBody;
  1764. m_pDocView->SetRect(&rc);
  1765. }
  1766. // notify the subclass of a wmsize
  1767. OnWMSize(&rc);
  1768. }
  1769. // *** IOleControlSite ***
  1770. //+---------------------------------------------------------------
  1771. //
  1772. // Member: OnControlInfoChanged
  1773. //
  1774. // Synopsis:
  1775. //
  1776. //---------------------------------------------------------------
  1777. HRESULT CMimeEditDocHost::OnControlInfoChanged()
  1778. {
  1779. TraceCall("CMimeEditDocHost::OnControlInfoChanged");
  1780. return E_NOTIMPL;
  1781. }
  1782. //+---------------------------------------------------------------
  1783. //
  1784. // Member: LockInPlaceActive
  1785. //
  1786. // Synopsis:
  1787. //
  1788. //---------------------------------------------------------------
  1789. HRESULT CMimeEditDocHost::LockInPlaceActive(BOOL fLock)
  1790. {
  1791. TraceCall("CMimeEditDocHost::LockInPlaceActive");
  1792. return E_NOTIMPL;
  1793. }
  1794. //+---------------------------------------------------------------
  1795. //
  1796. // Member: GetExtendedControl
  1797. //
  1798. // Synopsis:
  1799. //
  1800. //---------------------------------------------------------------
  1801. HRESULT CMimeEditDocHost::GetExtendedControl(LPDISPATCH *ppDisp)
  1802. {
  1803. TraceCall("CMimeEditDocHost::GetExtendedControl");
  1804. if (ppDisp)
  1805. *ppDisp=NULL;
  1806. return E_NOTIMPL;
  1807. }
  1808. //+---------------------------------------------------------------
  1809. //
  1810. // Member: TransformCoords
  1811. //
  1812. // Synopsis:
  1813. //
  1814. //---------------------------------------------------------------
  1815. HRESULT CMimeEditDocHost::TransformCoords(POINTL *pPtlHimetric, POINTF *pPtfContainer,DWORD dwFlags)
  1816. {
  1817. TraceCall("CMimeEditDocHost::TransformCoords");
  1818. return E_NOTIMPL;
  1819. }
  1820. //+---------------------------------------------------------------
  1821. //
  1822. // Member: TranslateAccelerator
  1823. //
  1824. // Synopsis:
  1825. //
  1826. //---------------------------------------------------------------
  1827. HRESULT CMimeEditDocHost::TranslateAccelerator(LPMSG lpMsg, DWORD grfModifiers)
  1828. {
  1829. TraceCall("CMimeEditDocHost::TranslateAccelerator");
  1830. return E_NOTIMPL;
  1831. }
  1832. //+---------------------------------------------------------------
  1833. //
  1834. // Member: OnFocus
  1835. //
  1836. // Synopsis:
  1837. //
  1838. //---------------------------------------------------------------
  1839. HRESULT CMimeEditDocHost::OnFocus(BOOL fGotFocus)
  1840. {
  1841. HRESULT hr = S_OK;
  1842. m_fUIActive = !!fGotFocus;
  1843. if (m_pDocView)
  1844. hr = m_pDocView->UIActivate(fGotFocus);
  1845. return hr;
  1846. }
  1847. //+---------------------------------------------------------------
  1848. //
  1849. // Member: ShowPropertyFrame
  1850. //
  1851. // Synopsis:
  1852. //
  1853. //---------------------------------------------------------------
  1854. HRESULT CMimeEditDocHost::ShowPropertyFrame(void)
  1855. {
  1856. TraceCall("CMimeEditDocHost::ShowPropertyFrame");
  1857. return E_NOTIMPL;
  1858. }
  1859. //+---------------------------------------------------------------
  1860. //
  1861. // Member: OnUpdateCommands
  1862. //
  1863. // Synopsis:
  1864. //
  1865. //---------------------------------------------------------------
  1866. HRESULT CMimeEditDocHost::OnUpdateCommands()
  1867. {
  1868. TraceCall("CMimeEditDocHost::OnUpdateCommands");
  1869. SendMessage(GetParent(m_hwnd), NWM_UPDATETOOLBAR, 0, 0);
  1870. return S_OK;
  1871. }
  1872. // ********************************************
  1873. HRESULT CMimeEditDocHost::Load(LPMIMEMESSAGE pMsg)
  1874. {
  1875. SECSTATE secState = {0};
  1876. DWORD dw = 0;
  1877. HRESULT hr;
  1878. m_fFixedFont = FALSE;
  1879. RegisterForHTMLDocEvents(FALSE);
  1880. m_fSecDispInfo = FALSE; // reset flag
  1881. m_fShowingErrorPage = FALSE;
  1882. m_fSecureReceipt = FALSE;
  1883. if(CheckSecReceipt(pMsg) == S_OK)
  1884. {
  1885. HrGetSecurityState(pMsg, &secState, NULL);
  1886. m_fSecureReceipt = TRUE;
  1887. m_fIsEncrypted = !!IsEncrypted(secState.type);
  1888. m_fIsSigned = !!IsSigned(secState.type);
  1889. m_fSignTrusted = !!IsSignTrusted(&secState);
  1890. m_fEncryptionOK = !!IsEncryptionOK(&secState);
  1891. hr = LoadSecurely(pMsg, &secState);
  1892. CleanupSECSTATE(&secState);
  1893. }
  1894. else if (IsSecure(pMsg) && SUCCEEDED(HrGetSecurityState(pMsg, &secState, NULL)))
  1895. {
  1896. m_fIsEncrypted = !!IsEncrypted(secState.type);
  1897. m_fIsSigned = !!IsSigned(secState.type);
  1898. m_fSignTrusted = !!IsSignTrusted(&secState);
  1899. m_fEncryptionOK = !!IsEncryptionOK(&secState);
  1900. hr = LoadSecurely(pMsg, &secState);
  1901. CleanupSECSTATE(&secState);
  1902. }
  1903. else
  1904. {
  1905. m_fIsEncrypted = FALSE;
  1906. m_fIsSigned = FALSE;
  1907. m_fSignTrusted = TRUE;
  1908. m_fEncryptionOK = TRUE;
  1909. hr = InternalLoad(pMsg);
  1910. }
  1911. return hr;
  1912. }
  1913. // ********************************************
  1914. HRESULT CMimeEditDocHost::InternalLoad(IMimeMessage *pMsg)
  1915. {
  1916. SECSTATE secState = {0};
  1917. DWORD dw = 0;
  1918. HRESULT hr;
  1919. DWORD dwBodyFlags = 0;
  1920. BOOLEAN fProcess = FALSE;
  1921. ReplaceInterface(m_pMsg, pMsg);
  1922. if(m_pBodyOptions)
  1923. {
  1924. m_pBodyOptions->GetFlags(&dwBodyFlags);
  1925. m_fMarkedRead = (0 == (dwBodyFlags & BOPT_UNREAD));
  1926. if (!m_fMarkedRead)
  1927. {
  1928. if (!m_fSecDispInfo && !!(dwBodyFlags & BOPT_MAIL))
  1929. fProcess = TRUE;
  1930. if (dwBodyFlags & BOPT_FROM_NOTE)
  1931. {
  1932. //Since opening a message in a note, it should be marked as read immediately.
  1933. HrMarkAsRead();
  1934. }
  1935. else
  1936. {
  1937. // ReplaceInterface(m_pMsg, pMsg);
  1938. if (m_pBodyOptions->GetMarkAsReadTime(&dw) == S_OK)
  1939. {
  1940. if (dw == 0)
  1941. HrMarkAsRead();
  1942. else
  1943. if (dw != OPTION_OFF)
  1944. SetTimer(m_hwnd, idTimerMarkAsRead, dw*1000, NULL);
  1945. }
  1946. else
  1947. HrMarkAsRead();
  1948. }
  1949. }
  1950. }
  1951. hr = m_pPrstMime->Load(m_pMsg);
  1952. if ((fProcess) && !(dwBodyFlags & BOPT_FROM_NOTE) && SUCCEEDED(hr) && (m_pEventSink))
  1953. {
  1954. m_pEventSink->EventOccurred(MEHC_CMD_PROCESS_RECEIPT, m_pMsg);
  1955. }
  1956. return hr;
  1957. }
  1958. // ********************************************
  1959. HRESULT CMimeEditDocHost::Save(LPMIMEMESSAGE pMsg, DWORD dwFlags)
  1960. {
  1961. DWORD idsWarning;
  1962. HRESULT hr;
  1963. Assert(m_pPrstMime);
  1964. hr = m_pPrstMime->Save(pMsg, dwFlags);
  1965. switch (hr)
  1966. {
  1967. case MIMEEDIT_E_CANNOTSAVEWHILESOURCEEDITING:
  1968. AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrCannotSaveInSourceEdit), NULL, MB_OK|MB_ICONEXCLAMATION);
  1969. hr = MAPI_E_USER_CANCEL;
  1970. break;
  1971. // brettm: for OE5 we no longer warn if trident is not readystate complete. In the case of active movie controls
  1972. // they never go readyState complete 'by design' as they never loaded the source url. The warning is annoying for
  1973. // msphone message forwarding. for images we check individual readystates anyway.
  1974. //case MIMEEDIT_W_DOWNLOADNOTCOMPLETE:
  1975. case MIMEEDIT_W_BADURLSNOTATTACHED:
  1976. if (IDYES != AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrBadMHTMLLinks), NULL, MB_YESNO|MB_ICONEXCLAMATION |MB_DEFBUTTON2))
  1977. hr = MAPI_E_USER_CANCEL;
  1978. break;
  1979. case MIMEEDIT_E_CANNOTSAVEUNTILPARSECOMPLETE:
  1980. AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrNotSaveUntilDownloadDone), NULL, MB_OK|MB_ICONEXCLAMATION);
  1981. hr = MAPI_E_USER_CANCEL;
  1982. }
  1983. return hr;
  1984. }
  1985. // ********************************************
  1986. HRESULT CMimeEditDocHost::GetClassID(CLSID *pClsID)
  1987. {
  1988. return E_NOTIMPL;
  1989. }
  1990. // ********************************************
  1991. HRESULT CMimeEditDocHost::HrOnDocObjCreate()
  1992. {
  1993. return S_OK;
  1994. }
  1995. // ********************************************
  1996. HRESULT CMimeEditDocHost::HrGetElement(LPCTSTR pszName, IHTMLElement **ppElem)
  1997. {
  1998. return ::HrGetElementImpl(m_pDoc, pszName, ppElem);
  1999. }
  2000. // ********************************************
  2001. HRESULT CMimeEditDocHost::HrSpellCheck(BOOL fSuppressDoneMsg)
  2002. {
  2003. return m_pCmdTarget ? m_pCmdTarget->Exec(NULL, OLECMDID_SPELL,
  2004. fSuppressDoneMsg ? OLECMDEXECOPT_DONTPROMPTUSER : OLECMDEXECOPT_PROMPTUSER , NULL, NULL) : E_FAIL;
  2005. }
  2006. // ********************************************
  2007. HRESULT CMimeEditDocHost::HrPrint(BOOL fPrompt)
  2008. {
  2009. VARIANTARG va;
  2010. HRESULT hr;
  2011. if (!m_pCmdTarget)
  2012. return E_FAIL;
  2013. va.vt = VT_BSTR;
  2014. va.bstrVal = NULL;
  2015. GetOEUserName(&va.bstrVal);
  2016. hr = m_pCmdTarget->Exec(NULL, OLECMDID_PRINT,
  2017. fPrompt ? OLECMDEXECOPT_PROMPTUSER : OLECMDEXECOPT_DONTPROMPTUSER, &va, NULL);
  2018. SysFreeString(va.bstrVal);
  2019. return hr;
  2020. }
  2021. // ********************************************
  2022. HRESULT CMimeEditDocHost::HrIsEmpty(BOOL *pfEmpty)
  2023. {
  2024. return ExecGetBool(&CMDSETID_MimeEdit, MECMDID_EMPTY, pfEmpty);
  2025. }
  2026. // ********************************************
  2027. HRESULT CMimeEditDocHost::HrUnloadAll(UINT idsDefaultBody, DWORD dwFlags)
  2028. {
  2029. TCHAR rgch[CCHMAX_STRINGRES];
  2030. KillTimer(m_hwnd, idTimerMarkAsRead);
  2031. m_fIsEncrypted = FALSE;
  2032. m_fIsSigned = FALSE;
  2033. m_fSignTrusted = TRUE;
  2034. m_fEncryptionOK = TRUE;
  2035. HrInitNew(m_lpOleObj);
  2036. if (idsDefaultBody)
  2037. {
  2038. LoadString(g_hLocRes, idsDefaultBody, rgch, ARRAYSIZE(rgch));
  2039. HrSetText(rgch);
  2040. }
  2041. return S_OK;
  2042. }
  2043. // ********************************************
  2044. BOOL CMimeEditDocHost::WMCommand(HWND hwnd, int id, WORD wCmd)
  2045. {
  2046. return SUCCEEDED(HrWMCommand(hwnd, id, wCmd));
  2047. }
  2048. // ********************************************
  2049. BOOL CMimeEditDocHost::WMNotify(int idFrom, NMHDR *pnmh)
  2050. {
  2051. return FALSE;
  2052. }
  2053. // ********************************************
  2054. HRESULT CMimeEditDocHost::HrIsDirty(BOOL *pfDirty)
  2055. {
  2056. return ExecGetBool(&CMDSETID_MimeEdit, MECMDID_DIRTY, pfDirty);
  2057. }
  2058. // ********************************************
  2059. HRESULT CMimeEditDocHost::HrSetDirtyFlag(BOOL fDirty)
  2060. {
  2061. return ExecSetBool(&CMDSETID_MimeEdit, MECMDID_DIRTY, fDirty);
  2062. }
  2063. // ********************************************
  2064. HRESULT CMimeEditDocHost::HrSetStyle(DWORD dwStyle)
  2065. {
  2066. HRESULT hr = ExecSetI4(&CMDSETID_MimeEdit, MECMDID_STYLE, dwStyle);
  2067. if (SUCCEEDED(hr))
  2068. m_dwDocStyle = dwStyle;
  2069. return hr;
  2070. }
  2071. // ********************************************
  2072. HRESULT CMimeEditDocHost::HrGetStyle(DWORD *pdwStyle)
  2073. {
  2074. *pdwStyle = m_dwDocStyle;
  2075. return S_OK;
  2076. }
  2077. // ********************************************
  2078. HRESULT CMimeEditDocHost::HrEnableHTMLMode(BOOL fOn)
  2079. {
  2080. BOOL fEdit=FALSE;
  2081. m_fFixedFont = FALSE;
  2082. // if turning HTML mode on, turn on the source tabs
  2083. if (fOn && HrIsEditMode(&fEdit)==S_OK && fEdit)
  2084. ExecSetBool(&CMDSETID_MimeEdit, MECMDID_SHOWSOURCETABS, DwGetOption(OPT_VIEWSOURCETABS));
  2085. return ExecSetBool(&CMDSETID_MimeEdit, MECMDID_EDITHTML, fOn);
  2086. }
  2087. // ********************************************
  2088. HRESULT CMimeEditDocHost::HrIsHTMLMode()
  2089. {
  2090. ULONG cmdf=0;
  2091. QuerySingleMimeEditCmd(MECMDID_EDITHTML, &cmdf);
  2092. return (cmdf & OLECMDF_LATCHED) ? S_OK :S_FALSE;
  2093. }
  2094. // ********************************************
  2095. HRESULT CMimeEditDocHost::HrDowngradeToPlainText()
  2096. {
  2097. return ExecCommand(&CMDSETID_MimeEdit, MECMDID_DOWNGRADEPLAINTEXT);
  2098. }
  2099. // ********************************************
  2100. HRESULT CMimeEditDocHost::HrSetText(LPSTR lpsz)
  2101. {
  2102. TCHAR rgch[CCHMAX_STRINGRES];
  2103. RegisterForHTMLDocEvents(FALSE);
  2104. m_fShowingErrorPage = TRUE;
  2105. if (HIWORD(lpsz)==0)
  2106. {
  2107. LoadString(g_hLocRes, LOWORD(lpsz), rgch, ARRAYSIZE(rgch));
  2108. lpsz = rgch;
  2109. }
  2110. return ExecSetText(&CMDSETID_MimeEdit, MECMDID_SETTEXT, lpsz);
  2111. }
  2112. // ********************************************
  2113. HRESULT CMimeEditDocHost::HrPerformROT13Encoding()
  2114. {
  2115. return ExecCommand(&CMDSETID_MimeEdit, MECMDID_ROT13);
  2116. }
  2117. // ********************************************
  2118. HRESULT CMimeEditDocHost::LoadHtmlErrorPage(LPCSTR pszURL)
  2119. {
  2120. HRESULT hr;
  2121. LPSTR pszUrlFree=NULL;
  2122. // if relative, wrap in our res:// handler
  2123. pszUrlFree = PszAllocResUrl((LPSTR)pszURL);
  2124. if (!pszUrlFree)
  2125. return E_OUTOFMEMORY;
  2126. hr = HrLoadURL(pszUrlFree);
  2127. if (SUCCEEDED(hr))
  2128. RegisterForHTMLDocEvents(TRUE);
  2129. m_fIsEncrypted = FALSE;
  2130. m_fIsSigned = FALSE;
  2131. m_fSignTrusted = TRUE;
  2132. m_fEncryptionOK = TRUE;
  2133. m_fShowingErrorPage = TRUE;
  2134. SafeMemFree(pszUrlFree);
  2135. return hr;
  2136. }
  2137. // ********************************************
  2138. // Base assumes that is URL to MHTML
  2139. HRESULT CMimeEditDocHost::HrLoadURL(LPCSTR pszURL)
  2140. {
  2141. BSTR bstr = NULL;
  2142. IMoniker *pMoniker = NULL;
  2143. IPersistMoniker *pPrstMnkr = NULL;
  2144. HRESULT hr;
  2145. hr = HrLPSZToBSTR(pszURL, &bstr);
  2146. if (FAILED(hr))
  2147. goto error;
  2148. hr = CreateURLMoniker(NULL, bstr, &pMoniker);
  2149. if (FAILED(hr))
  2150. goto error;
  2151. hr = m_lpOleObj->QueryInterface(IID_IPersistMoniker, (LPVOID*)&pPrstMnkr);
  2152. if (FAILED(hr))
  2153. goto error;
  2154. hr = pPrstMnkr->Load(FALSE, pMoniker, NULL, 0);
  2155. error:
  2156. SysFreeString(bstr);
  2157. SafeRelease(pMoniker);
  2158. SafeRelease(pPrstMnkr);
  2159. return hr;
  2160. }
  2161. // ********************************************
  2162. HRESULT CMimeEditDocHost::HrInsertTextFile(LPSTR lpsz)
  2163. {
  2164. return ExecSetText(&CMDSETID_MimeEdit, MECMDID_INSERTTEXTFILE, lpsz);
  2165. }
  2166. // ********************************************
  2167. HRESULT CMimeEditDocHost::HrInsertTextFileFromDialog()
  2168. {
  2169. return ExecCommand(&CMDSETID_MimeEdit, MECMDID_INSERTTEXTFILE);
  2170. }
  2171. // ********************************************
  2172. HRESULT CMimeEditDocHost::HrViewSource(DWORD dwViewType)
  2173. {
  2174. return ExecSetI4(&CMDSETID_MimeEdit, MECMDID_VIEWSOURCE, dwViewType);
  2175. }
  2176. // ********************************************
  2177. HRESULT CMimeEditDocHost::HrSetPreviewFormat(LPSTR lpsz)
  2178. {
  2179. BSTR bstr;
  2180. VARIANTARG var;
  2181. if (!m_pCmdTarget)
  2182. return E_FAIL;
  2183. HRESULT hr = HrLPSZToBSTR(lpsz, &bstr);
  2184. if (FAILED(hr))
  2185. goto Exit;
  2186. V_VT(&var) = VT_BSTR;
  2187. V_BSTR(&var) = bstr;
  2188. hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_PREVIEWFORMAT, OLECMDEXECOPT_DODEFAULT, &var, NULL);
  2189. SysFreeString(bstr);
  2190. Exit:
  2191. return hr;
  2192. }
  2193. // ********************************************
  2194. HRESULT CMimeEditDocHost::HrSetEditMode(BOOL fOn)
  2195. {
  2196. ExecSetBool(&CMDSETID_MimeEdit, MECMDID_EDITMODE, fOn);
  2197. if (fOn && HrIsHTMLMode()==S_OK)
  2198. ExecSetBool(&CMDSETID_MimeEdit, MECMDID_SHOWSOURCETABS, DwGetOption(OPT_VIEWSOURCETABS));
  2199. return S_OK;
  2200. }
  2201. // ********************************************
  2202. HRESULT CMimeEditDocHost::HrIsEditMode(BOOL *pfOn)
  2203. {
  2204. return ExecGetBool(&CMDSETID_MimeEdit, MECMDID_EDITMODE, pfOn);
  2205. }
  2206. // ********************************************
  2207. HRESULT CMimeEditDocHost::HrSetCharset(HCHARSET hCharset)
  2208. {
  2209. return ExecSetI8(&CMDSETID_MimeEdit, MECMDID_CHARSET, reinterpret_cast<ULONGLONG>(hCharset));
  2210. }
  2211. // ********************************************
  2212. HRESULT CMimeEditDocHost::HrGetCharset(HCHARSET *phCharset)
  2213. {
  2214. HRESULT hr;
  2215. ULONGLONG ullCharset;
  2216. hr = ExecGetI8(&CMDSETID_MimeEdit, MECMDID_CHARSET, &ullCharset);
  2217. *phCharset = reinterpret_cast<HCHARSET>(ullCharset);
  2218. return hr;
  2219. }
  2220. // ********************************************
  2221. HRESULT CMimeEditDocHost::HrSaveAsStationery(LPWSTR pwszFile)
  2222. {
  2223. BSTR bstr = NULL;
  2224. VARIANTARG varIn,
  2225. varOut;
  2226. HRESULT hr = S_OK;
  2227. V_VT(&varOut) = VT_EMPTY;
  2228. if (!m_pCmdTarget)
  2229. IF_FAILEXIT(hr = E_FAIL);
  2230. if (pwszFile)
  2231. {
  2232. IF_NULLEXIT(bstr = SysAllocString(pwszFile));
  2233. }
  2234. else
  2235. {
  2236. WCHAR wszPath[MAX_PATH];
  2237. HrGetStationeryPath(wszPath);
  2238. IF_NULLEXIT(bstr = SysAllocString(wszPath));
  2239. }
  2240. V_VT(&varIn) = VT_BSTR;
  2241. V_BSTR(&varIn) = bstr;
  2242. IF_FAILEXIT(hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_SAVEASSTATIONERY, OLECMDEXECOPT_DODEFAULT, &varIn, &varOut));
  2243. if (V_VT(&varOut) == VT_BSTR)
  2244. {
  2245. IF_FAILEXIT(hr = HrAddToStationeryMRU(V_BSTR(&varOut)));
  2246. }
  2247. exit:
  2248. SysFreeString(bstr);
  2249. if (VT_EMPTY != V_VT(&varOut))
  2250. SysFreeString(V_BSTR(&varOut));
  2251. return hr;
  2252. }
  2253. // ********************************************
  2254. HRESULT CMimeEditDocHost::HrApplyStationery(LPWSTR pwszFile)
  2255. {
  2256. IStream *pstm = NULL;
  2257. IHTMLDocument2 *pDoc = NULL;
  2258. HRESULT hr = S_OK;
  2259. VARIANTARG var;
  2260. if (!m_pCmdTarget)
  2261. IF_FAILEXIT(hr = E_FAIL);
  2262. // Apply stationery
  2263. // if no filename in buffer, means No Stationery was called
  2264. if (*pwszFile)
  2265. {
  2266. // Don't need to deal with the unicode stream issue when
  2267. // returning from HrCreateBasedWebPage in this case. There
  2268. // are only a few attributes that are saved when applying
  2269. // stationery and the ones we care about seem OK right now.
  2270. IF_FAILEXIT(hr = HrCreateBasedWebPage(pwszFile, &pstm));
  2271. IF_FAILEXIT(hr = MimeEditDocumentFromStream(pstm, IID_IHTMLDocument2, (LPVOID*)&pDoc));
  2272. }
  2273. var.vt = VT_UNKNOWN;
  2274. var.punkVal = pDoc;
  2275. IF_FAILEXIT(hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_APPLYDOCUMENT, OLECMDEXECOPT_DODEFAULT, &var, NULL));
  2276. exit:
  2277. ReleaseObj(pstm);
  2278. ReleaseObj(pDoc);
  2279. return hr;
  2280. }
  2281. // ********************************************
  2282. HRESULT CMimeEditDocHost::HrUpdateFormatBar()
  2283. {
  2284. return E_NOTIMPL;
  2285. }
  2286. // ********************************************
  2287. HRESULT CMimeEditDocHost::HrClearFormatting()
  2288. {
  2289. return E_NOTIMPL;
  2290. }
  2291. // ********************************************
  2292. HRESULT CMimeEditDocHost::HrMEDocHost_Init(BOOL fInit)
  2293. {
  2294. WNDCLASSW wc={0};
  2295. if(fInit)
  2296. {
  2297. // RAID - 12563
  2298. // We need to check to see if the class has been registered
  2299. // already, because our DLL might get unloaded
  2300. if (0 == GetClassInfoWrapW(g_hInst, c_wszMEDocHostWndClass, &wc)) // already regisered
  2301. {
  2302. wc.lpfnWndProc = CMimeEditDocHost::ExtWndProc;
  2303. wc.hInstance = g_hInst;
  2304. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  2305. wc.lpszClassName = c_wszMEDocHostWndClass;
  2306. wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  2307. wc.style = CS_DBLCLKS;
  2308. if(!RegisterClassWrapW(&wc))
  2309. return E_OUTOFMEMORY;
  2310. }
  2311. }
  2312. else if (0 != GetClassInfoWrapW(g_hInst, c_wszMEDocHostWndClass, &wc))
  2313. // don't need to enterCS for this, as it's the process going down.
  2314. UnregisterClassWrapW(c_wszDocHostWndClass, g_hInst);
  2315. return NOERROR;
  2316. }
  2317. // ********************************************
  2318. HRESULT CMimeEditDocHost::HrPostInit()
  2319. {
  2320. HRESULT hr = CreateDocObj((LPCLSID)&CLSID_MimeEdit);
  2321. if (FAILED(hr))
  2322. return hr;
  2323. hr = Show();
  2324. if(FAILED(hr))
  2325. return hr;
  2326. return HrOnDocObjCreate();
  2327. }
  2328. // ********************************************
  2329. HRESULT CMimeEditDocHost::HrInit(HWND hwndParent, DWORD dwFlags, IBodyOptions *pBodyOptions)
  2330. {
  2331. HRESULT hr = S_OK;
  2332. HWND hwnd = 0;
  2333. m_dwStyle=dwFlags;
  2334. Assert(!m_pBodyOptions);
  2335. if (pBodyOptions)
  2336. {
  2337. m_pBodyOptions = pBodyOptions;
  2338. pBodyOptions->AddRef();
  2339. }
  2340. if(!IsWindow(hwndParent))
  2341. IF_FAILEXIT(hr = E_INVALIDARG);
  2342. IF_FAILEXIT(hr=HrMEDocHost_Init(TRUE));
  2343. hwnd=CreateWindowExWrapW(WS_EX_NOPARENTNOTIFY,
  2344. c_wszMEDocHostWndClass, NULL,
  2345. WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_CHILD|WS_TABSTOP,
  2346. 0,0,0,0, hwndParent,
  2347. (HMENU)idREBody, g_hInst, (LPVOID)this);
  2348. IF_NULLEXIT(hwnd);
  2349. IF_FAILEXIT(hr = HrCreateColorMenu(ID_FORMAT_COLOR1, &m_hmenuColor, FALSE));
  2350. IF_FAILEXIT(hr = HrPostInit());
  2351. exit:
  2352. return hr;
  2353. }
  2354. // ********************************************
  2355. HRESULT CMimeEditDocHost::HrClose()
  2356. {
  2357. // Don't call HrUnloadAll on close as it's redundant to
  2358. // clear out the contents with an InitNew. We simply force the docobj
  2359. // down with it current content
  2360. SafeRelease(m_pBodyOptions);
  2361. CloseDocObj();
  2362. return S_OK;
  2363. }
  2364. // ********************************************
  2365. HRESULT CMimeEditDocHost::HrSetStatusBar(CStatusBar *pStatus)
  2366. {
  2367. SafeRelease(m_pStatus);
  2368. m_pStatus=pStatus;
  2369. if(pStatus)
  2370. pStatus->AddRef();
  2371. return NOERROR;
  2372. }
  2373. // ********************************************
  2374. HRESULT CMimeEditDocHost::HrUpdateToolbar(HWND hwndToolbar)
  2375. {
  2376. HRESULT hr=NOERROR;
  2377. ULONG cmdf=0;
  2378. if(!IsWindow(hwndToolbar))
  2379. return E_INVALIDARG;
  2380. QuerySingleMimeEditCmd(MECMDID_INSERTHTML, &cmdf);
  2381. if ((cmdf & OLECMDF_ENABLED) &&
  2382. m_pBodyOptions &&
  2383. m_pBodyOptions->SignatureEnabled(FALSE)==S_OK && m_fUIActive)
  2384. SendMessage(hwndToolbar, TB_ENABLEBUTTON, ID_INSERT_SIGNATURE, MAKELONG(TRUE, 0));
  2385. else
  2386. SendMessage(hwndToolbar, TB_ENABLEBUTTON, ID_INSERT_SIGNATURE, 0);
  2387. // if docobj has focus, query the command target to get info.
  2388. if (m_fUIActive)
  2389. hr=HrCmdTgtUpdateToolbar(m_pCmdTarget, hwndToolbar);
  2390. return hr;
  2391. }
  2392. // ********************************************
  2393. HRESULT CMimeEditDocHost::GetTabStopArray(HWND *rgTSArray, int *pcArrayCount)
  2394. {
  2395. Assert(rgTSArray);
  2396. Assert(pcArrayCount);
  2397. Assert(*pcArrayCount > 0);
  2398. IOleWindow *pWindow = NULL;
  2399. HWND hWnd;
  2400. *pcArrayCount = 0;
  2401. HRESULT hr = m_pDoc->QueryInterface(IID_IOleWindow, (LPVOID *)&pWindow);
  2402. if (FAILED(hr))
  2403. goto error;
  2404. hr = pWindow->GetWindow(&hWnd);
  2405. if (FAILED(hr))
  2406. goto error;
  2407. *rgTSArray = hWnd;
  2408. *pcArrayCount = 1;
  2409. error:
  2410. SafeRelease(pWindow);
  2411. return hr;
  2412. }
  2413. // ********************************************
  2414. HRESULT CMimeEditDocHost::HrInsertSignature(int id)
  2415. {
  2416. char szID[MAXSIGID], *pszID;
  2417. HRESULT hr=S_OK;
  2418. BSTR bstr;
  2419. DWORD dwSigOpt;
  2420. if (!m_pCmdTarget)
  2421. return E_FAIL;
  2422. Assert((ID_INSERT_SIGNATURE == id) || (id >= ID_SIGNATURE_FIRST && id <= ID_SIGNATURE_LAST));
  2423. Assert(m_pBodyOptions);
  2424. if(!m_pBodyOptions)
  2425. return E_FAIL;
  2426. if ((ID_INSERT_SIGNATURE == id) || FAILED(GetSigFromCmd(id, szID, ARRAYSIZE(szID))))
  2427. {
  2428. pszID = NULL;
  2429. }
  2430. else
  2431. {
  2432. pszID = szID;
  2433. }
  2434. if (m_pBodyOptions->SignatureEnabled(FALSE)==S_OK)
  2435. {
  2436. if (SUCCEEDED(hr = m_pBodyOptions->GetSignature(pszID, &dwSigOpt, &bstr)))
  2437. {
  2438. DWORD cmd;
  2439. VARIANTARG var;
  2440. if ((dwSigOpt & SIGOPT_PREFIX) && (0 == (dwSigOpt & SIGOPT_HTML)))
  2441. {
  2442. BSTR bstrPrefix;
  2443. if (HrLPSZToBSTR(c_szSigPrefix, &bstrPrefix)==S_OK)
  2444. {
  2445. UINT sigLen = lstrlenW(bstr),
  2446. preLen = lstrlenW(bstrPrefix);
  2447. // SysAllocStringLen includes one for the NULL
  2448. BSTR bstrTempBuf = SysAllocStringLen(NULL, preLen + sigLen);
  2449. if (bstrTempBuf)
  2450. {
  2451. memcpy(bstrTempBuf, bstrPrefix, preLen*sizeof(*bstrPrefix));
  2452. memcpy((bstrTempBuf + preLen), bstr, sigLen*sizeof(*bstr));
  2453. bstrTempBuf[preLen + sigLen] = L'\0';
  2454. SysFreeString(bstr);
  2455. bstr = bstrTempBuf;
  2456. }
  2457. SysFreeString(bstrPrefix);
  2458. }
  2459. }
  2460. V_VT(&var) = VT_BSTR;
  2461. V_BSTR(&var) = bstr;
  2462. cmd = dwSigOpt&SIGOPT_HTML ? MECMDID_INSERTHTML : MECMDID_INSERTTEXT;
  2463. hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL);
  2464. SysFreeString(bstr);
  2465. }
  2466. }
  2467. return hr;
  2468. }
  2469. // ********************************************
  2470. HRESULT CMimeEditDocHost::HrShow(BOOL fVisible)
  2471. {
  2472. ShowWindow(m_hwnd, fVisible ? SW_SHOW : SW_HIDE);
  2473. return S_OK;
  2474. }
  2475. // ********************************************
  2476. HRESULT CMimeEditDocHost::ViewCertificate(PCCERT_CONTEXT pCert, HCERTSTORE hcMsg)
  2477. {
  2478. return CommonUI_ViewSigningCertificate(m_hwnd, pCert, hcMsg);
  2479. }
  2480. // ********************************************
  2481. HRESULT CMimeEditDocHost::EditTrust(PCCERT_CONTEXT pCert, HCERTSTORE hcMsg)
  2482. {
  2483. return CommonUI_ViewSigningCertificateTrust(m_hwnd, pCert, hcMsg);
  2484. }
  2485. // ********************************************
  2486. HRESULT CMimeEditDocHost::UpdateBackAndStyleMenus(HMENU hmenu)
  2487. {
  2488. MENUITEMINFO miiBk;
  2489. HMENU hmenuTag=NULL;
  2490. ZeroMemory(&miiBk, sizeof(miiBk));
  2491. miiBk.cbSize=sizeof(miiBk);
  2492. miiBk.fMask = MIIM_ID | MIIM_SUBMENU;
  2493. if (GetMenuItemInfo(hmenu, ID_POPUP_BACKGROUND_COLOR, FALSE, &miiBk))
  2494. {
  2495. MENUITEMINFO miiBkColor;
  2496. HrCheckColor();
  2497. ZeroMemory(&miiBkColor, sizeof(miiBkColor));
  2498. miiBkColor.cbSize=sizeof(miiBkColor);
  2499. miiBkColor.fMask = MIIM_SUBMENU;
  2500. miiBkColor.hSubMenu = m_hmenuColor;
  2501. SetMenuItemInfo(hmenu, ID_POPUP_BACKGROUND_COLOR, FALSE, &miiBkColor);
  2502. }
  2503. if (!m_hmenuStyle)
  2504. {
  2505. Assert(m_pDoc);
  2506. HrCreateTridentMenu(m_pDoc, TM_TAGMENU, ID_FORMAT_FIRST, ID_FORMAT_FIRST - ID_FORMAT_LAST, &m_hmenuStyle);
  2507. Assert(m_hmenuStyle);
  2508. }
  2509. if(m_hmenuStyle)
  2510. {
  2511. VARIANTARG va;
  2512. MENUITEMINFO miiTag;
  2513. HrCheckTridentMenu(m_pDoc, TM_TAGMENU, ID_FORMAT_FIRST, ID_FORMAT_LAST, m_hmenuStyle);
  2514. ZeroMemory(&miiTag, sizeof(miiTag));
  2515. miiTag.cbSize=sizeof(miiTag);
  2516. miiTag.fMask = MIIM_SUBMENU;
  2517. miiTag.hSubMenu = m_hmenuStyle;
  2518. SetMenuItemInfo(hmenu, ID_POPUP_STYLE, FALSE, &miiTag);
  2519. }
  2520. return S_OK;
  2521. }
  2522. // ********************************************
  2523. void CMimeEditDocHost::UpdateInsertMenu(HMENU hmenu)
  2524. {
  2525. }
  2526. // ********************************************
  2527. void CMimeEditDocHost::UpdateEditMenu(HMENU hmenu)
  2528. {
  2529. }
  2530. // ********************************************
  2531. void CMimeEditDocHost::UpdateViewMenu(HMENU hmenu)
  2532. {
  2533. }
  2534. // ********************************************
  2535. HRESULT CMimeEditDocHost::HrOnInitMenuPopup(HMENU hmenuPopup, UINT uID)
  2536. {
  2537. if (m_pCmdTarget)
  2538. {
  2539. switch (uID)
  2540. {
  2541. case ID_POPUP_FILE:
  2542. break;
  2543. case ID_POPUP_FORMAT:
  2544. break;
  2545. case ID_POPUP_LANGUAGE:
  2546. {
  2547. // Now Let's try to insert document direction menu if applicable
  2548. VARIANTARG v = {0};
  2549. HRESULT hr;
  2550. hr = m_pCmdTarget->Exec(&CGID_ShellDocView,SHDVID_GETDOCDIRMENU, OLECMDEXECOPT_DODEFAULT, NULL, &v);
  2551. if (S_OK == hr)
  2552. {
  2553. MENUITEMINFOW mii;
  2554. HMENU hmenuDocDir = (HMENU)IntToPtr(v.lVal);
  2555. UINT uItemDir = 0, uItem = GetMenuItemCount(hmenuPopup);
  2556. WCHAR wszText[MAX_PATH];
  2557. ZeroMemory(&mii, sizeof(MENUITEMINFO));
  2558. mii.cbSize = sizeof(MENUITEMINFO);
  2559. mii.cbSize = sizeof(MENUITEMINFO);
  2560. mii.fMask = MIIM_TYPE;
  2561. mii.fType = MFT_SEPARATOR;
  2562. InsertMenuItemWrapW(hmenuPopup, (UINT)uItem, TRUE, &mii);
  2563. mii.fMask = MIIM_CHECKMARKS|MIIM_DATA|MIIM_ID|MIIM_STATE|MIIM_SUBMENU|MIIM_TYPE;
  2564. mii.fType = MFT_STRING;
  2565. mii.dwTypeData = wszText;
  2566. mii.cch = MAX_PATH;
  2567. while (GetMenuItemInfoWrapW(hmenuDocDir, uItemDir, TRUE, &mii))
  2568. {
  2569. mii.wID = ID_DOCDIR_LTR + uItemDir;
  2570. mii.fType |= MFT_RADIOCHECK;
  2571. mii.cch = ARRAYSIZE(wszText);
  2572. InsertMenuItemWrapW(hmenuPopup, (UINT)(uItemDir + uItem + 1), TRUE, &mii);
  2573. uItemDir++;
  2574. }
  2575. }
  2576. }
  2577. break;
  2578. case ID_POPUP_INSERT:
  2579. UpdateInsertMenu(hmenuPopup);
  2580. break;
  2581. case ID_POPUP_EDIT:
  2582. UpdateEditMenu(hmenuPopup);
  2583. break;
  2584. case ID_POPUP_VIEW:
  2585. UpdateViewMenu(hmenuPopup);
  2586. break;
  2587. case ID_POPUP_TOOLS:
  2588. break;
  2589. }
  2590. }
  2591. return NOERROR;
  2592. }
  2593. // ********************************************
  2594. HRESULT CMimeEditDocHost::HrWMMenuSelect(HWND hwnd, WPARAM wParam, LPARAM lParam)
  2595. {
  2596. TCHAR szRes[CCHMAX_STRINGRES];
  2597. if (!m_pStatus)
  2598. return S_FALSE;
  2599. if (LOWORD(wParam)>=ID_LANG_FIRST && LOWORD(wParam) <= ID_LANG_LAST)
  2600. {
  2601. m_pStatus->ShowSimpleText(MAKEINTRESOURCE(idsViewLanguageGeneralHelp));
  2602. return S_OK;
  2603. }
  2604. if (LOWORD(wParam)>=ID_FORMAT_FIRST && LOWORD(wParam)<=ID_FORMAT_LAST)
  2605. {
  2606. // ~~~ did I choose the correct item for idsFmtTagGeneralHelp
  2607. m_pStatus->ShowSimpleText(MAKEINTRESOURCE(ID_HELP_CONTENTS));
  2608. return S_OK;
  2609. }
  2610. return S_FALSE;
  2611. }
  2612. // ********************************************
  2613. HRESULT CMimeEditDocHost::HrCheckColor()
  2614. {
  2615. HRESULT hr;
  2616. INT iFound = -1;
  2617. DWORD dwRGB;
  2618. hr = ExecGetI4(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDCOLOR, &dwRGB);
  2619. if (0 == dwRGB)
  2620. iFound = 0;
  2621. else
  2622. iFound = GetColorIndex(dwRGB) - 1;
  2623. CheckMenuRadioItem(m_hmenuColor, ID_FORMAT_COLOR1, ID_FORMAT_COLOR16, ID_FORMAT_COLOR1 + iFound, MF_BYCOMMAND);
  2624. return hr;
  2625. }
  2626. // ********************************************
  2627. HRESULT CMimeEditDocHost::HrWMDrawMenuItem(HWND hwnd, LPDRAWITEMSTRUCT pdis)
  2628. {
  2629. // There is a bug in win95 that will sign extend the ID so that the
  2630. // hiword is filled with FFFF. Take the low word of the ID to work
  2631. // around this.
  2632. UINT id = LOWORD(pdis->itemID);
  2633. if (id >= ID_FORMAT_COLOR1 && id <=ID_FORMAT_COLOR16)
  2634. Color_WMDrawItem(pdis, iColorMenu);
  2635. return NOERROR;
  2636. }
  2637. // ********************************************
  2638. HRESULT CMimeEditDocHost::HrWMMeasureMenuItem(HWND hwnd, LPMEASUREITEMSTRUCT pmis)
  2639. {
  2640. HDC hdc;
  2641. UINT id = pmis->itemID;
  2642. if (id >= ID_FORMAT_COLOR1 && id <=ID_FORMAT_COLOR16)
  2643. {
  2644. hdc = GetDC(hwnd);
  2645. if(hdc)
  2646. {
  2647. Color_WMMeasureItem(hdc, pmis, iColorMenu);
  2648. ReleaseDC( hwnd, hdc );
  2649. }
  2650. }
  2651. return NOERROR;
  2652. }
  2653. // ********************************************
  2654. HRESULT CMimeEditDocHost::HrBackgroundImage()
  2655. {
  2656. WCHAR wszURL[INTERNET_MAX_URL_LENGTH+10];
  2657. LPWSTR pwszBackName;
  2658. HRESULT hr = S_OK;
  2659. *wszURL = 0;
  2660. hr = ExecGetTextW(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDIMAGE, &pwszBackName);
  2661. // ~~~ MimeEdit returns E_FAIL if no image found. MimeEdit will change to return S_OK is this case
  2662. // Once it is changed can delete these lines.
  2663. if (E_FAIL == hr)
  2664. hr = S_OK;
  2665. IF_FAILEXIT(hr);
  2666. if (pwszBackName != NULL)
  2667. StrCpyNW(wszURL, pwszBackName, INTERNET_MAX_URL_LENGTH);
  2668. if(DialogBoxParamWrapW(g_hLocRes, MAKEINTRESOURCEW(iddBkImage), m_hwnd, BkImageDlgProc, (LPARAM)wszURL)==IDCANCEL)
  2669. {
  2670. hr = S_OK;
  2671. goto exit;
  2672. }
  2673. // nothing has been changed, so do nothing.
  2674. if ((pwszBackName!=NULL && StrCmpIW(pwszBackName, wszURL)==0) ||
  2675. // there is no background at all.
  2676. (pwszBackName==NULL && lstrlenW(wszURL)==0))
  2677. goto exit;
  2678. InsertStationeryDir(wszURL);
  2679. hr = ExecSetTextW(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDIMAGE, wszURL);
  2680. exit:
  2681. MemFree(pwszBackName);
  2682. return hr;
  2683. }
  2684. // ********************************************
  2685. HRESULT CMimeEditDocHost::HrWMCommand(HWND hwnd, int id, WORD wCmd)
  2686. {
  2687. DWORD dwStdCmd = 0,
  2688. dwMECmd = 0,
  2689. dwF3Cmd = 0;
  2690. DWORD dw;
  2691. ULONG cmdf;
  2692. if(!m_pCmdTarget)
  2693. return S_FALSE;
  2694. // commands that don't care if we're UI Active
  2695. if (id >= ID_FORMAT_COLOR1 && id <= ID_FORMAT_COLOR16)
  2696. {
  2697. int index = id - ID_FORMAT_COLOR1;
  2698. ExecSetI4(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDCOLOR, rgrgbColors16[index]);
  2699. return S_OK;
  2700. }
  2701. switch(id)
  2702. {
  2703. case ID_INSERT_TEXT:
  2704. HrInsertTextFileFromDialog();
  2705. return S_OK;
  2706. case ID_SOURCE_EDIT:
  2707. // toggle stat
  2708. cmdf=0;
  2709. QuerySingleMimeEditCmd(MECMDID_SHOWSOURCETABS, &cmdf);
  2710. dw = !(cmdf & OLECMDF_LATCHED);
  2711. SetDwOption(OPT_VIEWSOURCETABS, dw, 0, 0);
  2712. ExecSetBool(&CMDSETID_MimeEdit, MECMDID_SHOWSOURCETABS, dw);
  2713. return S_OK;
  2714. case ID_SAVE_ATTACHMENTS:
  2715. case ID_NOTE_SAVE_ATTACHMENTS:
  2716. dwMECmd = MECMDID_SAVEATTACHMENTS;
  2717. break;
  2718. case ID_PRINT:
  2719. case ID_PRINT_NOW:
  2720. HrPrint(id == ID_PRINT);
  2721. return S_OK;
  2722. case ID_SAVE_STATIONERY:
  2723. case ID_NOTE_SAVE_STATIONERY:
  2724. HrSaveAsStationery(NULL);
  2725. return S_OK;
  2726. case ID_UNSCRAMBLE:
  2727. HrPerformROT13Encoding();
  2728. return S_OK;
  2729. case ID_VIEW_MSG_SOURCE:
  2730. HrViewSource(MECMD_VS_MESSAGE);
  2731. return S_OK;
  2732. case ID_VIEW_SOURCE:
  2733. HrViewSource(MECMD_VS_HTML);
  2734. return S_OK;
  2735. case ID_BACKGROUND_SOUND:
  2736. HrBackgroundSound();
  2737. return S_OK;
  2738. case ID_BACKGROUND_PICTURE:
  2739. HrBackgroundImage();
  2740. return S_OK;
  2741. case ID_FIND_TEXT:
  2742. dwStdCmd = OLECMDID_FIND;
  2743. break;
  2744. case ID_FONTS_DIALOG:
  2745. dwMECmd = MECMDID_FORMATFONT;
  2746. break;
  2747. case ID_FORMAT_PARADLG:
  2748. dwMECmd = MECMDID_FORMATPARAGRAPH;
  2749. break;
  2750. case ID_FONTS_LARGEST:
  2751. case ID_FONTS_LARGE:
  2752. case ID_FONTS_MEDIUM:
  2753. case ID_FONTS_SMALL:
  2754. case ID_FONTS_SMALLEST:
  2755. dwF3Cmd = IDM_BASELINEFONT1 + id - ID_FONTS_SMALLEST;
  2756. break;
  2757. case ID_FONTS_FIXED:
  2758. m_fFixedFont = !m_fFixedFont;
  2759. if (m_fFixedFont)
  2760. ExecSetBool(&CMDSETID_MimeEdit, MECMDID_DOWNGRADEPLAINTEXT, TRUE);
  2761. else
  2762. m_pPrstMime->Load(m_pMsg);
  2763. return S_OK;
  2764. case ID_DOCDIR_LTR:
  2765. dwF3Cmd = IDM_DIRLTR;
  2766. break;
  2767. case ID_DOCDIR_RTL:
  2768. dwF3Cmd = IDM_DIRRTL;
  2769. break;
  2770. }
  2771. // commands that are only applicable to UI if we're UIActive
  2772. if(m_fUIActive)
  2773. {
  2774. if ((ID_INSERT_SIGNATURE == id) || (id >= ID_SIGNATURE_FIRST && id <= ID_SIGNATURE_LAST))
  2775. {
  2776. HrInsertSignature(id);
  2777. return S_OK;
  2778. }
  2779. if (id >= ID_FORMAT_FIRST && id <= ID_FORMAT_LAST)
  2780. {
  2781. TCHAR szBuf[MAX_PATH];
  2782. *szBuf = 0;
  2783. GetMenuString(m_hmenuStyle, id, szBuf, MAX_PATH, MF_BYCOMMAND);
  2784. Assert(*szBuf);//should not be empty
  2785. SideAssert(ExecSetText(&CMDSETID_Forms3, IDM_BLOCKFMT, szBuf) == S_OK);
  2786. return S_OK;
  2787. }
  2788. switch(id)
  2789. {
  2790. case ID_PASTE:
  2791. if(HrPasteToAttachment()!=S_OK)
  2792. dwStdCmd = OLECMDID_PASTE;
  2793. break;
  2794. case ID_EDIT_LINK:
  2795. return m_pCmdTarget->Exec(&CMDSETID_Forms3, IDM_HYPERLINK,
  2796. OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
  2797. case ID_SELECT_ALL:
  2798. dwStdCmd = OLECMDID_SELECTALL;
  2799. break;
  2800. case ID_CUT:
  2801. dwStdCmd = OLECMDID_CUT;
  2802. break;
  2803. case ID_COPY:
  2804. dwStdCmd = OLECMDID_COPY;
  2805. break;
  2806. case ID_NOTE_COPY:
  2807. dwStdCmd = OLECMDID_COPY;
  2808. break;
  2809. case ID_UNDO:
  2810. dwStdCmd = OLECMDID_UNDO;
  2811. break;
  2812. case ID_REDO:
  2813. dwStdCmd = OLECMDID_REDO;
  2814. break;
  2815. case ID_UNLINK:
  2816. dwF3Cmd = IDM_UNLINK;
  2817. break;
  2818. case ID_INSERT_PICTURE:
  2819. dwF3Cmd = IDM_IMAGE;
  2820. break;
  2821. case ID_INSERT_LINE:
  2822. dwF3Cmd = IDM_HORIZONTALLINE;
  2823. break;
  2824. case ID_INDENT_INCREASE:
  2825. dwF3Cmd = IDM_INDENT;
  2826. break;
  2827. case ID_INDENT_DECREASE:
  2828. dwF3Cmd = IDM_OUTDENT;
  2829. break;
  2830. }
  2831. }
  2832. // Catch all standard group commands and execute them
  2833. if (dwStdCmd)
  2834. {
  2835. ExecCommand(NULL, dwStdCmd);
  2836. return S_OK;
  2837. }
  2838. // Catch all MimeEdit group commands and execute them
  2839. else if (dwMECmd)
  2840. {
  2841. ExecCommand(&CMDSETID_MimeEdit, dwMECmd);
  2842. return S_OK;
  2843. }
  2844. // Catch all Forms3 group commands and execute them
  2845. else if (dwF3Cmd)
  2846. {
  2847. ExecCommand(&CMDSETID_Forms3, dwF3Cmd);
  2848. return S_OK;
  2849. }
  2850. return OLECMDERR_E_NOTSUPPORTED;
  2851. }
  2852. // ********************************************
  2853. HRESULT CMimeEditDocHost::HrPasteToAttachment()
  2854. {
  2855. return E_NOTIMPL;
  2856. }
  2857. // ********************************************
  2858. HRESULT CMimeEditDocHost::HrGetWindow(HWND *pHwnd)
  2859. {
  2860. if(pHwnd==NULL)
  2861. return E_INVALIDARG;
  2862. *pHwnd=m_hwnd;
  2863. return NOERROR;
  2864. }
  2865. // ********************************************
  2866. HRESULT CMimeEditDocHost::HrSetSize(LPRECT prc)
  2867. {
  2868. SetWindowPos(m_hwnd, NULL, prc->left, prc->top, prc->right-prc->left, prc->bottom-prc->top, SWP_NOZORDER);
  2869. return NOERROR;
  2870. }
  2871. // ********************************************
  2872. HRESULT CMimeEditDocHost::HrMarkAsRead()
  2873. {
  2874. // ignore if already read
  2875. if(!m_fMarkedRead && !m_fSecDispInfo)
  2876. {
  2877. if (m_pEventSink)
  2878. m_pEventSink->EventOccurred(MEHC_CMD_MARK_AS_READ, NULL);
  2879. m_fMarkedRead=TRUE;
  2880. }
  2881. return NOERROR;
  2882. }
  2883. // ********************************************
  2884. void CMimeEditDocHost::OnWMTimer()
  2885. {
  2886. // user has been looking at the message for >2 secs,
  2887. // mark message as read now.
  2888. DOUTL(4, "MAR: Timer:: messages marked as read now");
  2889. KillTimer(m_hwnd, idTimerMarkAsRead);
  2890. HrMarkAsRead();
  2891. }
  2892. // ********************************************
  2893. HRESULT CMimeEditDocHost::HrSetNoSecUICallback(DWORD dwCookie, PFNNOSECUI pfnNoSecUI)
  2894. {
  2895. return E_NOTIMPL;
  2896. }
  2897. // ********************************************
  2898. HRESULT CMimeEditDocHost::HrSetDragSource(BOOL fIsSource)
  2899. {
  2900. return E_NOTIMPL;
  2901. }
  2902. // ********************************************
  2903. HRESULT CMimeEditDocHost::HrTranslateAccelerator(LPMSG lpMsg)
  2904. {
  2905. // this code will attempt to get ctrl-tab working in source-view
  2906. // problem is we uideactivate trident and our host doesn't call our
  2907. // translateaccel is we're not uiactive. so we have to fudge activation.
  2908. // I turned off for beta1
  2909. if (lpMsg->message == WM_KEYDOWN &&
  2910. (lpMsg->wParam == VK_TAB) &&
  2911. (GetKeyState(VK_CONTROL)&0x8000))
  2912. {
  2913. // if showing the TAB's then control-tab should cycle them
  2914. CycleSrcTabs(!(GetKeyState(VK_SHIFT)&0x8000));
  2915. return S_OK;
  2916. }
  2917. if (!m_fUIActive || !m_pInPlaceActiveObj)
  2918. return S_FALSE;
  2919. return m_pInPlaceActiveObj->TranslateAccelerator(lpMsg);
  2920. }
  2921. // ********************************************
  2922. HRESULT CMimeEditDocHost::HrUIActivate(BOOL fActivate)
  2923. {
  2924. HRESULT hr=NOERROR;
  2925. if (m_pDocView)
  2926. hr = m_pDocView->UIActivate(fActivate);
  2927. return hr;
  2928. }
  2929. // ********************************************
  2930. HRESULT CMimeEditDocHost::HrSetUIActivate()
  2931. {
  2932. SetFocus(m_hwndDocObj);
  2933. return S_OK;
  2934. }
  2935. // ********************************************
  2936. HRESULT CMimeEditDocHost::HrFrameActivate(BOOL fActivate)
  2937. {
  2938. IOleInPlaceActiveObject *pIPAO;
  2939. // we QI mimeedit to make sure we always pass it the frame activates so it can disable sound playing
  2940. // we can't use m_pInPlaceObject as it's only sent when we're UIActive.
  2941. if (m_lpOleObj &&
  2942. m_lpOleObj->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pIPAO)==S_OK)
  2943. {
  2944. pIPAO->OnFrameWindowActivate(fActivate);
  2945. pIPAO->Release();
  2946. }
  2947. return S_OK;
  2948. }
  2949. // ********************************************
  2950. HRESULT CMimeEditDocHost::HrHasFocus()
  2951. {
  2952. return m_fUIActive ? S_OK : S_FALSE;
  2953. }
  2954. // ********************************************
  2955. void CMimeEditDocHost::EnableStandardCmd(UINT idm, LPBOOL pbEnable)
  2956. {
  2957. OLECMD cmdEdit;
  2958. Assert(pbEnable);
  2959. cmdEdit.cmdf=0;
  2960. switch(idm)
  2961. {
  2962. case ID_CUT:
  2963. cmdEdit.cmdID = OLECMDID_CUT;
  2964. break;
  2965. case ID_NOTE_COPY:
  2966. case ID_COPY:
  2967. cmdEdit.cmdID = OLECMDID_COPY;
  2968. break;
  2969. case ID_PASTE:
  2970. cmdEdit.cmdID = OLECMDID_PASTE;
  2971. break;
  2972. case ID_SELECT_ALL:
  2973. cmdEdit.cmdID = OLECMDID_SELECTALL;
  2974. break;
  2975. case ID_UNDO:
  2976. cmdEdit.cmdID = OLECMDID_UNDO;
  2977. break;
  2978. default:
  2979. // Should never get here.
  2980. Assert(FALSE);
  2981. }
  2982. if (m_pCmdTarget && SUCCEEDED(m_pCmdTarget->QueryStatus(NULL, 1, &cmdEdit, NULL)))
  2983. *pbEnable = (cmdEdit.cmdf & OLECMDF_ENABLED);
  2984. }
  2985. // ********************************************
  2986. // HrRegisterNotify:
  2987. //
  2988. // Purpose:
  2989. // Generic version of HrRegisterLoadNotify. This allows
  2990. // a client (like CSecMsgService) to give enough information
  2991. // to become an event sink
  2992. // Takes:
  2993. // fRegister - TRUE if we're calling Advise
  2994. // szElement - [OPTIONAL] if given, we'll get that IHTMLElement
  2995. // and use it for the IConnectionPointContainer
  2996. // riidSink - IID for the connection point to find
  2997. // pUnkSink - IUnknown of our sink object
  2998. // pdwCookie - [OUT] cookie needed for Unadvise
  2999. // Returns:
  3000. // Trident HRs.
  3001. //
  3002. HRESULT CMimeEditDocHost::HrRegisterNotify(
  3003. BOOL fRegister,
  3004. LPCTSTR szElement,
  3005. REFIID riidSink,
  3006. IUnknown *pUnkSink,
  3007. DWORD *pdwCookie)
  3008. {
  3009. IConnectionPointContainer *pCPContainer=0;
  3010. IConnectionPoint *pCP=0;
  3011. IHTMLElement *pElem=0;
  3012. HRESULT hr;
  3013. if (!m_pDoc || !pdwCookie)
  3014. return E_POINTER;
  3015. if (fRegister && !pUnkSink)
  3016. return E_POINTER;
  3017. if (szElement)
  3018. {
  3019. hr = HrGetElement(szElement, &pElem);
  3020. if (SUCCEEDED(hr))
  3021. {
  3022. hr = pElem->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPContainer);
  3023. pElem->Release();
  3024. }
  3025. }
  3026. else
  3027. {
  3028. hr = m_pDoc->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPContainer);
  3029. }
  3030. if (FAILED(hr))
  3031. goto error;
  3032. hr = pCPContainer->FindConnectionPoint(riidSink, &pCP);
  3033. pCPContainer->Release();
  3034. if (FAILED(hr))
  3035. goto error;
  3036. if (fRegister)
  3037. {
  3038. Assert(*pdwCookie == 0);
  3039. hr = pCP->Advise(pUnkSink, pdwCookie);
  3040. if (FAILED(hr))
  3041. goto error;
  3042. }
  3043. else if (*pdwCookie)
  3044. {
  3045. hr = pCP->Unadvise(*pdwCookie);
  3046. *pdwCookie = NULL;
  3047. }
  3048. error:
  3049. ReleaseObj(pCP);
  3050. return hr;
  3051. }
  3052. // ********************************************
  3053. HRESULT CMimeEditDocHost::RegisterForHTMLDocEvents(BOOL fOn)
  3054. {
  3055. if (fOn == !!m_fRegisteredForDocEvents)
  3056. return S_OK;
  3057. m_fRegisteredForDocEvents = !!fOn;
  3058. return HrRegisterNotify(fOn, NULL, DIID_HTMLDocumentEvents2,
  3059. fOn ? ((IUnknown *)(IDispatch *)this) : NULL,
  3060. &m_dwHTMLNotifyCookie);
  3061. }
  3062. // ********************************************
  3063. HRESULT CMimeEditDocHost::PublicFilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
  3064. {
  3065. IDocHostUIHandler *pDHHand = NULL;
  3066. IServiceProvider *pSP = NULL;
  3067. HRESULT hr = S_OK;
  3068. // RAID 12020. Need to get IDocHostUIHandler of the body obj
  3069. hr = m_lpOleObj->QueryInterface(IID_IServiceProvider, (LPVOID*)&pSP);
  3070. if (SUCCEEDED(hr))
  3071. {
  3072. hr = pSP->QueryService(IID_IDocHostUIHandler, IID_IDocHostUIHandler, (LPVOID*)&pDHHand);
  3073. if (SUCCEEDED(hr))
  3074. {
  3075. hr = pDHHand->FilterDataObject(pDO, ppDORet);
  3076. pDHHand->Release();
  3077. }
  3078. pSP->Release();
  3079. }
  3080. return hr;
  3081. }
  3082. // ********************************************
  3083. HRESULT CMimeEditDocHost::HrSaveAttachment()
  3084. {
  3085. return ExecCommand(&CMDSETID_MimeEdit, MECMDID_SAVEATTACHMENTS);
  3086. }
  3087. // ********************************************
  3088. HRESULT CMimeEditDocHost::HrSetBkGrndPicture(LPTSTR pszPicture)
  3089. {
  3090. return ExecSetText(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDIMAGE, pszPicture);
  3091. }
  3092. // ********************************************
  3093. HRESULT CMimeEditDocHost::ShowContextMenu(
  3094. DWORD dwID,
  3095. POINT *ppt,
  3096. IUnknown *pcmdtReserved,
  3097. IDispatch *pdispReserved)
  3098. {
  3099. return MIMEEDIT_E_DODEFAULT;
  3100. }
  3101. // ********************************************
  3102. HRESULT CMimeEditDocHost::GetHostInfo(DOCHOSTUIINFO *pInfo)
  3103. {
  3104. return MIMEEDIT_E_DODEFAULT;
  3105. }
  3106. // ********************************************
  3107. HRESULT CMimeEditDocHost::ShowUI(DWORD dwID, IOleInPlaceActiveObject *pActiveObject,
  3108. IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
  3109. {
  3110. return MIMEEDIT_E_DODEFAULT;
  3111. }
  3112. // ********************************************
  3113. HRESULT CMimeEditDocHost::HideUI()
  3114. {
  3115. return MIMEEDIT_E_DODEFAULT;
  3116. }
  3117. // ********************************************
  3118. HRESULT CMimeEditDocHost::UpdateUI()
  3119. {
  3120. return MIMEEDIT_E_DODEFAULT;
  3121. }
  3122. // ********************************************
  3123. HRESULT CMimeEditDocHost::EnableModeless(BOOL fActivate)
  3124. {
  3125. // we don't have to support this, as any disable on a toplevel causes thread
  3126. // windows to get disabled anyway
  3127. return S_OK;
  3128. }
  3129. // ********************************************
  3130. HRESULT CMimeEditDocHost::OnDocWindowActivate(BOOL fActivate)
  3131. {
  3132. return MIMEEDIT_E_DODEFAULT;
  3133. }
  3134. // ********************************************
  3135. HRESULT CMimeEditDocHost::OnFrameWindowActivate(BOOL fActivate)
  3136. {
  3137. return MIMEEDIT_E_DODEFAULT;
  3138. }
  3139. // ********************************************
  3140. HRESULT CMimeEditDocHost::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
  3141. {
  3142. return MIMEEDIT_E_DODEFAULT;
  3143. }
  3144. // ********************************************
  3145. HRESULT CMimeEditDocHost::TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
  3146. {
  3147. return MIMEEDIT_E_DODEFAULT;
  3148. }
  3149. // ********************************************
  3150. HRESULT CMimeEditDocHost::GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw)
  3151. {
  3152. TCHAR szPath[MAX_PATH];
  3153. // dupW uses CoTaskMemAlloc
  3154. StrCpyN(szPath, MU_GetRegRoot(), ARRAYSIZE(szPath));
  3155. StrCatBuff(szPath, c_szTrident, ARRAYSIZE(szPath));
  3156. *pchKey = PszToUnicode(CP_ACP, szPath);
  3157. if (szPath && !(*pchKey))
  3158. return (TraceResult(E_OUTOFMEMORY));
  3159. return S_OK;
  3160. }
  3161. // ********************************************
  3162. HRESULT CMimeEditDocHost::GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
  3163. {
  3164. BOOL fEditModeOn = FALSE;
  3165. if (FAILED(HrIsEditMode(&fEditModeOn)) || !fEditModeOn)
  3166. return S_FALSE;
  3167. *ppDropTarget = (IDropTarget*)SendMessage(GetParent(m_hwnd), NWM_GETDROPTARGET, (WPARAM)pDropTarget, 0);
  3168. return NOERROR;
  3169. }
  3170. // ********************************************
  3171. HRESULT CMimeEditDocHost::GetExternal(IDispatch **ppDispatch)
  3172. {
  3173. return QueryInterface(IID_IDispatch, (LPVOID *)ppDispatch);
  3174. }
  3175. // ********************************************
  3176. HRESULT CMimeEditDocHost::TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
  3177. {
  3178. return MIMEEDIT_E_DODEFAULT;
  3179. }
  3180. // ********************************************
  3181. HRESULT CMimeEditDocHost::FilterDataObject( IDataObject *pDO, IDataObject **ppDORet)
  3182. {
  3183. return MIMEEDIT_E_DODEFAULT;
  3184. }
  3185. // ********************************************
  3186. HRESULT CMimeEditDocHost::OnChanged(DISPID dispid)
  3187. {
  3188. if (dispid == DISPID_READYSTATE)
  3189. OnReadyStateChanged();
  3190. return S_OK;
  3191. }
  3192. // ********************************************
  3193. HRESULT CMimeEditDocHost::OnRequestEdit (DISPID dispid)
  3194. {
  3195. return S_OK;
  3196. }
  3197. // ********************************************
  3198. void CMimeEditDocHost::OnDocumentReady()
  3199. {
  3200. NMHDR nmhdr;
  3201. // Bug 74697
  3202. // Under certain circumstances, Darwin causes Trident to send us IDM_PARSECOMPLETE
  3203. // when we don't even have a message. To prevent spurious errors, bail out.
  3204. if (!m_pMsg)
  3205. return;
  3206. if(m_fSecDispInfo)
  3207. {
  3208. VARIANTARG va;
  3209. if(!m_pCmdTarget)
  3210. return;
  3211. if(m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_STYLE, OLECMDEXECOPT_DODEFAULT, NULL, &va)==S_OK &&
  3212. va.lVal == MESTYLE_PREVIEW)
  3213. return;
  3214. ExecSetBool(&CMDSETID_MimeEdit, MECMDID_TABLINKS, TRUE);
  3215. return;
  3216. }
  3217. nmhdr.hwndFrom = m_hwnd;
  3218. nmhdr.idFrom = GetDlgCtrlID(m_hwnd);
  3219. nmhdr.code = BDN_DOWNLOADCOMPLETE;
  3220. SendMessage(GetParent(m_hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
  3221. }
  3222. // ********************************************
  3223. HRESULT CMimeEditDocHost::ExecGetBool(const GUID *guid, DWORD cmd, BOOL *pfValue)
  3224. {
  3225. VARIANTARG var;
  3226. V_VT(&var) = VT_BOOL;
  3227. if (!m_pCmdTarget)
  3228. return E_FAIL;
  3229. HRESULT hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var);
  3230. if (SUCCEEDED(hr))
  3231. *pfValue = (VARIANT_TRUE == V_BOOL(&var)) ? TRUE : FALSE;
  3232. else
  3233. *pfValue = FALSE;
  3234. return hr;
  3235. }
  3236. // ********************************************
  3237. HRESULT CMimeEditDocHost::ExecSetBool(const GUID *guid, DWORD cmd, BOOL fValue)
  3238. {
  3239. VARIANTARG var;
  3240. if (!m_pCmdTarget)
  3241. return E_FAIL;
  3242. V_VT(&var) = VT_BOOL;
  3243. V_BOOL(&var) = fValue ? VARIANT_TRUE : VARIANT_FALSE;
  3244. return m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL);
  3245. }
  3246. // ********************************************
  3247. HRESULT CMimeEditDocHost::ExecGetI4(const GUID *guid, DWORD cmd, DWORD *pdwValue)
  3248. {
  3249. VARIANTARG var;
  3250. HRESULT hr;
  3251. V_VT(&var) = VT_I4;
  3252. hr = m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var) : E_FAIL;
  3253. *pdwValue = (SUCCEEDED(hr) ? V_I4(&var) : 0);
  3254. return hr;
  3255. }
  3256. // ********************************************
  3257. HRESULT CMimeEditDocHost::ExecSetI4(const GUID *guid, DWORD cmd, DWORD dwValue)
  3258. {
  3259. VARIANTARG var;
  3260. V_VT(&var) = VT_I4;
  3261. V_I4(&var) = dwValue;
  3262. return m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL) : E_FAIL;
  3263. }
  3264. // ********************************************
  3265. HRESULT CMimeEditDocHost::ExecGetI8(const GUID *guid, DWORD cmd, ULONGLONG *pullValue)
  3266. {
  3267. VARIANTARG var;
  3268. HRESULT hr;
  3269. V_VT(&var) = VT_I8;
  3270. hr = m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var) : E_FAIL;
  3271. *pullValue = (SUCCEEDED(hr) ? V_UNION(&var, ullVal) : 0);
  3272. return hr;
  3273. }
  3274. // ********************************************
  3275. HRESULT CMimeEditDocHost::ExecSetI8(const GUID *guid, DWORD cmd, ULONGLONG ullValue)
  3276. {
  3277. VARIANTARG var;
  3278. V_VT(&var) = VT_I8;
  3279. V_UNION(&var, ullVal) = ullValue;
  3280. return m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL) : E_FAIL;
  3281. }
  3282. // ********************************************
  3283. HRESULT CMimeEditDocHost::ExecSetText(const GUID *guid, DWORD cmd, LPSTR psz)
  3284. {
  3285. BSTR bstr = NULL;
  3286. VARIANTARG var;
  3287. HRESULT hr = S_OK;
  3288. if (!m_pCmdTarget)
  3289. IF_FAILEXIT(hr = E_FAIL);
  3290. IF_FAILEXIT(hr = HrLPSZToBSTR(psz, &bstr));
  3291. V_VT(&var) = VT_BSTR;
  3292. V_BSTR(&var) = bstr;
  3293. IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL));
  3294. exit:
  3295. SysFreeString(bstr);
  3296. return hr;
  3297. }
  3298. // ********************************************
  3299. HRESULT CMimeEditDocHost::ExecSetTextW(const GUID *guid, DWORD cmd, LPWSTR pwsz)
  3300. {
  3301. BSTR bstr = NULL;
  3302. VARIANTARG var;
  3303. HRESULT hr = S_OK;
  3304. if (!m_pCmdTarget)
  3305. IF_FAILEXIT(hr = E_FAIL);
  3306. IF_NULLEXIT(bstr = SysAllocString(pwsz));
  3307. V_VT(&var) = VT_BSTR;
  3308. V_BSTR(&var) = bstr;
  3309. IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL));
  3310. exit:
  3311. SysFreeString(bstr);
  3312. return hr;
  3313. }
  3314. // ********************************************
  3315. HRESULT CMimeEditDocHost::ExecGetText(const GUID *guid, DWORD cmd, LPSTR *ppsz)
  3316. {
  3317. VARIANTARG var;
  3318. HRESULT hr = S_OK;
  3319. if (!m_pCmdTarget)
  3320. IF_FAILEXIT(hr = E_FAIL);
  3321. *ppsz = NULL;
  3322. IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var));
  3323. Assert(V_VT(&var) == VT_BSTR);
  3324. hr = HrBSTRToLPSZ(CP_ACP, V_BSTR(&var), ppsz);
  3325. SysFreeString(V_BSTR(&var));
  3326. IF_FAILEXIT(hr);
  3327. exit:
  3328. return hr;
  3329. }
  3330. // ********************************************
  3331. HRESULT CMimeEditDocHost::ExecGetTextW(const GUID *guid, DWORD cmd, LPWSTR *ppwsz)
  3332. {
  3333. VARIANTARG var;
  3334. HRESULT hr = S_OK;
  3335. V_VT(&var) = VT_EMPTY;
  3336. if (!m_pCmdTarget)
  3337. IF_FAILEXIT(hr = E_FAIL);
  3338. *ppwsz = NULL;
  3339. IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var));
  3340. Assert(V_VT(&var) == VT_BSTR);
  3341. IF_NULLEXIT(*ppwsz = PszDupW(V_BSTR(&var)));
  3342. exit:
  3343. if (VT_EMPTY != V_VT(&var))
  3344. SysFreeString(V_BSTR(&var));
  3345. return hr;
  3346. }
  3347. // ********************************************
  3348. HRESULT CMimeEditDocHost::ExecCommand(const GUID *guid, DWORD cmd)
  3349. {
  3350. if (!m_pCmdTarget)
  3351. return E_FAIL;
  3352. return m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
  3353. }
  3354. // ********************************************
  3355. void CMimeEditDocHost::OnReadyStateChanged()
  3356. {
  3357. // MimeEdit keeps track of state for us. Left
  3358. // this in in case there is a need to have it
  3359. // in the future.
  3360. }
  3361. HRESULT CMimeEditDocHost::HrHandsOffStorage()
  3362. {
  3363. if (m_pMsg)
  3364. m_pMsg->HandsOffStorage();
  3365. if (m_pSecureMessage)
  3366. m_pSecureMessage->HandsOffStorage();
  3367. if (m_pSecurityErrorScreen)
  3368. m_pSecurityErrorScreen->HandsOffStorage();
  3369. return S_OK;
  3370. }
  3371. HRESULT CMimeEditDocHost::HrRefresh()
  3372. {
  3373. if (m_pCmdTarget)
  3374. ExecCommand(NULL, OLECMDID_REFRESH);
  3375. return S_OK;
  3376. }
  3377. HRESULT CMimeEditDocHost::HrBackgroundSound()
  3378. {
  3379. return ExecCommand(&CMDSETID_MimeEdit, MECMDID_INSERTBGSOUND);
  3380. }
  3381. HRESULT CMimeEditDocHost::QuerySingleMimeEditCmd(ULONG uCmd, ULONG *pcmdf)
  3382. {
  3383. OLECMD cmd={uCmd, 0};
  3384. if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_MimeEdit, 1, &cmd, NULL))
  3385. {
  3386. *pcmdf = cmd.cmdf;
  3387. return S_OK;
  3388. }
  3389. return E_FAIL;
  3390. }
  3391. HRESULT CMimeEditDocHost::QuerySingleFormsCmd(ULONG uCmd, ULONG *pcmdf)
  3392. {
  3393. OLECMD cmd={uCmd, 0};
  3394. if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_Forms3, 1, &cmd, NULL))
  3395. {
  3396. *pcmdf = cmd.cmdf;
  3397. return S_OK;
  3398. }
  3399. return E_FAIL;
  3400. }
  3401. HRESULT CMimeEditDocHost::QuerySingleStdCmd(ULONG uCmd, ULONG *pcmdf)
  3402. {
  3403. OLECMD cmd={uCmd, 0};
  3404. if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(NULL, 1, &cmd, NULL))
  3405. {
  3406. *pcmdf = cmd.cmdf;
  3407. return S_OK;
  3408. }
  3409. return E_FAIL;
  3410. }
  3411. /////////////////////////////////////////////////////////////////////////////
  3412. //
  3413. // IDispatch
  3414. //
  3415. /////////////////////////////////////////////////////////////////////////////
  3416. // This is a really lightweight IDispatch implementation. We only expect
  3417. // to get invoked. Trident will call IDispatch::Invoke with the dispID
  3418. // of the event that happened or property that changed.
  3419. STDMETHODIMP CMimeEditDocHost::GetIDsOfNames(
  3420. REFIID riid,
  3421. OLECHAR ** rgszNames,
  3422. UINT cNames,
  3423. LCID lcid,
  3424. DISPID * rgDispId)
  3425. {
  3426. if (cNames==1 && StrCmpIW(rgszNames[0], L"hotmail")==0)
  3427. {
  3428. rgDispId[0] = 666;
  3429. return S_OK;
  3430. }
  3431. return E_NOTIMPL;
  3432. }
  3433. STDMETHODIMP CMimeEditDocHost::GetTypeInfo(
  3434. UINT /*iTInfo*/,
  3435. LCID /*lcid*/,
  3436. ITypeInfo **ppTInfo)
  3437. {
  3438. if (ppTInfo)
  3439. *ppTInfo=NULL;
  3440. return E_NOTIMPL;
  3441. }
  3442. STDMETHODIMP CMimeEditDocHost::GetTypeInfoCount(UINT *pctinfo)
  3443. {
  3444. if (pctinfo)
  3445. {
  3446. *pctinfo=0;
  3447. return NOERROR;
  3448. }
  3449. else
  3450. return E_POINTER;
  3451. }
  3452. STDMETHODIMP CMimeEditDocHost::Invoke(
  3453. DISPID dispIdMember,
  3454. REFIID /*riid*/,
  3455. LCID /*lcid*/,
  3456. WORD wFlags,
  3457. DISPPARAMS FAR* /*pDispParams*/,
  3458. VARIANT * pVarResult,
  3459. EXCEPINFO * /*pExcepInfo*/,
  3460. UINT * /*puArgErr*/)
  3461. {
  3462. IHTMLWindow2 *pWindow=0;
  3463. IHTMLEventObj *pEvent=0;
  3464. IHTMLElement *pElem=0;
  3465. BSTR bstr=0;
  3466. HRESULT hr=E_NOTIMPL;
  3467. if (dispIdMember == 666 &&
  3468. wFlags & DISPATCH_PROPERTYGET)
  3469. {
  3470. // hotmail on/off for welcome message
  3471. pVarResult->vt = VT_BOOL;
  3472. pVarResult->boolVal = HideHotmail() ? VARIANT_FALSE : VARIANT_TRUE;
  3473. return S_OK;
  3474. }
  3475. // Currently we only care about the button clicks.
  3476. if (dispIdMember == DISPID_HTMLDOCUMENTEVENTS_ONCLICK &&
  3477. (wFlags & DISPATCH_METHOD))
  3478. {
  3479. // Order of events:
  3480. // document gives us window gives us event object
  3481. // the event object can tell us which button was clicked
  3482. // event gives us source element gives us ID
  3483. // a couple lstrcmps will tell us which one got hit
  3484. if (!m_pDoc)
  3485. return E_UNEXPECTED;
  3486. m_pDoc->get_parentWindow(&pWindow);
  3487. if (pWindow)
  3488. {
  3489. pWindow->get_event(&pEvent);
  3490. if (pEvent)
  3491. {
  3492. pEvent->get_srcElement(&pElem);
  3493. if (pElem)
  3494. {
  3495. pElem->get_id(&bstr);
  3496. if (bstr)
  3497. {
  3498. hr = HandleButtonClicks(bstr);
  3499. SysFreeString(bstr);
  3500. }
  3501. pElem->Release();
  3502. }
  3503. pEvent->Release();
  3504. }
  3505. pWindow->Release();
  3506. }
  3507. }
  3508. return hr;
  3509. }
  3510. HRESULT CMimeEditDocHost::SetEventSink(IMimeEditEventSink *pEventSink)
  3511. {
  3512. ReplaceInterface(m_pEventSink, pEventSink);
  3513. return S_OK;
  3514. }
  3515. typedef struct tagCOMMANDSTRUCT {
  3516. WCHAR *string;
  3517. DWORD id;
  3518. } COMMANDSTRUCT, *LPCOMMANDSTRUCT;
  3519. COMMANDSTRUCT rgszCmdStrings[] =
  3520. {
  3521. {L"btnOpen", MEHC_BTN_OPEN},
  3522. {L"btnCert", MEHC_BTN_CERT},
  3523. {L"btnTrust", MEHC_BTN_TRUST},
  3524. {L"btnContinue", MEHC_BTN_CONTINUE},
  3525. {L"cmdConnect", MEHC_CMD_CONNECT},
  3526. {L"cmdDownload", MEHC_CMD_DOWNLOAD},
  3527. };
  3528. HRESULT CMimeEditDocHost::HandleButtonClicks(BSTR bstr)
  3529. {
  3530. HRESULT hr = S_OK;
  3531. LPCOMMANDSTRUCT prg = rgszCmdStrings;
  3532. DWORD cmdID=0;
  3533. BOOL fFound = FALSE;
  3534. Assert(bstr);
  3535. for (int i = 0; i < ARRAYSIZE(rgszCmdStrings); i++, prg++)
  3536. {
  3537. if (!StrCmpW(prg->string, bstr))
  3538. {
  3539. cmdID = prg->id;
  3540. fFound = TRUE;
  3541. break;
  3542. }
  3543. }
  3544. if (fFound)
  3545. {
  3546. // The notification needs to happen after the preview pane
  3547. // updates. Since there's no notifications here that actually
  3548. // return anything but S_FALSE I think this is pretty safe.
  3549. // -- From "The famous last words of Steve Serdy"
  3550. switch (cmdID)
  3551. {
  3552. case MEHC_BTN_OPEN:
  3553. hr = DoHtmlBtnOpen();
  3554. // Now we need update toolbar
  3555. m_pEventSink->EventOccurred(cmdID, NULL);
  3556. break;
  3557. case MEHC_BTN_CERT:
  3558. case MEHC_BTN_TRUST:
  3559. hr = DoHtmlBtnCertTrust(cmdID);
  3560. break;
  3561. case MEHC_BTN_CONTINUE:
  3562. hr = DoHtmlBtnContinue();
  3563. break;
  3564. default:
  3565. hr = E_NOTIMPL;
  3566. }
  3567. if (m_pEventSink && (cmdID != MEHC_BTN_OPEN))
  3568. hr = m_pEventSink->EventOccurred(cmdID, NULL);
  3569. }
  3570. return hr;
  3571. }
  3572. HRESULT CMimeEditDocHost::DoHtmlBtnOpen(void)
  3573. {
  3574. IHTMLElement * pElem = NULL;
  3575. HRESULT hr;
  3576. m_fSecDispInfo = FALSE;
  3577. // this process is non-critical; don't save errors
  3578. HrGetElementImpl(m_pDoc, c_szHTMLIDchkShowAgain, &pElem);
  3579. if (pElem)
  3580. {
  3581. VARIANT_BOOL boolVal;
  3582. HrGetSetCheck(FALSE, pElem, &boolVal);
  3583. SafeRelease(pElem);
  3584. if (VARIANT_TRUE == boolVal)
  3585. {
  3586. NMHDR nmhdr;
  3587. nmhdr.hwndFrom=m_hwnd;
  3588. nmhdr.idFrom=GetDlgCtrlID(m_hwnd);
  3589. nmhdr.code=BDN_MARKASSECURE;
  3590. SendMessage(GetParent(m_hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
  3591. }
  3592. }
  3593. AssertSz(m_pSecureMessage, "Secure message should be set at this point");
  3594. hr = InternalLoad(m_pSecureMessage);
  3595. SafeRelease(m_pSecureMessage);
  3596. return hr;
  3597. }
  3598. HRESULT CMimeEditDocHost::DoHtmlBtnCertTrust(DWORD cmdID)
  3599. {
  3600. IMimeBody *pRoot = NULL;
  3601. HRESULT hr = S_OK;
  3602. HBODY hBody = NULL;
  3603. SECSTATE SecState ={0};
  3604. if(FAILED(HrGetSecurityState(m_pSecureMessage, &SecState, &hBody)))
  3605. return(hr);
  3606. CleanupSECSTATE(&SecState);
  3607. AssertSz(m_pSecureMessage, "Should have a secure message if getting Cert or Trust");
  3608. hr = m_pSecureMessage->BindToObject(hBody ? hBody : HBODY_ROOT, IID_IMimeBody, (void**)&pRoot);
  3609. if (pRoot)
  3610. {
  3611. PROPVARIANT var;
  3612. HCERTSTORE hcStore = NULL;
  3613. #ifdef _WIN64
  3614. if (SUCCEEDED(pRoot->GetOption(OID_SECURITY_HCERTSTORE_64, &var)) && (var.vt == VT_UI8))
  3615. hcStore = (HCERTSTORE)(var.pulVal);
  3616. hr = pRoot->GetOption(OID_SECURITY_CERT_SIGNING_64, &var);
  3617. if (SUCCEEDED(hr))
  3618. {
  3619. if ((PCCERT_CONTEXT)(var.pulVal))
  3620. {
  3621. if (MEHC_BTN_CERT == cmdID)
  3622. // View digital Cert was clicked
  3623. hr = ViewCertificate((PCCERT_CONTEXT)(var.pulVal), hcStore);
  3624. else
  3625. // Edit Trust was clicked
  3626. hr = EditTrust((PCCERT_CONTEXT)(var.pulVal), hcStore);
  3627. CertFreeCertificateContext((PCCERT_CONTEXT)(var.pulVal));
  3628. }
  3629. }
  3630. #else // !_WIN64
  3631. if (SUCCEEDED(pRoot->GetOption(OID_SECURITY_HCERTSTORE, &var)) && (var.vt == VT_UI4))
  3632. hcStore = (HCERTSTORE)var.ulVal;
  3633. hr = pRoot->GetOption(OID_SECURITY_CERT_SIGNING, &var);
  3634. if (SUCCEEDED(hr))
  3635. {
  3636. if ((PCCERT_CONTEXT)var.ulVal)
  3637. {
  3638. if (MEHC_BTN_CERT == cmdID)
  3639. // View digital Cert was clicked
  3640. hr = ViewCertificate((PCCERT_CONTEXT)var.ulVal, hcStore);
  3641. else
  3642. // Edit Trust was clicked
  3643. hr = EditTrust((PCCERT_CONTEXT)var.ulVal, hcStore);
  3644. CertFreeCertificateContext((PCCERT_CONTEXT )var.ulVal);
  3645. }
  3646. }
  3647. #endif // _WIN64
  3648. SafeRelease(pRoot);
  3649. if (hcStore)
  3650. CertCloseStore(hcStore, 0);
  3651. }
  3652. return hr;
  3653. }
  3654. HRESULT CMimeEditDocHost::HrScrollPage()
  3655. {
  3656. IHTMLWindow2 *pWindow=0;
  3657. IHTMLBodyElement *pBody;
  3658. IHTMLElement2 *pElem;
  3659. LONG cyClientHeight=0,
  3660. cyScrollTop=0,
  3661. cyScrollHeight=0;
  3662. HRESULT hr = E_FAIL;
  3663. if (m_pDoc)
  3664. m_pDoc->get_parentWindow(&pWindow);
  3665. if (pWindow)
  3666. {
  3667. if (HrGetBodyElement(m_pDoc, &pBody)==S_OK)
  3668. {
  3669. if (pBody->QueryInterface(IID_IHTMLElement2, (LPVOID *)&pElem)==S_OK)
  3670. {
  3671. pElem->get_clientHeight(&cyClientHeight);
  3672. pElem->get_scrollTop(&cyScrollTop);
  3673. pElem->get_scrollHeight(&cyScrollHeight);
  3674. if (!(cyScrollTop + cyClientHeight >= cyScrollHeight))
  3675. {
  3676. pWindow->scrollBy(0, cyClientHeight);
  3677. hr = S_OK;
  3678. }
  3679. pElem->Release();
  3680. }
  3681. pBody->Release();
  3682. }
  3683. pWindow->Release();
  3684. }
  3685. return hr;
  3686. }
  3687. HRESULT CMimeEditDocHost::DoHtmlBtnContinue(void)
  3688. {
  3689. HRESULT hr;
  3690. IHTMLElement *pElem = NULL;
  3691. // this process is non-critical; don't save errors
  3692. HrGetElementImpl(m_pDoc, c_szHTMLIDchkShowAgain, &pElem);
  3693. if (pElem)
  3694. {
  3695. VARIANT_BOOL boolVal;
  3696. HrGetSetCheck(FALSE, pElem, &boolVal);
  3697. if (VARIANT_TRUE == boolVal)
  3698. {
  3699. if (m_fIsSigned)
  3700. SetDontShowAgain(1, c_szDSDigSigHelp);
  3701. if (m_fIsEncrypted)
  3702. SetDontShowAgain(1, c_szDSEncryptHelp);
  3703. }
  3704. pElem->Release();
  3705. }
  3706. if (m_pSecurityErrorScreen)
  3707. {
  3708. m_fSecDispInfo = TRUE;
  3709. hr = InternalLoad(m_pSecurityErrorScreen);
  3710. SafeRelease(m_pSecurityErrorScreen);
  3711. }
  3712. else
  3713. {
  3714. m_fSecDispInfo = FALSE;
  3715. AssertSz(m_pSecureMessage, "Secure message should be set at this point.");
  3716. hr = InternalLoad(m_pSecureMessage);
  3717. RegisterForHTMLDocEvents(FALSE);
  3718. SafeRelease(m_pSecureMessage);
  3719. }
  3720. return hr;
  3721. }
  3722. HRESULT CopySecurePropsToMessage(IMimeMessage *pDestMsg, IMimePropertySet *pPropSet)
  3723. {
  3724. IMimePropertySet *pNewProps = NULL;
  3725. HRESULT hr;
  3726. hr = pDestMsg->BindToObject(HBODY_ROOT, IID_IMimePropertySet, (LPVOID *)&pNewProps);
  3727. if (SUCCEEDED(hr))
  3728. {
  3729. hr = pPropSet->CopyProps(0, NULL, pNewProps);
  3730. pNewProps->Release();
  3731. }
  3732. return hr;
  3733. }
  3734. LPCSTR rgszHdrKeep[] = {
  3735. PIDTOSTR(PID_HDR_NEWSGROUP),
  3736. PIDTOSTR(PID_HDR_NEWSGROUPS),
  3737. PIDTOSTR(PID_HDR_SUBJECT),
  3738. PIDTOSTR(PID_HDR_FROM),
  3739. PIDTOSTR(PID_HDR_APPARTO),
  3740. PIDTOSTR(PID_HDR_DATE),
  3741. PIDTOSTR(PID_HDR_REPLYTO),
  3742. PIDTOSTR(PID_HDR_TO),
  3743. PIDTOSTR(PID_HDR_CC),
  3744. PIDTOSTR(PID_HDR_APPROVED),
  3745. PIDTOSTR(PID_HDR_DISTRIB),
  3746. PIDTOSTR(PID_HDR_KEYWORDS),
  3747. PIDTOSTR(PID_HDR_ORG),
  3748. PIDTOSTR(PID_HDR_XMSPRI),
  3749. PIDTOSTR(PID_HDR_XPRI),
  3750. PIDTOSTR(PID_HDR_COMMENT),
  3751. PIDTOSTR(PID_HDR_SENDER)};
  3752. HRESULT CMimeEditDocHost::LoadSecurely(IMimeMessage *pMsg, SECSTATE *pSecState)
  3753. {
  3754. HRESULT hr=S_OK;
  3755. BOOL fNeedIntroScreen = FALSE,
  3756. fNeedErrorScreen = FALSE,
  3757. fRegisterDispatch = FALSE;
  3758. LPCTSTR szIntroResName=NULL;
  3759. IMimeMessage *pSecurityIntroScreen = NULL;
  3760. DWORD dwFlags = 0;
  3761. // Since we are reloading, go ahead and free the original secure message if there is one.
  3762. SafeRelease(m_pSecureMessage);
  3763. SafeRelease(m_pSecurityErrorScreen);
  3764. // N2 delete schema
  3765. if (g_dwSecurityCheckedSchemaProp)
  3766. {
  3767. PROPVARIANT var;
  3768. var.vt = VT_UI4;
  3769. if (SUCCEEDED(pMsg->GetBodyProp(HBODY_ROOT, PIDTOSTR(g_dwSecurityCheckedSchemaProp), 0, &var)))
  3770. {
  3771. if (1 == var.lVal)
  3772. goto LoadMessage;
  3773. }
  3774. }
  3775. m_pBodyOptions->GetFlags(&dwFlags);
  3776. if(!m_fSecureReceipt)
  3777. {
  3778. if (0 == (dwFlags & BOPT_SECURITYUIENABLED))
  3779. goto LoadMessage;
  3780. if (m_fIsSigned)
  3781. {
  3782. // don't need warning UI if the cert is trusted and the message is okay
  3783. fNeedErrorScreen = (!m_fSignTrusted && !(dwFlags & BOPT_REPLYORFORWARD));
  3784. // If sig is valid, we should update any certs and SMIMECapabilities in the address book.
  3785. if (m_fSignTrusted && (DwGetOption(OPT_AUTO_ADD_SENDERS_CERT_TO_WAB)))
  3786. {
  3787. FILETIME ftNull = {0};
  3788. HrAddSenderCertToWab(NULL, pMsg, NULL, NULL, NULL, ftNull, WFF_CREATE);
  3789. }
  3790. // check for help UI
  3791. szIntroResName = c_szDigSigHelpHTML;
  3792. fNeedIntroScreen = ((0 == DwGetDontShowAgain(c_szDSDigSigHelp)) && !(dwFlags & BOPT_REPLYORFORWARD));
  3793. }
  3794. if (m_fIsEncrypted)
  3795. {
  3796. fNeedErrorScreen |= (!m_fEncryptionOK && !(dwFlags & BOPT_REPLYORFORWARD));
  3797. // If want signed intro, don't need to test this one.
  3798. if (!fNeedIntroScreen)
  3799. fNeedIntroScreen = ((0 == DwGetDontShowAgain(c_szDSEncryptHelp)) && !(dwFlags & BOPT_REPLYORFORWARD));
  3800. szIntroResName = (m_fIsSigned ? c_szSAndEHelpHTML : c_szEncryptHelpHTML);
  3801. }
  3802. // Bug 2557 - prevent error screen when secure reciept request
  3803. if(pSecState->type & MST_RECEIPT_REQUEST)
  3804. fNeedIntroScreen = FALSE;
  3805. if (fNeedIntroScreen && szIntroResName)
  3806. {
  3807. // Since this is only for the opening screen, if things error, allow
  3808. // the user to continue. In order to allow this, will use a temporary hr.
  3809. HRESULT tempHR;
  3810. IStream *pStm = NULL;
  3811. tempHR = LoadResourceToHTMLStream(szIntroResName, &pStm);
  3812. if (SUCCEEDED(tempHR))
  3813. tempHR = HrCreateMessage(&pSecurityIntroScreen);
  3814. if (SUCCEEDED(tempHR))
  3815. tempHR = pSecurityIntroScreen->Load(pStm);
  3816. ReleaseObj(pStm);
  3817. // If there was an error, don't show the screen and NULL the var
  3818. if (FAILED(tempHR))
  3819. SafeRelease(pSecurityIntroScreen);
  3820. }
  3821. if (fNeedErrorScreen)
  3822. {
  3823. // If have problems here, must exit. Can't show message before showing
  3824. // this error screen.
  3825. IStream *pStm = NULL;
  3826. // Disable check box if message not from the store.
  3827. hr = HrOutputSecurityScript(&pStm, pSecState, (0 == (BOPT_FROMSTORE & dwFlags)));
  3828. if (SUCCEEDED(hr))
  3829. hr = HrCreateMessage(&m_pSecurityErrorScreen);
  3830. if (SUCCEEDED(hr))
  3831. hr = m_pSecurityErrorScreen->Load(pStm);
  3832. ReleaseObj(pStm);
  3833. if (FAILED(hr))
  3834. SafeRelease(m_pSecurityErrorScreen);
  3835. }
  3836. }
  3837. else
  3838. {
  3839. IImnAccount * pAcct = NULL;
  3840. TCHAR *pszSubject = NULL;
  3841. TCHAR *pszFrom = NULL;
  3842. FILETIME ftSigningTime;
  3843. FILETIME ftSentTime;
  3844. IStream *pStm = NULL;
  3845. SECSTATE secStateRec = {0};
  3846. // DWORD dw = 0;
  3847. // Get account for receipt
  3848. if(m_pBodyOptions->GetAccount(&pAcct) == S_OK)
  3849. {
  3850. // Find original meassage and get information from receipt and orig msg
  3851. hr = HandleSecReceipt(pMsg, pAcct, m_hwnd, &pszSubject, &pszFrom, &ftSentTime, &ftSigningTime);
  3852. }
  3853. else
  3854. hr = MIME_E_SECURITY_RECEIPT_CANTFINDSENTITEM;
  3855. HrGetSecurityState(pMsg, &secStateRec, NULL);
  3856. m_fSignTrusted = !!IsSignTrusted(&secStateRec);
  3857. if(hr == S_OK)
  3858. hr = HrOutputSecureReceipt(&pStm, pszSubject, pszFrom, &ftSentTime, &ftSigningTime, &secStateRec);
  3859. else if(hr == MIME_S_RECEIPT_FROMMYSELF)
  3860. hr = HrOutputUserSecureReceipt(&pStm, pMsg);
  3861. else
  3862. hr = HrOutputErrSecReceipt(&pStm, hr, &secStateRec);
  3863. // Display receipt
  3864. if (SUCCEEDED(hr))
  3865. {
  3866. SafeRelease(m_pSecurityErrorScreen);
  3867. hr = HrCreateMessage(&m_pSecurityErrorScreen);
  3868. }
  3869. if (SUCCEEDED(hr))
  3870. {
  3871. #ifdef YST
  3872. HBODY hBody = 0;
  3873. ReplaceInterface(m_pSecurityErrorScreen, pMsg);
  3874. m_pSecurityErrorScreen->SetTextBody(TXT_HTML, IET_CURRENT, NULL, pStm, &hBody);
  3875. HrRemoveAttachments(m_pSecurityErrorScreen, FALSE);
  3876. #endif // YST
  3877. hr = m_pSecurityErrorScreen->Load(pStm);
  3878. }
  3879. ReleaseObj(pStm);
  3880. if (FAILED(hr))
  3881. SafeRelease(m_pSecurityErrorScreen);
  3882. // If sig is valid, we should update any certs and SMIMECapabilities in the address book.
  3883. if (m_fSignTrusted && (DwGetOption(OPT_AUTO_ADD_SENDERS_CERT_TO_WAB)))
  3884. {
  3885. FILETIME ftNull = {0};
  3886. HrAddSenderCertToWab(NULL, pMsg, NULL, NULL, NULL, ftNull, WFF_CREATE);
  3887. }
  3888. CleanupSECSTATE(&secStateRec);
  3889. SafeMemFree(pszSubject);
  3890. SafeMemFree(pszFrom);
  3891. ReleaseObj(pAcct);
  3892. }
  3893. // Reset m_pSecureMessage before continue
  3894. if(m_pSecureMessage)
  3895. SafeRelease(m_pSecureMessage);
  3896. // If we didn't get any errors and we have some screens
  3897. // to add, copy props from original message into other screens
  3898. if (SUCCEEDED(hr) && (m_pSecurityErrorScreen || pSecurityIntroScreen))
  3899. {
  3900. IMimePropertySet *pPropSet = NULL;
  3901. fRegisterDispatch = TRUE;
  3902. ReplaceInterface(m_pSecureMessage, pMsg);
  3903. // Move over the headers
  3904. // If the bind fails, don't worry about it. Just means the headers won't be
  3905. // visable until the normal message is loaded.
  3906. if (SUCCEEDED(m_pSecureMessage->BindToObject(HBODY_ROOT, IID_IMimePropertySet, (LPVOID *)&pPropSet)))
  3907. {
  3908. IMimePropertySet *pCopyProps = NULL;
  3909. if (SUCCEEDED(pPropSet->Clone(&pCopyProps)))
  3910. {
  3911. if (SUCCEEDED(pCopyProps->DeleteExcept(ARRAYSIZE(rgszHdrKeep), rgszHdrKeep)))
  3912. {
  3913. if (pSecurityIntroScreen)
  3914. CopySecurePropsToMessage(pSecurityIntroScreen, pCopyProps);
  3915. if (SUCCEEDED(hr) && m_pSecurityErrorScreen)
  3916. CopySecurePropsToMessage(m_pSecurityErrorScreen, pCopyProps);
  3917. }
  3918. pCopyProps->Release();
  3919. }
  3920. pPropSet->Release();
  3921. }
  3922. // need to init the property
  3923. //N8 talk to Opie about this schema thing.
  3924. // I didn't understand the property concept when I did this. It
  3925. // works fine, but is too big a hammer for the job.
  3926. if (SUCCEEDED(hr) && !g_dwSecurityCheckedSchemaProp)
  3927. {
  3928. IMimePropertySchema *pSchema = NULL;
  3929. hr = MimeOleGetPropertySchema(&pSchema);
  3930. if (SUCCEEDED(hr))
  3931. hr = pSchema->RegisterProperty("Y-SecurityChecked", 0, 0, VT_LPSTR, &g_dwSecurityCheckedSchemaProp);
  3932. if (pSchema)
  3933. pSchema->Release();
  3934. }
  3935. }
  3936. LoadMessage:
  3937. if(m_fSecureReceipt)
  3938. {
  3939. m_fSecDispInfo = FALSE;
  3940. if(m_pSecurityErrorScreen)
  3941. hr = InternalLoad(m_pSecurityErrorScreen);
  3942. // Free all mems
  3943. SafeRelease(m_pSecurityErrorScreen);
  3944. }
  3945. else if (SUCCEEDED(hr))
  3946. {
  3947. if (pSecurityIntroScreen)
  3948. {
  3949. m_fSecDispInfo = TRUE;
  3950. hr = InternalLoad(pSecurityIntroScreen);
  3951. SafeRelease(pSecurityIntroScreen);
  3952. }
  3953. else if (m_pSecurityErrorScreen)
  3954. {
  3955. m_fSecDispInfo = TRUE;
  3956. hr = InternalLoad(m_pSecurityErrorScreen);
  3957. SafeRelease(m_pSecurityErrorScreen);
  3958. }
  3959. else if (m_pSecureMessage)
  3960. {
  3961. m_fSecDispInfo = FALSE;
  3962. hr = InternalLoad(m_pSecureMessage);
  3963. SafeRelease(m_pSecureMessage);
  3964. }
  3965. else
  3966. {
  3967. m_fSecDispInfo = FALSE;
  3968. Assert(!m_pSecurityErrorScreen && !pSecurityIntroScreen);
  3969. hr = InternalLoad(pMsg);
  3970. }
  3971. if (fRegisterDispatch)
  3972. RegisterForHTMLDocEvents(TRUE);
  3973. }
  3974. return hr;
  3975. }
  3976. HRESULT CMimeEditDocHost::CycleSrcTabs(BOOL fFwd)
  3977. {
  3978. ExecSetI4(&CMDSETID_MimeEdit, MECMDID_SETSOURCETAB, fFwd ? MEST_NEXT : MEST_PREVIOUS);
  3979. return S_OK;
  3980. }
  3981. HRESULT CMimeEditDocHost::HrEnableScrollBars(BOOL fEnable)
  3982. {
  3983. HRESULT hr = S_OK;
  3984. IHTMLBodyElement *pBody = NULL;
  3985. BSTR bstrValue = NULL;
  3986. if (m_pDoc)
  3987. {
  3988. IF_FAILEXIT(hr = m_pDoc->get_body((IHTMLElement**)&pBody));
  3989. if (fEnable)
  3990. {
  3991. bstrValue = SysAllocString(L"yes");
  3992. }
  3993. else
  3994. {
  3995. bstrValue = SysAllocString(L"no");
  3996. }
  3997. hr = pBody->put_scroll(bstrValue);
  3998. }
  3999. exit:
  4000. ReleaseObj(pBody);
  4001. SysFreeString(bstrValue);
  4002. return hr;
  4003. }