// ScolPlugin.h : déclaration de CScolPlugin
#pragma once
#include "resource.h"       // symboles principaux
#include <atlctl.h>
#include "NewATLScol_i.h"
#include "_IScolPluginEvents_CP.h"
#include "ScolInterface.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Les objets COM monothread ne sont pas correctement pris en charge par les plateformes Windows CE, notamment les plateformes Windows Mobile qui ne prennent pas totalement en charge DCOM. Définissez _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA pour forcer ATL à prendre en charge la création d'objets COM monothread et permettre l'utilisation de leurs implémentations. Le modèle de thread de votre fichier rgs a été défini sur 'Libre', car il s'agit du seul modèle de thread pris en charge par les plateformes Windows CE non-DCOM."
#endif

static LRESULT CALLBACK PluginWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// CScolPlugin
class ATL_NO_VTABLE CScolPlugin :
	public CComObjectRootEx<CComSingleThreadModel>,
	public IDispatchImpl<IScolPlugin, &IID_IScolPlugin, &LIBID_NewATLScolLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
	public IPersistStreamInitImpl<CScolPlugin>,
	public IOleControlImpl<CScolPlugin>,
	public IOleObjectImpl<CScolPlugin>,
	public IOleInPlaceActiveObjectImpl<CScolPlugin>,
	public IViewObjectExImpl<CScolPlugin>,
	public IOleInPlaceObjectWindowlessImpl<CScolPlugin>,
	public ISupportErrorInfo,
	public IConnectionPointContainerImpl<CScolPlugin>,
	public CProxy_IScolPluginEvents<CScolPlugin>,
	public IPersistStorageImpl<CScolPlugin>,
	public ISpecifyPropertyPagesImpl<CScolPlugin>,
	public IQuickActivateImpl<CScolPlugin>,
#ifndef _WIN32_WCE
	public IDataObjectImpl<CScolPlugin>,
#endif
	public IProvideClassInfo2Impl<&CLSID_ScolPlugin, &__uuidof(_IScolPluginEvents), &LIBID_NewATLScolLib>,
#ifdef _WIN32_WCE // Sur les plateformes Windows CE, IObjectSafety est requis pour permettre le chargement du contrôle
	public IObjectSafetyImpl<CScolPlugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#endif
	public CComCoClass<CScolPlugin, &CLSID_ScolPlugin>,
	public CComControl<CScolPlugin>,
	public IObjectSafetyImpl <CScolPlugin,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,
  public IPersistPropertyBagImpl<CScolPlugin>,		/* Add propertyBag support */
  public ScolInterface
{
public:

	CScolPlugin();

	int SendEndEventToJS();
	int SendMessageToJS(char *JSMessage);

	CComBSTR m_bstrScolVersionNeeded;		// Version de Scol nécessaire pour la page Web
	CComBSTR m_bstrDownloadURL;				// URL de telechargement de l'installer
	CComBSTR m_bstrForceInstall;
	long m_longDownloadSize;

  char* m_Text;

	char mOnJSMessage[1024];
	char mOnScolEnd[1024];


DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_INSIDEOUT |
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST
)

DECLARE_REGISTRY_RESOURCEID(IDR_SCOLPLUGIN)


BEGIN_COM_MAP(CScolPlugin)
	COM_INTERFACE_ENTRY(IScolPlugin)
	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(IConnectionPointContainer)
	COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
	COM_INTERFACE_ENTRY(IQuickActivate)
	COM_INTERFACE_ENTRY(IPersistStorage)
#ifndef _WIN32_WCE
	COM_INTERFACE_ENTRY(IDataObject)
#endif
	COM_INTERFACE_ENTRY(IProvideClassInfo)
	COM_INTERFACE_ENTRY(IProvideClassInfo2)
#ifdef _WIN32_WCE // Sur les plateformes Windows CE, IObjectSafety est requis pour permettre le chargement du contrôle
	COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
#endif
	COM_INTERFACE_ENTRY_IMPL_IID(IID_IPersist, IPersistPropertyBag)
	COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag)
  COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()

BEGIN_PROP_MAP(CScolPlugin)
	PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
	PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
	// Exemples d'entrées
	// PROP_ENTRY_TYPE("Nom de la propriété", dispid, clsid, vtType)
	// PROP_PAGE(CLSID_StockColorPage)
	PROP_ENTRY("DownloadURL", 1, CLSID_ScolPlugin)
	PROP_ENTRY("DownloadSize", 5, CLSID_ScolPlugin)
	PROP_ENTRY("ScolVersionNeeded", 6, CLSID_ScolPlugin)
	PROP_ENTRY("ForceInstall", 4, CLSID_ScolPlugin)
END_PROP_MAP()

BEGIN_CONNECTION_POINT_MAP(CScolPlugin)
  CONNECTION_POINT_ENTRY(__uuidof(_IScolPluginEvents))
END_CONNECTION_POINT_MAP()

BEGIN_MSG_MAP(CScolPlugin)
	CHAIN_MSG_MAP(CComControl<CScolPlugin>)
	DEFAULT_REFLECTION_HANDLER()
 // MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
// Prototypes de gestionnaire :
//  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_IScolPlugin,
		};

		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)

// IScolPlugin
public:
		HRESULT OnDraw(ATL_DRAWINFO& di);

	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
	}
  STDMETHOD(get_DownloadURL)(BSTR* pVal);
  STDMETHOD(put_DownloadURL)(BSTR newVal);
  STDMETHOD(SendScolMessage)(BSTR* msg, LONG* result);
  STDMETHOD(LaunchMachine)(BSTR* CmdLine, LONG CmdShow, LONG MemSize, LONG* result);
  STDMETHOD(get_ForceInstall)(BSTR* pVal);
  STDMETHOD(put_ForceInstall)(BSTR newVal);
  STDMETHOD(get_DownloadSize)(LONG* pVal);
  STDMETHOD(put_DownloadSize)(LONG newVal);
  STDMETHOD(get_ScolVersionNeeded)(BSTR* pVal);
  STDMETHOD(put_ScolVersionNeeded)(BSTR newVal);
};

OBJECT_ENTRY_AUTO(__uuidof(ScolPlugin), CScolPlugin)
