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
4787 lines
139 KiB
#include "pch.hxx"
|
|
#include <docobj.h>
|
|
#include "dllmain.h"
|
|
#include "strconst.h"
|
|
#include "msoert.h"
|
|
#include "mimeole.h"
|
|
#include "mehost.h"
|
|
#include "oleutil.h"
|
|
#include "ibodyopt.h"
|
|
#include "resource.h"
|
|
#include "mshtmcid.h"
|
|
#include "thormsgs.h"
|
|
#include "msoeprop.h"
|
|
#include "goptions.h"
|
|
#include "bodyutil.h"
|
|
#include "mimeutil.h"
|
|
#include "ourguid.h"
|
|
#include "shlwapi.h"
|
|
#include "shlwapip.h"
|
|
#include "ipab.h"
|
|
#include "statnery.h"
|
|
#include "options.h"
|
|
#include "sigs.h"
|
|
#include "fonts.h"
|
|
#include "url.h"
|
|
#include "secutil.h"
|
|
#include "sechtml.h"
|
|
#include "mimeolep.h"
|
|
#include "menuutil.h"
|
|
#include "htmlhelp.h"
|
|
#include "msgprop.h"
|
|
#include "demand.h"
|
|
#include <mshtmdid.h>
|
|
#include "menures.h"
|
|
#include "multiusr.h"
|
|
#include "fontnsc.h"
|
|
|
|
const int idTimerMarkAsRead = 100;
|
|
const TCHAR c_szSigPrefix[] = "\r\n-- \r\n";
|
|
|
|
#define MAKEINDEX(b, l) (((DWORD)l & 0x00ffffff) | ((DWORD)b << 24))
|
|
#define GETINDEX(m) (((m & 0xff000000) >> 24) & 0x000000ff)
|
|
|
|
ASSERTDATA
|
|
static const WCHAR c_wszMailTo[] = L"mailto:",
|
|
c_wszHttp[] = L"http://",
|
|
c_wszFile[] = L"file://";
|
|
|
|
const DWORD rgrgbColors16[16] = {
|
|
RGB( 0, 0, 0), // "BLACK"},
|
|
RGB(128, 0, 0), // "MAROON"},
|
|
RGB( 0, 128, 0), // "GREEN"},
|
|
RGB(128, 128, 0), // "OLIVE"},
|
|
RGB( 0, 0, 128), // "NAVY"},
|
|
RGB(128, 0, 128), // "PURPLE"},
|
|
RGB( 0, 128, 128), // "TEAL"},
|
|
RGB(128, 128, 128), // "GREY"},
|
|
RGB(192, 192, 192), // "SILVER"},
|
|
RGB(255, 0, 0), // "RED"},
|
|
RGB( 0, 255, 0), // "LIME"},
|
|
RGB(255, 255, 0), // "YELLOW"},
|
|
RGB( 0, 0, 255), // "BLUE"},
|
|
RGB(255, 0, 255), // "FUSCHIA"},
|
|
RGB( 0, 255, 255), // "AQUA"},
|
|
RGB(255, 255, 255) // "WHITE"}
|
|
};
|
|
|
|
INT_PTR CALLBACK BkImageDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
int id;
|
|
LPWSTR pwszURL;
|
|
HWND hwndCombo = GetDlgItem(hwnd, idTxtBkImage);
|
|
LRESULT lr=0;
|
|
HRESULT hr;
|
|
|
|
pwszURL = (LPWSTR)GetWindowLongPtr(hwnd, DWLP_USER);
|
|
|
|
switch(msg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
Assert(lParam!= NULL);
|
|
SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)lParam);
|
|
SetIntlFont(hwndCombo);
|
|
SendDlgItemMessage(hwnd, idTxtBkImage, EM_LIMITTEXT, MAX_PATH-1, NULL);
|
|
SetFocus(hwndCombo);
|
|
pwszURL = (LPWSTR)lParam;
|
|
|
|
HrFillStationeryCombo(hwndCombo, TRUE, pwszURL);
|
|
StripStationeryDir(pwszURL);
|
|
SetWindowTextWrapW(hwndCombo, pwszURL);
|
|
SendMessage(GetWindow(hwndCombo, GW_CHILD), EM_SETSEL, 0, -1);
|
|
CenterDialog(hwnd);
|
|
return FALSE;
|
|
|
|
case WM_COMMAND:
|
|
switch(id=GET_WM_COMMAND_ID(wParam, lParam))
|
|
{
|
|
case idBrowsePicture:
|
|
HrBrowsePicture(hwnd, GetDlgItem(hwnd, idTxtBkImage));
|
|
break;
|
|
|
|
case IDOK:
|
|
Assert(pwszURL);
|
|
SendMessageWrapW(hwndCombo, CB_GETLBTEXT, (WPARAM)(SendMessage(hwndCombo, CB_GETCURSEL, 0, 0)), (LPARAM)(pwszURL));
|
|
|
|
// fall thro'
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, id);
|
|
break;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CMimeEditDocHost
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
CMimeEditDocHost::CMimeEditDocHost(DWORD dwBorderFlags)
|
|
{
|
|
m_hwnd = 0;
|
|
m_hwndDocObj = 0;
|
|
|
|
m_cRef = 1;
|
|
|
|
m_dwStyle = 0;
|
|
m_dwHTMLNotifyCookie = 0;
|
|
m_dwBorderFlags = dwBorderFlags;
|
|
m_dwDocStyle = MESTYLE_NOHEADER;
|
|
|
|
m_fUIActive = FALSE;
|
|
m_fIsSigned = FALSE;
|
|
m_fFixedFont = FALSE;
|
|
m_fMarkedRead = FALSE;
|
|
m_fSignTrusted = TRUE;
|
|
m_fIsEncrypted = FALSE;
|
|
m_fSecDispInfo = FALSE;
|
|
m_fSecureReceipt = FALSE;
|
|
m_fEncryptionOK = TRUE;
|
|
m_fBlockingOnSMime = FALSE;
|
|
m_fShowingErrorPage = FALSE;
|
|
m_fRegisteredForDocEvents = FALSE;
|
|
|
|
m_pDoc = NULL;
|
|
m_pMsg = NULL;
|
|
m_pStatus = NULL;
|
|
m_pDocView = NULL;
|
|
m_lpOleObj = NULL;
|
|
m_pPrstMime = NULL;
|
|
m_pCmdTarget = NULL;
|
|
m_hmenuColor = NULL;
|
|
m_hmenuStyle = NULL;
|
|
m_pEventSink = NULL;
|
|
m_pUnkService = NULL;
|
|
m_pBodyOptions = NULL;
|
|
m_pSecureMessage = NULL;
|
|
m_pInPlaceActiveObj = NULL;
|
|
m_pSecurityErrorScreen = NULL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member:
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
CMimeEditDocHost::~CMimeEditDocHost()
|
|
{
|
|
// These should all get feed up when we get a WM_DESTROY and close the docobj
|
|
Assert(m_lpOleObj==NULL);
|
|
Assert(m_pDocView==NULL);
|
|
Assert(m_pInPlaceActiveObj==NULL);
|
|
Assert(m_pCmdTarget==NULL);
|
|
Assert(m_pPrstMime==NULL);
|
|
Assert(m_pMsg==NULL);
|
|
Assert(m_pSecurityErrorScreen==NULL);
|
|
Assert(m_pSecureMessage==NULL);
|
|
|
|
if(m_hmenuColor)
|
|
DestroyMenu(m_hmenuColor);
|
|
|
|
if(m_hmenuStyle)
|
|
DestroyMenu(m_hmenuStyle);
|
|
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: AddRef
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
ULONG CMimeEditDocHost::AddRef()
|
|
{
|
|
TraceCall("CMimeEditDocHost::AddRef");
|
|
|
|
//TraceInfo(_MSG("CMimeEditDocHost::AddRef: cRef==%d", m_cRef+1));
|
|
return ++m_cRef;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Release
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
ULONG CMimeEditDocHost::Release()
|
|
{
|
|
TraceCall("CMimeEditDocHost::Release");
|
|
|
|
//TraceInfo(_MSG("CMimeEditDocHost::Release: cRef==%d", m_cRef-1));
|
|
if (--m_cRef==0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return m_cRef;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: QueryInterface
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::QueryInterface(REFIID riid, LPVOID *lplpObj)
|
|
{
|
|
TraceCall("CMimeEditDocHost::QueryInterface");
|
|
|
|
if(!lplpObj)
|
|
return E_INVALIDARG;
|
|
|
|
*lplpObj = NULL; // set to NULL, in case we fail.
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown))
|
|
*lplpObj = (LPVOID)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleInPlaceUIWindow))
|
|
*lplpObj = (LPVOID)(IOleInPlaceUIWindow *)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleInPlaceSite))
|
|
*lplpObj = (LPVOID)(LPOLEINPLACESITE)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleClientSite))
|
|
*lplpObj = (LPVOID)(LPOLECLIENTSITE)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleControlSite))
|
|
*lplpObj = (LPVOID)(IOleControlSite *)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IAdviseSink))
|
|
*lplpObj = (LPVOID)(LPADVISESINK)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleDocumentSite))
|
|
*lplpObj = (LPVOID)(LPOLEDOCUMENTSITE)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleCommandTarget))
|
|
*lplpObj = (LPVOID)(LPOLECOMMANDTARGET)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IDocHostUIHandler))
|
|
*lplpObj = (LPVOID)(IDocHostUIHandler*)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IBodyObj2))
|
|
*lplpObj = (LPVOID)(IBodyObj2*)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IPersistMime))
|
|
*lplpObj = (LPVOID)(IPersistMime*)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IDispatch))
|
|
*lplpObj = (LPVOID)(IDispatch*)this;
|
|
|
|
else
|
|
return E_NOINTERFACE;
|
|
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ExtWndProc
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
LRESULT CALLBACK CMimeEditDocHost::ExtWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CMimeEditDocHost *pDocHost;
|
|
|
|
if (WM_CREATE == msg)
|
|
{
|
|
pDocHost = (CMimeEditDocHost *)((LPCREATESTRUCT)lParam)->lpCreateParams;
|
|
if(!pDocHost)
|
|
return -1;
|
|
|
|
if(FAILED(pDocHost->OnCreate(hwnd)))
|
|
return -1;
|
|
}
|
|
pDocHost = (CMimeEditDocHost *)GetWndThisPtr(hwnd);
|
|
if(pDocHost)
|
|
return pDocHost->WndProc(hwnd, msg, wParam, lParam);
|
|
else
|
|
return DefWindowProcWrapW(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: WndProc
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
LRESULT CMimeEditDocHost::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(msg)
|
|
{
|
|
case WM_PAINT:
|
|
if (!m_lpOleObj)
|
|
{
|
|
HDC hdc;
|
|
PAINTSTRUCT ps;
|
|
RECT rc;
|
|
HBRUSH hBrush;
|
|
|
|
GetClientRect(m_hwnd, &rc);
|
|
hdc = BeginPaint(hwnd, &ps);
|
|
hBrush = SelectBrush(hdc, GetSysColorBrush(COLOR_WINDOW));
|
|
PatBlt(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY);
|
|
SelectBrush(hdc, hBrush);
|
|
EndPaint(hwnd, &ps);
|
|
return 0;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
if(WMCommand( GET_WM_COMMAND_HWND(wParam, lParam),
|
|
GET_WM_COMMAND_ID(wParam, lParam),
|
|
GET_WM_COMMAND_CMD(wParam, lParam)))
|
|
return 0;
|
|
break;
|
|
|
|
case WM_SETFOCUS:
|
|
return OnFocus(TRUE);
|
|
|
|
case WM_KILLFOCUS:
|
|
return OnFocus(FALSE);
|
|
|
|
case WM_NOTIFY:
|
|
return WMNotify((int) wParam, (NMHDR *)lParam);
|
|
|
|
case WM_SIZE:
|
|
WMSize(LOWORD(lParam), HIWORD(lParam));
|
|
return 0;
|
|
|
|
case WM_CLOSE:
|
|
return 0; // prevent alt-f4's
|
|
|
|
case WM_NCDESTROY:
|
|
WMNCDestroy();
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
if (wParam == idTimerMarkAsRead)
|
|
{
|
|
OnWMTimer();
|
|
return 0;
|
|
}
|
|
break;
|
|
|
|
case WM_WININICHANGE:
|
|
case WM_DISPLAYCHANGE:
|
|
case WM_SYSCOLORCHANGE:
|
|
case WM_QUERYNEWPALETTE:
|
|
case WM_PALETTECHANGED:
|
|
if (m_hwndDocObj)
|
|
return SendMessage(m_hwndDocObj, msg, wParam, lParam);
|
|
break;
|
|
}
|
|
|
|
return DefWindowProcWrapW(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
BOOL CMimeEditDocHost::WMCreate(HWND hwnd)
|
|
{
|
|
m_hwnd = hwnd;
|
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)this);
|
|
AddRef();
|
|
|
|
return SUCCEEDED(HrSubWMCreate())?TRUE:FALSE;
|
|
}
|
|
|
|
void CMimeEditDocHost::WMNCDestroy()
|
|
{
|
|
SetWindowLongPtr(m_hwnd, GWLP_USERDATA, NULL);
|
|
m_hwnd = NULL;
|
|
Release();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnNCDestroy
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnNCDestroy()
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnNCDestroy");
|
|
SetWindowLongPtr(m_hwnd, GWLP_USERDATA, NULL);
|
|
m_hwnd = NULL;
|
|
Release();
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnDestroy
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnDestroy()
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnDestroy");
|
|
|
|
return CloseDocObj();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnCreate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnCreate(HWND hwnd)
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnCreate");
|
|
|
|
m_hwnd = hwnd;
|
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)this);
|
|
AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CreateDocObj
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::CreateDocObj(LPCLSID pCLSID)
|
|
{
|
|
HRESULT hr=NOERROR;
|
|
|
|
TraceCall("CMimeEditDocHost::CreateDocObj");
|
|
|
|
if(!pCLSID)
|
|
return E_INVALIDARG;
|
|
|
|
Assert(!m_lpOleObj);
|
|
Assert(!m_pDocView);
|
|
Assert(!m_pCmdTarget);
|
|
|
|
hr = CoCreateInstance(*pCLSID, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
|
IID_IOleObject, (LPVOID *)&m_lpOleObj);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = m_lpOleObj->SetClientSite((LPOLECLIENTSITE)this);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = m_lpOleObj->QueryInterface(IID_IOleCommandTarget, (LPVOID *)&m_pCmdTarget);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = m_lpOleObj->QueryInterface(IID_IPersistMime, (LPVOID *)&m_pPrstMime);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = HrInitNew(m_lpOleObj);
|
|
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Show
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::Show()
|
|
{
|
|
RECT rc;
|
|
HRESULT hr;
|
|
|
|
TraceCall("CMimeEditDocHost::Show");
|
|
|
|
GetClientRect(m_hwnd, &rc);
|
|
|
|
hr=m_lpOleObj->DoVerb(OLEIVERB_SHOW, NULL, (LPOLECLIENTSITE)this, 0, m_hwnd, &rc);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CloseDocObj
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::CloseDocObj()
|
|
{
|
|
LPOLEINPLACEOBJECT pInPlaceObj=0;
|
|
|
|
RegisterForHTMLDocEvents(FALSE);
|
|
|
|
SafeRelease(m_pCmdTarget);
|
|
SafeRelease(m_pPrstMime);
|
|
SafeRelease(m_pInPlaceActiveObj);
|
|
SafeRelease(m_pDoc);
|
|
SafeRelease(m_pMsg);
|
|
SafeRelease(m_pSecureMessage);
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
SafeRelease(m_pEventSink);
|
|
SafeRelease(m_pStatus);
|
|
|
|
if(m_pDocView)
|
|
{
|
|
m_pDocView->UIActivate(FALSE);
|
|
m_pDocView->CloseView(0);
|
|
m_pDocView->SetInPlaceSite(NULL);
|
|
m_pDocView->Release();
|
|
m_pDocView=NULL;
|
|
}
|
|
|
|
if (m_lpOleObj)
|
|
{
|
|
// deactivate the docobj
|
|
if (!FAILED(m_lpOleObj->QueryInterface(IID_IOleInPlaceObject, (LPVOID*)&pInPlaceObj)))
|
|
{
|
|
pInPlaceObj->InPlaceDeactivate();
|
|
pInPlaceObj->Release();
|
|
}
|
|
|
|
// close the ole object, but blow off changes as we have either extracted
|
|
// them ourselves or don't care.
|
|
m_lpOleObj->Close(OLECLOSE_NOSAVE);
|
|
#ifdef DEBUG
|
|
ULONG uRef;
|
|
uRef=
|
|
#endif
|
|
m_lpOleObj->Release();
|
|
m_lpOleObj=NULL;
|
|
AssertSz(uRef==0, "We leaked a docobject!");
|
|
}
|
|
|
|
m_fUIActive=FALSE;
|
|
return NOERROR;
|
|
}
|
|
|
|
// Close DocObj
|
|
HRESULT CMimeEditDocHost::HrResetDocument()
|
|
{
|
|
CloseDocObj();
|
|
CreateDocObj((LPCLSID)&CLSID_MimeEdit);
|
|
CreateDocView();
|
|
return(S_OK);
|
|
}
|
|
|
|
// *** IOleWindow ***
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetWindow
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::GetWindow(HWND *phwnd)
|
|
{
|
|
TraceCall("CMimeEditDocHost::GetWindow");
|
|
*phwnd=m_hwnd;
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ContextSensitiveHelp
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::ContextSensitiveHelp(BOOL fEnterMode)
|
|
{
|
|
TraceCall("CMimeEditDocHost::ContextSensitiveHelp");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// *** IOleInPlaceUIWindow methods ***
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetBorder
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::GetBorder(LPRECT lprectBorder)
|
|
{
|
|
TraceCall("CMimeEditDocHost::GetBorder");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: RequestBorderSpace
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
|
|
{
|
|
TraceCall("CMimeEditDocHost::RequestBorderSpace");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SetBorderSpace
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::SetBorderSpace(LPCBORDERWIDTHS lpborderwidths)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceUIWindow::SetBorderSpace");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SetActiveObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::SetActiveObject(IOleInPlaceActiveObject * pActiveObject, LPCOLESTR lpszObjName)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceUIWindow::SetActiveObject");
|
|
|
|
ReplaceInterface(m_pInPlaceActiveObj, pActiveObject);
|
|
return S_OK;
|
|
}
|
|
|
|
// *** IOleInPlaceFrame methods ***
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CMimeEditDocHost::InsertMenus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS)
|
|
{
|
|
TraceCall("CMimeEditDocHost::InsertMenus");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CMimeEditDocHost::SetMenu
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::SetMenu(HMENU, HOLEMENU, HWND)
|
|
{
|
|
TraceCall("CMimeEditDocHost::SetMenu");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CMimeEditDocHost::RemoveMenus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::RemoveMenus(HMENU)
|
|
{
|
|
TraceCall("CMimeEditDocHost::RemoveMenus");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CMimeEditDocHost::SetStatusText
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::SetStatusText(LPCOLESTR pszW)
|
|
{
|
|
TCHAR rgch[CCHMAX_STRINGRES];
|
|
|
|
TraceCall("CMimeEditDocHost::SetStatusText");
|
|
|
|
if(!m_pStatus)
|
|
return E_NOTIMPL;
|
|
|
|
*rgch=0;
|
|
if(pszW && WideCharToMultiByte(CP_ACP, 0, pszW, -1, rgch, ARRAYSIZE(rgch), NULL, NULL))
|
|
m_pStatus->ShowSimpleText(rgch);
|
|
|
|
if(*rgch==0)
|
|
m_pStatus->HideSimpleText();
|
|
|
|
DOUTL(64, "IOleInPlaceFrame::SetStatusText:'%s'", rgch);
|
|
return NOERROR;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::TranslateAccelerator(LPMSG, WORD)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
// **** IOleInPlaceSite methods ****
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CanInPlaceActivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::CanInPlaceActivate()
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceSite::CanInPlaceActivate");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnInPlaceActivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnInPlaceActivate()
|
|
{
|
|
LPOLEINPLACEACTIVEOBJECT pInPlaceActive;
|
|
|
|
TraceCall("CMimeEditDocHost::OnInPlaceActivate");
|
|
|
|
Assert(m_lpOleObj);
|
|
|
|
if (m_lpOleObj->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pInPlaceActive)==S_OK)
|
|
{
|
|
SideAssert((pInPlaceActive->GetWindow(&m_hwndDocObj)==NOERROR)&& IsWindow(m_hwndDocObj));
|
|
pInPlaceActive->Release();
|
|
}
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnUIActivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnUIActivate()
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnUIActivate");
|
|
m_fUIActive=TRUE;
|
|
|
|
// Notify our parent that we're the one with the focus now.
|
|
if (m_pEventSink)
|
|
m_pEventSink->EventOccurred(MEHC_UIACTIVATE, NULL);
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetWindowContext
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::GetWindowContext( IOleInPlaceFrame **ppFrame,
|
|
IOleInPlaceUIWindow **ppDoc,
|
|
LPRECT lprcPosRect,
|
|
LPRECT lprcClipRect,
|
|
LPOLEINPLACEFRAMEINFO lpFrameInfo)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceSite::GetWindowContext");
|
|
|
|
*ppFrame = (LPOLEINPLACEFRAME)this;
|
|
AddRef();
|
|
*ppDoc = NULL;
|
|
|
|
GetClientRect(m_hwnd, lprcPosRect);
|
|
*lprcClipRect = *lprcPosRect;
|
|
|
|
lpFrameInfo->fMDIApp = FALSE;
|
|
lpFrameInfo->hwndFrame = m_hwnd;
|
|
lpFrameInfo->haccel = NULL;
|
|
lpFrameInfo->cAccelEntries = 0;
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Scroll
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::Scroll(SIZE scrollExtent)
|
|
{
|
|
// the docobject consumes the entireview, so scroll requests
|
|
// are meaningless. Return NOERROR to indicate that they're scolled
|
|
// into view.
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceSite::Scroll");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnUIDeactivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnUIDeactivate(BOOL fUndoable)
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnUIDeactivate");
|
|
m_fUIActive=FALSE;
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnInPlaceDeactivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnInPlaceDeactivate()
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnInPlaceDeactivate");
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: DiscardUndoState
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::DiscardUndoState()
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceSite::DiscardUndoState");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: DeactivateAndUndo
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::DeactivateAndUndo()
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceSite::DeactivateAndUndo");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnPosRectChange
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnPosRectChange(LPCRECT lprcPosRect)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleInPlaceSite::OnPosRectChange");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
// IOleClientSite methods.
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SaveObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::SaveObject()
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleClientSite::SaveObject");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetMoniker
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppmnk)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleClientSite::GetMoniker");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetContainer
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::GetContainer(LPOLECONTAINER *ppCont)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleClientSite::GetContainer");
|
|
if(ppCont)
|
|
*ppCont=NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ShowObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::ShowObject()
|
|
{
|
|
// always shown.
|
|
// $TODO: do we need to restore the browser here if it is
|
|
// minimised?
|
|
TraceCall("CMimeEditDocHost::IOleClientSite::ShowObject");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnShowWindow
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnShowWindow(BOOL fShow)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleClientSite::OnShowWindow");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: RequestNewObjectLayout
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::RequestNewObjectLayout()
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleClientSite::RequestNewObjectLayout");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// IOleDocumentSite
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ActivateMe
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::ActivateMe(LPOLEDOCUMENTVIEW pViewToActivate)
|
|
{
|
|
TraceCall("CMimeEditDocHost::IOleDocumentSite::ActivateMe");
|
|
return CreateDocView();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CreateDocView
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::CreateDocView()
|
|
{
|
|
HRESULT hr;
|
|
LPOLEDOCUMENT pOleDoc=NULL;
|
|
IServiceProvider *pSP;
|
|
|
|
TraceCall("CMimeEditDocHost::CreateDocView");
|
|
AssertSz(!m_pDocView, "why is this still set??");
|
|
AssertSz(m_lpOleObj, "uh? no docobject at this point?");
|
|
|
|
hr=OleRun(m_lpOleObj);
|
|
if(FAILED(hr))
|
|
goto Exit;
|
|
|
|
hr=m_lpOleObj->QueryInterface(IID_IOleDocument, (LPVOID*)&pOleDoc);
|
|
if(FAILED(hr))
|
|
goto Exit;
|
|
|
|
hr=pOleDoc->CreateView(this, NULL,0,&m_pDocView);
|
|
if(FAILED(hr))
|
|
goto CleanUp;
|
|
|
|
hr=m_pDocView->SetInPlaceSite(this);
|
|
if(FAILED(hr))
|
|
goto CleanUp;
|
|
|
|
hr=m_pDocView->Show(TRUE);
|
|
if(FAILED(hr))
|
|
goto CleanUp;
|
|
|
|
hr = m_lpOleObj->QueryInterface(IID_IServiceProvider, (LPVOID *)&pSP);
|
|
if (!FAILED(hr))
|
|
{
|
|
hr = pSP->QueryService(IID_IHTMLDocument2, IID_IHTMLDocument2, (LPVOID *)&m_pDoc);
|
|
pSP->Release();
|
|
}
|
|
|
|
CleanUp:
|
|
pOleDoc->Release();
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
// This must be greater than the most number of IDs that will ever be passed down
|
|
// to MimeEdit for any one group within the CMDSETID_OutlookExpress portion of
|
|
// QueryStatus below
|
|
const DWORD MAX_MIMEEDIT_CMDS = 20;
|
|
|
|
// I know this is totally cheesy, but...
|
|
// These next macros rely upon variables within the CMDSETID_OutlookExpress
|
|
// portion of QueryStatus
|
|
#define INC_FORMS(id) _IncrementCmdList(pCmd, rgCmdForms, rgpCmdForms, &cCmdForms, id)
|
|
#define INC_STD(id) _IncrementCmdList(pCmd, rgCmdStd, rgpCmdStd, &cCmdStd, id)
|
|
#define INC_MIMEEDIT(id) _IncrementCmdList(pCmd, rgCmdMimeEdit, rgpCmdMimeEdit, &cCmdMimeEdit, id)
|
|
|
|
inline void _IncrementCmdList(OLECMD *pCurCmd, OLECMD *pInCmdList, OLECMD **ppOutCmdList, DWORD *pdwIndex, DWORD cmdID)
|
|
{
|
|
DWORD dwIndex = *pdwIndex;
|
|
AssertSz(dwIndex < MAX_MIMEEDIT_CMDS, "Need to increment MAX_MIMEEDIT_CMDS");
|
|
pInCmdList[dwIndex].cmdID = cmdID;
|
|
pInCmdList[dwIndex].cmdf = 0;
|
|
ppOutCmdList[dwIndex] = pCurCmd;
|
|
dwIndex++;
|
|
*pdwIndex = dwIndex;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: QueryStatus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pCmdText)
|
|
{
|
|
TraceCall("CMimeEditDocHost::CMimeEditDocHost::QueryStatus");
|
|
|
|
HRESULT hr = OLECMDERR_E_UNKNOWNGROUP;
|
|
OLECMD *pCmd = rgCmds;
|
|
|
|
if (!rgCmds)
|
|
return E_INVALIDARG;
|
|
|
|
if (NULL == pguidCmdGroup)
|
|
{
|
|
// TraceInfo("IOleCmdTarget::QueryStatus - std group");
|
|
|
|
for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
|
|
{
|
|
if (0 != pCmd->cmdf)
|
|
continue;
|
|
switch (pCmd->cmdID)
|
|
{
|
|
case OLECMDID_UPDATECOMMANDS:
|
|
case OLECMDID_SETPROGRESSPOS:
|
|
case OLECMDID_SETPROGRESSTEXT:
|
|
pCmd->cmdf = MSOCMDF_ENABLED;
|
|
break;
|
|
}
|
|
}
|
|
hr = S_OK;
|
|
}
|
|
|
|
// Will be used when sending down command IDs
|
|
else if (IsEqualGUID(CMDSETID_OutlookExpress, *pguidCmdGroup))
|
|
{
|
|
ULONG ulTab = MEST_EDIT;
|
|
|
|
DWORD cCmdForms = 0,
|
|
cCmdStd = 0,
|
|
cCmdMimeEdit = 0;
|
|
|
|
OLECMD rgCmdForms[MAX_MIMEEDIT_CMDS],
|
|
rgCmdStd[MAX_MIMEEDIT_CMDS],
|
|
rgCmdMimeEdit[MAX_MIMEEDIT_CMDS],
|
|
*rgpCmdForms[MAX_MIMEEDIT_CMDS],
|
|
*rgpCmdStd[MAX_MIMEEDIT_CMDS],
|
|
*rgpCmdMimeEdit[MAX_MIMEEDIT_CMDS];
|
|
|
|
BOOL fHtml,
|
|
fActiveAndHtml,
|
|
fEditMode = FALSE,
|
|
fFormatMenu = FALSE;
|
|
|
|
HrIsEditMode(&fEditMode);
|
|
if (!fEditMode && m_pMsg)
|
|
{
|
|
DWORD dwFlags = 0;
|
|
m_pMsg->GetFlags(&dwFlags);
|
|
fHtml = (dwFlags & IMF_HTML);
|
|
}
|
|
else
|
|
fHtml = (S_OK == HrIsHTMLMode());
|
|
|
|
fActiveAndHtml = fHtml && m_fUIActive;
|
|
|
|
ExecGetI4(&CMDSETID_MimeEdit, MECMDID_SETSOURCETAB, &ulTab);
|
|
|
|
for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
|
|
{
|
|
ULONG cmdID = pCmd->cmdID;
|
|
if (0 != pCmd->cmdf)
|
|
continue;
|
|
|
|
switch (cmdID)
|
|
{
|
|
case ID_REPLY:
|
|
case ID_REPLY_ALL:
|
|
case ID_REPLY_GROUP:
|
|
case ID_FORWARD:
|
|
case ID_FORWARD_AS_ATTACH:
|
|
// If we have the sec UI showing then the reply, etc shouldn't work. We don't care
|
|
// here in MimeEdit if is isn't displayed. We can allow the other components to
|
|
// decide what happens in that case.
|
|
if(m_fSecDispInfo || m_fShowingErrorPage)
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_FONTS_LARGEST:
|
|
case ID_FONTS_LARGE:
|
|
case ID_FONTS_MEDIUM:
|
|
case ID_FONTS_SMALL:
|
|
case ID_FONTS_SMALLEST:
|
|
INC_FORMS(IDM_BASELINEFONT1 + (cmdID - ID_FONTS_SMALLEST));
|
|
break;
|
|
|
|
case ID_FONTS_FIXED:
|
|
pCmd->cmdf = QS_ENABLECHECK(!fHtml, m_fFixedFont);
|
|
break;
|
|
|
|
case ID_FIND_TEXT:
|
|
// For some reason, trident always marks this enabled, but if we are in the
|
|
// browser and the list view has focus, then the Exec won't work even though
|
|
// the QueryStatus returns enabled. Therefore, only enable this if active
|
|
|
|
// Once trident has fixed there problem here, we can enable calling into trident
|
|
// See RAID 13727
|
|
//INC_STD(OLECMDID_FIND);
|
|
pCmd->cmdf = QS_ENABLED(m_fUIActive);
|
|
break;
|
|
|
|
case ID_PRINT:
|
|
case ID_PRINT_NOW:
|
|
if (IsWindowVisible(m_hwnd))
|
|
INC_STD(OLECMDID_PRINT);
|
|
|
|
break;
|
|
|
|
case ID_POPUP_FONTS:
|
|
case ID_VIEW_MSG_SOURCE:
|
|
case ID_VIEW_SOURCE:
|
|
pCmd->cmdf = QS_ENABLED(TRUE);
|
|
break;
|
|
|
|
// This should be disabled if mail
|
|
case ID_UNSCRAMBLE:
|
|
{
|
|
DWORD dwFlags = 0;
|
|
if (m_fSecDispInfo || m_fShowingErrorPage)
|
|
{
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
}
|
|
else
|
|
{
|
|
m_pBodyOptions->GetFlags(&dwFlags);
|
|
pCmd->cmdf = QS_ENABLED((0 == (dwFlags & BOPT_MAIL)) && !fEditMode);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ID_SAVE_STATIONERY:
|
|
case ID_NOTE_SAVE_STATIONERY:
|
|
{
|
|
DWORD dwFlags = 0;
|
|
m_pBodyOptions->GetFlags(&dwFlags);
|
|
|
|
pCmd->cmdf = QS_ENABLED(fHtml && IsWindowVisible(m_hwnd) &&
|
|
(0 == (BOPT_MULTI_MSGS_SELECTED & dwFlags)) && !m_fShowingErrorPage);
|
|
break;
|
|
}
|
|
|
|
// This should only be enabled if have attachments
|
|
case ID_SAVE_ATTACHMENTS:
|
|
case ID_NOTE_SAVE_ATTACHMENTS:
|
|
{
|
|
DWORD dwFlags = 0;
|
|
m_pBodyOptions->GetFlags(&dwFlags);
|
|
|
|
if (IsWindowVisible(m_hwnd) && (0 == (BOPT_MULTI_MSGS_SELECTED & dwFlags)))
|
|
INC_MIMEEDIT(MECMDID_SAVEATTACHMENTS);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
}
|
|
|
|
// We only care what happens with these if we are not in the edit tab. If not in the
|
|
// edit tab, then disable these menu items.
|
|
case ID_MOVE_TO_FOLDER:
|
|
case ID_COPY_TO_FOLDER:
|
|
case ID_NOTE_MOVE_TO_FOLDER:
|
|
case ID_NOTE_COPY_TO_FOLDER:
|
|
case ID_FORMATTING_TOOLBAR:
|
|
case ID_POPUP_LANGUAGE:
|
|
case ID_POPUP_LANGUAGE_DEFERRED:
|
|
if (ulTab != MEST_EDIT)
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_SPELLING:
|
|
INC_STD(OLECMDID_SPELL);
|
|
break;
|
|
|
|
case ID_CUT:
|
|
INC_STD(OLECMDID_CUT);
|
|
break;
|
|
|
|
case ID_NOTE_COPY:
|
|
case ID_COPY:
|
|
INC_STD(OLECMDID_COPY);
|
|
break;
|
|
|
|
case ID_PASTE:
|
|
INC_STD(OLECMDID_PASTE);
|
|
break;
|
|
|
|
case ID_SELECT_ALL:
|
|
INC_STD(OLECMDID_SELECTALL);
|
|
break;
|
|
|
|
case ID_UNDO:
|
|
INC_STD(OLECMDID_UNDO);
|
|
break;
|
|
|
|
case ID_REDO:
|
|
INC_STD(OLECMDID_REDO);
|
|
break;
|
|
|
|
case ID_SOURCE_EDIT:
|
|
INC_MIMEEDIT(MECMDID_SHOWSOURCETABS);
|
|
break;
|
|
|
|
case ID_DOCDIR_LTR:
|
|
INC_FORMS(IDM_DIRLTR);
|
|
break;
|
|
|
|
case ID_DOCDIR_RTL:
|
|
INC_FORMS(IDM_DIRRTL);
|
|
break;
|
|
|
|
case ID_INDENT_INCREASE:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_INDENT);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_INDENT_DECREASE:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_OUTDENT);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_FONTS_DIALOG:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_FONT);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_FORMAT_SETTINGS:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_BLOCKFMT);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_INSERT_TEXT:
|
|
if (m_fUIActive)
|
|
INC_MIMEEDIT(MECMDID_INSERTTEXTFILE);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_FORMAT_PARADLG:
|
|
if (m_fUIActive)
|
|
INC_MIMEEDIT(MECMDID_FORMATPARAGRAPH);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_POPUP_STYLE:
|
|
pCmd->cmdf = QS_ENABLED(fActiveAndHtml && (ulTab == MEST_EDIT));
|
|
break;
|
|
|
|
case ID_BACKGROUND_PICTURE:
|
|
case ID_BACKGROUND_SOUND:
|
|
case ID_POPUP_BACKGROUND_COLOR:
|
|
case ID_POPUP_STATIONERY:
|
|
case ID_POPUP_BACKGROUND:
|
|
pCmd->cmdf = QS_ENABLED(fHtml && (ulTab == MEST_EDIT));
|
|
break;
|
|
|
|
case ID_INSERT_PICTURE:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_IMAGE);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_INSERT_LINE:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_HORIZONTALLINE);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_UNLINK:
|
|
if (fActiveAndHtml)
|
|
INC_FORMS(IDM_UNLINK);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
case ID_EDIT_LINK:
|
|
pCmd->cmdf = QS_ENABLED(fActiveAndHtml);
|
|
break;
|
|
|
|
case ID_INSERT_SIGNATURE:
|
|
if (m_fUIActive && (ulTab == MEST_EDIT) && m_pBodyOptions && (S_OK == m_pBodyOptions->SignatureEnabled(FALSE)))
|
|
INC_MIMEEDIT(MECMDID_INSERTHTML);
|
|
else
|
|
pCmd->cmdf = QS_ENABLED(FALSE);
|
|
break;
|
|
|
|
default:
|
|
if ((ID_FORMAT_FIRST <= cmdID) && (ID_FORMAT_LAST >= cmdID))
|
|
pCmd->cmdf = QS_ENABLED(TRUE);
|
|
break;
|
|
}
|
|
}
|
|
if (cCmdForms)
|
|
{
|
|
DOUTL(8, "cCmdForms = %d", cCmdForms);
|
|
if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_Forms3, cCmdForms, rgCmdForms, NULL))
|
|
{
|
|
OLECMD *pCmds = rgCmdForms,
|
|
**ppCmdsToReturn = rgpCmdForms;
|
|
|
|
for (DWORD i = 0; i < cCmdForms; i++, pCmds++, ppCmdsToReturn++)
|
|
(*ppCmdsToReturn)->cmdf = pCmds->cmdf;
|
|
}
|
|
}
|
|
if (cCmdStd)
|
|
{
|
|
DOUTL(8, "cCmdStd = %d", cCmdStd);
|
|
if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(NULL, cCmdStd, rgCmdStd, NULL))
|
|
{
|
|
OLECMD *pCmds = rgCmdStd,
|
|
**ppCmdsToReturn = rgpCmdStd;
|
|
|
|
for (DWORD i = 0; i < cCmdStd; i++, pCmds++, ppCmdsToReturn++)
|
|
(*ppCmdsToReturn)->cmdf = pCmds->cmdf;
|
|
}
|
|
}
|
|
if (cCmdMimeEdit)
|
|
{
|
|
DOUTL(8, "cCmdMimeEdit = %d", cCmdMimeEdit);
|
|
if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_MimeEdit, cCmdMimeEdit, rgCmdMimeEdit, NULL))
|
|
{
|
|
OLECMD *pCmds = rgCmdMimeEdit,
|
|
**ppCmdsToReturn = rgpCmdMimeEdit;
|
|
|
|
for (DWORD i = 0; i < cCmdMimeEdit; i++, pCmds++, ppCmdsToReturn++)
|
|
(*ppCmdsToReturn)->cmdf = pCmds->cmdf;
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
}
|
|
|
|
else if (IsEqualGUID(CMDSETID_MimeEditHost, *pguidCmdGroup))
|
|
{
|
|
for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
|
|
{
|
|
if (0 != pCmd->cmdf)
|
|
continue;
|
|
switch (pCmd->cmdID)
|
|
{
|
|
case MEHOSTCMDID_SAVEATTACH_PATH:
|
|
case MEHOSTCMDID_UNSAFEATTACHMENTS:
|
|
case MEHOSTCMDID_SECURITY_ZONE:
|
|
case MEHOSTCMDID_SIGNATURE_ENABLED:
|
|
case MEHOSTCMDID_SIGNATURE_OPTIONS:
|
|
case MEHOSTCMDID_SIGNATURE:
|
|
case MEHOSTCMDID_HEADER_TYPE:
|
|
case MEHOSTCMDID_FLAGS:
|
|
case MEHOSTCMDID_QUOTE_CHAR:
|
|
case MEHOSTCMDID_REPLY_TICK_COLOR:
|
|
case MEHOSTCMDID_COMPOSE_FONT:
|
|
case MEHOSTCMDID_ADD_TO_ADDRESSBOOK:
|
|
case MEHOSTCMDID_ADD_TO_FAVORITES:
|
|
case MEHOSTCMDID_ONPARSECOMPLETE:
|
|
case MEHOSTCMDID_FONTCACHE:
|
|
case MEHOSTCMDID_BORDERFLAGS:
|
|
pCmd->cmdf = QS_ENABLED(TRUE);
|
|
break;
|
|
}
|
|
}
|
|
hr = S_OK;
|
|
}
|
|
|
|
else if (IsEqualGUID(CMDSETID_OESecurity, *pguidCmdGroup))
|
|
{
|
|
for (ULONG ul = 0; ul < cCmds; ul++, pCmd++)
|
|
{
|
|
if (0 != pCmd->cmdf)
|
|
continue;
|
|
switch (pCmd->cmdID)
|
|
{
|
|
case OECSECCMD_ENCRYPTED:
|
|
{
|
|
pCmd->cmdf = OLECMDF_SUPPORTED;
|
|
if (m_fIsEncrypted)
|
|
{
|
|
if(m_fSecDispInfo)
|
|
pCmd->cmdf |= OLECMDF_INVISIBLE;
|
|
else if (m_fEncryptionOK)
|
|
pCmd->cmdf |= OLECMDF_ENABLED;
|
|
}
|
|
else
|
|
pCmd->cmdf |= OLECMDF_INVISIBLE;
|
|
break;
|
|
}
|
|
case OECSECCMD_SIGNED:
|
|
{
|
|
pCmd->cmdf = OLECMDF_SUPPORTED;
|
|
if (m_fIsSigned)
|
|
{
|
|
if(m_fSecDispInfo)
|
|
pCmd->cmdf |= OLECMDF_INVISIBLE;
|
|
else if (m_fSignTrusted)
|
|
pCmd->cmdf |= OLECMDF_ENABLED;
|
|
}
|
|
else
|
|
pCmd->cmdf |= OLECMDF_INVISIBLE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
hr = S_OK;
|
|
}
|
|
|
|
TraceInfoAssert(OLECMDERR_E_UNKNOWNGROUP != hr, "IOleCmdTarget::QueryStatus - unknown group");
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Exec
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
|
|
{
|
|
TCHAR rgch[MAX_PATH];
|
|
HRESULT hr = S_OK;
|
|
|
|
TraceCall("CMimeEditDocHost::Exec");
|
|
|
|
if (NULL == pguidCmdGroup)
|
|
{
|
|
switch(nCmdID)
|
|
{
|
|
case OLECMDID_UPDATECOMMANDS:
|
|
OnUpdateCommands();
|
|
break;
|
|
|
|
case OLECMDID_SETPROGRESSPOS:
|
|
// when done downloading trident now hits us with a
|
|
// setprogresspos == -1 to indicate we should remove the "Done"
|
|
if (pvaIn->lVal == -1)
|
|
SetStatusText(NULL);
|
|
break;
|
|
|
|
case OLECMDID_SETPROGRESSTEXT:
|
|
if(pvaIn->vt == (VT_BSTR))
|
|
SetStatusText((LPCOLESTR)pvaIn->bstrVal);
|
|
break;
|
|
|
|
default:
|
|
hr = OLECMDERR_E_NOTSUPPORTED;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Will be used when sending down command IDs
|
|
else if (IsEqualGUID(CMDSETID_OutlookExpress, *pguidCmdGroup))
|
|
{
|
|
// TraceInfo("IOleCmdTarget::QueryStatus - std group");
|
|
|
|
hr = HrWMCommand(m_hwnd, nCmdID, 0);
|
|
}
|
|
|
|
else if (IsEqualGUID(CMDSETID_Forms3, *pguidCmdGroup))
|
|
{
|
|
if (nCmdID == IDM_PARSECOMPLETE)
|
|
// add code here to call download complete when 916 comes out.
|
|
OnDocumentReady();
|
|
else if (nCmdID == IDM_DIRRTL)
|
|
return m_pCmdTarget ? m_pCmdTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut) : E_FAIL;
|
|
else
|
|
hr = OLECMDERR_E_NOTSUPPORTED;
|
|
|
|
}
|
|
else if (IsEqualGUID(CMDSETID_MimeEdit, *pguidCmdGroup))
|
|
{
|
|
return m_pCmdTarget ? m_pCmdTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut) : E_FAIL;
|
|
}
|
|
else if (IsEqualGUID(CMDSETID_MimeEditHost, *pguidCmdGroup))
|
|
{
|
|
BOOL fCommandHandled = FALSE;
|
|
// CFrontPage doesn't initialize an m_pBodyOptions
|
|
if (m_pBodyOptions)
|
|
{
|
|
fCommandHandled = TRUE;
|
|
switch (nCmdID)
|
|
{
|
|
case MEHOSTCMDID_SOURCEEDIT_FLAGS:
|
|
if (pvaOut)
|
|
{
|
|
pvaOut->vt = VT_I4;
|
|
pvaOut->lVal = 0;
|
|
|
|
if (DwGetOption(OPT_SOURCE_EDIT_COLORING))
|
|
pvaOut->lVal |= MESRCFLAGS_COLOR;
|
|
} else
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
|
|
case MEHOSTCMDID_SAVEATTACH_PATH:
|
|
{
|
|
if (pvaIn && pvaIn->vt == VT_BSTR && pvaIn->bstrVal)
|
|
{
|
|
if (WideCharToMultiByte(CP_ACP, 0, pvaIn->bstrVal, -1, rgch, ARRAYSIZE(rgch), NULL, NULL))
|
|
SetOption(OPT_SAVEATTACH_PATH, rgch, MAX_PATH, NULL, 0);
|
|
}
|
|
else if (pvaOut)
|
|
{
|
|
pvaOut->vt = VT_BSTR;
|
|
GetOption(OPT_SAVEATTACH_PATH, rgch, MAX_PATH);
|
|
hr = HrLPSZToBSTR(rgch, &pvaOut->bstrVal);
|
|
} else
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_UNSAFEATTACHMENTS:
|
|
if (pvaOut)
|
|
{
|
|
BOOL fEditMode = FALSE;
|
|
|
|
pvaOut->vt = VT_I4;
|
|
HrIsEditMode(&fEditMode);
|
|
if (fEditMode) // allow open/save during edit/compose
|
|
pvaOut->lVal = 0;
|
|
else
|
|
pvaOut->lVal = DwGetOption(OPT_SECURITY_ATTACHMENT);
|
|
} else
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
|
|
case MEHOSTCMDID_SECURITY_ZONE:
|
|
if (pvaOut)
|
|
{
|
|
pvaOut->vt = VT_I4;
|
|
#ifdef FORCE_UNTRUSTED
|
|
pvaOut->lVal = URLZONE_UNTRUSTED;
|
|
#else // FORCE_UNTRUSTED
|
|
if (DwGetOption(OPT_READ_IN_TEXT_ONLY))
|
|
{
|
|
// In text mode, never let scripts run.
|
|
pvaOut->lVal = URLZONE_UNTRUSTED;
|
|
}
|
|
else
|
|
{
|
|
pvaOut->lVal = DwGetOption(OPT_SECURITYZONE);
|
|
}
|
|
#endif // FORCE_UNTRUSTED
|
|
} else
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
|
|
case MEHOSTCMDID_SIGNATURE_ENABLED:
|
|
{
|
|
Assert(pvaIn);
|
|
Assert(V_VT(pvaIn) == VT_I4);
|
|
hr = m_pBodyOptions->SignatureEnabled((V_I4(pvaIn) == MESIG_AUTO) ? TRUE : FALSE);
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_SIGNATURE_OPTIONS:
|
|
{
|
|
DWORD outFlags = 0,
|
|
fBodyFlags = 0;
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
m_pBodyOptions->GetSignature(NULL, &fBodyFlags, NULL);
|
|
if (fBodyFlags != 0)
|
|
{
|
|
outFlags = (fBodyFlags & SIGOPT_HTML) ? MESIGOPT_HTML : MESIGOPT_PLAIN;
|
|
if (fBodyFlags & SIGOPT_TOP)
|
|
outFlags |= MESIGOPT_TOP;
|
|
if (fBodyFlags & SIGOPT_PREFIX)
|
|
outFlags |= MESIGOPT_PREFIX;
|
|
if (fBodyFlags & SIGOPT_BOTTOM)
|
|
outFlags |= MESIGOPT_BOTTOM;
|
|
}
|
|
V_I4(pvaOut) = outFlags;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_SPELL_LANGUAGE:
|
|
{
|
|
Assert(pvaOut);
|
|
pvaOut->vt = VT_BSTR;
|
|
|
|
if (GetOption(OPT_SPELL_LANGID, rgch, ARRAYSIZE(rgch)))
|
|
{
|
|
hr = HrLPSZToBSTR(rgch, &pvaOut->bstrVal);
|
|
}
|
|
else
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_SPELL_OPTIONS:
|
|
{
|
|
DWORD outFlags = 0;
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
if (DwGetOption(OPT_SPELLIGNORENUMBER))
|
|
outFlags |= MESPELLOPT_IGNORENUMBER;
|
|
if (DwGetOption(OPT_SPELLIGNOREUPPER))
|
|
outFlags |= MESPELLOPT_IGNOREUPPER;
|
|
if (DwGetOption(OPT_SPELLIGNOREDBCS))
|
|
outFlags |= MESPELLOPT_IGNOREDBCS;
|
|
if (DwGetOption(OPT_SPELLIGNOREPROTECT))
|
|
outFlags |= MESPELLOPT_IGNOREPROTECT;
|
|
if (DwGetOption(OPT_SPELLIGNOREURL))
|
|
outFlags |= MESPELLOPT_IGNOREURL;
|
|
if (DwGetOption(OPT_SPELLALWAYSSUGGEST))
|
|
outFlags |= MESPELLOPT_ALWAYSSUGGEST;
|
|
if (DwGetOption(OPT_SPELLCHECKONSEND))
|
|
outFlags |= MESPELLOPT_CHECKONSEND;
|
|
if (DwGetOption(OPT_SPELLCHECKONTYPE))
|
|
outFlags |= MESPELLOPT_CHECKONTYPE;
|
|
|
|
V_I4(pvaOut) = outFlags;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_SIGNATURE:
|
|
{
|
|
DWORD fFlags;
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_BSTR;
|
|
hr = m_pBodyOptions->GetSignature(NULL, &fFlags, &V_BSTR(pvaOut));
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_HEADER_TYPE:
|
|
{
|
|
DWORD dwFlags = 0;
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
m_pBodyOptions->GetFlags(&dwFlags);
|
|
if (dwFlags & BOPT_USEREPLYHEADER)
|
|
{
|
|
if (dwFlags & BOPT_MAIL)
|
|
{
|
|
V_I4(pvaOut) = MEHEADER_MAIL;
|
|
if (DwGetOption(OPT_HARDCODEDHDRS))
|
|
V_I4(pvaOut) |= MEHEADER_FORCE_ENGLISH;
|
|
}
|
|
else
|
|
V_I4(pvaOut) = MEHEADER_NEWS;
|
|
}
|
|
else
|
|
V_I4(pvaOut) = MEHEADER_NONE;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_FLAGS:
|
|
{
|
|
DWORD outFlags = 0,
|
|
fBodyFlags;
|
|
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
hr = m_pBodyOptions->GetFlags(&fBodyFlags);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (fBodyFlags & BOPT_INCLUDEMSG)
|
|
outFlags = MEO_FLAGS_INCLUDEMSG;
|
|
if ((fBodyFlags & BOPT_HTML) || m_fSecDispInfo)
|
|
outFlags |= MEO_FLAGS_HTML;
|
|
|
|
if (fBodyFlags & BOPT_AUTOINLINE &&
|
|
DwGetOption(OPT_AUTO_IMAGE_INLINE)!=AUTO_INLINE_OFF)
|
|
{
|
|
outFlags |= MEO_FLAGS_AUTOINLINE;
|
|
if (DwGetOption(OPT_AUTO_IMAGE_INLINE) == AUTO_INLINE_SLIDE)
|
|
outFlags |= MEO_FLAGS_SLIDESHOW;
|
|
}
|
|
|
|
if (fBodyFlags & BOPT_SENDIMAGES)
|
|
outFlags |= MEO_FLAGS_SENDIMAGES;
|
|
if (fBodyFlags & BOPT_AUTOTEXT)
|
|
outFlags |= MEO_FLAGS_AUTOTEXT;
|
|
if (fBodyFlags & BOPT_BLOCKQUOTE)
|
|
outFlags |= MEO_FLAGS_BLOCKQUOTE;
|
|
if (fBodyFlags & BOPT_SENDEXTERNALS)
|
|
outFlags |= MEO_FLAGS_SENDEXTERNALIMGSRC;
|
|
if (fBodyFlags & BOPT_SPELLINGOREORIGINAL)
|
|
outFlags |= MEO_FLAGS_DONTSPELLCHECKQUOTED;
|
|
}
|
|
V_I4(pvaOut) = outFlags;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_QUOTE_CHAR:
|
|
{
|
|
BODYOPTINFO boi;
|
|
Assert(pvaOut);
|
|
|
|
boi.dwMask = BOPTF_QUOTECHAR;
|
|
hr = m_pBodyOptions->GetInfo(&boi);
|
|
V_VT(pvaOut) = VT_I4;
|
|
V_I4(pvaOut) = boi.chQuote;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_REPLY_TICK_COLOR:
|
|
{
|
|
BODYOPTINFO boi;
|
|
Assert(pvaOut);
|
|
|
|
boi.dwMask = BOPTF_REPLYTICKCOLOR;
|
|
hr = m_pBodyOptions->GetInfo(&boi);
|
|
V_VT(pvaOut) = VT_I4;
|
|
V_I4(pvaOut) = boi.dwReplyTickColor;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_COMPOSE_FONT:
|
|
{
|
|
BODYOPTINFO boi;
|
|
DWORD fBodyFlags = 0;
|
|
Assert(pvaOut);
|
|
|
|
hr = m_pBodyOptions->GetFlags(&fBodyFlags);
|
|
if (SUCCEEDED(hr) && (fBodyFlags & BOPT_NOFONTTAG))
|
|
{
|
|
V_BSTR(pvaOut) = NULL;
|
|
break;
|
|
}
|
|
|
|
boi.dwMask = BOPTF_COMPOSEFONT;
|
|
hr = m_pBodyOptions->GetInfo(&boi);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
V_VT(pvaOut) = VT_BSTR;
|
|
hr = HrLPSZToBSTR(boi.rgchComposeFont, &V_BSTR(pvaOut));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_IS_READ_IN_TEXT_ONLY:
|
|
{
|
|
if (VT_BOOL == pvaOut->vt)
|
|
{
|
|
if (m_fSecDispInfo || m_fShowingErrorPage || !DwGetOption(OPT_READ_IN_TEXT_ONLY))
|
|
pvaOut->boolVal = VARIANT_FALSE;
|
|
else
|
|
pvaOut->boolVal = VARIANT_TRUE;
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_HTML_HELP:
|
|
{
|
|
Assert(pvaOut);
|
|
|
|
V_VT(pvaOut) = VT_BOOL;
|
|
V_BOOL(pvaOut) = (m_fSecDispInfo || m_fShowingErrorPage)?VARIANT_TRUE:VARIANT_FALSE;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
fCommandHandled = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (fCommandHandled)
|
|
goto exit;
|
|
|
|
switch (nCmdID)
|
|
{
|
|
case MEHOSTCMDID_ADD_TO_ADDRESSBOOK:
|
|
{
|
|
Assert(pvaIn);
|
|
Assert(V_BSTR(pvaIn));
|
|
hr = HrAddToWab(V_BSTR(pvaIn));
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_ADD_TO_FAVORITES:
|
|
{
|
|
BSTR bstrURL=0, bstrDescr=0;
|
|
LONG l;
|
|
|
|
Assert(pvaIn);
|
|
|
|
l=0;
|
|
IF_FAILEXIT(hr=SafeArrayGetElement(V_ARRAY(pvaIn), &l, &bstrDescr));
|
|
l=1;
|
|
IF_FAILEXIT(hr=SafeArrayGetElement(V_ARRAY(pvaIn), &l, &bstrURL));
|
|
|
|
hr = HrAddToFavorites(bstrDescr, bstrURL);
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_SLIDESHOW_DELAY:
|
|
{
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
V_I4(pvaOut) = 3000; //In milleseconds
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_ONPARSECOMPLETE:
|
|
{
|
|
if (!m_fBlockingOnSMime)
|
|
OnDocumentReady();
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_FONTCACHE:
|
|
{
|
|
Assert(pvaOut);
|
|
if (g_lpIFontCache)
|
|
{
|
|
V_VT(pvaOut) = VT_UNKNOWN;
|
|
V_UNKNOWN(pvaOut) = g_lpIFontCache;
|
|
g_lpIFontCache->AddRef();
|
|
} else
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
|
|
case MEHOSTCMDID_BORDERFLAGS:
|
|
{
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
V_I4(pvaOut) = m_dwBorderFlags;
|
|
break;
|
|
}
|
|
|
|
// in the case where m_pBodyOptions is not initialized we're
|
|
// likely in a non-message window so just default to internet zone
|
|
case MEHOSTCMDID_SECURITY_ZONE:
|
|
{
|
|
Assert(pvaOut);
|
|
V_VT(pvaOut) = VT_I4;
|
|
V_I4(pvaOut) = URLZONE_INTERNET;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
hr = OLECMDERR_E_NOTSUPPORTED;
|
|
break;
|
|
}
|
|
}
|
|
else if (IsEqualGUID(CMDSETID_OESecurity, *pguidCmdGroup))
|
|
{
|
|
if ((OECSECCMD_ENCRYPTED == nCmdID) || (OECSECCMD_SIGNED == nCmdID))
|
|
{
|
|
if(m_pSecureMessage && (CheckSecReceipt(m_pSecureMessage) == S_OK))
|
|
{
|
|
hr = HrShowSecurityProperty(m_hwnd, m_pSecureMessage);
|
|
}
|
|
else
|
|
hr = HrShowSecurityProperty(m_hwnd, m_pMsg);
|
|
}
|
|
|
|
else
|
|
hr = OLECMDERR_E_NOTSUPPORTED;
|
|
} else
|
|
hr = OLECMDERR_E_NOTSUPPORTED;
|
|
|
|
exit:
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::HrAddToFavorites(BSTR bstrDescr, BSTR bstrURL)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
hr = AddUrlToFavorites(m_hwnd, bstrURL, bstrDescr, TRUE);
|
|
if(FAILED(hr))
|
|
AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthenaMail), MAKEINTRESOURCEW(idsErrFavorites), NULL, MB_OK);
|
|
|
|
return (TraceResult(hr));
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::HrAddToWab(BSTR bstr)
|
|
{
|
|
LPWAB lpWab;
|
|
HRESULT hr;
|
|
INT idsErr=0;
|
|
ADRINFO AdrInfo;
|
|
LPSTR psz;
|
|
|
|
hr = HrCreateWabObject(&lpWab);
|
|
if (!FAILED(hr))
|
|
{
|
|
if (bstr)
|
|
{
|
|
ZeroMemory(&AdrInfo, sizeof(ADRINFO));
|
|
AdrInfo.lpwszAddress = bstr;
|
|
AdrInfo.lpwszDisplay = bstr;
|
|
|
|
hr = lpWab->HrAddToWAB(m_hwnd, &AdrInfo);
|
|
if (FAILED(hr) && hr!=MAPI_E_USER_CANCEL)
|
|
{
|
|
if(hr==MAPI_E_COLLISION)
|
|
idsErr=idsErrAddrDupe;
|
|
else
|
|
idsErr=idsErrAddToWAB;
|
|
}
|
|
|
|
if(idsErr)
|
|
AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthenaMail), MAKEINTRESOURCEW(idsErr), NULL, MB_OK);
|
|
}
|
|
lpWab->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: WMSize
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
void CMimeEditDocHost::WMSize(int cxBody, int cyBody)
|
|
{
|
|
RECT rc={0};
|
|
|
|
TraceCall("CMimeEditDocHost::WMSize");
|
|
|
|
if(m_pDocView)
|
|
{
|
|
rc.bottom=cyBody;
|
|
rc.right=cxBody;
|
|
|
|
m_pDocView->SetRect(&rc);
|
|
}
|
|
|
|
// notify the subclass of a wmsize
|
|
OnWMSize(&rc);
|
|
}
|
|
// *** IOleControlSite ***
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnControlInfoChanged
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnControlInfoChanged()
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnControlInfoChanged");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: LockInPlaceActive
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::LockInPlaceActive(BOOL fLock)
|
|
{
|
|
TraceCall("CMimeEditDocHost::LockInPlaceActive");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetExtendedControl
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::GetExtendedControl(LPDISPATCH *ppDisp)
|
|
{
|
|
TraceCall("CMimeEditDocHost::GetExtendedControl");
|
|
|
|
if (ppDisp)
|
|
*ppDisp=NULL;
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: TransformCoords
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::TransformCoords(POINTL *pPtlHimetric, POINTF *pPtfContainer,DWORD dwFlags)
|
|
{
|
|
TraceCall("CMimeEditDocHost::TransformCoords");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: TranslateAccelerator
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::TranslateAccelerator(LPMSG lpMsg, DWORD grfModifiers)
|
|
{
|
|
TraceCall("CMimeEditDocHost::TranslateAccelerator");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnFocus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnFocus(BOOL fGotFocus)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
m_fUIActive = !!fGotFocus;
|
|
if (m_pDocView)
|
|
hr = m_pDocView->UIActivate(fGotFocus);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ShowPropertyFrame
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::ShowPropertyFrame(void)
|
|
{
|
|
TraceCall("CMimeEditDocHost::ShowPropertyFrame");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnUpdateCommands
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CMimeEditDocHost::OnUpdateCommands()
|
|
{
|
|
TraceCall("CMimeEditDocHost::OnUpdateCommands");
|
|
|
|
SendMessage(GetParent(m_hwnd), NWM_UPDATETOOLBAR, 0, 0);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::Load(LPMIMEMESSAGE pMsg)
|
|
{
|
|
SECSTATE secState = {0};
|
|
DWORD dw = 0;
|
|
HRESULT hr;
|
|
|
|
m_fFixedFont = FALSE;
|
|
|
|
RegisterForHTMLDocEvents(FALSE);
|
|
|
|
m_fSecDispInfo = FALSE; // reset flag
|
|
m_fShowingErrorPage = FALSE;
|
|
m_fSecureReceipt = FALSE;
|
|
|
|
if(CheckSecReceipt(pMsg) == S_OK)
|
|
{
|
|
HrGetSecurityState(pMsg, &secState, NULL);
|
|
m_fSecureReceipt = TRUE;
|
|
m_fIsEncrypted = !!IsEncrypted(secState.type);
|
|
m_fIsSigned = !!IsSigned(secState.type);
|
|
m_fSignTrusted = !!IsSignTrusted(&secState);
|
|
m_fEncryptionOK = !!IsEncryptionOK(&secState);
|
|
hr = LoadSecurely(pMsg, &secState);
|
|
CleanupSECSTATE(&secState);
|
|
}
|
|
else if (IsSecure(pMsg) && SUCCEEDED(HrGetSecurityState(pMsg, &secState, NULL)))
|
|
{
|
|
m_fIsEncrypted = !!IsEncrypted(secState.type);
|
|
m_fIsSigned = !!IsSigned(secState.type);
|
|
m_fSignTrusted = !!IsSignTrusted(&secState);
|
|
m_fEncryptionOK = !!IsEncryptionOK(&secState);
|
|
hr = LoadSecurely(pMsg, &secState);
|
|
CleanupSECSTATE(&secState);
|
|
}
|
|
else
|
|
{
|
|
m_fIsEncrypted = FALSE;
|
|
m_fIsSigned = FALSE;
|
|
m_fSignTrusted = TRUE;
|
|
m_fEncryptionOK = TRUE;
|
|
hr = InternalLoad(pMsg);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::InternalLoad(IMimeMessage *pMsg)
|
|
{
|
|
SECSTATE secState = {0};
|
|
DWORD dw = 0;
|
|
HRESULT hr;
|
|
DWORD dwBodyFlags = 0;
|
|
BOOLEAN fProcess = FALSE;
|
|
|
|
ReplaceInterface(m_pMsg, pMsg);
|
|
|
|
if(m_pBodyOptions)
|
|
{
|
|
m_pBodyOptions->GetFlags(&dwBodyFlags);
|
|
|
|
m_fMarkedRead = (0 == (dwBodyFlags & BOPT_UNREAD));
|
|
if (!m_fMarkedRead)
|
|
{
|
|
if (!m_fSecDispInfo && !!(dwBodyFlags & BOPT_MAIL))
|
|
fProcess = TRUE;
|
|
|
|
if (dwBodyFlags & BOPT_FROM_NOTE)
|
|
{
|
|
//Since opening a message in a note, it should be marked as read immediately.
|
|
HrMarkAsRead();
|
|
}
|
|
else
|
|
{
|
|
// ReplaceInterface(m_pMsg, pMsg);
|
|
|
|
if (m_pBodyOptions->GetMarkAsReadTime(&dw) == S_OK)
|
|
{
|
|
if (dw == 0)
|
|
HrMarkAsRead();
|
|
else
|
|
if (dw != OPTION_OFF)
|
|
SetTimer(m_hwnd, idTimerMarkAsRead, dw*1000, NULL);
|
|
}
|
|
else
|
|
HrMarkAsRead();
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = m_pPrstMime->Load(m_pMsg);
|
|
|
|
if ((fProcess) && !(dwBodyFlags & BOPT_FROM_NOTE) && SUCCEEDED(hr) && (m_pEventSink))
|
|
{
|
|
m_pEventSink->EventOccurred(MEHC_CMD_PROCESS_RECEIPT, m_pMsg);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::Save(LPMIMEMESSAGE pMsg, DWORD dwFlags)
|
|
{
|
|
DWORD idsWarning;
|
|
HRESULT hr;
|
|
|
|
Assert(m_pPrstMime);
|
|
|
|
hr = m_pPrstMime->Save(pMsg, dwFlags);
|
|
|
|
switch (hr)
|
|
{
|
|
case MIMEEDIT_E_CANNOTSAVEWHILESOURCEEDITING:
|
|
AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrCannotSaveInSourceEdit), NULL, MB_OK|MB_ICONEXCLAMATION);
|
|
hr = MAPI_E_USER_CANCEL;
|
|
break;
|
|
|
|
// brettm: for OE5 we no longer warn if trident is not readystate complete. In the case of active movie controls
|
|
// they never go readyState complete 'by design' as they never loaded the source url. The warning is annoying for
|
|
// msphone message forwarding. for images we check individual readystates anyway.
|
|
//case MIMEEDIT_W_DOWNLOADNOTCOMPLETE:
|
|
|
|
case MIMEEDIT_W_BADURLSNOTATTACHED:
|
|
if (IDYES != AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrBadMHTMLLinks), NULL, MB_YESNO|MB_ICONEXCLAMATION |MB_DEFBUTTON2))
|
|
hr = MAPI_E_USER_CANCEL;
|
|
break;
|
|
|
|
case MIMEEDIT_E_CANNOTSAVEUNTILPARSECOMPLETE:
|
|
AthMessageBoxW(m_hwnd, MAKEINTRESOURCEW(idsAthena), MAKEINTRESOURCEW(idsErrNotSaveUntilDownloadDone), NULL, MB_OK|MB_ICONEXCLAMATION);
|
|
hr = MAPI_E_USER_CANCEL;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::GetClassID(CLSID *pClsID)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrOnDocObjCreate()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrGetElement(LPCTSTR pszName, IHTMLElement **ppElem)
|
|
{
|
|
return ::HrGetElementImpl(m_pDoc, pszName, ppElem);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSpellCheck(BOOL fSuppressDoneMsg)
|
|
{
|
|
return m_pCmdTarget ? m_pCmdTarget->Exec(NULL, OLECMDID_SPELL,
|
|
fSuppressDoneMsg ? OLECMDEXECOPT_DONTPROMPTUSER : OLECMDEXECOPT_PROMPTUSER , NULL, NULL) : E_FAIL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrPrint(BOOL fPrompt)
|
|
{
|
|
VARIANTARG va;
|
|
HRESULT hr;
|
|
|
|
if (!m_pCmdTarget)
|
|
return E_FAIL;
|
|
|
|
va.vt = VT_BSTR;
|
|
va.bstrVal = NULL;
|
|
GetOEUserName(&va.bstrVal);
|
|
hr = m_pCmdTarget->Exec(NULL, OLECMDID_PRINT,
|
|
fPrompt ? OLECMDEXECOPT_PROMPTUSER : OLECMDEXECOPT_DONTPROMPTUSER, &va, NULL);
|
|
|
|
SysFreeString(va.bstrVal);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrIsEmpty(BOOL *pfEmpty)
|
|
{
|
|
return ExecGetBool(&CMDSETID_MimeEdit, MECMDID_EMPTY, pfEmpty);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrUnloadAll(UINT idsDefaultBody, DWORD dwFlags)
|
|
{
|
|
TCHAR rgch[CCHMAX_STRINGRES];
|
|
|
|
KillTimer(m_hwnd, idTimerMarkAsRead);
|
|
|
|
m_fIsEncrypted = FALSE;
|
|
m_fIsSigned = FALSE;
|
|
m_fSignTrusted = TRUE;
|
|
m_fEncryptionOK = TRUE;
|
|
|
|
HrInitNew(m_lpOleObj);
|
|
|
|
if (idsDefaultBody)
|
|
{
|
|
LoadString(g_hLocRes, idsDefaultBody, rgch, ARRAYSIZE(rgch));
|
|
HrSetText(rgch);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
BOOL CMimeEditDocHost::WMCommand(HWND hwnd, int id, WORD wCmd)
|
|
{
|
|
return SUCCEEDED(HrWMCommand(hwnd, id, wCmd));
|
|
}
|
|
|
|
// ********************************************
|
|
BOOL CMimeEditDocHost::WMNotify(int idFrom, NMHDR *pnmh)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrIsDirty(BOOL *pfDirty)
|
|
{
|
|
return ExecGetBool(&CMDSETID_MimeEdit, MECMDID_DIRTY, pfDirty);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetDirtyFlag(BOOL fDirty)
|
|
{
|
|
return ExecSetBool(&CMDSETID_MimeEdit, MECMDID_DIRTY, fDirty);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetStyle(DWORD dwStyle)
|
|
{
|
|
HRESULT hr = ExecSetI4(&CMDSETID_MimeEdit, MECMDID_STYLE, dwStyle);
|
|
|
|
if (SUCCEEDED(hr))
|
|
m_dwDocStyle = dwStyle;
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrGetStyle(DWORD *pdwStyle)
|
|
{
|
|
*pdwStyle = m_dwDocStyle;
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrEnableHTMLMode(BOOL fOn)
|
|
{
|
|
BOOL fEdit=FALSE;
|
|
|
|
m_fFixedFont = FALSE;
|
|
|
|
// if turning HTML mode on, turn on the source tabs
|
|
if (fOn && HrIsEditMode(&fEdit)==S_OK && fEdit)
|
|
ExecSetBool(&CMDSETID_MimeEdit, MECMDID_SHOWSOURCETABS, DwGetOption(OPT_VIEWSOURCETABS));
|
|
|
|
return ExecSetBool(&CMDSETID_MimeEdit, MECMDID_EDITHTML, fOn);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrIsHTMLMode()
|
|
{
|
|
ULONG cmdf=0;
|
|
|
|
QuerySingleMimeEditCmd(MECMDID_EDITHTML, &cmdf);
|
|
return (cmdf & OLECMDF_LATCHED) ? S_OK :S_FALSE;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrDowngradeToPlainText()
|
|
{
|
|
return ExecCommand(&CMDSETID_MimeEdit, MECMDID_DOWNGRADEPLAINTEXT);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetText(LPSTR lpsz)
|
|
{
|
|
TCHAR rgch[CCHMAX_STRINGRES];
|
|
|
|
RegisterForHTMLDocEvents(FALSE);
|
|
m_fShowingErrorPage = TRUE;
|
|
|
|
if (HIWORD(lpsz)==0)
|
|
{
|
|
LoadString(g_hLocRes, LOWORD(lpsz), rgch, ARRAYSIZE(rgch));
|
|
lpsz = rgch;
|
|
}
|
|
return ExecSetText(&CMDSETID_MimeEdit, MECMDID_SETTEXT, lpsz);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrPerformROT13Encoding()
|
|
{
|
|
return ExecCommand(&CMDSETID_MimeEdit, MECMDID_ROT13);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::LoadHtmlErrorPage(LPCSTR pszURL)
|
|
{
|
|
HRESULT hr;
|
|
LPSTR pszUrlFree=NULL;
|
|
|
|
// if relative, wrap in our res:// handler
|
|
pszUrlFree = PszAllocResUrl((LPSTR)pszURL);
|
|
if (!pszUrlFree)
|
|
return E_OUTOFMEMORY;
|
|
|
|
hr = HrLoadURL(pszUrlFree);
|
|
if (SUCCEEDED(hr))
|
|
RegisterForHTMLDocEvents(TRUE);
|
|
|
|
m_fIsEncrypted = FALSE;
|
|
m_fIsSigned = FALSE;
|
|
m_fSignTrusted = TRUE;
|
|
m_fEncryptionOK = TRUE;
|
|
m_fShowingErrorPage = TRUE;
|
|
|
|
SafeMemFree(pszUrlFree);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
// Base assumes that is URL to MHTML
|
|
HRESULT CMimeEditDocHost::HrLoadURL(LPCSTR pszURL)
|
|
{
|
|
BSTR bstr = NULL;
|
|
IMoniker *pMoniker = NULL;
|
|
IPersistMoniker *pPrstMnkr = NULL;
|
|
HRESULT hr;
|
|
|
|
hr = HrLPSZToBSTR(pszURL, &bstr);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = CreateURLMoniker(NULL, bstr, &pMoniker);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = m_lpOleObj->QueryInterface(IID_IPersistMoniker, (LPVOID*)&pPrstMnkr);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = pPrstMnkr->Load(FALSE, pMoniker, NULL, 0);
|
|
|
|
error:
|
|
SysFreeString(bstr);
|
|
SafeRelease(pMoniker);
|
|
SafeRelease(pPrstMnkr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrInsertTextFile(LPSTR lpsz)
|
|
{
|
|
return ExecSetText(&CMDSETID_MimeEdit, MECMDID_INSERTTEXTFILE, lpsz);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrInsertTextFileFromDialog()
|
|
{
|
|
return ExecCommand(&CMDSETID_MimeEdit, MECMDID_INSERTTEXTFILE);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrViewSource(DWORD dwViewType)
|
|
{
|
|
return ExecSetI4(&CMDSETID_MimeEdit, MECMDID_VIEWSOURCE, dwViewType);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetPreviewFormat(LPSTR lpsz)
|
|
{
|
|
BSTR bstr;
|
|
VARIANTARG var;
|
|
|
|
if (!m_pCmdTarget)
|
|
return E_FAIL;
|
|
|
|
HRESULT hr = HrLPSZToBSTR(lpsz, &bstr);
|
|
if (FAILED(hr))
|
|
goto Exit;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = bstr;
|
|
|
|
hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_PREVIEWFORMAT, OLECMDEXECOPT_DODEFAULT, &var, NULL);
|
|
|
|
SysFreeString(bstr);
|
|
Exit:
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetEditMode(BOOL fOn)
|
|
{
|
|
ExecSetBool(&CMDSETID_MimeEdit, MECMDID_EDITMODE, fOn);
|
|
|
|
if (fOn && HrIsHTMLMode()==S_OK)
|
|
ExecSetBool(&CMDSETID_MimeEdit, MECMDID_SHOWSOURCETABS, DwGetOption(OPT_VIEWSOURCETABS));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrIsEditMode(BOOL *pfOn)
|
|
{
|
|
return ExecGetBool(&CMDSETID_MimeEdit, MECMDID_EDITMODE, pfOn);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetCharset(HCHARSET hCharset)
|
|
{
|
|
return ExecSetI8(&CMDSETID_MimeEdit, MECMDID_CHARSET, reinterpret_cast<ULONGLONG>(hCharset));
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrGetCharset(HCHARSET *phCharset)
|
|
{
|
|
HRESULT hr;
|
|
ULONGLONG ullCharset;
|
|
|
|
hr = ExecGetI8(&CMDSETID_MimeEdit, MECMDID_CHARSET, &ullCharset);
|
|
|
|
*phCharset = reinterpret_cast<HCHARSET>(ullCharset);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSaveAsStationery(LPWSTR pwszFile)
|
|
{
|
|
BSTR bstr = NULL;
|
|
VARIANTARG varIn,
|
|
varOut;
|
|
HRESULT hr = S_OK;
|
|
|
|
V_VT(&varOut) = VT_EMPTY;
|
|
|
|
if (!m_pCmdTarget)
|
|
IF_FAILEXIT(hr = E_FAIL);
|
|
|
|
if (pwszFile)
|
|
{
|
|
IF_NULLEXIT(bstr = SysAllocString(pwszFile));
|
|
}
|
|
else
|
|
{
|
|
WCHAR wszPath[MAX_PATH];
|
|
HrGetStationeryPath(wszPath);
|
|
IF_NULLEXIT(bstr = SysAllocString(wszPath));
|
|
}
|
|
|
|
V_VT(&varIn) = VT_BSTR;
|
|
V_BSTR(&varIn) = bstr;
|
|
|
|
IF_FAILEXIT(hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_SAVEASSTATIONERY, OLECMDEXECOPT_DODEFAULT, &varIn, &varOut));
|
|
|
|
if (V_VT(&varOut) == VT_BSTR)
|
|
{
|
|
IF_FAILEXIT(hr = HrAddToStationeryMRU(V_BSTR(&varOut)));
|
|
}
|
|
|
|
exit:
|
|
SysFreeString(bstr);
|
|
if (VT_EMPTY != V_VT(&varOut))
|
|
SysFreeString(V_BSTR(&varOut));
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrApplyStationery(LPWSTR pwszFile)
|
|
{
|
|
IStream *pstm = NULL;
|
|
IHTMLDocument2 *pDoc = NULL;
|
|
HRESULT hr = S_OK;
|
|
VARIANTARG var;
|
|
|
|
if (!m_pCmdTarget)
|
|
IF_FAILEXIT(hr = E_FAIL);
|
|
|
|
// Apply stationery
|
|
// if no filename in buffer, means No Stationery was called
|
|
if (*pwszFile)
|
|
{
|
|
// Don't need to deal with the unicode stream issue when
|
|
// returning from HrCreateBasedWebPage in this case. There
|
|
// are only a few attributes that are saved when applying
|
|
// stationery and the ones we care about seem OK right now.
|
|
IF_FAILEXIT(hr = HrCreateBasedWebPage(pwszFile, &pstm));
|
|
|
|
IF_FAILEXIT(hr = MimeEditDocumentFromStream(pstm, IID_IHTMLDocument2, (LPVOID*)&pDoc));
|
|
}
|
|
|
|
var.vt = VT_UNKNOWN;
|
|
var.punkVal = pDoc;
|
|
IF_FAILEXIT(hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_APPLYDOCUMENT, OLECMDEXECOPT_DODEFAULT, &var, NULL));
|
|
|
|
exit:
|
|
ReleaseObj(pstm);
|
|
ReleaseObj(pDoc);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrUpdateFormatBar()
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrClearFormatting()
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrMEDocHost_Init(BOOL fInit)
|
|
{
|
|
WNDCLASSW wc={0};
|
|
|
|
if(fInit)
|
|
{
|
|
// RAID - 12563
|
|
// We need to check to see if the class has been registered
|
|
// already, because our DLL might get unloaded
|
|
if (0 == GetClassInfoWrapW(g_hInst, c_wszMEDocHostWndClass, &wc)) // already regisered
|
|
{
|
|
wc.lpfnWndProc = CMimeEditDocHost::ExtWndProc;
|
|
wc.hInstance = g_hInst;
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszClassName = c_wszMEDocHostWndClass;
|
|
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
|
wc.style = CS_DBLCLKS;
|
|
|
|
if(!RegisterClassWrapW(&wc))
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
else if (0 != GetClassInfoWrapW(g_hInst, c_wszMEDocHostWndClass, &wc))
|
|
// don't need to enterCS for this, as it's the process going down.
|
|
UnregisterClassWrapW(c_wszDocHostWndClass, g_hInst);
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrPostInit()
|
|
{
|
|
HRESULT hr = CreateDocObj((LPCLSID)&CLSID_MimeEdit);
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
hr = Show();
|
|
if(FAILED(hr))
|
|
return hr;
|
|
|
|
return HrOnDocObjCreate();
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrInit(HWND hwndParent, DWORD dwFlags, IBodyOptions *pBodyOptions)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HWND hwnd = 0;
|
|
|
|
m_dwStyle=dwFlags;
|
|
|
|
Assert(!m_pBodyOptions);
|
|
if (pBodyOptions)
|
|
{
|
|
m_pBodyOptions = pBodyOptions;
|
|
pBodyOptions->AddRef();
|
|
}
|
|
|
|
if(!IsWindow(hwndParent))
|
|
IF_FAILEXIT(hr = E_INVALIDARG);
|
|
|
|
IF_FAILEXIT(hr=HrMEDocHost_Init(TRUE));
|
|
|
|
hwnd=CreateWindowExWrapW(WS_EX_NOPARENTNOTIFY,
|
|
c_wszMEDocHostWndClass, NULL,
|
|
WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_CHILD|WS_TABSTOP,
|
|
0,0,0,0, hwndParent,
|
|
(HMENU)idREBody, g_hInst, (LPVOID)this);
|
|
IF_NULLEXIT(hwnd);
|
|
|
|
IF_FAILEXIT(hr = HrCreateColorMenu(ID_FORMAT_COLOR1, &m_hmenuColor, FALSE));
|
|
|
|
IF_FAILEXIT(hr = HrPostInit());
|
|
|
|
exit:
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrClose()
|
|
{
|
|
// Don't call HrUnloadAll on close as it's redundant to
|
|
// clear out the contents with an InitNew. We simply force the docobj
|
|
// down with it current content
|
|
SafeRelease(m_pBodyOptions);
|
|
CloseDocObj();
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetStatusBar(CStatusBar *pStatus)
|
|
{
|
|
SafeRelease(m_pStatus);
|
|
m_pStatus=pStatus;
|
|
if(pStatus)
|
|
pStatus->AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrUpdateToolbar(HWND hwndToolbar)
|
|
{
|
|
HRESULT hr=NOERROR;
|
|
ULONG cmdf=0;
|
|
|
|
if(!IsWindow(hwndToolbar))
|
|
return E_INVALIDARG;
|
|
|
|
QuerySingleMimeEditCmd(MECMDID_INSERTHTML, &cmdf);
|
|
|
|
if ((cmdf & OLECMDF_ENABLED) &&
|
|
m_pBodyOptions &&
|
|
m_pBodyOptions->SignatureEnabled(FALSE)==S_OK && m_fUIActive)
|
|
SendMessage(hwndToolbar, TB_ENABLEBUTTON, ID_INSERT_SIGNATURE, MAKELONG(TRUE, 0));
|
|
else
|
|
SendMessage(hwndToolbar, TB_ENABLEBUTTON, ID_INSERT_SIGNATURE, 0);
|
|
|
|
// if docobj has focus, query the command target to get info.
|
|
if (m_fUIActive)
|
|
hr=HrCmdTgtUpdateToolbar(m_pCmdTarget, hwndToolbar);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::GetTabStopArray(HWND *rgTSArray, int *pcArrayCount)
|
|
{
|
|
Assert(rgTSArray);
|
|
Assert(pcArrayCount);
|
|
Assert(*pcArrayCount > 0);
|
|
|
|
IOleWindow *pWindow = NULL;
|
|
HWND hWnd;
|
|
|
|
*pcArrayCount = 0;
|
|
|
|
HRESULT hr = m_pDoc->QueryInterface(IID_IOleWindow, (LPVOID *)&pWindow);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = pWindow->GetWindow(&hWnd);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
*rgTSArray = hWnd;
|
|
*pcArrayCount = 1;
|
|
|
|
error:
|
|
SafeRelease(pWindow);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrInsertSignature(int id)
|
|
{
|
|
char szID[MAXSIGID], *pszID;
|
|
HRESULT hr=S_OK;
|
|
BSTR bstr;
|
|
DWORD dwSigOpt;
|
|
|
|
if (!m_pCmdTarget)
|
|
return E_FAIL;
|
|
|
|
Assert((ID_INSERT_SIGNATURE == id) || (id >= ID_SIGNATURE_FIRST && id <= ID_SIGNATURE_LAST));
|
|
Assert(m_pBodyOptions);
|
|
|
|
if(!m_pBodyOptions)
|
|
return E_FAIL;
|
|
|
|
if ((ID_INSERT_SIGNATURE == id) || FAILED(GetSigFromCmd(id, szID, ARRAYSIZE(szID))))
|
|
{
|
|
pszID = NULL;
|
|
}
|
|
else
|
|
{
|
|
pszID = szID;
|
|
}
|
|
|
|
if (m_pBodyOptions->SignatureEnabled(FALSE)==S_OK)
|
|
{
|
|
if (SUCCEEDED(hr = m_pBodyOptions->GetSignature(pszID, &dwSigOpt, &bstr)))
|
|
{
|
|
DWORD cmd;
|
|
VARIANTARG var;
|
|
|
|
if ((dwSigOpt & SIGOPT_PREFIX) && (0 == (dwSigOpt & SIGOPT_HTML)))
|
|
{
|
|
BSTR bstrPrefix;
|
|
if (HrLPSZToBSTR(c_szSigPrefix, &bstrPrefix)==S_OK)
|
|
{
|
|
UINT sigLen = lstrlenW(bstr),
|
|
preLen = lstrlenW(bstrPrefix);
|
|
|
|
// SysAllocStringLen includes one for the NULL
|
|
BSTR bstrTempBuf = SysAllocStringLen(NULL, preLen + sigLen);
|
|
if (bstrTempBuf)
|
|
{
|
|
memcpy(bstrTempBuf, bstrPrefix, preLen*sizeof(*bstrPrefix));
|
|
memcpy((bstrTempBuf + preLen), bstr, sigLen*sizeof(*bstr));
|
|
bstrTempBuf[preLen + sigLen] = L'\0';
|
|
SysFreeString(bstr);
|
|
bstr = bstrTempBuf;
|
|
}
|
|
SysFreeString(bstrPrefix);
|
|
}
|
|
}
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = bstr;
|
|
|
|
cmd = dwSigOpt&SIGOPT_HTML ? MECMDID_INSERTHTML : MECMDID_INSERTTEXT;
|
|
hr = m_pCmdTarget->Exec(&CMDSETID_MimeEdit, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL);
|
|
|
|
SysFreeString(bstr);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrShow(BOOL fVisible)
|
|
{
|
|
ShowWindow(m_hwnd, fVisible ? SW_SHOW : SW_HIDE);
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ViewCertificate(PCCERT_CONTEXT pCert, HCERTSTORE hcMsg)
|
|
{
|
|
return CommonUI_ViewSigningCertificate(m_hwnd, pCert, hcMsg);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::EditTrust(PCCERT_CONTEXT pCert, HCERTSTORE hcMsg)
|
|
{
|
|
return CommonUI_ViewSigningCertificateTrust(m_hwnd, pCert, hcMsg);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::UpdateBackAndStyleMenus(HMENU hmenu)
|
|
{
|
|
MENUITEMINFO miiBk;
|
|
HMENU hmenuTag=NULL;
|
|
|
|
ZeroMemory(&miiBk, sizeof(miiBk));
|
|
miiBk.cbSize=sizeof(miiBk);
|
|
miiBk.fMask = MIIM_ID | MIIM_SUBMENU;
|
|
if (GetMenuItemInfo(hmenu, ID_POPUP_BACKGROUND_COLOR, FALSE, &miiBk))
|
|
{
|
|
MENUITEMINFO miiBkColor;
|
|
|
|
HrCheckColor();
|
|
ZeroMemory(&miiBkColor, sizeof(miiBkColor));
|
|
miiBkColor.cbSize=sizeof(miiBkColor);
|
|
miiBkColor.fMask = MIIM_SUBMENU;
|
|
miiBkColor.hSubMenu = m_hmenuColor;
|
|
SetMenuItemInfo(hmenu, ID_POPUP_BACKGROUND_COLOR, FALSE, &miiBkColor);
|
|
}
|
|
|
|
if (!m_hmenuStyle)
|
|
{
|
|
Assert(m_pDoc);
|
|
HrCreateTridentMenu(m_pDoc, TM_TAGMENU, ID_FORMAT_FIRST, ID_FORMAT_FIRST - ID_FORMAT_LAST, &m_hmenuStyle);
|
|
Assert(m_hmenuStyle);
|
|
}
|
|
|
|
if(m_hmenuStyle)
|
|
{
|
|
VARIANTARG va;
|
|
MENUITEMINFO miiTag;
|
|
|
|
HrCheckTridentMenu(m_pDoc, TM_TAGMENU, ID_FORMAT_FIRST, ID_FORMAT_LAST, m_hmenuStyle);
|
|
|
|
ZeroMemory(&miiTag, sizeof(miiTag));
|
|
miiTag.cbSize=sizeof(miiTag);
|
|
miiTag.fMask = MIIM_SUBMENU;
|
|
miiTag.hSubMenu = m_hmenuStyle;
|
|
SetMenuItemInfo(hmenu, ID_POPUP_STYLE, FALSE, &miiTag);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::UpdateInsertMenu(HMENU hmenu)
|
|
{
|
|
}
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::UpdateEditMenu(HMENU hmenu)
|
|
{
|
|
}
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::UpdateViewMenu(HMENU hmenu)
|
|
{
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrOnInitMenuPopup(HMENU hmenuPopup, UINT uID)
|
|
{
|
|
if (m_pCmdTarget)
|
|
{
|
|
switch (uID)
|
|
{
|
|
case ID_POPUP_FILE:
|
|
break;
|
|
|
|
case ID_POPUP_FORMAT:
|
|
break;
|
|
|
|
case ID_POPUP_LANGUAGE:
|
|
{
|
|
// Now Let's try to insert document direction menu if applicable
|
|
VARIANTARG v = {0};
|
|
HRESULT hr;
|
|
hr = m_pCmdTarget->Exec(&CGID_ShellDocView,SHDVID_GETDOCDIRMENU, OLECMDEXECOPT_DODEFAULT, NULL, &v);
|
|
if (S_OK == hr)
|
|
{
|
|
MENUITEMINFOW mii;
|
|
HMENU hmenuDocDir = (HMENU)IntToPtr(v.lVal);
|
|
UINT uItemDir = 0, uItem = GetMenuItemCount(hmenuPopup);
|
|
WCHAR wszText[MAX_PATH];
|
|
|
|
ZeroMemory(&mii, sizeof(MENUITEMINFO));
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.cbSize = sizeof(MENUITEMINFO);
|
|
mii.fMask = MIIM_TYPE;
|
|
mii.fType = MFT_SEPARATOR;
|
|
|
|
InsertMenuItemWrapW(hmenuPopup, (UINT)uItem, TRUE, &mii);
|
|
|
|
mii.fMask = MIIM_CHECKMARKS|MIIM_DATA|MIIM_ID|MIIM_STATE|MIIM_SUBMENU|MIIM_TYPE;
|
|
mii.fType = MFT_STRING;
|
|
mii.dwTypeData = wszText;
|
|
mii.cch = MAX_PATH;
|
|
|
|
while (GetMenuItemInfoWrapW(hmenuDocDir, uItemDir, TRUE, &mii))
|
|
{
|
|
mii.wID = ID_DOCDIR_LTR + uItemDir;
|
|
mii.fType |= MFT_RADIOCHECK;
|
|
mii.cch = ARRAYSIZE(wszText);
|
|
InsertMenuItemWrapW(hmenuPopup, (UINT)(uItemDir + uItem + 1), TRUE, &mii);
|
|
uItemDir++;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ID_POPUP_INSERT:
|
|
UpdateInsertMenu(hmenuPopup);
|
|
break;
|
|
|
|
case ID_POPUP_EDIT:
|
|
UpdateEditMenu(hmenuPopup);
|
|
break;
|
|
|
|
case ID_POPUP_VIEW:
|
|
UpdateViewMenu(hmenuPopup);
|
|
break;
|
|
|
|
case ID_POPUP_TOOLS:
|
|
break;
|
|
|
|
}
|
|
}
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrWMMenuSelect(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
TCHAR szRes[CCHMAX_STRINGRES];
|
|
|
|
if (!m_pStatus)
|
|
return S_FALSE;
|
|
|
|
if (LOWORD(wParam)>=ID_LANG_FIRST && LOWORD(wParam) <= ID_LANG_LAST)
|
|
{
|
|
m_pStatus->ShowSimpleText(MAKEINTRESOURCE(idsViewLanguageGeneralHelp));
|
|
return S_OK;
|
|
}
|
|
|
|
if (LOWORD(wParam)>=ID_FORMAT_FIRST && LOWORD(wParam)<=ID_FORMAT_LAST)
|
|
{
|
|
// ~~~ did I choose the correct item for idsFmtTagGeneralHelp
|
|
m_pStatus->ShowSimpleText(MAKEINTRESOURCE(ID_HELP_CONTENTS));
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrCheckColor()
|
|
{
|
|
HRESULT hr;
|
|
INT iFound = -1;
|
|
DWORD dwRGB;
|
|
|
|
hr = ExecGetI4(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDCOLOR, &dwRGB);
|
|
if (0 == dwRGB)
|
|
iFound = 0;
|
|
else
|
|
iFound = GetColorIndex(dwRGB) - 1;
|
|
|
|
CheckMenuRadioItem(m_hmenuColor, ID_FORMAT_COLOR1, ID_FORMAT_COLOR16, ID_FORMAT_COLOR1 + iFound, MF_BYCOMMAND);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrWMDrawMenuItem(HWND hwnd, LPDRAWITEMSTRUCT pdis)
|
|
{
|
|
// There is a bug in win95 that will sign extend the ID so that the
|
|
// hiword is filled with FFFF. Take the low word of the ID to work
|
|
// around this.
|
|
UINT id = LOWORD(pdis->itemID);
|
|
|
|
if (id >= ID_FORMAT_COLOR1 && id <=ID_FORMAT_COLOR16)
|
|
Color_WMDrawItem(pdis, iColorMenu);
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrWMMeasureMenuItem(HWND hwnd, LPMEASUREITEMSTRUCT pmis)
|
|
{
|
|
HDC hdc;
|
|
UINT id = pmis->itemID;
|
|
|
|
if (id >= ID_FORMAT_COLOR1 && id <=ID_FORMAT_COLOR16)
|
|
{
|
|
hdc = GetDC(hwnd);
|
|
if(hdc)
|
|
{
|
|
Color_WMMeasureItem(hdc, pmis, iColorMenu);
|
|
ReleaseDC( hwnd, hdc );
|
|
}
|
|
}
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrBackgroundImage()
|
|
{
|
|
WCHAR wszURL[INTERNET_MAX_URL_LENGTH+10];
|
|
LPWSTR pwszBackName;
|
|
HRESULT hr = S_OK;
|
|
|
|
*wszURL = 0;
|
|
hr = ExecGetTextW(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDIMAGE, &pwszBackName);
|
|
// ~~~ MimeEdit returns E_FAIL if no image found. MimeEdit will change to return S_OK is this case
|
|
// Once it is changed can delete these lines.
|
|
if (E_FAIL == hr)
|
|
hr = S_OK;
|
|
|
|
IF_FAILEXIT(hr);
|
|
|
|
if (pwszBackName != NULL)
|
|
StrCpyNW(wszURL, pwszBackName, INTERNET_MAX_URL_LENGTH);
|
|
|
|
if(DialogBoxParamWrapW(g_hLocRes, MAKEINTRESOURCEW(iddBkImage), m_hwnd, BkImageDlgProc, (LPARAM)wszURL)==IDCANCEL)
|
|
{
|
|
hr = S_OK;
|
|
goto exit;
|
|
}
|
|
|
|
// nothing has been changed, so do nothing.
|
|
if ((pwszBackName!=NULL && StrCmpIW(pwszBackName, wszURL)==0) ||
|
|
// there is no background at all.
|
|
(pwszBackName==NULL && lstrlenW(wszURL)==0))
|
|
goto exit;
|
|
|
|
InsertStationeryDir(wszURL);
|
|
|
|
hr = ExecSetTextW(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDIMAGE, wszURL);
|
|
|
|
exit:
|
|
MemFree(pwszBackName);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrWMCommand(HWND hwnd, int id, WORD wCmd)
|
|
{
|
|
DWORD dwStdCmd = 0,
|
|
dwMECmd = 0,
|
|
dwF3Cmd = 0;
|
|
DWORD dw;
|
|
ULONG cmdf;
|
|
|
|
if(!m_pCmdTarget)
|
|
return S_FALSE;
|
|
|
|
// commands that don't care if we're UI Active
|
|
|
|
if (id >= ID_FORMAT_COLOR1 && id <= ID_FORMAT_COLOR16)
|
|
{
|
|
int index = id - ID_FORMAT_COLOR1;
|
|
ExecSetI4(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDCOLOR, rgrgbColors16[index]);
|
|
return S_OK;
|
|
}
|
|
|
|
switch(id)
|
|
{
|
|
case ID_INSERT_TEXT:
|
|
HrInsertTextFileFromDialog();
|
|
return S_OK;
|
|
|
|
case ID_SOURCE_EDIT:
|
|
// toggle stat
|
|
cmdf=0;
|
|
QuerySingleMimeEditCmd(MECMDID_SHOWSOURCETABS, &cmdf);
|
|
dw = !(cmdf & OLECMDF_LATCHED);
|
|
SetDwOption(OPT_VIEWSOURCETABS, dw, 0, 0);
|
|
ExecSetBool(&CMDSETID_MimeEdit, MECMDID_SHOWSOURCETABS, dw);
|
|
return S_OK;
|
|
|
|
case ID_SAVE_ATTACHMENTS:
|
|
case ID_NOTE_SAVE_ATTACHMENTS:
|
|
dwMECmd = MECMDID_SAVEATTACHMENTS;
|
|
break;
|
|
|
|
case ID_PRINT:
|
|
case ID_PRINT_NOW:
|
|
HrPrint(id == ID_PRINT);
|
|
return S_OK;
|
|
|
|
case ID_SAVE_STATIONERY:
|
|
case ID_NOTE_SAVE_STATIONERY:
|
|
HrSaveAsStationery(NULL);
|
|
return S_OK;
|
|
|
|
case ID_UNSCRAMBLE:
|
|
HrPerformROT13Encoding();
|
|
return S_OK;
|
|
|
|
case ID_VIEW_MSG_SOURCE:
|
|
HrViewSource(MECMD_VS_MESSAGE);
|
|
return S_OK;
|
|
|
|
case ID_VIEW_SOURCE:
|
|
HrViewSource(MECMD_VS_HTML);
|
|
return S_OK;
|
|
|
|
case ID_BACKGROUND_SOUND:
|
|
HrBackgroundSound();
|
|
return S_OK;
|
|
|
|
case ID_BACKGROUND_PICTURE:
|
|
HrBackgroundImage();
|
|
return S_OK;
|
|
|
|
case ID_FIND_TEXT:
|
|
dwStdCmd = OLECMDID_FIND;
|
|
break;
|
|
|
|
case ID_FONTS_DIALOG:
|
|
dwMECmd = MECMDID_FORMATFONT;
|
|
break;
|
|
|
|
case ID_FORMAT_PARADLG:
|
|
dwMECmd = MECMDID_FORMATPARAGRAPH;
|
|
break;
|
|
|
|
case ID_FONTS_LARGEST:
|
|
case ID_FONTS_LARGE:
|
|
case ID_FONTS_MEDIUM:
|
|
case ID_FONTS_SMALL:
|
|
case ID_FONTS_SMALLEST:
|
|
dwF3Cmd = IDM_BASELINEFONT1 + id - ID_FONTS_SMALLEST;
|
|
break;
|
|
|
|
case ID_FONTS_FIXED:
|
|
m_fFixedFont = !m_fFixedFont;
|
|
if (m_fFixedFont)
|
|
ExecSetBool(&CMDSETID_MimeEdit, MECMDID_DOWNGRADEPLAINTEXT, TRUE);
|
|
else
|
|
m_pPrstMime->Load(m_pMsg);
|
|
return S_OK;
|
|
|
|
case ID_DOCDIR_LTR:
|
|
dwF3Cmd = IDM_DIRLTR;
|
|
break;
|
|
case ID_DOCDIR_RTL:
|
|
dwF3Cmd = IDM_DIRRTL;
|
|
break;
|
|
}
|
|
|
|
// commands that are only applicable to UI if we're UIActive
|
|
if(m_fUIActive)
|
|
{
|
|
if ((ID_INSERT_SIGNATURE == id) || (id >= ID_SIGNATURE_FIRST && id <= ID_SIGNATURE_LAST))
|
|
{
|
|
HrInsertSignature(id);
|
|
return S_OK;
|
|
}
|
|
|
|
if (id >= ID_FORMAT_FIRST && id <= ID_FORMAT_LAST)
|
|
{
|
|
TCHAR szBuf[MAX_PATH];
|
|
*szBuf = 0;
|
|
GetMenuString(m_hmenuStyle, id, szBuf, MAX_PATH, MF_BYCOMMAND);
|
|
Assert(*szBuf);//should not be empty
|
|
|
|
SideAssert(ExecSetText(&CMDSETID_Forms3, IDM_BLOCKFMT, szBuf) == S_OK);
|
|
return S_OK;
|
|
}
|
|
|
|
switch(id)
|
|
{
|
|
case ID_PASTE:
|
|
if(HrPasteToAttachment()!=S_OK)
|
|
dwStdCmd = OLECMDID_PASTE;
|
|
break;
|
|
|
|
case ID_EDIT_LINK:
|
|
return m_pCmdTarget->Exec(&CMDSETID_Forms3, IDM_HYPERLINK,
|
|
OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
|
|
|
|
case ID_SELECT_ALL:
|
|
dwStdCmd = OLECMDID_SELECTALL;
|
|
break;
|
|
|
|
case ID_CUT:
|
|
dwStdCmd = OLECMDID_CUT;
|
|
break;
|
|
|
|
case ID_COPY:
|
|
dwStdCmd = OLECMDID_COPY;
|
|
break;
|
|
|
|
case ID_NOTE_COPY:
|
|
dwStdCmd = OLECMDID_COPY;
|
|
break;
|
|
|
|
case ID_UNDO:
|
|
dwStdCmd = OLECMDID_UNDO;
|
|
break;
|
|
|
|
case ID_REDO:
|
|
dwStdCmd = OLECMDID_REDO;
|
|
break;
|
|
|
|
case ID_UNLINK:
|
|
dwF3Cmd = IDM_UNLINK;
|
|
break;
|
|
|
|
case ID_INSERT_PICTURE:
|
|
dwF3Cmd = IDM_IMAGE;
|
|
break;
|
|
|
|
case ID_INSERT_LINE:
|
|
dwF3Cmd = IDM_HORIZONTALLINE;
|
|
break;
|
|
|
|
case ID_INDENT_INCREASE:
|
|
dwF3Cmd = IDM_INDENT;
|
|
break;
|
|
|
|
case ID_INDENT_DECREASE:
|
|
dwF3Cmd = IDM_OUTDENT;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
// Catch all standard group commands and execute them
|
|
if (dwStdCmd)
|
|
{
|
|
ExecCommand(NULL, dwStdCmd);
|
|
return S_OK;
|
|
}
|
|
|
|
// Catch all MimeEdit group commands and execute them
|
|
else if (dwMECmd)
|
|
{
|
|
ExecCommand(&CMDSETID_MimeEdit, dwMECmd);
|
|
return S_OK;
|
|
}
|
|
|
|
// Catch all Forms3 group commands and execute them
|
|
else if (dwF3Cmd)
|
|
{
|
|
ExecCommand(&CMDSETID_Forms3, dwF3Cmd);
|
|
return S_OK;
|
|
}
|
|
|
|
return OLECMDERR_E_NOTSUPPORTED;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrPasteToAttachment()
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrGetWindow(HWND *pHwnd)
|
|
{
|
|
if(pHwnd==NULL)
|
|
return E_INVALIDARG;
|
|
|
|
*pHwnd=m_hwnd;
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetSize(LPRECT prc)
|
|
{
|
|
SetWindowPos(m_hwnd, NULL, prc->left, prc->top, prc->right-prc->left, prc->bottom-prc->top, SWP_NOZORDER);
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrMarkAsRead()
|
|
{
|
|
// ignore if already read
|
|
if(!m_fMarkedRead && !m_fSecDispInfo)
|
|
{
|
|
if (m_pEventSink)
|
|
m_pEventSink->EventOccurred(MEHC_CMD_MARK_AS_READ, NULL);
|
|
m_fMarkedRead=TRUE;
|
|
}
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::OnWMTimer()
|
|
{
|
|
// user has been looking at the message for >2 secs,
|
|
// mark message as read now.
|
|
DOUTL(4, "MAR: Timer:: messages marked as read now");
|
|
KillTimer(m_hwnd, idTimerMarkAsRead);
|
|
HrMarkAsRead();
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetNoSecUICallback(DWORD dwCookie, PFNNOSECUI pfnNoSecUI)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetDragSource(BOOL fIsSource)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrTranslateAccelerator(LPMSG lpMsg)
|
|
{
|
|
|
|
// this code will attempt to get ctrl-tab working in source-view
|
|
// problem is we uideactivate trident and our host doesn't call our
|
|
// translateaccel is we're not uiactive. so we have to fudge activation.
|
|
// I turned off for beta1
|
|
if (lpMsg->message == WM_KEYDOWN &&
|
|
(lpMsg->wParam == VK_TAB) &&
|
|
(GetKeyState(VK_CONTROL)&0x8000))
|
|
{
|
|
// if showing the TAB's then control-tab should cycle them
|
|
CycleSrcTabs(!(GetKeyState(VK_SHIFT)&0x8000));
|
|
return S_OK;
|
|
}
|
|
|
|
if (!m_fUIActive || !m_pInPlaceActiveObj)
|
|
return S_FALSE;
|
|
|
|
return m_pInPlaceActiveObj->TranslateAccelerator(lpMsg);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrUIActivate(BOOL fActivate)
|
|
{
|
|
HRESULT hr=NOERROR;
|
|
|
|
if (m_pDocView)
|
|
hr = m_pDocView->UIActivate(fActivate);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetUIActivate()
|
|
{
|
|
|
|
SetFocus(m_hwndDocObj);
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrFrameActivate(BOOL fActivate)
|
|
{
|
|
IOleInPlaceActiveObject *pIPAO;
|
|
|
|
// we QI mimeedit to make sure we always pass it the frame activates so it can disable sound playing
|
|
// we can't use m_pInPlaceObject as it's only sent when we're UIActive.
|
|
if (m_lpOleObj &&
|
|
m_lpOleObj->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pIPAO)==S_OK)
|
|
{
|
|
pIPAO->OnFrameWindowActivate(fActivate);
|
|
pIPAO->Release();
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrHasFocus()
|
|
{
|
|
return m_fUIActive ? S_OK : S_FALSE;
|
|
}
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::EnableStandardCmd(UINT idm, LPBOOL pbEnable)
|
|
{
|
|
OLECMD cmdEdit;
|
|
|
|
Assert(pbEnable);
|
|
|
|
cmdEdit.cmdf=0;
|
|
|
|
switch(idm)
|
|
{
|
|
case ID_CUT:
|
|
cmdEdit.cmdID = OLECMDID_CUT;
|
|
break;
|
|
|
|
case ID_NOTE_COPY:
|
|
case ID_COPY:
|
|
cmdEdit.cmdID = OLECMDID_COPY;
|
|
break;
|
|
|
|
case ID_PASTE:
|
|
cmdEdit.cmdID = OLECMDID_PASTE;
|
|
break;
|
|
|
|
case ID_SELECT_ALL:
|
|
cmdEdit.cmdID = OLECMDID_SELECTALL;
|
|
break;
|
|
|
|
case ID_UNDO:
|
|
cmdEdit.cmdID = OLECMDID_UNDO;
|
|
break;
|
|
|
|
default:
|
|
// Should never get here.
|
|
Assert(FALSE);
|
|
}
|
|
|
|
if (m_pCmdTarget && SUCCEEDED(m_pCmdTarget->QueryStatus(NULL, 1, &cmdEdit, NULL)))
|
|
*pbEnable = (cmdEdit.cmdf & OLECMDF_ENABLED);
|
|
}
|
|
|
|
|
|
// ********************************************
|
|
// HrRegisterNotify:
|
|
//
|
|
// Purpose:
|
|
// Generic version of HrRegisterLoadNotify. This allows
|
|
// a client (like CSecMsgService) to give enough information
|
|
// to become an event sink
|
|
// Takes:
|
|
// fRegister - TRUE if we're calling Advise
|
|
// szElement - [OPTIONAL] if given, we'll get that IHTMLElement
|
|
// and use it for the IConnectionPointContainer
|
|
// riidSink - IID for the connection point to find
|
|
// pUnkSink - IUnknown of our sink object
|
|
// pdwCookie - [OUT] cookie needed for Unadvise
|
|
// Returns:
|
|
// Trident HRs.
|
|
//
|
|
HRESULT CMimeEditDocHost::HrRegisterNotify(
|
|
BOOL fRegister,
|
|
LPCTSTR szElement,
|
|
REFIID riidSink,
|
|
IUnknown *pUnkSink,
|
|
DWORD *pdwCookie)
|
|
{
|
|
IConnectionPointContainer *pCPContainer=0;
|
|
IConnectionPoint *pCP=0;
|
|
IHTMLElement *pElem=0;
|
|
HRESULT hr;
|
|
|
|
if (!m_pDoc || !pdwCookie)
|
|
return E_POINTER;
|
|
if (fRegister && !pUnkSink)
|
|
return E_POINTER;
|
|
|
|
if (szElement)
|
|
{
|
|
hr = HrGetElement(szElement, &pElem);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pElem->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPContainer);
|
|
pElem->Release();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = m_pDoc->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPContainer);
|
|
}
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
hr = pCPContainer->FindConnectionPoint(riidSink, &pCP);
|
|
pCPContainer->Release();
|
|
if (FAILED(hr))
|
|
goto error;
|
|
|
|
if (fRegister)
|
|
{
|
|
Assert(*pdwCookie == 0);
|
|
|
|
hr = pCP->Advise(pUnkSink, pdwCookie);
|
|
if (FAILED(hr))
|
|
goto error;
|
|
}
|
|
else if (*pdwCookie)
|
|
{
|
|
hr = pCP->Unadvise(*pdwCookie);
|
|
*pdwCookie = NULL;
|
|
}
|
|
|
|
error:
|
|
ReleaseObj(pCP);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::RegisterForHTMLDocEvents(BOOL fOn)
|
|
{
|
|
if (fOn == !!m_fRegisteredForDocEvents)
|
|
return S_OK;
|
|
|
|
m_fRegisteredForDocEvents = !!fOn;
|
|
|
|
return HrRegisterNotify(fOn, NULL, DIID_HTMLDocumentEvents2,
|
|
fOn ? ((IUnknown *)(IDispatch *)this) : NULL,
|
|
&m_dwHTMLNotifyCookie);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::PublicFilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
|
|
{
|
|
IDocHostUIHandler *pDHHand = NULL;
|
|
IServiceProvider *pSP = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
// RAID 12020. Need to get IDocHostUIHandler of the body obj
|
|
hr = m_lpOleObj->QueryInterface(IID_IServiceProvider, (LPVOID*)&pSP);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pSP->QueryService(IID_IDocHostUIHandler, IID_IDocHostUIHandler, (LPVOID*)&pDHHand);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pDHHand->FilterDataObject(pDO, ppDORet);
|
|
pDHHand->Release();
|
|
}
|
|
pSP->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSaveAttachment()
|
|
{
|
|
return ExecCommand(&CMDSETID_MimeEdit, MECMDID_SAVEATTACHMENTS);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HrSetBkGrndPicture(LPTSTR pszPicture)
|
|
{
|
|
return ExecSetText(&CMDSETID_MimeEdit, MECMDID_BACKGROUNDIMAGE, pszPicture);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ShowContextMenu(
|
|
DWORD dwID,
|
|
POINT *ppt,
|
|
IUnknown *pcmdtReserved,
|
|
IDispatch *pdispReserved)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::GetHostInfo(DOCHOSTUIINFO *pInfo)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ShowUI(DWORD dwID, IOleInPlaceActiveObject *pActiveObject,
|
|
IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::HideUI()
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::UpdateUI()
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::EnableModeless(BOOL fActivate)
|
|
{
|
|
// we don't have to support this, as any disable on a toplevel causes thread
|
|
// windows to get disabled anyway
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::OnDocWindowActivate(BOOL fActivate)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::OnFrameWindowActivate(BOOL fActivate)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw)
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
// dupW uses CoTaskMemAlloc
|
|
StrCpyN(szPath, MU_GetRegRoot(), ARRAYSIZE(szPath));
|
|
StrCatBuff(szPath, c_szTrident, ARRAYSIZE(szPath));
|
|
|
|
*pchKey = PszToUnicode(CP_ACP, szPath);
|
|
if (szPath && !(*pchKey))
|
|
return (TraceResult(E_OUTOFMEMORY));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
|
|
{
|
|
BOOL fEditModeOn = FALSE;
|
|
if (FAILED(HrIsEditMode(&fEditModeOn)) || !fEditModeOn)
|
|
return S_FALSE;
|
|
|
|
*ppDropTarget = (IDropTarget*)SendMessage(GetParent(m_hwnd), NWM_GETDROPTARGET, (WPARAM)pDropTarget, 0);
|
|
return NOERROR;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::GetExternal(IDispatch **ppDispatch)
|
|
{
|
|
return QueryInterface(IID_IDispatch, (LPVOID *)ppDispatch);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::FilterDataObject( IDataObject *pDO, IDataObject **ppDORet)
|
|
{
|
|
return MIMEEDIT_E_DODEFAULT;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::OnChanged(DISPID dispid)
|
|
{
|
|
if (dispid == DISPID_READYSTATE)
|
|
OnReadyStateChanged();
|
|
return S_OK;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::OnRequestEdit (DISPID dispid)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::OnDocumentReady()
|
|
{
|
|
NMHDR nmhdr;
|
|
|
|
// Bug 74697
|
|
// Under certain circumstances, Darwin causes Trident to send us IDM_PARSECOMPLETE
|
|
// when we don't even have a message. To prevent spurious errors, bail out.
|
|
if (!m_pMsg)
|
|
return;
|
|
|
|
if(m_fSecDispInfo)
|
|
{
|
|
VARIANTARG va;
|
|
|
|
if(!m_pCmdTarget)
|
|
return;
|
|
|
|
if(m_pCmdTarget->Exec(&CMDSETID_MimeEdit, MECMDID_STYLE, OLECMDEXECOPT_DODEFAULT, NULL, &va)==S_OK &&
|
|
va.lVal == MESTYLE_PREVIEW)
|
|
return;
|
|
|
|
ExecSetBool(&CMDSETID_MimeEdit, MECMDID_TABLINKS, TRUE);
|
|
|
|
return;
|
|
}
|
|
|
|
nmhdr.hwndFrom = m_hwnd;
|
|
nmhdr.idFrom = GetDlgCtrlID(m_hwnd);
|
|
nmhdr.code = BDN_DOWNLOADCOMPLETE;
|
|
SendMessage(GetParent(m_hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecGetBool(const GUID *guid, DWORD cmd, BOOL *pfValue)
|
|
{
|
|
VARIANTARG var;
|
|
V_VT(&var) = VT_BOOL;
|
|
|
|
if (!m_pCmdTarget)
|
|
return E_FAIL;
|
|
|
|
HRESULT hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var);
|
|
if (SUCCEEDED(hr))
|
|
*pfValue = (VARIANT_TRUE == V_BOOL(&var)) ? TRUE : FALSE;
|
|
else
|
|
*pfValue = FALSE;
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecSetBool(const GUID *guid, DWORD cmd, BOOL fValue)
|
|
{
|
|
VARIANTARG var;
|
|
|
|
if (!m_pCmdTarget)
|
|
return E_FAIL;
|
|
|
|
V_VT(&var) = VT_BOOL;
|
|
V_BOOL(&var) = fValue ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
return m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL);
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecGetI4(const GUID *guid, DWORD cmd, DWORD *pdwValue)
|
|
{
|
|
VARIANTARG var;
|
|
HRESULT hr;
|
|
V_VT(&var) = VT_I4;
|
|
|
|
hr = m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var) : E_FAIL;
|
|
|
|
*pdwValue = (SUCCEEDED(hr) ? V_I4(&var) : 0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecSetI4(const GUID *guid, DWORD cmd, DWORD dwValue)
|
|
{
|
|
|
|
VARIANTARG var;
|
|
V_VT(&var) = VT_I4;
|
|
V_I4(&var) = dwValue;
|
|
|
|
return m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL) : E_FAIL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecGetI8(const GUID *guid, DWORD cmd, ULONGLONG *pullValue)
|
|
{
|
|
VARIANTARG var;
|
|
HRESULT hr;
|
|
V_VT(&var) = VT_I8;
|
|
|
|
hr = m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var) : E_FAIL;
|
|
|
|
*pullValue = (SUCCEEDED(hr) ? V_UNION(&var, ullVal) : 0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecSetI8(const GUID *guid, DWORD cmd, ULONGLONG ullValue)
|
|
{
|
|
|
|
VARIANTARG var;
|
|
V_VT(&var) = VT_I8;
|
|
V_UNION(&var, ullVal) = ullValue;
|
|
|
|
return m_pCmdTarget ? m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL) : E_FAIL;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecSetText(const GUID *guid, DWORD cmd, LPSTR psz)
|
|
{
|
|
BSTR bstr = NULL;
|
|
VARIANTARG var;
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!m_pCmdTarget)
|
|
IF_FAILEXIT(hr = E_FAIL);
|
|
|
|
IF_FAILEXIT(hr = HrLPSZToBSTR(psz, &bstr));
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = bstr;
|
|
|
|
IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL));
|
|
|
|
exit:
|
|
SysFreeString(bstr);
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecSetTextW(const GUID *guid, DWORD cmd, LPWSTR pwsz)
|
|
{
|
|
BSTR bstr = NULL;
|
|
VARIANTARG var;
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!m_pCmdTarget)
|
|
IF_FAILEXIT(hr = E_FAIL);
|
|
|
|
IF_NULLEXIT(bstr = SysAllocString(pwsz));
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = bstr;
|
|
|
|
IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, &var, NULL));
|
|
|
|
exit:
|
|
SysFreeString(bstr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecGetText(const GUID *guid, DWORD cmd, LPSTR *ppsz)
|
|
{
|
|
VARIANTARG var;
|
|
HRESULT hr = S_OK;
|
|
|
|
if (!m_pCmdTarget)
|
|
IF_FAILEXIT(hr = E_FAIL);
|
|
|
|
*ppsz = NULL;
|
|
|
|
IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var));
|
|
|
|
Assert(V_VT(&var) == VT_BSTR);
|
|
hr = HrBSTRToLPSZ(CP_ACP, V_BSTR(&var), ppsz);
|
|
SysFreeString(V_BSTR(&var));
|
|
|
|
IF_FAILEXIT(hr);
|
|
|
|
exit:
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecGetTextW(const GUID *guid, DWORD cmd, LPWSTR *ppwsz)
|
|
{
|
|
VARIANTARG var;
|
|
HRESULT hr = S_OK;
|
|
|
|
V_VT(&var) = VT_EMPTY;
|
|
|
|
if (!m_pCmdTarget)
|
|
IF_FAILEXIT(hr = E_FAIL);
|
|
|
|
*ppwsz = NULL;
|
|
|
|
IF_FAILEXIT(hr = m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, &var));
|
|
|
|
Assert(V_VT(&var) == VT_BSTR);
|
|
IF_NULLEXIT(*ppwsz = PszDupW(V_BSTR(&var)));
|
|
|
|
exit:
|
|
if (VT_EMPTY != V_VT(&var))
|
|
SysFreeString(V_BSTR(&var));
|
|
return hr;
|
|
}
|
|
|
|
// ********************************************
|
|
HRESULT CMimeEditDocHost::ExecCommand(const GUID *guid, DWORD cmd)
|
|
{
|
|
if (!m_pCmdTarget)
|
|
return E_FAIL;
|
|
|
|
return m_pCmdTarget->Exec(guid, cmd, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
|
}
|
|
|
|
// ********************************************
|
|
void CMimeEditDocHost::OnReadyStateChanged()
|
|
{
|
|
// MimeEdit keeps track of state for us. Left
|
|
// this in in case there is a need to have it
|
|
// in the future.
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::HrHandsOffStorage()
|
|
{
|
|
if (m_pMsg)
|
|
m_pMsg->HandsOffStorage();
|
|
if (m_pSecureMessage)
|
|
m_pSecureMessage->HandsOffStorage();
|
|
if (m_pSecurityErrorScreen)
|
|
m_pSecurityErrorScreen->HandsOffStorage();
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::HrRefresh()
|
|
{
|
|
if (m_pCmdTarget)
|
|
ExecCommand(NULL, OLECMDID_REFRESH);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT CMimeEditDocHost::HrBackgroundSound()
|
|
{
|
|
return ExecCommand(&CMDSETID_MimeEdit, MECMDID_INSERTBGSOUND);
|
|
}
|
|
|
|
|
|
HRESULT CMimeEditDocHost::QuerySingleMimeEditCmd(ULONG uCmd, ULONG *pcmdf)
|
|
{
|
|
OLECMD cmd={uCmd, 0};
|
|
|
|
if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_MimeEdit, 1, &cmd, NULL))
|
|
{
|
|
*pcmdf = cmd.cmdf;
|
|
return S_OK;
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::QuerySingleFormsCmd(ULONG uCmd, ULONG *pcmdf)
|
|
{
|
|
OLECMD cmd={uCmd, 0};
|
|
|
|
if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(&CMDSETID_Forms3, 1, &cmd, NULL))
|
|
{
|
|
*pcmdf = cmd.cmdf;
|
|
return S_OK;
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::QuerySingleStdCmd(ULONG uCmd, ULONG *pcmdf)
|
|
{
|
|
OLECMD cmd={uCmd, 0};
|
|
|
|
if (m_pCmdTarget && S_OK==m_pCmdTarget->QueryStatus(NULL, 1, &cmd, NULL))
|
|
{
|
|
*pcmdf = cmd.cmdf;
|
|
return S_OK;
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IDispatch
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// This is a really lightweight IDispatch implementation. We only expect
|
|
// to get invoked. Trident will call IDispatch::Invoke with the dispID
|
|
// of the event that happened or property that changed.
|
|
|
|
STDMETHODIMP CMimeEditDocHost::GetIDsOfNames(
|
|
REFIID riid,
|
|
OLECHAR ** rgszNames,
|
|
UINT cNames,
|
|
LCID lcid,
|
|
DISPID * rgDispId)
|
|
{
|
|
if (cNames==1 && StrCmpIW(rgszNames[0], L"hotmail")==0)
|
|
{
|
|
rgDispId[0] = 666;
|
|
return S_OK;
|
|
}
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CMimeEditDocHost::GetTypeInfo(
|
|
UINT /*iTInfo*/,
|
|
LCID /*lcid*/,
|
|
ITypeInfo **ppTInfo)
|
|
{
|
|
if (ppTInfo)
|
|
*ppTInfo=NULL;
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CMimeEditDocHost::GetTypeInfoCount(UINT *pctinfo)
|
|
{
|
|
if (pctinfo)
|
|
{
|
|
*pctinfo=0;
|
|
return NOERROR;
|
|
}
|
|
else
|
|
return E_POINTER;
|
|
}
|
|
|
|
STDMETHODIMP CMimeEditDocHost::Invoke(
|
|
DISPID dispIdMember,
|
|
REFIID /*riid*/,
|
|
LCID /*lcid*/,
|
|
WORD wFlags,
|
|
DISPPARAMS FAR* /*pDispParams*/,
|
|
VARIANT * pVarResult,
|
|
EXCEPINFO * /*pExcepInfo*/,
|
|
UINT * /*puArgErr*/)
|
|
{
|
|
IHTMLWindow2 *pWindow=0;
|
|
IHTMLEventObj *pEvent=0;
|
|
IHTMLElement *pElem=0;
|
|
BSTR bstr=0;
|
|
HRESULT hr=E_NOTIMPL;
|
|
|
|
|
|
if (dispIdMember == 666 &&
|
|
wFlags & DISPATCH_PROPERTYGET)
|
|
{
|
|
// hotmail on/off for welcome message
|
|
pVarResult->vt = VT_BOOL;
|
|
pVarResult->boolVal = HideHotmail() ? VARIANT_FALSE : VARIANT_TRUE;
|
|
return S_OK;
|
|
}
|
|
// Currently we only care about the button clicks.
|
|
if (dispIdMember == DISPID_HTMLDOCUMENTEVENTS_ONCLICK &&
|
|
(wFlags & DISPATCH_METHOD))
|
|
{
|
|
// Order of events:
|
|
// document gives us window gives us event object
|
|
// the event object can tell us which button was clicked
|
|
// event gives us source element gives us ID
|
|
// a couple lstrcmps will tell us which one got hit
|
|
if (!m_pDoc)
|
|
return E_UNEXPECTED;
|
|
|
|
m_pDoc->get_parentWindow(&pWindow);
|
|
if (pWindow)
|
|
{
|
|
pWindow->get_event(&pEvent);
|
|
if (pEvent)
|
|
{
|
|
pEvent->get_srcElement(&pElem);
|
|
if (pElem)
|
|
{
|
|
pElem->get_id(&bstr);
|
|
if (bstr)
|
|
{
|
|
hr = HandleButtonClicks(bstr);
|
|
SysFreeString(bstr);
|
|
}
|
|
pElem->Release();
|
|
}
|
|
pEvent->Release();
|
|
}
|
|
pWindow->Release();
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::SetEventSink(IMimeEditEventSink *pEventSink)
|
|
{
|
|
ReplaceInterface(m_pEventSink, pEventSink);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
typedef struct tagCOMMANDSTRUCT {
|
|
WCHAR *string;
|
|
DWORD id;
|
|
} COMMANDSTRUCT, *LPCOMMANDSTRUCT;
|
|
|
|
COMMANDSTRUCT rgszCmdStrings[] =
|
|
{
|
|
{L"btnOpen", MEHC_BTN_OPEN},
|
|
{L"btnCert", MEHC_BTN_CERT},
|
|
{L"btnTrust", MEHC_BTN_TRUST},
|
|
{L"btnContinue", MEHC_BTN_CONTINUE},
|
|
{L"cmdConnect", MEHC_CMD_CONNECT},
|
|
{L"cmdDownload", MEHC_CMD_DOWNLOAD},
|
|
};
|
|
|
|
HRESULT CMimeEditDocHost::HandleButtonClicks(BSTR bstr)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
LPCOMMANDSTRUCT prg = rgszCmdStrings;
|
|
DWORD cmdID=0;
|
|
BOOL fFound = FALSE;
|
|
|
|
Assert(bstr);
|
|
|
|
for (int i = 0; i < ARRAYSIZE(rgszCmdStrings); i++, prg++)
|
|
{
|
|
if (!StrCmpW(prg->string, bstr))
|
|
{
|
|
cmdID = prg->id;
|
|
fFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (fFound)
|
|
{
|
|
// The notification needs to happen after the preview pane
|
|
// updates. Since there's no notifications here that actually
|
|
// return anything but S_FALSE I think this is pretty safe.
|
|
// -- From "The famous last words of Steve Serdy"
|
|
switch (cmdID)
|
|
{
|
|
case MEHC_BTN_OPEN:
|
|
hr = DoHtmlBtnOpen();
|
|
// Now we need update toolbar
|
|
m_pEventSink->EventOccurred(cmdID, NULL);
|
|
break;
|
|
|
|
case MEHC_BTN_CERT:
|
|
case MEHC_BTN_TRUST:
|
|
hr = DoHtmlBtnCertTrust(cmdID);
|
|
break;
|
|
|
|
case MEHC_BTN_CONTINUE:
|
|
hr = DoHtmlBtnContinue();
|
|
break;
|
|
|
|
default:
|
|
hr = E_NOTIMPL;
|
|
}
|
|
|
|
if (m_pEventSink && (cmdID != MEHC_BTN_OPEN))
|
|
hr = m_pEventSink->EventOccurred(cmdID, NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::DoHtmlBtnOpen(void)
|
|
{
|
|
IHTMLElement * pElem = NULL;
|
|
HRESULT hr;
|
|
|
|
m_fSecDispInfo = FALSE;
|
|
// this process is non-critical; don't save errors
|
|
HrGetElementImpl(m_pDoc, c_szHTMLIDchkShowAgain, &pElem);
|
|
if (pElem)
|
|
{
|
|
VARIANT_BOOL boolVal;
|
|
|
|
HrGetSetCheck(FALSE, pElem, &boolVal);
|
|
SafeRelease(pElem);
|
|
|
|
if (VARIANT_TRUE == boolVal)
|
|
{
|
|
NMHDR nmhdr;
|
|
|
|
nmhdr.hwndFrom=m_hwnd;
|
|
nmhdr.idFrom=GetDlgCtrlID(m_hwnd);
|
|
nmhdr.code=BDN_MARKASSECURE;
|
|
SendMessage(GetParent(m_hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
|
|
}
|
|
}
|
|
|
|
AssertSz(m_pSecureMessage, "Secure message should be set at this point");
|
|
hr = InternalLoad(m_pSecureMessage);
|
|
SafeRelease(m_pSecureMessage);
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::DoHtmlBtnCertTrust(DWORD cmdID)
|
|
{
|
|
IMimeBody *pRoot = NULL;
|
|
HRESULT hr = S_OK;
|
|
HBODY hBody = NULL;
|
|
SECSTATE SecState ={0};
|
|
|
|
if(FAILED(HrGetSecurityState(m_pSecureMessage, &SecState, &hBody)))
|
|
return(hr);
|
|
|
|
CleanupSECSTATE(&SecState);
|
|
|
|
AssertSz(m_pSecureMessage, "Should have a secure message if getting Cert or Trust");
|
|
hr = m_pSecureMessage->BindToObject(hBody ? hBody : HBODY_ROOT, IID_IMimeBody, (void**)&pRoot);
|
|
if (pRoot)
|
|
{
|
|
PROPVARIANT var;
|
|
HCERTSTORE hcStore = NULL;
|
|
|
|
#ifdef _WIN64
|
|
if (SUCCEEDED(pRoot->GetOption(OID_SECURITY_HCERTSTORE_64, &var)) && (var.vt == VT_UI8))
|
|
hcStore = (HCERTSTORE)(var.pulVal);
|
|
|
|
hr = pRoot->GetOption(OID_SECURITY_CERT_SIGNING_64, &var);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((PCCERT_CONTEXT)(var.pulVal))
|
|
{
|
|
if (MEHC_BTN_CERT == cmdID)
|
|
// View digital Cert was clicked
|
|
hr = ViewCertificate((PCCERT_CONTEXT)(var.pulVal), hcStore);
|
|
else
|
|
// Edit Trust was clicked
|
|
hr = EditTrust((PCCERT_CONTEXT)(var.pulVal), hcStore);
|
|
|
|
CertFreeCertificateContext((PCCERT_CONTEXT)(var.pulVal));
|
|
}
|
|
}
|
|
#else // !_WIN64
|
|
if (SUCCEEDED(pRoot->GetOption(OID_SECURITY_HCERTSTORE, &var)) && (var.vt == VT_UI4))
|
|
hcStore = (HCERTSTORE)var.ulVal;
|
|
hr = pRoot->GetOption(OID_SECURITY_CERT_SIGNING, &var);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((PCCERT_CONTEXT)var.ulVal)
|
|
{
|
|
if (MEHC_BTN_CERT == cmdID)
|
|
// View digital Cert was clicked
|
|
hr = ViewCertificate((PCCERT_CONTEXT)var.ulVal, hcStore);
|
|
else
|
|
// Edit Trust was clicked
|
|
hr = EditTrust((PCCERT_CONTEXT)var.ulVal, hcStore);
|
|
|
|
CertFreeCertificateContext((PCCERT_CONTEXT )var.ulVal);
|
|
}
|
|
}
|
|
#endif // _WIN64
|
|
SafeRelease(pRoot);
|
|
if (hcStore)
|
|
CertCloseStore(hcStore, 0);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CMimeEditDocHost::HrScrollPage()
|
|
{
|
|
IHTMLWindow2 *pWindow=0;
|
|
IHTMLBodyElement *pBody;
|
|
IHTMLElement2 *pElem;
|
|
LONG cyClientHeight=0,
|
|
cyScrollTop=0,
|
|
cyScrollHeight=0;
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if (m_pDoc)
|
|
m_pDoc->get_parentWindow(&pWindow);
|
|
|
|
if (pWindow)
|
|
{
|
|
if (HrGetBodyElement(m_pDoc, &pBody)==S_OK)
|
|
{
|
|
if (pBody->QueryInterface(IID_IHTMLElement2, (LPVOID *)&pElem)==S_OK)
|
|
{
|
|
pElem->get_clientHeight(&cyClientHeight);
|
|
pElem->get_scrollTop(&cyScrollTop);
|
|
pElem->get_scrollHeight(&cyScrollHeight);
|
|
|
|
if (!(cyScrollTop + cyClientHeight >= cyScrollHeight))
|
|
{
|
|
pWindow->scrollBy(0, cyClientHeight);
|
|
hr = S_OK;
|
|
}
|
|
|
|
pElem->Release();
|
|
}
|
|
pBody->Release();
|
|
}
|
|
pWindow->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CMimeEditDocHost::DoHtmlBtnContinue(void)
|
|
{
|
|
HRESULT hr;
|
|
IHTMLElement *pElem = NULL;
|
|
|
|
// this process is non-critical; don't save errors
|
|
HrGetElementImpl(m_pDoc, c_szHTMLIDchkShowAgain, &pElem);
|
|
if (pElem)
|
|
{
|
|
VARIANT_BOOL boolVal;
|
|
|
|
HrGetSetCheck(FALSE, pElem, &boolVal);
|
|
if (VARIANT_TRUE == boolVal)
|
|
{
|
|
if (m_fIsSigned)
|
|
SetDontShowAgain(1, c_szDSDigSigHelp);
|
|
if (m_fIsEncrypted)
|
|
SetDontShowAgain(1, c_szDSEncryptHelp);
|
|
}
|
|
|
|
pElem->Release();
|
|
}
|
|
|
|
if (m_pSecurityErrorScreen)
|
|
{
|
|
m_fSecDispInfo = TRUE;
|
|
hr = InternalLoad(m_pSecurityErrorScreen);
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
}
|
|
else
|
|
{
|
|
m_fSecDispInfo = FALSE;
|
|
AssertSz(m_pSecureMessage, "Secure message should be set at this point.");
|
|
hr = InternalLoad(m_pSecureMessage);
|
|
RegisterForHTMLDocEvents(FALSE);
|
|
SafeRelease(m_pSecureMessage);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CopySecurePropsToMessage(IMimeMessage *pDestMsg, IMimePropertySet *pPropSet)
|
|
{
|
|
IMimePropertySet *pNewProps = NULL;
|
|
HRESULT hr;
|
|
|
|
hr = pDestMsg->BindToObject(HBODY_ROOT, IID_IMimePropertySet, (LPVOID *)&pNewProps);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pPropSet->CopyProps(0, NULL, pNewProps);
|
|
pNewProps->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
LPCSTR rgszHdrKeep[] = {
|
|
PIDTOSTR(PID_HDR_NEWSGROUP),
|
|
PIDTOSTR(PID_HDR_NEWSGROUPS),
|
|
PIDTOSTR(PID_HDR_SUBJECT),
|
|
PIDTOSTR(PID_HDR_FROM),
|
|
PIDTOSTR(PID_HDR_APPARTO),
|
|
PIDTOSTR(PID_HDR_DATE),
|
|
PIDTOSTR(PID_HDR_REPLYTO),
|
|
PIDTOSTR(PID_HDR_TO),
|
|
PIDTOSTR(PID_HDR_CC),
|
|
PIDTOSTR(PID_HDR_APPROVED),
|
|
PIDTOSTR(PID_HDR_DISTRIB),
|
|
PIDTOSTR(PID_HDR_KEYWORDS),
|
|
PIDTOSTR(PID_HDR_ORG),
|
|
PIDTOSTR(PID_HDR_XMSPRI),
|
|
PIDTOSTR(PID_HDR_XPRI),
|
|
PIDTOSTR(PID_HDR_COMMENT),
|
|
PIDTOSTR(PID_HDR_SENDER)};
|
|
|
|
HRESULT CMimeEditDocHost::LoadSecurely(IMimeMessage *pMsg, SECSTATE *pSecState)
|
|
{
|
|
HRESULT hr=S_OK;
|
|
BOOL fNeedIntroScreen = FALSE,
|
|
fNeedErrorScreen = FALSE,
|
|
fRegisterDispatch = FALSE;
|
|
LPCTSTR szIntroResName=NULL;
|
|
IMimeMessage *pSecurityIntroScreen = NULL;
|
|
DWORD dwFlags = 0;
|
|
|
|
// Since we are reloading, go ahead and free the original secure message if there is one.
|
|
SafeRelease(m_pSecureMessage);
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
|
|
// N2 delete schema
|
|
if (g_dwSecurityCheckedSchemaProp)
|
|
{
|
|
PROPVARIANT var;
|
|
var.vt = VT_UI4;
|
|
if (SUCCEEDED(pMsg->GetBodyProp(HBODY_ROOT, PIDTOSTR(g_dwSecurityCheckedSchemaProp), 0, &var)))
|
|
{
|
|
if (1 == var.lVal)
|
|
goto LoadMessage;
|
|
}
|
|
}
|
|
|
|
m_pBodyOptions->GetFlags(&dwFlags);
|
|
|
|
if(!m_fSecureReceipt)
|
|
{
|
|
if (0 == (dwFlags & BOPT_SECURITYUIENABLED))
|
|
goto LoadMessage;
|
|
|
|
if (m_fIsSigned)
|
|
{
|
|
// don't need warning UI if the cert is trusted and the message is okay
|
|
fNeedErrorScreen = (!m_fSignTrusted && !(dwFlags & BOPT_REPLYORFORWARD));
|
|
|
|
// If sig is valid, we should update any certs and SMIMECapabilities in the address book.
|
|
if (m_fSignTrusted && (DwGetOption(OPT_AUTO_ADD_SENDERS_CERT_TO_WAB)))
|
|
{
|
|
FILETIME ftNull = {0};
|
|
|
|
HrAddSenderCertToWab(NULL, pMsg, NULL, NULL, NULL, ftNull, WFF_CREATE);
|
|
}
|
|
|
|
// check for help UI
|
|
szIntroResName = c_szDigSigHelpHTML;
|
|
fNeedIntroScreen = ((0 == DwGetDontShowAgain(c_szDSDigSigHelp)) && !(dwFlags & BOPT_REPLYORFORWARD));
|
|
}
|
|
|
|
if (m_fIsEncrypted)
|
|
{
|
|
fNeedErrorScreen |= (!m_fEncryptionOK && !(dwFlags & BOPT_REPLYORFORWARD));
|
|
|
|
// If want signed intro, don't need to test this one.
|
|
if (!fNeedIntroScreen)
|
|
fNeedIntroScreen = ((0 == DwGetDontShowAgain(c_szDSEncryptHelp)) && !(dwFlags & BOPT_REPLYORFORWARD));
|
|
|
|
szIntroResName = (m_fIsSigned ? c_szSAndEHelpHTML : c_szEncryptHelpHTML);
|
|
}
|
|
|
|
// Bug 2557 - prevent error screen when secure reciept request
|
|
if(pSecState->type & MST_RECEIPT_REQUEST)
|
|
fNeedIntroScreen = FALSE;
|
|
|
|
if (fNeedIntroScreen && szIntroResName)
|
|
{
|
|
// Since this is only for the opening screen, if things error, allow
|
|
// the user to continue. In order to allow this, will use a temporary hr.
|
|
HRESULT tempHR;
|
|
IStream *pStm = NULL;
|
|
|
|
tempHR = LoadResourceToHTMLStream(szIntroResName, &pStm);
|
|
if (SUCCEEDED(tempHR))
|
|
tempHR = HrCreateMessage(&pSecurityIntroScreen);
|
|
if (SUCCEEDED(tempHR))
|
|
tempHR = pSecurityIntroScreen->Load(pStm);
|
|
|
|
ReleaseObj(pStm);
|
|
|
|
// If there was an error, don't show the screen and NULL the var
|
|
if (FAILED(tempHR))
|
|
SafeRelease(pSecurityIntroScreen);
|
|
}
|
|
|
|
if (fNeedErrorScreen)
|
|
{
|
|
// If have problems here, must exit. Can't show message before showing
|
|
// this error screen.
|
|
IStream *pStm = NULL;
|
|
|
|
// Disable check box if message not from the store.
|
|
hr = HrOutputSecurityScript(&pStm, pSecState, (0 == (BOPT_FROMSTORE & dwFlags)));
|
|
|
|
if (SUCCEEDED(hr))
|
|
hr = HrCreateMessage(&m_pSecurityErrorScreen);
|
|
|
|
if (SUCCEEDED(hr))
|
|
hr = m_pSecurityErrorScreen->Load(pStm);
|
|
|
|
ReleaseObj(pStm);
|
|
|
|
if (FAILED(hr))
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
IImnAccount * pAcct = NULL;
|
|
TCHAR *pszSubject = NULL;
|
|
TCHAR *pszFrom = NULL;
|
|
FILETIME ftSigningTime;
|
|
FILETIME ftSentTime;
|
|
IStream *pStm = NULL;
|
|
|
|
SECSTATE secStateRec = {0};
|
|
// DWORD dw = 0;
|
|
|
|
// Get account for receipt
|
|
if(m_pBodyOptions->GetAccount(&pAcct) == S_OK)
|
|
{
|
|
// Find original meassage and get information from receipt and orig msg
|
|
hr = HandleSecReceipt(pMsg, pAcct, m_hwnd, &pszSubject, &pszFrom, &ftSentTime, &ftSigningTime);
|
|
}
|
|
else
|
|
hr = MIME_E_SECURITY_RECEIPT_CANTFINDSENTITEM;
|
|
|
|
HrGetSecurityState(pMsg, &secStateRec, NULL);
|
|
m_fSignTrusted = !!IsSignTrusted(&secStateRec);
|
|
|
|
if(hr == S_OK)
|
|
hr = HrOutputSecureReceipt(&pStm, pszSubject, pszFrom, &ftSentTime, &ftSigningTime, &secStateRec);
|
|
else if(hr == MIME_S_RECEIPT_FROMMYSELF)
|
|
hr = HrOutputUserSecureReceipt(&pStm, pMsg);
|
|
else
|
|
hr = HrOutputErrSecReceipt(&pStm, hr, &secStateRec);
|
|
|
|
// Display receipt
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
hr = HrCreateMessage(&m_pSecurityErrorScreen);
|
|
}
|
|
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
#ifdef YST
|
|
HBODY hBody = 0;
|
|
ReplaceInterface(m_pSecurityErrorScreen, pMsg);
|
|
m_pSecurityErrorScreen->SetTextBody(TXT_HTML, IET_CURRENT, NULL, pStm, &hBody);
|
|
HrRemoveAttachments(m_pSecurityErrorScreen, FALSE);
|
|
#endif // YST
|
|
hr = m_pSecurityErrorScreen->Load(pStm);
|
|
}
|
|
|
|
ReleaseObj(pStm);
|
|
|
|
if (FAILED(hr))
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
|
|
// If sig is valid, we should update any certs and SMIMECapabilities in the address book.
|
|
if (m_fSignTrusted && (DwGetOption(OPT_AUTO_ADD_SENDERS_CERT_TO_WAB)))
|
|
{
|
|
FILETIME ftNull = {0};
|
|
|
|
HrAddSenderCertToWab(NULL, pMsg, NULL, NULL, NULL, ftNull, WFF_CREATE);
|
|
}
|
|
|
|
CleanupSECSTATE(&secStateRec);
|
|
SafeMemFree(pszSubject);
|
|
SafeMemFree(pszFrom);
|
|
ReleaseObj(pAcct);
|
|
}
|
|
|
|
// Reset m_pSecureMessage before continue
|
|
if(m_pSecureMessage)
|
|
SafeRelease(m_pSecureMessage);
|
|
|
|
// If we didn't get any errors and we have some screens
|
|
// to add, copy props from original message into other screens
|
|
if (SUCCEEDED(hr) && (m_pSecurityErrorScreen || pSecurityIntroScreen))
|
|
{
|
|
IMimePropertySet *pPropSet = NULL;
|
|
|
|
fRegisterDispatch = TRUE;
|
|
ReplaceInterface(m_pSecureMessage, pMsg);
|
|
|
|
// Move over the headers
|
|
// If the bind fails, don't worry about it. Just means the headers won't be
|
|
// visable until the normal message is loaded.
|
|
if (SUCCEEDED(m_pSecureMessage->BindToObject(HBODY_ROOT, IID_IMimePropertySet, (LPVOID *)&pPropSet)))
|
|
{
|
|
IMimePropertySet *pCopyProps = NULL;
|
|
if (SUCCEEDED(pPropSet->Clone(&pCopyProps)))
|
|
{
|
|
if (SUCCEEDED(pCopyProps->DeleteExcept(ARRAYSIZE(rgszHdrKeep), rgszHdrKeep)))
|
|
{
|
|
if (pSecurityIntroScreen)
|
|
CopySecurePropsToMessage(pSecurityIntroScreen, pCopyProps);
|
|
if (SUCCEEDED(hr) && m_pSecurityErrorScreen)
|
|
CopySecurePropsToMessage(m_pSecurityErrorScreen, pCopyProps);
|
|
}
|
|
pCopyProps->Release();
|
|
}
|
|
pPropSet->Release();
|
|
}
|
|
|
|
// need to init the property
|
|
//N8 talk to Opie about this schema thing.
|
|
// I didn't understand the property concept when I did this. It
|
|
// works fine, but is too big a hammer for the job.
|
|
if (SUCCEEDED(hr) && !g_dwSecurityCheckedSchemaProp)
|
|
{
|
|
IMimePropertySchema *pSchema = NULL;
|
|
|
|
hr = MimeOleGetPropertySchema(&pSchema);
|
|
if (SUCCEEDED(hr))
|
|
hr = pSchema->RegisterProperty("Y-SecurityChecked", 0, 0, VT_LPSTR, &g_dwSecurityCheckedSchemaProp);
|
|
if (pSchema)
|
|
pSchema->Release();
|
|
}
|
|
}
|
|
|
|
LoadMessage:
|
|
if(m_fSecureReceipt)
|
|
{
|
|
m_fSecDispInfo = FALSE;
|
|
if(m_pSecurityErrorScreen)
|
|
hr = InternalLoad(m_pSecurityErrorScreen);
|
|
// Free all mems
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
}
|
|
else if (SUCCEEDED(hr))
|
|
{
|
|
if (pSecurityIntroScreen)
|
|
{
|
|
m_fSecDispInfo = TRUE;
|
|
hr = InternalLoad(pSecurityIntroScreen);
|
|
SafeRelease(pSecurityIntroScreen);
|
|
|
|
}
|
|
else if (m_pSecurityErrorScreen)
|
|
{
|
|
m_fSecDispInfo = TRUE;
|
|
hr = InternalLoad(m_pSecurityErrorScreen);
|
|
SafeRelease(m_pSecurityErrorScreen);
|
|
}
|
|
else if (m_pSecureMessage)
|
|
{
|
|
m_fSecDispInfo = FALSE;
|
|
hr = InternalLoad(m_pSecureMessage);
|
|
SafeRelease(m_pSecureMessage);
|
|
}
|
|
else
|
|
{
|
|
m_fSecDispInfo = FALSE;
|
|
Assert(!m_pSecurityErrorScreen && !pSecurityIntroScreen);
|
|
hr = InternalLoad(pMsg);
|
|
}
|
|
if (fRegisterDispatch)
|
|
RegisterForHTMLDocEvents(TRUE);
|
|
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CMimeEditDocHost::CycleSrcTabs(BOOL fFwd)
|
|
{
|
|
ExecSetI4(&CMDSETID_MimeEdit, MECMDID_SETSOURCETAB, fFwd ? MEST_NEXT : MEST_PREVIOUS);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CMimeEditDocHost::HrEnableScrollBars(BOOL fEnable)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IHTMLBodyElement *pBody = NULL;
|
|
BSTR bstrValue = NULL;
|
|
|
|
if (m_pDoc)
|
|
{
|
|
IF_FAILEXIT(hr = m_pDoc->get_body((IHTMLElement**)&pBody));
|
|
|
|
if (fEnable)
|
|
{
|
|
bstrValue = SysAllocString(L"yes");
|
|
}
|
|
else
|
|
{
|
|
bstrValue = SysAllocString(L"no");
|
|
}
|
|
|
|
hr = pBody->put_scroll(bstrValue);
|
|
}
|
|
|
|
exit:
|
|
|
|
ReleaseObj(pBody);
|
|
SysFreeString(bstrValue);
|
|
return hr;
|
|
}
|