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