⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 browserwrapper.cpp

📁 Last change: 2008-02-03 This is the source code of KCeasy。
💻 CPP
字号:
/*
This file is part of KCeasy (http://www.kceasy.com)
Copyright (C) 2002-2005 Markus Kern <mkern@kceasy.com>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/
//---------------------------------------------------------------------------
#include <vcl.h>

#pragma hdrstop
#include "BrowserWrapper.h"
#include "BrowserUtils.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

TBrowserWrapper::TBrowserWrapper(TCppWebBrowser* Browser)
:   RefCount(1),
    WebBrowser(Browser),
    External(NULL)
{
    if(WebBrowser && WebBrowser->ControlInterface != ((IWebBrowser2*)NULL)) {
        IOleObject *OleObject = NULL;
        if(SUCCEEDED(WebBrowser->ControlInterface->QueryInterface(IID_IOleObject,
                     (void**)&OleObject)))
        {
            OleObject->SetClientSite(this);
            OleObject->Release();
        }
    }
}

TBrowserWrapper::~TBrowserWrapper()
{
    if(External)
        External->Release();
}

TCppWebBrowser* TBrowserWrapper::GetBrowser()
{
    return WebBrowser;
}

void TBrowserWrapper::SetExternal(IDispatch* Ext)
{
    if(External)
        External->Release();

    External = Ext;

    if(External)
        External->AddRef();
}

IDispatch* TBrowserWrapper::GetExternal()
{
    return External;
}

// IUnknown

HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryInterface(REFIID riid,
      void** intf)
{
    if(intf == NULL)
        return E_POINTER;

    *intf = NULL;

    if(riid == IID_IUnknown)
        *intf = (IUnknown*) ((IDocHostUIHandler*)this);
    else if(riid == IID_IOleClientSite)
        *intf = (IOleClientSite*) this;
    else if(riid == IID_IDocHostUIHandler)
        *intf = (IDocHostUIHandler*) this;
    else if(riid == IID_IOleCommandTarget)
        *intf = (IOleCommandTarget*) this;
    else if(riid == IID_IInternetSecurityManager)
        *intf = (IInternetSecurityManager*) this;
    else if(riid == IID_IServiceProvider)
        *intf = (IServiceProvider*) this;

    if( *intf == NULL )
        return E_NOINTERFACE;

    AddRef();
    return S_OK;
}

ULONG STDMETHODCALLTYPE TBrowserWrapper::AddRef()
{
    InterlockedIncrement(&RefCount);
    return RefCount;
}

ULONG STDMETHODCALLTYPE TBrowserWrapper::Release()
{
    InterlockedDecrement(&RefCount);
    if (RefCount == 0) {
        delete this;
        return 0;
    }
    return RefCount;
}

// IOleClientSite

HRESULT STDMETHODCALLTYPE TBrowserWrapper::SaveObject(void)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetMoniker(DWORD, DWORD,
      IMoniker**)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetContainer(IOleContainer **)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::ShowObject(void)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::OnShowWindow(BOOL)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::RequestNewObjectLayout(void)
{
    return E_NOTIMPL;
}

// IDocHostUIHandler

HRESULT STDMETHODCALLTYPE TBrowserWrapper::ShowContextMenu(DWORD, POINT*,
      IUnknown*, IDispatch*)
{
/*
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/reference/ifaces/idochostuihandler/showcontextmenu.asp
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustompart2.asp
*/
#if 0
    return S_OK; // don't show context menu in browser
#else
    return E_NOTIMPL;
