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