Windows2003-3790/inetcore/connectionwizard/icwutil/site.cpp
2020-09-30 16:53:55 +02:00

1382 lines
42 KiB
C++

//**********************************************************************
// File name: SITE.CPP
//
// Implementation file for COleSite
//
// Functions:
//
// See SITE.H for class definition
//
// Copyright (c) 1992 - 1996 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "pre.h"
extern BOOL CopyBitmapRectToFile
(
HBITMAP hbm,
LPRECT lpRect,
LPTSTR lpszFileName
);
#include "exdispid.h"
#define SETDefFormatEtc(fe, cf, med) \
{\
(fe).cfFormat=cf;\
(fe).dwAspect=DVASPECT_CONTENT;\
(fe).ptd=NULL;\
(fe).tymed=med;\
(fe).lindex=-1;\
};
#define MAX_DISP_NAME 50
#define DISPID_RunIcwTutorApp 12345
typedef struct dispatchList_tag
{
WCHAR szName[MAX_DISP_NAME];
int cName;
DWORD dwDispID;
} DISPATCHLIST;
DISPATCHLIST ExternalInterface[] =
{
{L"RunIcwTutorApplication", 22, DISPID_RunIcwTutorApp }
};
const TCHAR cszOLSNewText[] = TEXT("g_spnOlsNewText");
const TCHAR cszOLSOldText[] = TEXT("g_spnOlsOldText");
//**********************************************************************
//
// OleFree
//
// Purpose:
//
// free memory using the currently active IMalloc* allocator
//
// Parameters:
//
// LPVOID pmem - pointer to memory allocated using IMalloc
//
// Return Value:
//
// None
//
// Comments:
//
//********************************************************************
void OleFree(LPVOID pmem)
{
LPMALLOC pmalloc;
if (pmem == NULL)
return;
if (FAILED(CoGetMalloc(MEMCTX_TASK, &pmalloc)))
return;
pmalloc->Free(pmem);
pmalloc->Release();
}
//**********************************************************************
//
// COleSite::COleSite
//
// Purpose:
//
// Constructor for COleSite
//
// Parameters:
//
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// Comments:
//
//********************************************************************
#pragma warning(disable : 4355) // turn off this warning. This warning
// tells us that we are passing this in
// an initializer, before "this" is through
// initializing. This is ok, because
// we just store the ptr in the other
// constructors
COleSite::COleSite (void) : m_OleClientSite(this) ,
m_OleInPlaceSite(this),
m_OleInPlaceFrame(this)
#pragma warning (default : 4355) // Turn the warning back on
{
TCHAR szTempPath[MAX_PATH];
// Init member vars
m_lpInPlaceObject = NULL;
m_lpOleObject = NULL;
m_hwndIPObj = NULL;
m_hWnd = NULL;
m_fInPlaceActive = FALSE;
m_dwHtmPageType = 0;
m_hbmBkGrnd = NULL;
lstrcpyn(m_szForeGrndColor, HTML_DEFAULT_COLOR, MAX_COLOR_NAME);
lstrcpyn(m_szBkGrndColor, HTML_DEFAULT_BGCOLOR, MAX_COLOR_NAME);
m_bUseBkGndBitmap = FALSE;
m_dwDrawAspect = DVASPECT_CONTENT; // clear the reference count
m_cRef = 0; // Init the ref count
// Create a temp file for storing the background bitmap
if (GetTempPath(sizeof(szTempPath)/sizeof(TCHAR), szTempPath))
{
GetTempFileName(szTempPath, TEXT("ICW"), 0, m_szBkGndBitmapFile);
}
// Create a storage file for creating/embedding an OLE oject into this site
StgCreateDocfile (NULL,
STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE,
0,
&m_lpStorage);
}
//**********************************************************************
//
// COleSite::~COleSite
//
// Purpose:
//
// Destructor for COleSite
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// IOleObject::Release Object
// IStorage::Release OLE API
//
// Comments:
//
//********************************************************************
COleSite::~COleSite ()
{
TraceMsg(TF_GENERAL, "In COleSite's Destructor \r\n");
ASSERT( m_cRef == 0 );
if (m_lpOleObject)
m_lpOleObject->Release();
if (m_lpWebBrowser)
m_lpWebBrowser->Release();
if (m_lpStorage)
{
m_lpStorage->Release();
m_lpStorage = NULL;
}
DeleteFile(m_szBkGndBitmapFile);
}
//**********************************************************************
//
// COleSite::CloseOleObject
//
// Purpose:
//
// Call IOleObject::Close on the object of the COleSite
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// IOleObject::QueryInterface Object
// IOleObject::Close Object
// IOleInPlaceObject::UIDeactivate Object
// IOleInPlaceObject::InPlaceDeactivate Object
// IOleInPlaceObject::Release Object
//
// Comments:
//
//********************************************************************
void COleSite::CloseOleObject (void)
{
TraceMsg(TF_GENERAL, "In COleSite::CloseOleObject \r\n");
if (m_lpOleObject)
{
if (m_fInPlaceActive)
{
LPOLEINPLACEOBJECT lpObject;
LPVIEWOBJECT lpViewObject = NULL;
m_lpOleObject->QueryInterface(IID_IOleInPlaceObject, (LPVOID FAR *)&lpObject);
lpObject->UIDeactivate();
// don't need to worry about inside-out because the object
// is going away.
lpObject->InPlaceDeactivate();
lpObject->Release();
}
m_lpOleObject->Close(OLECLOSE_NOSAVE);
m_hWnd = NULL;
}
}
//**********************************************************************
//
// COleSite::UnloadOleObject
//
// Purpose:
//
// Close and release all pointers to the object of the COleSite
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// COleSite::CloseOleObject SITE.CPP
// IOleObject::QueryInterface Object
// IViewObject::SetAdvise Object
// IViewObject::Release Object
// IStorage::Release OLE API
//
// Comments:
//
//********************************************************************
void COleSite::UnloadOleObject (void)
{
TraceMsg(TF_GENERAL, "In COleSite::UnloadOleObject \r\n");
if (m_lpOleObject)
{
LPVIEWOBJECT lpViewObject;
CloseOleObject(); // ensure object is closed; NOP if already closed
m_lpOleObject->QueryInterface(IID_IViewObject, (LPVOID FAR *)&lpViewObject);
if (lpViewObject)
{
// Remove the view advise
lpViewObject->SetAdvise(m_dwDrawAspect, 0, NULL);
lpViewObject->Release();
}
m_lpOleObject->Release();
m_lpOleObject = NULL;
}
}
//**********************************************************************
//
// COleSite::QueryInterface
//
// Purpose:
//
// Used for interface negotiation of the container Site.
//
// Parameters:
//
// REFIID riid - A reference to the interface that is
// being queried.
//
// LPVOID FAR* ppvObj - An out parameter to return a pointer to
// the interface.
//
// Return Value:
//
// S_OK - The interface is supported.
// S_FALSE - The interface is not supported
//
// Function Calls:
// Function Location
//
// IsEqualIID OLE API
// ResultFromScode OLE API
// COleSite::AddRef OBJ.CPP
// COleClientSite::AddRef IOCS.CPP
// CAdviseSink::AddRef IAS.CPP
//
// Comments:
//
//
//********************************************************************
STDMETHODIMP COleSite::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
{
TraceMsg(TF_GENERAL, "In COleSite::QueryInterface\r\n");
*ppvObj = NULL; // must set out pointer parameters to NULL
if ( riid == IID_IDocHostUIHandler)
{
AddRef();
*ppvObj = this;
return ResultFromScode(S_OK);
}
if ( riid == IID_IUnknown)
{
AddRef();
*ppvObj = this;
return ResultFromScode(S_OK);
}
if ( riid == IID_IOleClientSite)
{
m_OleClientSite.AddRef();
*ppvObj = &m_OleClientSite;
return ResultFromScode(S_OK);
}
if ( riid == IID_IOleInPlaceSite)
{
m_OleInPlaceSite.AddRef();
*ppvObj = &m_OleInPlaceSite;
return ResultFromScode(S_OK);
}
if( (riid == DIID_DWebBrowserEvents) ||
(riid == IID_IDispatch))
{
AddRef();
*ppvObj = (LPVOID)(IUnknown*)(DWebBrowserEvents*)this;
return ResultFromScode(S_OK);
}
// Not a supported interface
return ResultFromScode(E_NOINTERFACE);
}
//**********************************************************************
//
// COleSite::AddRef
//
// Purpose:
//
// Increments the reference count of the container Site.
//
// Parameters:
//
// None
//
// Return Value:
//
// ULONG - The new reference count of the site.
//
// Function Calls:
// Function Location
//
//
// Comments:
//
//********************************************************************
STDMETHODIMP_(ULONG) COleSite::AddRef()
{
TraceMsg(TF_GENERAL, "In COleSite::AddRef\r\n");
return ++m_cRef;
}
//**********************************************************************
//
// COleSite::Release
//
// Purpose:
//
// Decrements the reference count of the container Site
//
// Parameters:
//
// None
//
// Return Value:
//
// ULONG - The new reference count of the Site.
//
// Function Calls:
// Function Location
//
//
// Comments:
//
//********************************************************************
STDMETHODIMP_(ULONG) COleSite::Release()
{
TraceMsg(TF_GENERAL, "In COleSite::Release\r\n");
return --m_cRef;
}
//**********************************************************************
//
// COleSite::CreateBrowserObject
//
// Purpose:
//
// Used to Create a new WebBrowser object (can't be done in the
// constructor).
//
// Parameters:
//
// Return Value:
//
// None
//
// Function Calls:
//
// Comments:
//
//********************************************************************
void COleSite::CreateBrowserObject()
{
HRESULT hr;
SETDefFormatEtc(m_fe, 0, TYMED_NULL);
hr = OleCreate(CLSID_WebBrowser,
IID_IWebBrowser2,
OLERENDER_DRAW,
&m_fe,
&m_OleClientSite,
m_lpStorage,
(LPVOID FAR *)&m_lpWebBrowser);
if (SUCCEEDED(hr))
InitBrowserObject();
IUnknown *pOleSite;
// Get an IUnknow pointer to the site, so I can attach an event sink
QueryInterface(IID_IUnknown, (LPVOID *)&pOleSite);
// Setup to get WebBrowserEvents
ConnectToConnectionPoint(pOleSite,
DIID_DWebBrowserEvents,
TRUE,
(IUnknown *)m_lpWebBrowser,
&m_dwcpCookie,
NULL);
// We can release this instance now, since we have attached the event sink
pOleSite->Release();
}
void COleSite::DestroyBrowserObject()
{
UnloadOleObject();
if (m_lpWebBrowser)
{
m_lpWebBrowser->Release();
m_lpWebBrowser = NULL;
}
}
//**********************************************************************
//
// COleSite::InitBrowserObject
//
// Purpose:
//
// Used to initialize a newly create object (can't be done in the
// constructor).
//
// Parameters:
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// IOleObject::SetHostNames Object
// IOleObject::QueryInterface Object
// IViewObject2::GetExtent Object
// IOleObject::DoVerb Object
// IViewObject::SetAdvise Object
// IViewObject::Release Object
// GetClientRect Windows API
// OleSetContainedObject OLE API
//
// Comments:
//
//********************************************************************
void COleSite::InitBrowserObject()
{
// If we don't have a WebBrowser object to initialize, then bail
if (!m_lpWebBrowser)
return;
// Get An OleObject from the WebBrowser Interface
m_lpWebBrowser->QueryInterface(IID_IOleObject, (LPVOID FAR *)&m_lpOleObject);
// inform object handler/DLL object that it is used in the embedding container's context
OleSetContainedObject(m_lpOleObject, TRUE);
// setup the client setup
m_lpOleObject->SetClientSite(&m_OleClientSite);
}
void COleSite::ConnectBrowserObjectToWindow
(
HWND hWnd,
DWORD dwHtmPageType,
BOOL bUseBkGndBitmap,
HBITMAP hbmBkGrnd,
LPRECT lprcBkGrnd,
LPTSTR lpszclrBkGrnd,
LPTSTR lpszclrForeGrnd
)
{
if (m_hWnd)
{
// Close the OLE Object, which will deactivate it, so we can then reactivate it
// with the new window
CloseOleObject();
}
// Remeber this window handle for later
m_hWnd = hWnd;
m_dwHtmPageType = dwHtmPageType;
m_bUseBkGndBitmap = bUseBkGndBitmap;
m_hbmBkGrnd = hbmBkGrnd;
if (NULL != lpszclrForeGrnd)
lstrcpyn(m_szForeGrndColor, lpszclrForeGrnd, MAX_COLOR_NAME);
if (NULL != lpszclrBkGrnd)
lstrcpyn(m_szBkGrndColor, lpszclrBkGrnd, MAX_COLOR_NAME);
CopyRect(&m_rcBkGrnd, lprcBkGrnd);
InPlaceActivate();
}
void COleSite::ShowHTML()
{
RECT rect;
// we only want to DoVerb(SHOW) if this is an InsertNew object.
// we should NOT DoVerb(SHOW) if the object is created FromFile.
m_lpOleObject->DoVerb( OLEIVERB_SHOW,
NULL,
&m_OleClientSite,
-1,
m_hWnd,
&rect);
}
void COleSite::InPlaceActivate()
{
RECT rect;
m_lpOleObject->DoVerb( OLEIVERB_INPLACEACTIVATE,
NULL,
&m_OleClientSite,
-1,
m_hWnd,
&rect);
}
void COleSite::UIActivate()
{
RECT rect;
m_lpOleObject->DoVerb( OLEIVERB_UIACTIVATE,
NULL,
&m_OleClientSite,
-1,
m_hWnd,
&rect);
}
HRESULT COleSite::TweakHTML( TCHAR* pszFontFace,
TCHAR* pszFontSize,
TCHAR* pszBgColor,
TCHAR* pszForeColor)
{
ASSERT(m_lpWebBrowser);
IWebBrowser2* pwb = m_lpWebBrowser;
HRESULT hr = E_FAIL;
IDispatch* pDisp = NULL;
hr = pwb->get_Document(&pDisp);
// Call might succeed but that dosen't guarantee a valid ptr
if (SUCCEEDED(hr) && pDisp)
{
IHTMLDocument2* pDoc = NULL;
hr = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
if (SUCCEEDED(hr) && pDoc)
{
VARIANT var;
VariantInit(&var);
V_VT(&var) = VT_BSTR;
if (m_bUseBkGndBitmap)
{
// Use A background bitmap
SetHTMLBackground(pDoc, m_hbmBkGrnd, &m_rcBkGrnd);
}
else
{
//Setup the background solid color
var.bstrVal = A2W(pszBgColor);
pDoc->put_bgColor(var);
}
//Setup the Foreground (text) color
var.bstrVal = A2W(pszForeColor);
pDoc->put_fgColor(var);
//now we'll try for the font-face/size
if((NULL != pszFontFace))
{
IHTMLElement* pBody;
//Get the <BODY> from the document
hr = pDoc->get_body(&pBody);
if((SUCCEEDED(hr)) && pBody)
{
IHTMLStyle* pStyle = NULL;
//Cool, now the inline style sheet
hr = pBody->get_style(&pStyle);
if (SUCCEEDED(hr) && pStyle)
{
//Great, now the font-family
hr = pStyle->put_fontFamily(A2W(pszFontFace));
if(SUCCEEDED(hr))
{
//Setup for the font-size
var.bstrVal = A2W(pszFontSize);
//And finally the font-size
hr = pStyle->put_fontSize(var);
}
pStyle->Release();
}
pBody->Release();
}
}
pDoc->Release();
}
pDisp->Release();
}
else
hr = E_FAIL;
return hr;
}
HRESULT COleSite::SetHTMLBackground
(
IHTMLDocument2 *pDoc,
HBITMAP hbm,
LPRECT lpRC
)
{
HRESULT hr = E_FAIL;
IDispatch* pDisp = NULL;
TCHAR szBmpURL[MAX_PATH+10];
// Get the portion of the Bitmap we are interested into a file
if (CopyBitmapRectToFile(hbm, lpRC, m_szBkGndBitmapFile))
{
wsprintf (szBmpURL, TEXT("file://%s"), m_szBkGndBitmapFile);
IHTMLElement* pBody;
//Get the <BODY> from the document
hr = pDoc->get_body(&pBody);
if((SUCCEEDED(hr)) && pBody)
{
IHTMLBodyElement* pBodyElt = NULL;
pBody->QueryInterface(IID_IHTMLBodyElement, (void**)&pBodyElt);
// Set the Background bitmap
hr = pBodyElt->put_background(A2W(szBmpURL));
pBodyElt->Release();
}
}
return (hr);
}
//**********************************************************************
//
// COleSite::GetObjRect
//
// Purpose:
//
// Retrieves the rect of the object in pixels
//
// Parameters:
//
// LPRECT lpRect - Rect structure filled with object's rect in pixels
//
//********************************************************************
void COleSite::GetObjRect(LPRECT lpRect)
{
GetClientRect(m_hWnd, lpRect);
}
// * CConWizSite::GetHostInfo
// *
// * Purpose: Called at initialisation of every instance of Trident.
// *
HRESULT COleSite::GetHostInfo( DOCHOSTUIINFO* pInfo )
{
BSTR wbLoc = NULL;
pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
// Adjust the HTML properties to our liking based on the offer type
// pagetype defs in appdefs.h
switch(m_dwHtmPageType)
{
//YES 3D
case PAGETYPE_BILLING:
case PAGETYPE_ISP_TOS:
case PAGETYPE_MARKETING:
case PAGETYPE_CUSTOMPAY:
{
pInfo->dwFlags = DOCHOSTUIFLAG_DIALOG | DOCHOSTUIFLAG_DISABLE_HELP_MENU;
break;
}
//NO 3D
case PAGETYPE_BRANDED:
case PAGETYPE_ISP_NORMAL:
case PAGETYPE_NOOFFERS:
case PAGETYPE_ISP_FINISH:
case PAGETYPE_ISP_CUSTOMFINISH:
case PAGETYPE_OLS_FINISH:
default:
{
pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_DIALOG | DOCHOSTUIFLAG_SCROLL_NO |
DOCHOSTUIFLAG_DISABLE_HELP_MENU;
break;
}
}
return S_OK;
}
// * CConWizSite::ShowUI
// *
// * Purpose: Called when MSHTML.DLL shows its UI
// *
HRESULT COleSite::ShowUI
(
DWORD dwID,
IOleInPlaceActiveObject * /*pActiveObject*/,
IOleCommandTarget * pCommandTarget,
IOleInPlaceFrame * /*pFrame*/,
IOleInPlaceUIWindow * /*pDoc*/
)
{
// We've already got our own UI in place so just return S_OK
return S_OK;
}
// * CConWizSite::HideUI
// *
// * Purpose: Called when MSHTML.DLL hides its UI
// *
HRESULT COleSite::HideUI(void)
{
return S_OK;
}
// * CConWizSite::UpdateUI
// *
// * Purpose: Called when MSHTML.DLL updates its UI
// *
HRESULT COleSite::UpdateUI(void)
{
return S_OK;
}
// * CConWizSite::EnableModeless
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::EnableModeless
// *
HRESULT COleSite::EnableModeless(BOOL /*fEnable*/)
{
return E_NOTIMPL;
}
// * CConWizSite::OnDocWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnDocWindowActivate
// *
HRESULT COleSite::OnDocWindowActivate(BOOL /*fActivate*/)
{
return E_NOTIMPL;
}
// * CConWizSite::OnFrameWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnFrameWindowActivate
// *
HRESULT COleSite::OnFrameWindowActivate(BOOL /*fActivate*/)
{
return E_NOTIMPL;
}
// * CConWizSite::ResizeBorder
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::ResizeBorder
// *
HRESULT COleSite::ResizeBorder(
LPCRECT /*prcBorder*/,
IOleInPlaceUIWindow* /*pUIWindow*/,
BOOL /*fRameWindow*/)
{
return E_NOTIMPL;
}
// * CConWizSite::ShowContextMenu
// *
// * Purpose: Called when MSHTML.DLL would normally display its context menu
// *
HRESULT COleSite::ShowContextMenu(
DWORD /*dwID*/,
POINT* /*pptPosition*/,
IUnknown* /*pCommandTarget*/,
IDispatch* /*pDispatchObjectHit*/)
{
return S_OK; // We've shown our own context menu. MSHTML.DLL will no longer try to show its own.
}
// * CConWizSite::TranslateAccelerator
// *
// * Purpose: Called from MSHTML.DLL's TranslateAccelerator routines
// *
HRESULT COleSite::TranslateAccelerator(LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID)
{
return ResultFromScode(S_FALSE);
}
// * CConWizSite::GetOptionKeyPath
// *
// * Purpose: Called by MSHTML.DLL to find where the host wishes to store
// * its options in the registry
// *
HRESULT COleSite::GetOptionKeyPath(BSTR* pbstrKey, DWORD)
{
return E_NOTIMPL;
}
STDMETHODIMP COleSite::GetDropTarget(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
{
return E_NOTIMPL;
}
STDMETHODIMP COleSite::GetExternal(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
// return the IDispatch we have for extending the object Model
ASSERT(this);
*ppDispatch = (IDispatch*)this;
return S_OK;
}
STDMETHODIMP COleSite::GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ OLECHAR** rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID* rgDispId)
{
HRESULT hr = ResultFromScode(DISP_E_UNKNOWNNAME);
rgDispId[0] = DISPID_UNKNOWN;
for (int iX = 0; iX < sizeof(ExternalInterface)/sizeof(DISPATCHLIST); iX++)
{
if ( 2 == CompareString( lcid,
NORM_IGNORECASE | NORM_IGNOREWIDTH,
(LPCTSTR)ExternalInterface[iX].szName,
ExternalInterface[iX].cName,
(LPCTSTR)rgszNames[0],
wcslen(rgszNames[0])))
{
rgDispId[0] = ExternalInterface[iX].dwDispID;
hr = NOERROR;
break;
}
}
// Set the disid's for the parameters
if (cNames > 1)
{
// Set a DISPID for function parameters
for (UINT i = 1; i < cNames ; i++)
rgDispId[i] = DISPID_UNKNOWN;
}
return hr;
}
STDMETHODIMP COleSite::TranslateUrl(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
{
return E_NOTIMPL;
}
STDMETHODIMP COleSite::FilterDataObject(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
{
return E_NOTIMPL;
}
HRESULT COleSite::ActivateOLSText(void )
{
LPDISPATCH pDisp = NULL;
// Get the document pointer from this webbrowser.
if (SUCCEEDED(m_lpWebBrowser->get_Document(&pDisp)) && pDisp)
{
IHTMLDocument2* pDoc = NULL;
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc)) && pDoc)
{
IHTMLElementCollection* pColl = NULL;
// retrieve a reference to the ALL collection
if (SUCCEEDED(pDoc->get_all( &pColl )))
{
// Get the two spans we are interested in from the all collection
VARIANT varName;
VariantInit(&varName);
V_VT(&varName) = VT_BSTR;
varName.bstrVal = A2W(cszOLSNewText);
VARIANT varIdx;
varIdx.vt = VT_UINT;
varIdx.lVal = 0;
LPDISPATCH pDispElt = NULL;
// Get the IDispatch for NewText SPAN, and set it to visible
if (SUCCEEDED(pColl->item(varName, varIdx, &pDispElt)) && pDispElt)
{
IHTMLElement* pElt = NULL;
if (SUCCEEDED(pDispElt->QueryInterface( IID_IHTMLElement, (LPVOID*)&pElt )) && pElt)
{
IHTMLStyle *pStyle = NULL;
// Get the style interface for this element, so we can tweak it
if (SUCCEEDED(pElt->get_style(&pStyle)))
{
pStyle->put_visibility(A2W(TEXT("visible")));
pStyle->Release();
}
pElt->Release();
}
pDispElt->Release();
}
pDispElt = NULL;
varName.bstrVal = A2W(cszOLSOldText);
// Get the IDispatch for OldText SPAN, and set it to hidden
if (SUCCEEDED(pColl->item(varName, varIdx, &pDispElt)) && pDispElt)
{
IHTMLElement* pElt = NULL;
if (SUCCEEDED(pDispElt->QueryInterface( IID_IHTMLElement, (LPVOID*)&pElt )) && pElt)
{
IHTMLStyle *pStyle = NULL;
// Get the style interface for this element, so we can tweak it
if (SUCCEEDED(pElt->get_style(&pStyle)))
{
pStyle->put_visibility(A2W(TEXT("hidden")));
pStyle->Release();
}
pElt->Release();
}
pDispElt->Release();
}
pColl->Release();
} // get_all
pDoc->Release();
}
pDisp->Release();
}
return S_OK;
}
//returns true if focus was sucessfully set
BOOL COleSite::TrySettingFocusOnHtmlElement(IUnknown* pUnk)
{
IHTMLControlElement* pControl = NULL;
BOOL bFocusWasSet = FALSE;
if(SUCCEEDED(pUnk->QueryInterface(IID_IHTMLControlElement, (LPVOID*)&pControl)) && pControl)
{
if(SUCCEEDED(pControl->focus()))
bFocusWasSet = TRUE;
pControl->Release();
}
return bFocusWasSet;
}
BOOL COleSite::SetFocusToFirstHtmlInputElement()
{
VARIANT vIndex;
IDispatch* pDisp = NULL;
IDispatch* pDispElement = NULL;
IHTMLDocument2* pDoc = NULL;
IHTMLElementCollection* pColl = NULL;
IHTMLButtonElement* pButton = NULL;
IHTMLInputButtonElement* pInputButton = NULL;
IHTMLInputFileElement* pInputFile = NULL;
IHTMLInputTextElement* pInputText = NULL;
IHTMLSelectElement* pSelect = NULL;
IHTMLTextAreaElement* pTextArea = NULL;
IHTMLOptionButtonElement* pOptionButton = NULL;
VARIANT varNull = { 0 };
long lLen = 0;
BOOL bFocusWasSet = FALSE;
vIndex.vt = VT_UINT;
if (SUCCEEDED(m_lpWebBrowser->get_Document(&pDisp)) && pDisp)
{
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc)) && pDoc)
{
if (SUCCEEDED(pDoc->get_all(&pColl)) && pColl)
{
pColl->get_length(&lLen);
for (int i = 0; i < lLen; i++)
{
vIndex.lVal = i;
pDispElement = NULL;
if(SUCCEEDED(pColl->item(vIndex, varNull, &pDispElement)) && pDispElement)
{
pButton = NULL;
pInputButton = NULL;
pInputFile = NULL;
pInputText = NULL;
pSelect = NULL;
if(SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLButtonElement, (LPVOID*)&pButton)) && pButton)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pButton);
pButton->Release();
}
else if (SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLInputButtonElement, (LPVOID*)&pInputButton)) && pInputButton)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pInputButton);
pInputButton->Release();
}
else if (SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLInputFileElement, (LPVOID*)&pInputFile)) && pInputFile)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pInputFile);
pInputFile->Release();
}
else if (SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLInputTextElement, (LPVOID*)&pInputText)) && pInputText)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pInputText);
pInputText->Release();
}
else if (SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLSelectElement, (LPVOID*)&pSelect)) && pSelect)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pSelect);
pSelect->Release();
}
else if (SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLTextAreaElement, (LPVOID*)&pTextArea)) && pTextArea)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pTextArea);
pTextArea->Release();
}
else if (SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLOptionButtonElement, (LPVOID*)&pOptionButton)) && pOptionButton)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pOptionButton);
pOptionButton->Release();
}
pDispElement->Release();
}
if(bFocusWasSet)
break;
}
pColl->Release();
}
pDoc->Release();
}
pDisp->Release();
}
return bFocusWasSet;
}
BOOL COleSite::SetFocusToHtmlPage()
{
IDispatch* pDisp = NULL;
IHTMLDocument2* pDoc = NULL;
IHTMLElement* pElement = NULL;
BOOL bFocusWasSet = FALSE;
DOCHOSTUIINFO pInfo;
pInfo.cbSize = sizeof(DOCHOSTUIINFO);
if(SUCCEEDED(GetHostInfo(&pInfo)))
{
if(!(pInfo.dwFlags & DOCHOSTUIFLAG_SCROLL_NO))
{
if (SUCCEEDED(m_lpWebBrowser->get_Document(&pDisp)) && pDisp)
{
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc)) && pDoc)
{
if (SUCCEEDED(pDoc->get_body(&pElement)) && pElement)
{
bFocusWasSet = TrySettingFocusOnHtmlElement((IUnknown*)pElement);
pElement->Release();
}
pDoc->Release();
}
pDisp->Release();
}
}
}
return bFocusWasSet;
}
HRESULT COleSite::Invoke
(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pdispparams,
VARIANT FAR* pvarResult,
EXCEPINFO FAR* pexcepinfo,
UINT FAR* puArgErr
)
{
HRESULT hr = DISP_E_MEMBERNOTFOUND;
// Either one of these is good, since we just want to make sure the DOCUMENT pointer is
// available.
switch(dispidMember)
{
case DISPID_DOCUMENTCOMPLETE:
case DISPID_NAVIGATECOMPLETE:
{
TCHAR szFontFace [MAX_RES_LEN] = TEXT("\0");
TCHAR szFontSize [MAX_RES_LEN] = TEXT("\0");
LoadString(ghInstance, IDS_HTML_DEFAULT_FONTFACE, szFontFace, MAX_RES_LEN);
LoadString(ghInstance, IDS_HTML_DEFAULT_FONTSIZE, szFontSize, MAX_RES_LEN);
ASSERT(strlen(szFontFace) != 0);
ASSERT(strlen(szFontSize) != 0);
// Adjust the HTML properties to our liking based on the offer type
// html default defs in icwutil.h and icwutil.rc
// pagetype defs in appdefs.h
switch(m_dwHtmPageType)
{
case PAGETYPE_BILLING:
case PAGETYPE_CUSTOMPAY:
case PAGETYPE_ISP_TOS:
case PAGETYPE_ISP_NORMAL:
{
TweakHTML(szFontFace,
szFontSize,
m_szBkGrndColor,
m_szForeGrndColor);
if(!SetFocusToFirstHtmlInputElement())
SetFocusToHtmlPage();
break;
}
// For the OLS finish page, we need to tweak it's display by
// invoking the SetNewText script function
case PAGETYPE_OLS_FINISH:
{
TweakHTML(szFontFace,
szFontSize,
HTML_DEFAULT_BGCOLOR,
HTML_DEFAULT_COLOR);
ActivateOLSText();
break;
}
case PAGETYPE_ISP_FINISH:
case PAGETYPE_ISP_CUSTOMFINISH:
case PAGETYPE_NOOFFERS:
{
TweakHTML(szFontFace,
szFontSize,
HTML_DEFAULT_SPECIALBGCOLOR,
HTML_DEFAULT_COLOR);
break;
}
case PAGETYPE_MARKETING:
case PAGETYPE_BRANDED:
default:
{
//Do just the background bitmap if necessary
if (m_bUseBkGndBitmap)
{
TweakHTML(NULL,
NULL,
HTML_DEFAULT_BGCOLOR,
HTML_DEFAULT_COLOR);
}
break;
}
}
DisableHyperlinksInDocument();
// Show the Page
ShowHTML();
break;
}
case DISPID_RunIcwTutorApp:
{
PostMessage(GetParent(m_hWnd), WM_RUNICWTUTORAPP, 0, 0);
break;
}
default:
{
hr = DISP_E_MEMBERNOTFOUND;
break;
}
}
return hr;
}
void COleSite::DisableHyperlinksInDocument()
{
VARIANT vIndex;
IHTMLAnchorElement* pAnchor;
IHTMLElement* pElement;
IDispatch* pDisp = NULL;
IDispatch* pDispElement = NULL;
IDispatch* pDispElement2 = NULL;
IHTMLDocument2* pDoc = NULL;
IHTMLElementCollection* pColl = NULL;
BSTR bstrInnerHtml = NULL;
BSTR bstrOuterHtml = NULL;
VARIANT varNull = { 0 };
long lLen = 0;
vIndex.vt = VT_UINT;
bstrOuterHtml = SysAllocString(A2W(TEXT("&nbsp<SPAN></SPAN>&nbsp")));
if (SUCCEEDED(m_lpWebBrowser->get_Document(&pDisp)) && pDisp)
{
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc)) && pDoc)
{
if (SUCCEEDED(pDoc->get_all(&pColl)) && pColl)
{
pColl->get_length(&lLen);
for (int i = 0; i < lLen; i++)
{
vIndex.lVal = i;
pDispElement = NULL;
if(SUCCEEDED(pColl->item(vIndex, varNull, &pDispElement)) && pDispElement)
{
pAnchor = NULL;
if(SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLAnchorElement, (LPVOID*)&pAnchor)) && pAnchor)
{
pAnchor->Release();
pElement = NULL;
if(SUCCEEDED(pDispElement->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement)) && pElement)
{
pElement->get_innerHTML(&bstrInnerHtml);
pElement->put_outerHTML(bstrOuterHtml);
pElement->Release();
if(bstrInnerHtml)
{
pDispElement2 = NULL;;
if(SUCCEEDED(pColl->item(vIndex, varNull, &pDispElement2)) && pDispElement2)
{
pElement = NULL;
if(SUCCEEDED(pDispElement2->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement)) && pElement)
{
pElement->put_innerHTML(bstrInnerHtml);
SysFreeString(bstrInnerHtml);
bstrInnerHtml = NULL;
pElement->Release();
}
pDispElement2->Release();
}
}
}
}
pDispElement->Release();
}
}
pColl->Release();
}
pDoc->Release();
}
pDisp->Release();
}
if(bstrInnerHtml)
SysFreeString(bstrInnerHtml);
SysFreeString(bstrOuterHtml);
}