#endif
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetHostInfo(DOCHOSTUIINFO* pInfo)
{
    pInfo->cbSize = sizeof(DOCHOSTUIINFO);
    // allow text selection in browser
    pInfo->dwFlags &= ~DOCHOSTUIFLAG_DIALOG;

    // DOCHOSTUIFLAG_NO3DOUTERBORDER is only available on IE 6.0+
#define DOCHOSTUIFLAG_NO3DOUTERBORDER 0x00200000
    pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DOUTERBORDER;
#undef DOCHOSTUIFLAG_NO3DOUTERBORDER

    return S_OK;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::ShowUI(DWORD,
      IOleInPlaceActiveObject*, IOleCommandTarget*, IOleInPlaceFrame*,
      IOleInPlaceUIWindow*)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::HideUI(void)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::UpdateUI(void)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::EnableModeless(BOOL)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::OnDocWindowActivate(BOOL)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::OnFrameWindowActivate(BOOL)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::ResizeBorder(LPCRECT,
      IOleInPlaceUIWindow*, BOOL)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::TranslateAccelerator(LPMSG lpMsg,
      const GUID*, DWORD)
{
    // This all is needed to make <enter> work in forms
    if(lpMsg &&
       (lpMsg->message == WM_KEYDOWN || lpMsg->message == WM_KEYUP) &&
       (lpMsg->wParam == VK_RETURN || lpMsg->wParam == VK_EXECUTE))
    {
        // it was a bitch to figure this out
        // http://community.borland.com/article/0,1410,6302,00.html
        // http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&c2coff=1&th=736b4f1d8383d431&seekm=3a802ec0_2%40dnews&frame=off

        HWND hwnd = WebBrowser->Handle;
        if(!(hwnd = ::GetWindow(hwnd,GW_CHILD)))
            return S_FALSE;
        if(!(hwnd = ::GetWindow(hwnd,GW_CHILD)))
            return S_FALSE;

        ::SendMessage(hwnd,lpMsg->message,lpMsg->wParam,lpMsg->lParam);

        if(lpMsg->message == WM_KEYDOWN)
            ::SendMessage(hwnd,WM_CHAR,13,0);

        return S_OK;
    }

    // let IE handle it
    return S_FALSE;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetOptionKeyPath(LPOLESTR*, DWORD)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetDropTarget(IDropTarget*,
      IDropTarget**)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetExternal(IDispatch** intf)
{
    if(intf == NULL)
        return E_POINTER;

    // make sure currently loaded doc is safe
    if(!UrlSafeForExternal(WebBrowser->LocationURL))
        return E_NOTIMPL;

    if(External) {
        *intf = External;
        (*intf)->AddRef();
        return S_OK;
    }
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::TranslateUrl(DWORD, OLECHAR*,
      OLECHAR**)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::FilterDataObject(IDataObject*,
      IDataObject**)
{
    return E_NOTIMPL;
}

// IOleCommandTarget

HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryStatus(
      const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds,
      OLECMDTEXT *pCmdText)
{
    return E_NOTIMPL;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::Exec(
      const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
      VARIANTARG *pvaIn, VARIANTARG *pvaOut)
{
    if (nCmdID == ::OLECMDID_SHOWSCRIPTERROR)
    {
        // don't show error dialog but continue to run scripts
        (*pvaOut).vt = VT_BOOL;
        (*pvaOut).boolVal = VARIANT_TRUE;
        return S_OK;
    }

    return OLECMDERR_E_NOTSUPPORTED;
}

// IInternetSecurityManager

HRESULT STDMETHODCALLTYPE TBrowserWrapper::SetSecuritySite (
      IInternetSecurityMgrSite *pSite)
{
	return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetSecuritySite(
      IInternetSecurityMgrSite **ppSite)
{
	return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::MapUrlToZone(LPCWSTR pwszUrl,
      DWORD *pdwZone,DWORD dwFlags)
{
	return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetSecurityId(LPCWSTR pwszUrl,
      BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD dwReserved)
{
	return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::ProcessUrlAction(LPCWSTR pwszUrl,
      DWORD dwAction, BYTE __RPC_FAR *pPolicy, DWORD cbPolicy,
      BYTE __RPC_FAR *pContext, DWORD cbContext, DWORD dwFlags,
      DWORD dwReserved)
{
    // allow running scripts from trusted urls
    if(dwAction >= URLACTION_SCRIPT_MIN && dwAction <= URLACTION_SCRIPT_MAX) {
        if(UrlSafeForExternal(pwszUrl)) {
        	if(cbPolicy >= sizeof (DWORD)) 	{
        		*(DWORD*)pPolicy = URLPOLICY_ALLOW;
        		return S_OK;
        	} else {
        		return S_FALSE;
        	}
        }
    }

    return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryCustomPolicy(LPCWSTR pwszUrl,
      REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext,
      DWORD cbContext, DWORD dwReserved)
{
	return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::SetZoneMapping(DWORD dwZone,
      LPCWSTR lpszPattern, DWORD dwFlags)
{
	return INET_E_DEFAULT_ACTION;
}

HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetZoneMappings(DWORD dwZone,
      IEnumString **ppenumString, DWORD dwFlags)
{
	return INET_E_DEFAULT_ACTION;
}

// IServiceProvider

HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryService(REFGUID guidService,
      REFIID riid, void** ppvObject)
{
	if (guidService == SID_SInternetSecurityManager &&
        riid == IID_IInternetSecurityManager)
	{
		HRESULT hr = (HRESULT)this->QueryInterface(riid, ppvObject);
		return hr;
	}
	else
	{
		*ppvObject = NULL;
	}
	return E_NOINTERFACE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -