1 /*
2  *			GPAC - Multimedia Framework C SDK
3  *
4  *			Authors: Jean Le Feuvre
5  *			Copyright (c) Telecom ParisTech 2006-2012
6  *					All rights reserved
7  *
8  *  This file is part of GPAC / ActiveX control
9  *
10  *  GPAC is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU Lesser General Public License as published by
12  *  the Free Software Foundation; either version 2, or (at your option)
13  *  any later version.
14  *
15  *  GPAC is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU Lesser General Public License for more details.
19  *
20  *  You should have received a copy of the GNU Lesser General Public
21  *  License along with this library; see the file COPYING.  If not, write to
22  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23  *
24  */
25 
26 #ifndef __GPAXPLUGIN_H_
27 #define __GPAXPLUGIN_H_
28 
29 #define MAXLEN_URL     300
30 
31 #include "resource.h"       // main symbols
32 #include <atlctl.h>
33 #include <SHLGUID.h>
34 
35 
36 
37 #include <gpac/terminal.h>
38 #include <gpac/user.h>
39 #include <gpac/config_file.h>
40 #include <gpac/module.h>
41 #include <gpac/options.h>
42 
43 #if (_MSC_VER >= 1300)
44 using namespace ATL;
45 #endif
46 
47 
48 Bool GPAX_EventProc(void *ptr, GF_Event *evt);
49 
50 /////////////////////////////////////////////////////////////////////////////
51 // CGPAXPlugin
52 class ATL_NO_VTABLE CGPAXPlugin :
53 	public CComObjectRootEx<CComSingleThreadModel>,
54 	public IDispatchImpl<IGPAX, &IID_IGPAX, &LIBID_GPAXLib>,
55 	public CComControl<CGPAXPlugin>,
56 	public CComCoClass<CGPAXPlugin, &CLSID_GPAX>,
57 	public IOleControlImpl<CGPAXPlugin>,
58 	public IOleObjectImpl<CGPAXPlugin>,
59 	public IOleInPlaceActiveObjectImpl<CGPAXPlugin>,
60 	public IViewObjectExImpl<CGPAXPlugin>,
61 	public IOleInPlaceObjectWindowlessImpl<CGPAXPlugin>,
62 	public IProvideClassInfo2Impl<&CLSID_GPAX, &DIID_IGPAXEvents, &LIBID_GPAXLib>,
63 
64 	public IPersistStreamInitImpl<CGPAXPlugin>,
65 	public ISupportErrorInfo,
66 	public IConnectionPointContainerImpl<CGPAXPlugin>,
67 	public IPersistStorageImpl<CGPAXPlugin>,
68 	public ISpecifyPropertyPagesImpl<CGPAXPlugin>,
69 	public IQuickActivateImpl<CGPAXPlugin>,
70 	public IDataObjectImpl<CGPAXPlugin>,
71 	public IPropertyNotifySinkCP<CGPAXPlugin>,
72 
73 	public IPersistPropertyBagImpl<CGPAXPlugin>,
74 	public IObjectSafetyImpl<CGPAXPlugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
75 
76 {
77 public:
CGPAXPlugin()78 	CGPAXPlugin() {
79 		m_term = NULL;
80 		m_bAutoStart = GF_TRUE;
81 		m_bInitialDraw = GF_TRUE;
82 		m_bWindowOnly = GF_TRUE;  //to declare that the control is a window control in order
83 		//to inherit the member variable m_hWnd which contains the window handler
84 		m_bIsConnected = GF_FALSE;
85 		m_bUse3D = GF_FALSE;
86 		m_bUseGUI = GF_FALSE;
87 		m_iDownload_progress = 0;
88 		m_AR = GF_ASPECT_RATIO_KEEP;
89 		m_url[0] = 0;
90 		m_pLogs = NULL;
91 #ifndef _WIN32_WCE
92 		m_pBrowser = NULL;
93 #endif
94 		memset(&m_user, 0, sizeof(m_user));
95 
96 		m_dwCurrentSafety = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
97 	}
98 
99 	~CGPAXPlugin();
100 
101 	Bool EventProc(GF_Event *evt);
102 
103 	BOOL PreTranslateMessage(MSG* pMsg);
104 
105 	DECLARE_REGISTRY_RESOURCEID(IDR_GPAXPLUGIN)
DECLARE_PROTECT_FINAL_CONSTRUCT()106 	DECLARE_PROTECT_FINAL_CONSTRUCT()
107 #if (_MSC_VER >= 1300)
108 	DECLARE_OLEMISC_STATUS(OLEMISC_ACTSLIKEBUTTON | OLEMISC_ACTIVATEWHENVISIBLE)
109 #endif
110 
111 	static LPCTSTR GetWindowClassName() {
112 		return TEXT("GPAC ActiveX");
113 	}
114 
115 	BEGIN_COM_MAP(CGPAXPlugin)
COM_INTERFACE_ENTRY(IGPAX)116 	COM_INTERFACE_ENTRY(IGPAX)
117 	COM_INTERFACE_ENTRY(IDispatch)
118 	COM_INTERFACE_ENTRY(IViewObjectEx)
119 	COM_INTERFACE_ENTRY(IProvideClassInfo)
120 	COM_INTERFACE_ENTRY(IOleControl)
121 	COM_INTERFACE_ENTRY(IOleObject)
122 
123 	COM_INTERFACE_ENTRY_IMPL(IViewObjectEx)
124 	COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx)
125 	COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx)
126 	COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless)
127 	COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless)
128 	COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceActiveObject)
129 
130 	COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject)
131 	COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless)
132 
133 //	COM_INTERFACE_ENTRY(IObjectSafety)
134 	COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
135 	COM_INTERFACE_ENTRY(IPersistPropertyBag)
136 	COM_INTERFACE_ENTRY_IMPL_IID(IID_IPersist, IPersistPropertyBag)
137 
138 	/*	COM_INTERFACE_ENTRY(IViewObject)
139 	    COM_INTERFACE_ENTRY(IViewObject2)
140 	    COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
141 	    COM_INTERFACE_ENTRY(IOleInPlaceObject)
142 		*/
143 
144 	COM_INTERFACE_ENTRY(IProvideClassInfo2)
145 	COM_INTERFACE_ENTRY(IPersistStreamInit)
146 	COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
147 	COM_INTERFACE_ENTRY(ISupportErrorInfo)
148 	COM_INTERFACE_ENTRY(IConnectionPointContainer)
149 	COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
150 	COM_INTERFACE_ENTRY(IQuickActivate)
151 	COM_INTERFACE_ENTRY(IPersistStorage)
152 	COM_INTERFACE_ENTRY(IDataObject)
153 
154 	END_COM_MAP()
155 
156 	BEGIN_PROP_MAP(CGPAXPlugin)
157 	END_PROP_MAP()
158 
159 	BEGIN_CONNECTION_POINT_MAP(CGPAXPlugin)
160 	CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
161 	END_CONNECTION_POINT_MAP()
162 
163 	BEGIN_MSG_MAP(CGPAXPlugin)
164 	CHAIN_MSG_MAP(CComControl<CGPAXPlugin>)
165 	DEFAULT_REFLECTION_HANDLER()
166 	MESSAGE_HANDLER(WM_CREATE, OnCreate)
167 	MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
168 
169 	END_MSG_MAP()
170 	// Handler prototypes:
171 	//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
172 	//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
173 	//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
174 
175 
176 
177 	// ISupportsErrorInfo
178 	STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
179 	{
180 		static const IID* arr[] =
181 		{
182 			&IID_IGPAX,
183 		};
184 		for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
185 		{
186 #if (_MSC_VER < 1300)
187 			if (::ATL::InlineIsEqualGUID(*arr[i], riid))
188 #else
189 			if (::InlineIsEqualGUID(*arr[i], riid))
190 #endif
191 				return S_OK;
192 		}
193 		return S_FALSE;
194 	}
195 	STDMETHODIMP GetInterfaceSafetyOptions(
196 	    REFIID riid,
197 	    DWORD *pdwSupportedOptions,
198 	    DWORD *pdwEnabledOptions
199 	);
200 
201 	STDMETHODIMP SetInterfaceSafetyOptions(
202 	    REFIID riid,
203 	    DWORD dwOptionSetMask,
204 	    DWORD dwEnabledOptions
205 	);
206 
207 	// IViewObjectEx
208 	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
209 
210 	// IGPAX
211 public:
212 	//Interface methods
213 	STDMETHOD(Stop)();
214 	STDMETHOD(Pause)();
215 	STDMETHOD(Play)();
216 	STDMETHOD(Update)(BSTR mtype,BSTR updates);
217 	STDMETHOD(QualitySwitch)(int switch_up);
218 	STDMETHOD(SetURL)(BSTR url);
219 
220 	//Interface properties
221 	STDMETHODIMP get_src(BSTR *url);
222 	STDMETHODIMP put_src(BSTR url);
223 	STDMETHODIMP get_AutoStart(VARIANT_BOOL *as);
224 	STDMETHODIMP put_AutoStart(VARIANT_BOOL as);
225 	STDMETHODIMP get_DownloadProgress(INT *dp);
226 	STDMETHODIMP put_DownloadProgress(INT dp);
227 
228 	//Customed Window Message functions: OnCreate and OnDestroy are called when a window
229 	//is created or destroyed. OnDraw is to establish inital connection.
230 	HRESULT OnDraw(ATL_DRAWINFO& di);
231 	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
232 	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
233 
234 	//IPersistPropertyBag method: to handle persist property packed and transfered by MSIE
235 	//in html doc, the ActiveX control is added by tags
236 	//   <object CLSID=...>
237 	//		<PARAM name="..." value="...">
238 	//   </object>
239 	//the interface IPersistPropertyBag enable MSIE and ActiveX Control to communicate these
240 	//properties included in tags <PARAM>
241 	STDMETHODIMP Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog);
242 	STDMETHODIMP Save(LPPROPERTYBAG, BOOL, BOOL);
243 
244 
245 private:
246 	Bool ReadParamString(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, WCHAR *name, char *buf, int bufsize);
247 	void SetStatusText(char *msg);
248 	void UpdateURL();
249 	void UnloadTerm();
250 	void LoadDATAUrl();
251 
252 	GF_Terminal *m_term;
253 	GF_User m_user;
254 	char m_url[MAXLEN_URL];
255 #ifndef _WIN32_WCE
256 	/*pointer to the parent browser if any*/
257 	IWebBrowser2 *m_pBrowser;
258 #endif
259 
260 	u32 m_width, m_height, m_AR;
261 	Bool m_bIsConnected, m_bInitialDraw, m_bAutoStart, m_bUse3D, m_bLoop, m_bUseGUI;
262 	int m_iDownload_progress;
263 	FILE *m_pLogs;
264 
265 };
266 
267 
268 
269 #endif //__GPAXPLUGIN_H_
270