//********************************************************************** // 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 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 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("  "))); 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); }