]> git.sesse.net Git - casparcg/blob - core/producer/flash/FlashAxContainer.h
e95a7f0ee854accc77f56c1f085618362ff11718
[casparcg] / core / producer / flash / FlashAxContainer.h
1 /*\r
2 * copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 *  This file is part of CasparCG.\r
5 *\r
6 *    CasparCG is free software: you can redistribute it and/or modify\r
7 *    it under the terms of the GNU General Public License as published by\r
8 *    the Free Software Foundation, either version 3 of the License, or\r
9 *    (at your option) any later version.\r
10 *\r
11 *    CasparCG is distributed in the hope that it will be useful,\r
12 *    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 *    GNU General Public License for more details.\r
15 \r
16 *    You should have received a copy of the GNU General Public License\r
17 *    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
18 *\r
19 */\r
20  \r
21 #if defined(_MSC_VER)\r
22 #pragma once\r
23 #endif\r
24 \r
25 #ifndef _FLASHAXCONTAINER_H__\r
26 #define _FLASHAXCONTAINER_H__\r
27 \r
28 #pragma warning(push)\r
29 #pragma warning(disable : 4996)\r
30 \r
31         #include <atlbase.h>\r
32 \r
33         #include <atlcom.h>\r
34         #include <atlhost.h>\r
35 \r
36 #pragma warning(push)\r
37 \r
38 #include "..\..\frame\gpu_frame.h"\r
39 #include "..\..\frame\frame_format.h"\r
40 \r
41 #include <ocmm.h>\r
42 #include <vector>\r
43 #include <tbb\atomic.h>\r
44 \r
45 #include "axflash.h"\r
46 //#import "progid:ShockwaveFlash.ShockwaveFlash.9" no_namespace, named_guids\r
47 \r
48 namespace caspar { namespace flash {\r
49         \r
50 class flash_producer;\r
51 \r
52 class TimerHelper;\r
53 struct DirtyRect {\r
54         DirtyRect(LONG l, LONG t, LONG r, LONG b, bool e) : bErase(e), bWhole(false) { \r
55                 rect.left = l;\r
56                 rect.top = t;\r
57                 rect.right = r;\r
58                 rect.bottom = b; \r
59         }\r
60         DirtyRect(const RECT& rc, bool e) : bErase(e), bWhole(false)  {\r
61                 rect.left = rc.left;\r
62                 rect.top = rc.top;\r
63                 rect.right = rc.right;\r
64                 rect.bottom = rc.bottom; \r
65         }\r
66         explicit DirtyRect(bool b) : bWhole(b) {}\r
67 \r
68         RECT    rect;\r
69         bool    bErase;\r
70         bool    bWhole;\r
71 };\r
72 \r
73 extern _ATL_FUNC_INFO fnInfoFlashCallEvent;\r
74 extern _ATL_FUNC_INFO fnInfoReadyStateChangeEvent;\r
75 \r
76 class ATL_NO_VTABLE FlashAxContainer : \r
77                 public ATL::CComCoClass<FlashAxContainer , &CLSID_NULL>,\r
78                 public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>,\r
79                 public IOleClientSite,\r
80                 public IOleContainer,\r
81                 public IOleControlSite,\r
82                 public IOleInPlaceSiteWindowless,\r
83                 public IObjectWithSiteImpl<FlashAxContainer>,\r
84                 public IServiceProvider,\r
85                 public IAdviseSink,\r
86                 public ITimerService,\r
87                 public ITimer,\r
88                 public IDispatchImpl<IDispatch>,\r
89                 public IDispEventSimpleImpl<0, FlashAxContainer, &DIID__IShockwaveFlashEvents>\r
90 {\r
91 \r
92 public:\r
93 \r
94         FlashAxContainer();\r
95         virtual ~FlashAxContainer();\r
96 \r
97         DECLARE_NO_REGISTRY()\r
98         DECLARE_POLY_AGGREGATABLE(FlashAxContainer)\r
99         DECLARE_GET_CONTROLLING_UNKNOWN()\r
100 \r
101         BEGIN_COM_MAP(FlashAxContainer)\r
102                 COM_INTERFACE_ENTRY(IDispatch)\r
103                 COM_INTERFACE_ENTRY(IOleClientSite)\r
104                 COM_INTERFACE_ENTRY(IObjectWithSite)\r
105                 COM_INTERFACE_ENTRY(IOleControlSite)\r
106                 COM_INTERFACE_ENTRY(IOleContainer)\r
107 \r
108                 COM_INTERFACE_ENTRY(IOleInPlaceSiteWindowless)\r
109                 COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)\r
110                 COM_INTERFACE_ENTRY(IOleInPlaceSite)\r
111                 COM_INTERFACE_ENTRY(IOleWindow)\r
112 \r
113                 COM_INTERFACE_ENTRY(IServiceProvider)\r
114 \r
115                 COM_INTERFACE_ENTRY(IAdviseSink)\r
116 \r
117                 COM_INTERFACE_ENTRY(ITimerService)\r
118 \r
119                 COM_INTERFACE_ENTRY(ITimer)\r
120         END_COM_MAP()\r
121 \r
122         BEGIN_SINK_MAP(FlashAxContainer)\r
123                 SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xc5, OnFlashCall, &fnInfoFlashCallEvent)\r
124                 SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xfffffd9f, OnReadyStateChange, &fnInfoReadyStateChangeEvent)\r
125         END_SINK_MAP()\r
126 \r
127         void STDMETHODCALLTYPE OnFlashCall(BSTR request);\r
128         void STDMETHODCALLTYPE OnReadyStateChange(long newState);\r
129 \r
130 // IObjectWithSite\r
131         STDMETHOD(SetSite)(IUnknown* pUnkSite);\r
132 \r
133 // IOleClientSite\r
134         STDMETHOD(SaveObject)();\r
135         STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);\r
136         STDMETHOD(GetContainer)(IOleContainer** ppContainer);\r
137         STDMETHOD(ShowObject)();\r
138         STDMETHOD(OnShowWindow)(BOOL fShow);\r
139         STDMETHOD(RequestNewObjectLayout)();\r
140 \r
141 // IOleInPlaceSite\r
142         STDMETHOD(GetWindow)(HWND* pHwnd);\r
143         STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);\r
144         STDMETHOD(CanInPlaceActivate)();\r
145         STDMETHOD(OnInPlaceActivate)();\r
146         STDMETHOD(OnInPlaceDeactivate)();\r
147         STDMETHOD(OnUIActivate)();\r
148         STDMETHOD(OnUIDeactivate)(BOOL fUndoable);\r
149         STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo);\r
150         STDMETHOD(Scroll)(SIZE scrollExtant);\r
151         STDMETHOD(DiscardUndoState)();\r
152         STDMETHOD(DeactivateAndUndo)();\r
153         STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);\r
154 \r
155 // IOleInPlaceSiteEx\r
156         STDMETHOD(OnInPlaceActivateEx)(BOOL* pfNoRedraw, DWORD dwFlags);\r
157         STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);\r
158         STDMETHOD(RequestUIActivate)();\r
159 \r
160 // IOleInPlaceSiteWindowless\r
161         STDMETHOD(CanWindowlessActivate)();\r
162         STDMETHOD(GetCapture)();\r
163         STDMETHOD(SetCapture)(BOOL fCapture);\r
164         STDMETHOD(GetFocus)();\r
165         STDMETHOD(SetFocus)(BOOL fGotFocus);\r
166         STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);\r
167         STDMETHOD(ReleaseDC)(HDC hDC);\r
168         STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);\r
169         STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);\r
170         STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);\r
171         STDMETHOD(AdjustRect)(LPRECT prc);\r
172         STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);\r
173 \r
174 // IOleControlSite\r
175         STDMETHOD(OnControlInfoChanged)();\r
176         STDMETHOD(LockInPlaceActive)(BOOL fLock);\r
177         STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);\r
178         STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);\r
179         STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, DWORD grfModifiers);\r
180         STDMETHOD(OnFocus)(BOOL fGotFocus);\r
181         STDMETHOD(ShowPropertyFrame)();\r
182 \r
183 // IAdviseSink\r
184         STDMETHOD_(void, OnDataChange)(FORMATETC* pFormatetc, STGMEDIUM* pStgmed);\r
185         STDMETHOD_(void, OnViewChange)(DWORD dwAspect, LONG lindex);\r
186         STDMETHOD_(void, OnRename)(IMoniker* pmk);\r
187         STDMETHOD_(void, OnSave)();\r
188         STDMETHOD_(void, OnClose)();\r
189 \r
190 // IServiceProvider\r
191         STDMETHOD(QueryService)( REFGUID rsid, REFIID riid, void** ppvObj);\r
192 \r
193 // IOleContainer\r
194         STDMETHOD(ParseDisplayName)(IBindCtx*, LPOLESTR, ULONG*, IMoniker**)\r
195         {\r
196                 ATLTRACENOTIMPL(_T("IOleContainer::ParseDisplayName"));\r
197         }\r
198         STDMETHOD(EnumObjects)(DWORD, IEnumUnknown** ppenum)\r
199         {\r
200                 if (ppenum == NULL)\r
201                         return E_POINTER;\r
202                 *ppenum = NULL;\r
203                 typedef CComObject<CComEnum<IEnumUnknown, &__uuidof(IEnumUnknown), IUnknown*, _CopyInterface<IUnknown> > > enumunk;\r
204                 enumunk* p = NULL;\r
205                 ATLTRY(p = new enumunk);\r
206                 if(p == NULL)\r
207                         return E_OUTOFMEMORY;\r
208                 IUnknown* pTemp = m_spUnknown;\r
209                 // There is always only one object.\r
210                 HRESULT hRes = p->Init(reinterpret_cast<IUnknown**>(&pTemp), reinterpret_cast<IUnknown**>(&pTemp + 1), GetControllingUnknown(), AtlFlagCopy);\r
211                 if (SUCCEEDED(hRes))\r
212                         hRes = p->QueryInterface(__uuidof(IEnumUnknown), (void**)ppenum);\r
213                 if (FAILED(hRes))\r
214                         delete p;\r
215                 return hRes;\r
216         }\r
217         STDMETHOD(LockContainer)(BOOL)\r
218         {\r
219                 ATLTRACENOTIMPL(_T("IOleContainer::LockContainer"));\r
220         }\r
221 \r
222 //ITimerService\r
223         STDMETHOD(CreateTimer)(ITimer *pReferenceTimer, ITimer **ppNewTimer);\r
224         STDMETHOD(GetNamedTimer)(REFGUID rguidName, ITimer **ppTimer);\r
225         STDMETHOD(SetNamedTimerReference)(REFGUID rguidName, ITimer *pReferenceTimer);\r
226 \r
227 //ITimer\r
228         STDMETHOD(Advise)(VARIANT vtimeMin, VARIANT vtimeMax, VARIANT vtimeInterval, DWORD dwFlags, ITimerSink *pTimerSink, DWORD *pdwCookie);\r
229         STDMETHOD(Unadvise)(DWORD dwCookie);\r
230         STDMETHOD(Freeze)(BOOL fFreeze);\r
231         STDMETHOD(GetTime)(VARIANT *pvtime);\r
232         int GetFPS();\r
233 \r
234         HRESULT CreateAxControl();\r
235         void DestroyAxControl();\r
236         HRESULT QueryControl(REFIID iid, void** ppUnk);\r
237 \r
238         template <class Q>\r
239         HRESULT QueryControl(Q** ppUnk)\r
240         {\r
241                 return QueryControl(__uuidof(Q), (void**)ppUnk);\r
242         }\r
243 \r
244         bool InvalidRectangle() const;\r
245         void Tick();\r
246         bool CallFunction(const std::wstring& param);\r
247         bool IsEmpty() const;\r
248 \r
249 //      static ATL::CComObject<FlashAxContainer>* CreateInstance();\r
250 \r
251         bool DrawControl(HDC targetDC);\r
252 \r
253         TimerHelper* pTimerHelper;\r
254         tbb::atomic<bool> bInvalidRect_;\r
255         tbb::atomic<bool> bCallSuccessful_;\r
256         tbb::atomic<bool> bReadyToRender_;\r
257         tbb::atomic<bool> bIsEmpty_;\r
258         tbb::atomic<bool> bHasNewTiming_;\r
259         flash::flash_producer* pflash_producer_;\r
260         std::vector<DirtyRect> bDirtyRects_;\r
261 \r
262         HRESULT SetFormat(const caspar::frame_format_desc&);\r
263         bool IsReadyToRender() const;\r
264         void EnterFullscreen();\r
265 \r
266         static bool CheckForFlashSupport();\r
267 private:\r
268         static CComBSTR flashGUID_;\r
269 \r
270         DWORD lastTime_;\r
271 //      state\r
272         bool            bUIActive_;\r
273         bool            bInPlaceActive_;\r
274         unsigned long           bHaveFocus_ : 1;\r
275         unsigned long           bCapture_ : 1;\r
276 \r
277         DWORD m_dwOleObject;\r
278         DWORD m_dwMiscStatus;\r
279         SIZEL m_hmSize;\r
280         SIZEL m_pxSize;\r
281         RECT m_rcPos;\r
282 \r
283         ATL::CComPtr<IUnknown> m_spUnknown;\r
284         ATL::CComPtr<IOleObject> m_spServices;\r
285         ATL::CComPtr<IOleObject> m_spOleObject;\r
286         ATL::CComPtr<IViewObjectEx> m_spViewObject;\r
287         ATL::CComPtr<IOleInPlaceObjectWindowless> m_spInPlaceObjectWindowless;\r
288 \r
289 //      ATL::CComPtr<ATL::CComObject<MyMoniker> > m_spMyMoniker;\r
290 };\r
291 \r
292 }       //namespace flash\r
293 }       //namespace caspar\r
294 \r
295 #endif  //_FLASHAXCONTAINER_H__