Windows2003-3790/inetcore/outlookexpress/msoert/mshtutil.cpp
2020-09-30 16:53:55 +02:00

280 lines
7.6 KiB
C++

/*
* m s h t u t i l . c p p
*
* Purpose:
* MSHTML utilities
*
* History
*
* Copyright (C) Microsoft Corp. 1995, 1996.
*/
#include <pch.hxx>
#include <imm.h>
#include "dllmain.h"
#include "urlmon.h"
#include "wininet.h"
#include "mshtml.h"
#include "mshtmcid.h"
#include "mshtmhst.h"
#include "demand.h"
#include <shlwapi.h>
#include <BadStrFunctions.h>
ASSERTDATA
/*
* t y p e d e f s
*/
/*
* m a c r o s
*/
/*
* c o n s t a n t s
*/
/*
* g l o b a l s
*/
/*
* p r o t o t y p e s
*/
HRESULT HrCheckTridentMenu(IUnknown *pUnkTrident, ULONG uMenu, ULONG idmFirst, ULONG idmLast, HMENU hMenu)
{
HRESULT hr = S_OK;
if (pUnkTrident == NULL)
return E_INVALIDARG;
switch (uMenu)
{
case TM_TAGMENU:
{
IOleCommandTarget *pCmdTarget = NULL;
VARIANTARG va;
// uncheck stuff incase of failure
CheckMenuRadioItem(hMenu, idmFirst, idmLast, 0, MF_BYCOMMAND|MF_UNCHECKED);
hr = pUnkTrident->QueryInterface(IID_IOleCommandTarget, (LPVOID *)&pCmdTarget);
if (FAILED(hr))
break;
va.vt = VT_BSTR;
va.bstrVal = NULL;
if(SUCCEEDED(pCmdTarget->Exec(&CMDSETID_Forms3, IDM_BLOCKFMT, MSOCMDEXECOPT_DONTPROMPTUSER, NULL, &va)))
{
TCHAR szBufMenu[MAX_PATH];
TCHAR szBufTag[MAX_PATH];
ULONG cmenus = (ULONG)GetMenuItemCount(hMenu);
*szBufTag = 0;
*szBufMenu = 0;
if (va.vt == VT_BSTR && va.bstrVal)
{
WideCharToMultiByte(CP_ACP, 0, (WCHAR*)va.bstrVal, -1, szBufTag, MAX_PATH, NULL, NULL);
szBufTag[MAX_PATH - 1] = 0;
SysFreeString(va.bstrVal);
}
// find the right one in the tag menu to put a radio button.
for(ULONG i = idmFirst; i < cmenus+idmFirst; i++)
{
GetMenuString(hMenu, i, szBufMenu, MAX_PATH, MF_BYCOMMAND);
if(0 == StrCmpI(szBufMenu, szBufTag))
{
CheckMenuRadioItem(hMenu, idmFirst, idmLast, i, MF_BYCOMMAND);
break;
}
}
}
pCmdTarget->Release();
break;
}
default:
hr = E_FAIL;
}
return hr;
}
HRESULT HrCreateTridentMenu(IUnknown *pUnkTrident, ULONG uMenu, ULONG idmFirst, ULONG cMaxItems, HMENU *phMenu)
{
HRESULT hr = NOERROR;
VARIANTARG va;
LONG lLBound,
lUBound,
lIndex;
BSTR bstr;
TCHAR szBuf[CCHMAX_STRINGRES];
SAFEARRAY *psa;
ULONG idmTag=idmFirst;
HMENU hmenu;
IOleCommandTarget *pCmdTarget;
if (phMenu == NULL || pUnkTrident == NULL)
return E_INVALIDARG;
hmenu = CreatePopupMenu();
if (hmenu == NULL)
return E_OUTOFMEMORY;
switch (uMenu)
{
case TM_TAGMENU:
hr = pUnkTrident->QueryInterface(IID_IOleCommandTarget, (LPVOID *)&pCmdTarget);
if (SUCCEEDED(hr))
{
va.vt = VT_ARRAY;
va.parray = NULL;
hr = pCmdTarget->Exec(&CMDSETID_Forms3, IDM_GETBLOCKFMTS, MSOCMDEXECOPT_DONTPROMPTUSER, NULL, &va);
if (SUCCEEDED(hr))
{
psa = V_ARRAY(&va);
SafeArrayGetLBound(psa, 1, &lLBound);
SafeArrayGetUBound(psa, 1, &lUBound);
for (lIndex=lLBound; lIndex<=lUBound; lIndex++)
{
if (idmTag == idmFirst + cMaxItems) // don't append to many
break;
if (SafeArrayGetElement(psa, &lIndex, &bstr)==S_OK)
{
if(WideCharToMultiByte(CP_ACP, 0, bstr, -1, szBuf, CCHMAX_STRINGRES, NULL, NULL))
AppendMenu(hmenu, MF_STRING | MF_BYCOMMAND, idmTag++, (LPCTSTR)szBuf);
szBuf[CCHMAX_STRINGRES - 1] = 0;
SysFreeString(bstr);
}
}
SafeArrayDestroy(psa);
}
pCmdTarget->Release();
}
break;
default:
hr = E_FAIL;
}
if (hr==S_OK)
*phMenu = hmenu;
return hr;
}
HRESULT HrGetElementImpl(IHTMLDocument2 *pDoc, LPCTSTR pszName, IHTMLElement **ppElem)
{
HRESULT hr = E_FAIL;
IHTMLElementCollection *pCollect = NULL;
IDispatch *pDisp = NULL;
VARIANTARG va1, va2;
if (pDoc)
{
pDoc->get_all(&pCollect);
if (pCollect)
{
if (SUCCEEDED(HrLPSZToBSTR(pszName, &va1.bstrVal)))
{
va1.vt = VT_BSTR;
va2.vt = VT_EMPTY;
pCollect->item(va1, va2, &pDisp);
if (pDisp)
{
hr = pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)ppElem);
pDisp->Release();
}
SysFreeString(va1.bstrVal);
}
pCollect->Release();
}
}
return hr;
}
HRESULT HrGetBodyElement(IHTMLDocument2 *pDoc, IHTMLBodyElement **ppBody)
{
HRESULT hr=E_FAIL;
IHTMLElement *pElem=0;
if (ppBody == NULL)
return E_INVALIDARG;
*ppBody = 0;
if (pDoc)
{
pDoc->get_body(&pElem);
if (pElem)
{
hr = pElem->QueryInterface(IID_IHTMLBodyElement, (LPVOID *)ppBody);
pElem->Release();
}
}
return hr;
}
HRESULT HrSetDirtyFlagImpl(LPUNKNOWN pUnkTrident, BOOL fDirty)
{
VARIANTARG va;
IOleCommandTarget *pCmdTarget;
if (!pUnkTrident)
return E_INVALIDARG;
if (pUnkTrident->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&pCmdTarget)==S_OK)
{
va.vt = VT_BOOL;
va.boolVal = fDirty?VARIANT_TRUE:VARIANT_FALSE;
pCmdTarget->Exec(&CMDSETID_Forms3, IDM_SETDIRTY, MSOCMDEXECOPT_DONTPROMPTUSER, &va, NULL);
pCmdTarget->Release();
}
return S_OK;
}
HRESULT HrGetStyleSheet(IHTMLDocument2 *pDoc, IHTMLStyleSheet **ppStyle)
{
IHTMLStyleSheetsCollection *pStyleSheets;
IHTMLStyleSheet *pStyle;
VARIANTARG va1, va2;
HRESULT hr=E_FAIL;
if (pDoc == NULL || ppStyle == NULL)
return E_INVALIDARG;
*ppStyle=NULL;
if (pDoc->get_styleSheets(&pStyleSheets)==S_OK)
{
va1.vt = VT_I4;
va1.lVal = (LONG)0;
va2.vt = VT_EMPTY;
pStyleSheets->item(&va1, &va2);
if (va2.vt == VT_DISPATCH && va2.pdispVal)
hr = va2.pdispVal->QueryInterface(IID_IHTMLStyleSheet, (LPVOID *)ppStyle);
pStyleSheets->Release();
}
// not found, let's create a new one
if (*ppStyle==NULL)
hr = pDoc->createStyleSheet(NULL, -1, ppStyle);
return hr;
}