aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_swf/SWFContainer.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_swf/SWFContainer.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Input/in_swf/SWFContainer.cpp')
-rw-r--r--Src/Plugins/Input/in_swf/SWFContainer.cpp574
1 files changed, 574 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_swf/SWFContainer.cpp b/Src/Plugins/Input/in_swf/SWFContainer.cpp
new file mode 100644
index 00000000..ac920248
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/SWFContainer.cpp
@@ -0,0 +1,574 @@
+#include "SWFContainer.h"
+
+#include <strsafe.h>
+
+// ---------------------------------------------------------------
+IConnectionPoint *SWFContainer::GetConnectionPoint (REFIID riid)
+{
+ IUnknown *punk = getUnknown ();
+ if (!punk)
+ return 0;
+
+ IConnectionPointContainer *pcpc;
+ IConnectionPoint *pcp = 0;
+
+ HRESULT hr = punk->QueryInterface (IID_IConnectionPointContainer, (void **) & pcpc);
+ if (SUCCEEDED (hr))
+ {
+ pcpc->FindConnectionPoint (riid, &pcp);
+ pcpc->Release();
+ }
+ punk->Release();
+ return pcp;
+}
+
+void SWFContainer::SyncSizeToWindow(HWND hwnd)
+{
+ RECT rect;
+ GetClientRect(hwnd, &rect);
+ int height = (rect.bottom - rect.top);
+
+ // if we get a null height then hide the html control (after limiting to 1px)
+ // and also hide it's parent window - is mainly for ml_wire to prevent display
+ // glitches when resizing the bottom segment all the way to the bottom
+ //ShowWindow(m_hwnd,height?SW_SHOWNA:SW_HIDE);
+ //ShowWindow(hwnd,height?SW_SHOWNA:SW_HIDE);
+ setLocation(0, 0, rect.right - rect.left, height?height:1);
+}
+
+ SWFContainer::SWFContainer(HWND hwnd)
+ : flash (0), m_cRefs(1), m_hwnd(hwnd), m_punk(NULL),
+ externalInterface(0)
+ {
+
+ bInitialized = (S_OK == CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)) ? true : false;
+
+ memset(&m_rect, 0, sizeof(m_rect));
+ add(ShockwaveFlashObjects::CLSID_ShockwaveFlash);
+
+ IUnknown *punk = getUnknown();
+ if (punk)
+ {
+
+ if (SUCCEEDED(punk->QueryInterface (ShockwaveFlashObjects::IID_IShockwaveFlash, (void **) & flash)))
+ {
+ IConnectionPoint *icp = GetConnectionPoint(ShockwaveFlashObjects::DIID__IShockwaveFlashEvents);
+ if (icp)
+ {
+ m_dwCookie = 0;
+ HRESULT hr = icp->Advise(static_cast<IDispatch *>(this), &m_dwCookie);
+ icp->Release();
+ }
+ }
+ else
+ flash=0;
+ punk->Release();
+ }
+ }
+
+SWFContainer::~SWFContainer()
+{
+ close();
+
+ if (bInitialized) CoUninitialize();
+}
+
+void SWFContainer::close()
+{
+ IOleObject *pioo;
+ if ( m_punk )
+ {
+ HRESULT hr = m_punk->QueryInterface(IID_IOleObject, (PVOID *) & pioo);
+ if (SUCCEEDED(hr))
+ {
+ pioo->Close(OLECLOSE_NOSAVE);
+ pioo->Release();
+ }
+ }
+
+ if (m_punk)
+ {
+ m_punk->Release();
+ m_punk = NULL;
+ }
+
+ if (flash)
+ {
+ flash->Stop();
+ flash->Release();
+ flash = 0;
+ }
+}
+
+STDMETHODIMP SWFContainer::QueryInterface(REFIID riid, PVOID *ppvObject)
+{
+ if (!ppvObject)
+ return E_POINTER;
+
+ if (IsEqualIID(riid, IID_IOleClientSite))
+ *ppvObject = (IOleClientSite *)this;
+ else if (IsEqualIID(riid, IID_IOleInPlaceSite))
+ *ppvObject = (IOleInPlaceSite *)this;
+ else if (IsEqualIID(riid, IID_IOleInPlaceFrame))
+ *ppvObject = (IOleInPlaceFrame *)this;
+ else if (IsEqualIID(riid, IID_IOleInPlaceUIWindow))
+ *ppvObject = (IOleInPlaceUIWindow *)this;
+// else if (IsEqualIID(riid, IID_IOleControlSite))
+// *ppvObject = (IOleControlSite *)this;
+ else if (IsEqualIID(riid, IID_IOleWindow))
+ *ppvObject = this;
+ else if (IsEqualIID(riid, IID_IDispatch))
+ *ppvObject = (IDispatch *)this;
+ else if (IsEqualIID(riid, IID_IUnknown))
+ *ppvObject = this;
+ else if (IsEqualIID(riid, __uuidof(ShockwaveFlashObjects::_IShockwaveFlashEvents)))
+ *ppvObject = (IDispatch *)this;
+ else
+ {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+
+ AddRef();
+ return S_OK;
+}
+
+ULONG SWFContainer::AddRef(void)
+{
+ return ++m_cRefs;
+}
+
+ULONG SWFContainer::Release(void)
+{
+ if (--m_cRefs)
+ return m_cRefs;
+
+// PostQuitMessage(0);
+ delete this;
+ return 0;
+}
+
+HRESULT SWFContainer::SaveObject()
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER * ppMk)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::GetContainer(LPOLECONTAINER * ppContainer)
+{
+ return E_NOINTERFACE;
+}
+
+HRESULT SWFContainer::ShowObject()
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::OnShowWindow(BOOL fShow)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::RequestNewObjectLayout()
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::GetWindow(HWND * lphwnd)
+{
+ if (!IsWindow(m_hwnd))
+ return S_FALSE;
+
+ *lphwnd = m_hwnd;
+ return S_OK;
+}
+
+HRESULT SWFContainer::ContextSensitiveHelp(BOOL fEnterMode)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::CanInPlaceActivate(void)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::OnInPlaceActivate(void)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::OnUIActivate(void)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::GetWindowContext(IOleInPlaceFrame ** ppFrame, IOleInPlaceUIWindow ** ppIIPUIWin,
+ LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
+{
+ *ppFrame = (IOleInPlaceFrame *)this;
+ *ppIIPUIWin = NULL;
+
+ RECT rect;
+ GetClientRect(m_hwnd, &rect);
+ lprcPosRect->left = 0;
+ lprcPosRect->top = 0;
+ lprcPosRect->right = rect.right;
+ lprcPosRect->bottom = rect.bottom;
+
+ CopyRect(lprcClipRect, lprcPosRect);
+
+ lpFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO);
+ lpFrameInfo->fMDIApp = FALSE;
+ lpFrameInfo->hwndFrame = m_hwnd;
+ lpFrameInfo->haccel = 0;
+ lpFrameInfo->cAccelEntries = 0;
+
+ (*ppFrame)->AddRef();
+ return S_OK;
+}
+
+HRESULT SWFContainer::Scroll(SIZE scrollExtent)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::OnUIDeactivate(BOOL fUndoable)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::OnInPlaceDeactivate(void)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::DiscardUndoState(void)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::DeactivateAndUndo(void)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::OnPosRectChange(LPCRECT lprcPosRect)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::RemoveMenus(HMENU hmenuShared)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::SetStatusText(LPCOLESTR pszStatusText)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::TranslateAccelerator(LPMSG lpmsg, WORD wID)
+{
+ return S_OK;
+}
+
+HRESULT SWFContainer::EnableModeless(BOOL fEnable)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::OnControlInfoChanged()
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::LockInPlaceActive(BOOL fLock)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::GetExtendedControl(IDispatch **ppDisp)
+{
+ if (ppDisp == NULL)
+ return E_INVALIDARG;
+
+ *ppDisp = (IDispatch *)this;
+ (*ppDisp)->AddRef();
+
+ return S_OK;
+}
+
+HRESULT SWFContainer::TransformCoords(POINTL *pptlHimetric, POINTF *pptfContainer, DWORD dwFlags)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::TranslateAccelerator(LPMSG pMsg, DWORD grfModifiers)
+{
+ return S_FALSE;
+}
+
+HRESULT SWFContainer::OnFocus(BOOL fGotFocus)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::ShowPropertyFrame(void)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)
+{
+ *rgdispid = DISPID_UNKNOWN;
+ return DISP_E_UNKNOWNNAME;
+}
+
+HRESULT SWFContainer::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::GetTypeInfoCount(unsigned int FAR * pctinfo)
+{
+ return E_NOTIMPL;
+}
+
+#define GET_SAFE_DISP_BSTR(_val) ((_val.pvarVal && VT_BSTR == _val.pvarVal->vt) ? _val.pvarVal->bstrVal : NULL)
+#define GET_SAFE_DISP_I4(_val) ((_val.pvarVal && VT_I4 == _val.pvarVal->vt) ? _val.pvarVal->intVal : 0)
+
+
+
+void SWFContainer::add(CLSID clsid)
+{
+ HRESULT hr; // return code
+
+ CoCreateInstance(clsid,
+ NULL,
+ CLSCTX_INPROC_SERVER/* | CLSCTX_LOCAL_SERVER*/,
+ IID_IUnknown,
+ (PVOID *)&m_punk);
+
+ if (!m_punk)
+ return ;
+
+ IOleObject *pioo;
+ hr = m_punk->QueryInterface(IID_IOleObject, (PVOID *) & pioo);
+ if (FAILED(hr))
+ return ;
+
+ pioo->SetClientSite(this);
+ pioo->Release();
+
+ IPersistStreamInit *ppsi;
+ hr = m_punk->QueryInterface(IID_IPersistStreamInit, (PVOID *) & ppsi);
+ if (SUCCEEDED(hr))
+ {
+ ppsi->InitNew();
+ ppsi->Release();
+ }
+}
+
+void SWFContainer::remove()
+{
+ if (!m_punk)
+ return ;
+
+ HRESULT hr;
+ IOleObject *pioo;
+ IOleInPlaceObject *pipo;
+
+ /*
+ benski> enabling this makes everything lock up!
+ IConnectionPoint *icp = GetConnectionPoint(DIID_DWebBrowserEvents2);
+ if (icp)
+ {
+// m_dwCookie = 0;
+ HRESULT hr = icp->Unadvise(m_dwCookie);
+ icp->Release();
+ }
+ */
+
+ hr = m_punk->QueryInterface(IID_IOleObject, (PVOID *) & pioo);
+ if (SUCCEEDED(hr))
+ {
+ pioo->Close(OLECLOSE_NOSAVE);
+ pioo->SetClientSite(NULL);
+ pioo->Release();
+ }
+
+ hr = m_punk->QueryInterface(IID_IOleInPlaceObject, (PVOID *) & pipo);
+ if (SUCCEEDED(hr))
+ {
+ pipo->UIDeactivate();
+ pipo->InPlaceDeactivate();
+ pipo->Release();
+ }
+
+ m_punk->Release();
+ m_punk = NULL;
+}
+
+
+void SWFContainer::setLocation(int x, int y, int width, int height)
+{
+ m_rect.left = x;
+ m_rect.top = y;
+ m_rect.right = x + width;
+ m_rect.bottom = y + height;
+
+ if (!m_punk)
+ return ;
+
+ HRESULT hr;
+ IOleInPlaceObject *pipo;
+
+ hr = m_punk->QueryInterface(IID_IOleInPlaceObject, (PVOID *) & pipo);
+ if (FAILED(hr))
+ return ;
+
+ pipo->SetObjectRects(&m_rect, &m_rect);
+ pipo->Release();
+}
+
+HRESULT SWFContainer::GetBorder(LPRECT lprectBorder)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::RequestBorderSpace(LPCBORDERWIDTHS lpborderwidths)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::SetBorderSpace(LPCBORDERWIDTHS lpborderwidths)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT SWFContainer::SetActiveObject(IOleInPlaceActiveObject * pActiveObject, LPCOLESTR lpszObjName)
+{
+ return E_NOTIMPL;
+}
+
+void SWFContainer::setVisible(BOOL fVisible)
+{
+ if (!m_punk)
+ return ;
+
+ HRESULT hr;
+ IOleObject *pioo;
+
+ hr = m_punk->QueryInterface(IID_IOleObject, (PVOID *) & pioo);
+ if (FAILED(hr))
+ return ;
+
+ if (fVisible)
+ {
+ pioo->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, this, 0, m_hwnd, &m_rect);
+ pioo->DoVerb(OLEIVERB_SHOW, NULL, this, 0, m_hwnd, &m_rect);
+ }
+ else
+ pioo->DoVerb(OLEIVERB_HIDE, NULL, this, 0, m_hwnd, NULL);
+
+ pioo->Release();
+}
+
+void SWFContainer::setFocus(BOOL fFocus)
+{
+ if (!m_punk)
+ return ;
+
+ HRESULT hr;
+ IOleObject *pioo;
+
+ if (fFocus)
+ {
+ hr = m_punk->QueryInterface(IID_IOleObject, (PVOID *) & pioo);
+ if (FAILED(hr))
+ return ;
+
+ pioo->DoVerb(OLEIVERB_UIACTIVATE, NULL, this, 0, m_hwnd, &m_rect);
+ pioo->Release();
+ }
+}
+
+bool SWFContainer::translateKey(LPMSG pMsg)
+{
+ if (!m_punk)
+ return false;
+
+ HRESULT hr;
+ IOleInPlaceActiveObject *pao;
+
+ hr = m_punk->QueryInterface(IID_IOleInPlaceActiveObject, (PVOID *) & pao);
+ if (FAILED(hr))
+ return false;
+
+ HRESULT res = pao->TranslateAccelerator(pMsg);
+ pao->Release();
+ return res == S_OK;
+}
+enum
+{
+ FLASH_DISPID_EXTERNALINTERFACE_CALL = 197,
+};
+
+HRESULT SWFContainer::Invoke(
+ /* [in] */ DISPID dispIdMember,
+ /* [in] */ REFIID riid,
+ /* [in] */ LCID lcid,
+ /* [in] */ WORD wFlags,
+ /* [out][in] */ DISPPARAMS *pDispParams,
+ /* [out] */ VARIANT *pVarResult,
+ /* [out] */ EXCEPINFO *pExcepInfo,
+ /* [out] */ UINT *puArgErr)
+{
+ switch (dispIdMember)
+ {
+ case 0x000007a6 : // OnProgress
+ break;
+
+ case 0x00000096 : // FSCommand
+ break;
+
+ case FLASH_DISPID_EXTERNALINTERFACE_CALL : // ExternalInterface.call()
+ {
+ if (externalInterface)
+ externalInterface->ExternalInterface_call(pDispParams->rgvarg[0].bstrVal);
+ }
+ break;
+ }
+ return DISP_E_MEMBERNOTFOUND;
+}
+
+
+/**************************************************************************
+
+* adContainer::getUnknown()
+
+**************************************************************************/
+
+IUnknown * SWFContainer::getUnknown()
+{
+ if (!m_punk)
+ return NULL;
+
+ m_punk->AddRef();
+ return m_punk;
+}