]> git.sesse.net Git - casparcg/blob - modules/silverlight/interop/XcpControlHost.cpp
2.0.0.2: graph - Changed interface.
[casparcg] / modules / silverlight / interop / XcpControlHost.cpp
1 #include "../StdAfx.h"\r
2 \r
3 #include "XcpControlHost.h"\r
4 #include "XcpPropertyBag.h"\r
5 #include "Ocidl.h"\r
6 #include "xcpctrl_h.h"\r
7 \r
8 #include "atlstr.h"\r
9 \r
10 using namespace ATL;\r
11 \r
12 #ifdef _MSC_VER\r
13 #pragma warning (disable : 4100)\r
14 #pragma warning(disable:4061)\r
15 #endif\r
16 \r
17 XcpControlHost::XcpControlHost() \r
18         : hControlWindow(nullptr)\r
19         , m_pUnKnown(nullptr)\r
20         , m_pControl(nullptr)\r
21 {\r
22 }\r
23 \r
24 XcpControlHost::~XcpControlHost() \r
25 {\r
26 }\r
27 \r
28 STDMETHODIMP XcpControlHost::GetHostOptions(DWORD* pdwOptions)\r
29 {\r
30         *pdwOptions = XcpHostOption_EnableCrossDomainDownloads|\r
31                 XcpHostOption_EnableScriptableObjectAccess|XcpHostOption_EnableHtmlDomAccess;\r
32         return S_OK;\r
33 }\r
34 \r
35 STDMETHODIMP XcpControlHost::GetCustomAppDomain(IUnknown** ppAppDomain) \r
36 {  \r
37         return S_OK;\r
38 }\r
39 \r
40 STDMETHODIMP XcpControlHost::GetControlVersion(UINT *puMajorVersion, UINT *puMinorVersion)\r
41 {\r
42         *puMajorVersion = 4;\r
43         *puMinorVersion = 50401;\r
44         return S_OK;;\r
45 }\r
46 \r
47 STDMETHODIMP XcpControlHost::NotifyLoaded() \r
48 {\r
49 //      MessageBox(L"Notify Loaded", L"Silverlight Error", 0);\r
50         return S_OK;\r
51 }\r
52 \r
53 STDMETHODIMP XcpControlHost::NotifyError(BSTR bstrError, BSTR bstrSource, long nLine, long nColumn)\r
54 {\r
55         return S_OK;\r
56 }\r
57 \r
58 STDMETHODIMP XcpControlHost::InvokeHandler(BSTR bstrName, VARIANT varParam1, VARIANT varParam2, VARIANT* pvarResult) \r
59 {\r
60         return E_NOTIMPL;\r
61 }\r
62 \r
63 STDMETHODIMP XcpControlHost::GetBaseUrl(BSTR* pbstrUrl) {\r
64 \r
65         CAtlString strPath = "C:\\";\r
66         //TCHAR pBuff[255];\r
67         //GetCurrentDirectory(255, pBuff);\r
68         //strPath = pBuff;\r
69         //strPath += "\\";\r
70 \r
71         *pbstrUrl = SysAllocString(strPath);\r
72 \r
73         //MessageBox(*pbstrUrl, L"GetBaseUrl", 0);\r
74         return S_OK;\r
75 }\r
76 \r
77 STDMETHODIMP XcpControlHost::GetNamedSource(BSTR bstrSourceName, BSTR* pbstrSource) \r
78 {    \r
79         return E_NOTIMPL;\r
80 }\r
81 \r
82 STDMETHODIMP XcpControlHost::DownloadUrl(BSTR bstrUrl, IXcpControlDownloadCallback* pCallback, IStream** ppStream) \r
83 {\r
84 //      MessageBox(L"DownloadUrl", L"DownloadUrl", 0);\r
85         return S_FALSE;\r
86 }\r
87 \r
88 ///////////////////////////////////////////////////////////////////////////////\r
89 // XcpControlHost IServiceProvider Implementation\r
90 \r
91 STDMETHODIMP XcpControlHost::QueryService(REFGUID rsid, REFIID riid, void** ppvObj) {\r
92         ATLASSERT(ppvObj != NULL);\r
93         if (ppvObj == NULL)\r
94                 return E_POINTER;\r
95         *ppvObj = NULL;\r
96 \r
97         //static const GUID IID_IXcpControlHost = \r
98         //      { 0x1B36028E, 0xB491, 0x4bb2, { 0x85, 0x84, 0x8A, 0x9E, 0x0A, 0x67, 0x7D, 0x6E }};\r
99 \r
100         HRESULT hr = E_NOINTERFACE;\r
101 \r
102         if ((rsid == IID_IXcpControlHost) && (riid == IID_IXcpControlHost)) {\r
103                 ((IXcpControlHost*)this)->AddRef();\r
104                 *ppvObj = (IXcpControlHost*)this;\r
105                 hr = S_OK;\r
106         }\r
107 \r
108         if ((rsid == IID_IXcpControlHost2) && (riid == IID_IXcpControlHost2)) {\r
109                 ((IXcpControlHost2*)this)->AddRef();\r
110                 *ppvObj = (IXcpControlHost2*)this;\r
111                 hr = S_OK;\r
112         }\r
113 \r
114 \r
115         return hr;\r
116 }\r
117 \r
118 ///////////////////////////////////////////////////////////////////////////////\r
119 // General ActiveX control embedding.\r
120 \r
121 \r
122 HRESULT XcpControlHost::CreateXcpControl(HWND hWnd) \r
123 {\r
124         AtlAxWinInit();\r
125 \r
126         HRESULT hr;\r
127         static const GUID IID_IXcpControl = \r
128                 { 0x1FB839CC, 0x116C, 0x4C9B, { 0xAE, 0x8E, 0x3D, 0xBB, 0x64, 0x96, 0xE3, 0x26 }};\r
129 \r
130         static const GUID CLSID_XcpControl = \r
131                 { 0xDFEAF541, 0xF3E1, 0x4c24, { 0xAC, 0xAC, 0x99, 0xC3, 0x07, 0x15, 0x08, 0x4A }};\r
132 \r
133         static const GUID IID_IXcpControl2 = \r
134                 { 0x1c3294f9, 0x891f, 0x49b1, { 0xBB, 0xAE, 0x49, 0x2a, 0x68, 0xBA, 0x10, 0xcc }};\r
135 \r
136 //      static const GUID CLSID_XcpControl2 = \r
137 //              { 0xDFEAF541, 0xF3E1, 0x4c24, { 0xAC, 0xAC, 0x99, 0xC3, 0x07, 0x15, 0x08, 0x4A }};\r
138 \r
139         //static const GUID IID_IXcpControlHost2 = \r
140         //      { 0xfb3ed7c4, 0x5797, 0x4b44, { 0x86, 0x95, 0x0c, 0x51, 0x2e, 0xa2, 0x7D, 0x8f }};\r
141         \r
142         hr = CoCreateInstance(CLSID_XcpControl, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&m_pUnKnown);\r
143         \r
144         if (SUCCEEDED(hr)) \r
145         {\r
146                 CComPtr<IUnknown> spUnkContainer;\r
147                 hr = XcpControlHost::_CreatorClass::CreateInstance(NULL, IID_IUnknown, (void**)&spUnkContainer);\r
148                 if (SUCCEEDED(hr)) \r
149                 {\r
150                         CComPtr<IAxWinHostWindow> pAxWindow;\r
151 \r
152                         spUnkContainer->QueryInterface(IID_IAxWinHostWindow, (void**)&pAxWindow);\r
153                         m_pUnKnown->QueryInterface(IID_IXcpControl2, (void**)&m_pControl);\r
154                         hr = pAxWindow->AttachControl(m_pUnKnown, hWnd);            \r
155                         hControlWindow = hWnd;\r
156 \r
157                         IOleInPlaceActiveObject *pObj;\r
158                         hr = m_pControl->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&pObj);\r
159                 }\r
160         }\r
161         return hr;\r
162 }\r
163 \r
164 HRESULT XcpControlHost::DestroyXcpControl()\r
165 {\r
166         HRESULT hr = S_OK;\r
167         if (m_pControl)\r
168         {\r
169                 m_pControl->Release();\r
170         }\r
171         if (m_pUnKnown)\r
172         {\r
173                 m_pUnKnown->Release();\r
174         }\r
175         return hr;\r
176 }\r
177 \r
178 \r
179 STDMETHODIMP XcpControlHost::AttachControl(IUnknown* pUnKnown, HWND hWnd) {\r
180         ReleaseAll();\r
181 \r
182         HRESULT hr = S_FALSE;\r
183         BOOL fReleaseWindowOnFailure = FALSE;\r
184 \r
185         if ((m_hWnd != NULL) && (m_hWnd != hWnd)) {\r
186                 // Don't release the window if it's the same as the one we already subclass/own\r
187                 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);\r
188                 ReleaseWindow();\r
189         }\r
190 \r
191         if (::IsWindow(hWnd)) {\r
192                 if (m_hWnd != hWnd) {\r
193                         // Don't need to subclass the window if we already own it\r
194                         SubclassWindow(hWnd);\r
195                         fReleaseWindowOnFailure = TRUE;\r
196                 }\r
197 \r
198                 hr = ActivateXcpControl(pUnKnown);\r
199                 if (FAILED(hr)) {\r
200                         ReleaseAll();\r
201 \r
202                         if (m_hWnd != NULL) {\r
203                                 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);\r
204 \r
205                                 if (fReleaseWindowOnFailure) {\r
206                                         // We subclassed the window in an attempt to create this control, so we unsubclass on failure\r
207                                         ReleaseWindow();\r
208                                 }\r
209                         }\r
210                 }\r
211         }\r
212         return hr;\r
213 }\r
214 \r
215 HRESULT XcpControlHost::ActivateXcpControl(IUnknown* pUnKnown) \r
216 {\r
217         if (pUnKnown == NULL)\r
218         {\r
219                 return S_OK;\r
220         }\r
221 \r
222         m_spUnknown = pUnKnown;\r
223 \r
224         HRESULT hr = S_OK;\r
225         pUnKnown->QueryInterface(__uuidof(IOleObject), (void**)&m_spOleObject);\r
226         if (m_spOleObject) \r
227         {\r
228                 m_spOleObject->GetMiscStatus(DVASPECT_CONTENT, &m_dwMiscStatus);\r
229                 if (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) \r
230                 {\r
231                         CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());\r
232                         m_spOleObject->SetClientSite(spClientSite);\r
233                 }\r
234 \r
235                 CComQIPtr<IPersistPropertyBag> pPersist(m_spOleObject);\r
236 \r
237                 if (pPersist != NULL) \r
238                 {\r
239                         IPropertyBag* pPropBag = new XcpPropertyBag();\r
240                         pPropBag->AddRef();\r
241 \r
242                         pPersist->Load((IPropertyBag*)pPropBag, NULL);\r
243                         pPropBag->Release();\r
244                 }\r
245 \r
246                 if (0 == (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)) \r
247                 {\r
248                         CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());\r
249                         m_spOleObject->SetClientSite(spClientSite);\r
250                 }\r
251 \r
252                 m_dwViewObjectType = 0;\r
253                 hr = m_spOleObject->QueryInterface(__uuidof(IViewObjectEx), (void**) &m_spViewObject);\r
254                 if (FAILED(hr)) \r
255                 {\r
256                         hr = m_spOleObject->QueryInterface(__uuidof(IViewObject2), (void**) &m_spViewObject);\r
257                         if (SUCCEEDED(hr)) {\r
258                                 m_dwViewObjectType = 3;\r
259                         }\r
260                 }\r
261                 else {\r
262                         m_dwViewObjectType = 7;\r
263                 }\r
264 \r
265                 if (FAILED(hr)) \r
266                 {\r
267                         hr = m_spOleObject->QueryInterface(__uuidof(IViewObject), (void**) &m_spViewObject);\r
268                         if (SUCCEEDED(hr))\r
269                                 m_dwViewObjectType = 1;\r
270                 }\r
271 \r
272                 CComQIPtr<IAdviseSink> spAdviseSink(GetControllingUnknown());\r
273                 m_spOleObject->Advise(spAdviseSink, &m_dwOleObject);\r
274                 if (m_spViewObject) \r
275                 {\r
276                         m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, spAdviseSink);\r
277                 }\r
278 \r
279                 m_spOleObject->SetHostNames(OLESTR("AXWIN"), NULL);\r
280 \r
281                 if ((m_dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0) \r
282                 {\r
283                         GetClientRect(&m_rcPos);\r
284 \r
285                         m_pxSize.cx =  m_rcPos.right - m_rcPos.left;\r
286                         m_pxSize.cy =  m_rcPos.bottom - m_rcPos.top;\r
287                         AtlPixelToHiMetric(&m_pxSize, &m_hmSize);\r
288                         m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize);\r
289                         m_spOleObject->GetExtent(DVASPECT_CONTENT, &m_hmSize);\r
290                         AtlHiMetricToPixel(&m_hmSize, &m_pxSize);\r
291                         m_rcPos.right = m_rcPos.left + m_pxSize.cx ;\r
292                         m_rcPos.bottom = m_rcPos.top + m_pxSize.cy ;\r
293 \r
294                         CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());\r
295                         hr = m_spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos);\r
296                         RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);\r
297                 }\r
298         }\r
299 \r
300         CComPtr<IObjectWithSite> spSite;\r
301         pUnKnown->QueryInterface(__uuidof(IObjectWithSite), (void**)&spSite);\r
302         if (spSite != NULL) \r
303         {\r
304                 spSite->SetSite(GetControllingUnknown());\r
305         }\r
306 \r
307         return hr;\r
308 }\r