blob: d508558445964f0e6a051fa67bfec9fd7797746f [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
// plugin.h : Declaration of the Cplugin
#pragma once
#include "resource.h" // main symbols
#include <atlctl.h>
#include "oophm_i.h"
#include "Debug.h"
#include "IESessionHandler.h"
#include "IEUtils.h"
#ifdef _WIN32_WCE
#error "ATL does not support HTML controls for Windows CE."
#endif
class ATL_NO_VTABLE CpluginUI :
public IDispatchImpl<IpluginUI, &IID_IpluginUI, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public CComObjectRootEx<CComSingleThreadModel>
{
BEGIN_COM_MAP(CpluginUI)
COM_INTERFACE_ENTRY(IpluginUI)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// Iplugin
public:
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
// Example method called by the HTML to change the <BODY> background color
STDMETHOD(OnClick)(IDispatch* pdispBody, VARIANT varColor)
{
CComQIPtr<IHTMLBodyElement> spBody(pdispBody);
if (spBody != NULL)
spBody->put_bgColor(varColor);
return S_OK;
}
};
// Cplugin
class ATL_NO_VTABLE Cplugin :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<Iplugin, &IID_Iplugin, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<Cplugin>,
public IOleControlImpl<Cplugin>,
public IOleObjectImpl<Cplugin>,
public IOleInPlaceActiveObjectImpl<Cplugin>,
public IViewObjectExImpl<Cplugin>,
public IOleInPlaceObjectWindowlessImpl<Cplugin>,
public ISupportErrorInfo,
public IPersistStorageImpl<Cplugin>,
public ISpecifyPropertyPagesImpl<Cplugin>,
public IQuickActivateImpl<Cplugin>,
public IObjectSafetyImpl<Cplugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
#ifndef _WIN32_WCE
public IDataObjectImpl<Cplugin>,
#endif
public IProvideClassInfo2Impl<&CLSID_plugin, NULL, &LIBID_oophmLib>,
#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
public IObjectSafetyImpl<Cplugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#endif
public CComCoClass<Cplugin, &CLSID_plugin>,
public CComControl<Cplugin>
{
public:
Cplugin()
{
m_bWindowOnly = TRUE;
}
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
OLEMISC_CANTLINKINSIDE |
OLEMISC_INSIDEOUT |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST
)
DECLARE_REGISTRY_RESOURCEID(IDR_PLUGIN)
BEGIN_COM_MAP(Cplugin)
COM_INTERFACE_ENTRY(Iplugin)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IObjectSafety)
#ifndef _WIN32_WCE
COM_INTERFACE_ENTRY(IDataObject)
#endif
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
#endif
END_COM_MAP()
BEGIN_PROP_MAP(Cplugin)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
// Example entries
// PROP_ENTRY_TYPE("Property Name", dispid, clsid, vtType)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
BEGIN_MSG_MAP(Cplugin)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
CHAIN_MSG_MAP(CComControl<Cplugin>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
{
static const IID* arr[] =
{
&IID_Iplugin,
};
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i], riid))
return S_OK;
}
return S_FALSE;
}
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// Iplugin
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CAxWindow wnd(m_hWnd);
wnd.ModifyStyle(0, WS_HSCROLL | WS_VSCROLL);
HRESULT hr = wnd.CreateControl(IDH_PLUGIN);
if (SUCCEEDED(hr))
{
CComObject<CpluginUI> *pObject = NULL;
hr = CComObject<CpluginUI>::CreateInstance(&pObject);
if (SUCCEEDED(hr) && pObject != NULL)
hr = wnd.SetExternalDispatch(static_cast<IpluginUI*>(pObject));
}
if (SUCCEEDED(hr))
hr = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);
return SUCCEEDED(hr) ? 0 : -1;
}
STDMETHOD(TranslateAccelerator)(LPMSG pMsg)
{
CComPtr<IOleInPlaceActiveObject> spIOleInPlaceActiveObject;
HRESULT hr = m_spBrowser->QueryInterface(&spIOleInPlaceActiveObject);
if (SUCCEEDED(hr))
hr = spIOleInPlaceActiveObject->TranslateAccelerator(pMsg);
if (hr != S_OK)
hr = IOleInPlaceActiveObjectImpl<Cplugin>::TranslateAccelerator(pMsg);
return hr;
}
CComPtr<IWebBrowser2> m_spBrowser;
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
IEUtils::InitEventLog();
return S_OK;
}
void FinalRelease()
{
IEUtils::CloseEventLog();
Debug::log(Debug::Debugging) << "OOPHM plugin FinalRelease" << Debug::flush;
}
STDMETHOD(connect)(BSTR url, BSTR sessionKey, BSTR hostedServer,
BSTR moduleName, BSTR hostedHtmlVersion, VARIANT_BOOL* ret);
STDMETHOD(init)(IDispatch* jsniContext, VARIANT_BOOL* ret);
STDMETHOD(testObject)(IDispatch** ret);
private:
scoped_ptr<IESessionHandler> sessionHandler;
};
OBJECT_ENTRY_AUTO(__uuidof(plugin), Cplugin)