]> git.sesse.net Git - casparcg/blob - core/producer/flash/FlashAxContainer.h
2.0.0.2:
[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 "..\..\processor\write_frame.h"\r
39 #include "..\..\format\video_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 \r
47 #include <ddraw.h>\r
48 #include <comdef.h>\r
49 \r
50 #ifndef DEFINE_GUID2\r
51 #define DEFINE_GUID2(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\r
52         const GUID name \\r
53                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }\r
54 #endif     \r
55 \r
56 _COM_SMARTPTR_TYPEDEF(IDirectDraw4, IID_IDirectDraw4);\r
57 \r
58 //#import "progid:ShockwaveFlash.ShockwaveFlash.9" no_namespace, named_guids\r
59 \r
60 namespace caspar { namespace core { namespace flash {\r
61         \r
62 extern _ATL_FUNC_INFO fnInfoFlashCallEvent;\r
63 extern _ATL_FUNC_INFO fnInfoReadyStateChangeEvent;\r
64 \r
65 class ATL_NO_VTABLE FlashAxContainer : \r
66                 public ATL::CComCoClass<FlashAxContainer , &CLSID_NULL>,\r
67                 public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>,\r
68                 public IOleClientSite,\r
69                 public IOleContainer,\r
70                 public IOleControlSite,\r
71                 public IOleInPlaceSiteWindowless,\r
72                 public IObjectWithSiteImpl<FlashAxContainer>,\r
73                 public IServiceProvider,\r
74                 public IDispatchImpl<IDispatch>,\r
75                 public IDispEventSimpleImpl<0, FlashAxContainer, &DIID__IShockwaveFlashEvents>\r
76 {\r
77 \r
78 public:\r
79 \r
80         FlashAxContainer();\r
81         virtual ~FlashAxContainer();\r
82 \r
83         DECLARE_NO_REGISTRY()\r
84         DECLARE_POLY_AGGREGATABLE(FlashAxContainer)\r
85         DECLARE_GET_CONTROLLING_UNKNOWN()\r
86 \r
87         BEGIN_COM_MAP(FlashAxContainer)\r
88                 COM_INTERFACE_ENTRY(IDispatch)\r
89                 COM_INTERFACE_ENTRY(IOleClientSite)\r
90                 COM_INTERFACE_ENTRY(IObjectWithSite)\r
91                 COM_INTERFACE_ENTRY(IOleControlSite)\r
92                 COM_INTERFACE_ENTRY(IOleContainer)\r
93 \r
94                 COM_INTERFACE_ENTRY(IOleInPlaceSiteWindowless)\r
95                 COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)\r
96                 COM_INTERFACE_ENTRY(IOleInPlaceSite)\r
97                 COM_INTERFACE_ENTRY(IOleWindow)\r
98 \r
99                 COM_INTERFACE_ENTRY(IServiceProvider)\r
100 \r
101         END_COM_MAP()\r
102 \r
103         BEGIN_SINK_MAP(FlashAxContainer)\r
104                 SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xc5, OnFlashCall, &fnInfoFlashCallEvent)\r
105                 SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xfffffd9f, OnReadyStateChange, &fnInfoReadyStateChangeEvent)\r
106         END_SINK_MAP()\r
107 \r
108         void STDMETHODCALLTYPE OnFlashCall(BSTR request);\r
109         void STDMETHODCALLTYPE OnReadyStateChange(long newState);\r
110 \r
111 // IObjectWithSite\r
112         STDMETHOD(SetSite)(IUnknown* pUnkSite);\r
113 \r
114 // IOleClientSite\r
115         STDMETHOD(SaveObject)();\r
116         STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);\r
117         STDMETHOD(GetContainer)(IOleContainer** ppContainer);\r
118         STDMETHOD(ShowObject)();\r
119         STDMETHOD(OnShowWindow)(BOOL fShow);\r
120         STDMETHOD(RequestNewObjectLayout)();\r
121 \r
122 // IOleInPlaceSite\r
123         STDMETHOD(GetWindow)(HWND* pHwnd);\r
124         STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);\r
125         STDMETHOD(CanInPlaceActivate)();\r
126         STDMETHOD(OnInPlaceActivate)();\r
127         STDMETHOD(OnInPlaceDeactivate)();\r
128         STDMETHOD(OnUIActivate)();\r
129         STDMETHOD(OnUIDeactivate)(BOOL fUndoable);\r
130         STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo);\r
131         STDMETHOD(Scroll)(SIZE scrollExtant);\r
132         STDMETHOD(DiscardUndoState)();\r
133         STDMETHOD(DeactivateAndUndo)();\r
134         STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);\r
135 \r
136 // IOleInPlaceSiteEx\r
137         STDMETHOD(OnInPlaceActivateEx)(BOOL* pfNoRedraw, DWORD dwFlags);\r
138         STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);\r
139         STDMETHOD(RequestUIActivate)();\r
140 \r
141 // IOleInPlaceSiteWindowless\r
142         STDMETHOD(CanWindowlessActivate)();\r
143         STDMETHOD(GetCapture)();\r
144         STDMETHOD(SetCapture)(BOOL fCapture);\r
145         STDMETHOD(GetFocus)();\r
146         STDMETHOD(SetFocus)(BOOL fGotFocus);\r
147         STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);\r
148         STDMETHOD(ReleaseDC)(HDC hDC);\r
149         STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);\r
150         STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);\r
151         STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);\r
152         STDMETHOD(AdjustRect)(LPRECT prc);\r
153         STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);\r
154 \r
155 // IOleControlSite\r
156         STDMETHOD(OnControlInfoChanged)();\r
157         STDMETHOD(LockInPlaceActive)(BOOL fLock);\r
158         STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);\r
159         STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);\r
160         STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, DWORD grfModifiers);\r
161         STDMETHOD(OnFocus)(BOOL fGotFocus);\r
162         STDMETHOD(ShowPropertyFrame)();\r
163 \r
164 // IServiceProvider\r
165         STDMETHOD(QueryService)( REFGUID rsid, REFIID riid, void** ppvObj);\r
166 \r
167 // IOleContainer\r
168         STDMETHOD(ParseDisplayName)(IBindCtx*, LPOLESTR, ULONG*, IMoniker**)\r
169         {\r
170                 ATLTRACENOTIMPL(_T("IOleContainer::ParseDisplayName"));\r
171         }\r
172         STDMETHOD(EnumObjects)(DWORD, IEnumUnknown** ppenum)\r
173         {\r
174                 if (ppenum == NULL)\r
175                         return E_POINTER;\r
176                 *ppenum = NULL;\r
177                 typedef CComObject<CComEnum<IEnumUnknown, &__uuidof(IEnumUnknown), IUnknown*, _CopyInterface<IUnknown> > > enumunk;\r
178                 enumunk* p = NULL;\r
179                 ATLTRY(p = new enumunk);\r
180                 if(p == NULL)\r
181                         return E_OUTOFMEMORY;\r
182                 IUnknown* pTemp = m_spUnknown;\r
183                 // There is always only one object.\r
184                 HRESULT hRes = p->Init(reinterpret_cast<IUnknown**>(&pTemp), reinterpret_cast<IUnknown**>(&pTemp + 1), GetControllingUnknown(), AtlFlagCopy);\r
185                 if (SUCCEEDED(hRes))\r
186                         hRes = p->QueryInterface(__uuidof(IEnumUnknown), (void**)ppenum);\r
187                 if (FAILED(hRes))\r
188                         delete p;\r
189                 return hRes;\r
190         }\r
191         STDMETHOD(LockContainer)(BOOL)\r
192         {\r
193                 ATLTRACENOTIMPL(_T("IOleContainer::LockContainer"));\r
194         }\r
195 \r
196         HRESULT CreateAxControl();\r
197         void DestroyAxControl();\r
198         HRESULT QueryControl(REFIID iid, void** ppUnk);\r
199 \r
200         template <class Q>\r
201         HRESULT QueryControl(Q** ppUnk)\r
202         {\r
203                 return QueryControl(__uuidof(Q), (void**)ppUnk);\r
204         }\r
205 \r
206         bool InvalidRectangle() const;\r
207         bool CallFunction(const std::wstring& param);\r
208 \r
209 //      static ATL::CComObject<FlashAxContainer>* CreateInstance();\r
210 \r
211         bool DrawControl(HDC targetDC);\r
212 \r
213         HRESULT SetFormat(const video_format_desc&);\r
214         bool IsReadyToRender() const;\r
215         void EnterFullscreen();\r
216 \r
217         static bool CheckForFlashSupport();\r
218 private:\r
219         IDirectDraw4Ptr *m_lpDD4;\r
220         static CComBSTR flashGUID_;\r
221 \r
222         tbb::atomic<bool> bInvalidRect_;\r
223         tbb::atomic<bool> bCallSuccessful_;\r
224         tbb::atomic<bool> bReadyToRender_;\r
225 \r
226 //      state\r
227         bool            bUIActive_;\r
228         bool            bInPlaceActive_;\r
229         unsigned long           bHaveFocus_ : 1;\r
230         unsigned long           bCapture_ : 1;\r
231 \r
232         DWORD m_dwOleObject;\r
233         DWORD m_dwMiscStatus;\r
234         SIZEL m_hmSize;\r
235         SIZEL m_pxSize;\r
236         RECT m_rcPos;\r
237 \r
238         ATL::CComPtr<IUnknown> m_spUnknown;\r
239         ATL::CComPtr<IOleObject> m_spServices;\r
240         ATL::CComPtr<IOleObject> m_spOleObject;\r
241         ATL::CComPtr<IViewObjectEx> m_spViewObject;\r
242         ATL::CComPtr<IOleInPlaceObjectWindowless> m_spInPlaceObjectWindowless;\r
243 \r
244 //      ATL::CComPtr<ATL::CComObject<MyMoniker> > m_spMyMoniker;\r
245 };\r
246 \r
247 }       //namespace flash\r
248 }}      //namespace caspar\r
249 \r
250 #endif  //_FLASHAXCONTAINER_H__