aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_swf
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
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Input/in_swf')
-rw-r--r--Src/Plugins/Input/in_swf/ExtendedFileInfo.cpp41
-rw-r--r--Src/Plugins/Input/in_swf/FLVExternalInterface.cpp75
-rw-r--r--Src/Plugins/Input/in_swf/FLVExternalInterface.h8
-rw-r--r--Src/Plugins/Input/in_swf/FlashDispInterface.h7
-rw-r--r--Src/Plugins/Input/in_swf/SWFContainer.cpp574
-rw-r--r--Src/Plugins/Input/in_swf/SWFContainer.h144
-rw-r--r--Src/Plugins/Input/in_swf/SWFParameters.cpp104
-rw-r--r--Src/Plugins/Input/in_swf/SWFParameters.h37
-rw-r--r--Src/Plugins/Input/in_swf/SWFThread.cpp26
-rw-r--r--Src/Plugins/Input/in_swf/XMLString.cpp52
-rw-r--r--Src/Plugins/Input/in_swf/XMLString.h29
-rw-r--r--Src/Plugins/Input/in_swf/api.h6
-rw-r--r--Src/Plugins/Input/in_swf/flash9e.tlh347
-rw-r--r--Src/Plugins/Input/in_swf/in_swf.rc83
-rw-r--r--Src/Plugins/Input/in_swf/in_swf.sln30
-rw-r--r--Src/Plugins/Input/in_swf/in_swf.vcxproj258
-rw-r--r--Src/Plugins/Input/in_swf/in_swf.vcxproj.filters74
-rw-r--r--Src/Plugins/Input/in_swf/main.cpp447
-rw-r--r--Src/Plugins/Input/in_swf/main.h24
-rw-r--r--Src/Plugins/Input/in_swf/resource.h20
-rw-r--r--Src/Plugins/Input/in_swf/version.rc239
-rw-r--r--Src/Plugins/Input/in_swf/winampFLV.flabin0 -> 237056 bytes
22 files changed, 2425 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_swf/ExtendedFileInfo.cpp b/Src/Plugins/Input/in_swf/ExtendedFileInfo.cpp
new file mode 100644
index 00000000..be0efd14
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/ExtendedFileInfo.cpp
@@ -0,0 +1,41 @@
+#include "main.h"
+#include "resource.h"
+#include <shlwapi.h>
+#include <strsafe.h>
+#include "api.h"
+
+#define TESTKEYWORD(__keyword, __string)\
+ (CSTR_EQUAL == CompareStringA(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT),\
+ NORM_IGNORECASE, (__keyword), -1, (__string), -1))
+
+extern "C" __declspec( dllexport ) int winampGetExtendedFileInfoW(const wchar_t *fn, const char *data, wchar_t *dest, int destlen)
+{
+ if (TESTKEYWORD("type", data))
+ {
+ if (NULL != dest)
+ {
+ int index = 0;
+ if (destlen > 1)
+ dest[index++] = L'1';
+ dest[index] = L'\0';
+ }
+ return 1;
+ }
+ else if (TESTKEYWORD("family", data))
+ {
+ LPCWSTR e, p(NULL);
+ e = PathFindExtensionW(fn);
+ if (L'.' != *e) return 0;
+ e++;
+
+ if (CSTR_EQUAL == CompareStringW(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT),
+ NORM_IGNORECASE, e, -1, L"SWF", -1))
+ {
+ if (S_OK == StringCchCopyW(dest, destlen, WASABI_API_LNGSTRINGW(IDS_FAMILY_STRING))) return 1;
+ //p = L"Shockwave Flash";
+ }
+ //if (p && S_OK == StringCchCopyW(dest, destlen, p)) return 1;
+ return 0;
+ }
+ return 0;
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/FLVExternalInterface.cpp b/Src/Plugins/Input/in_swf/FLVExternalInterface.cpp
new file mode 100644
index 00000000..817215d6
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/FLVExternalInterface.cpp
@@ -0,0 +1,75 @@
+#include "FLVExternalInterface.h"
+#include "../xml/obj_xml.h"
+#include "api.h"
+#include "SWFParameters.h"
+#include "../Winamp/wa_ipc.h"
+#include "main.h"
+#include <api/service/waServiceFactory.h>
+#include <strsafe.h>
+
+BSTR FLVExternalInterface::ExternalInterface_call(BSTR xml)
+{
+ obj_xml *parser=0;
+ waServiceFactory *parserFactory = plugin.service->service_getServiceByGuid(obj_xmlGUID);
+ if (parserFactory)
+ parser = (obj_xml *)parserFactory->getInterface();
+
+ if (parser)
+ {
+ { // artificial scope for SWFParameters
+ SWFParameters parameters(parser);
+ parser->xmlreader_open();
+ parser->xmlreader_setEncoding(L"UTF-16");
+ parser->xmlreader_feed(xml, wcslen(xml)*sizeof(*xml));
+ parser->xmlreader_feed(0, 0);
+ parser->xmlreader_close();
+ if (parameters.functionName)
+ {
+ if (!wcscmp(parameters.functionName, L"Benski"))
+ {
+ }
+ else if (!wcscmp(parameters.functionName, L"Ready"))
+ {
+ unsigned int width, height;
+ if (parameters.GetUnsigned(0, &width) && parameters.GetUnsigned(1, &height))
+ videoOutput->open(width, height, 0, 1.0f /*(double)x/(double)y*/, VIDEO_MAKETYPE('N','O','N','E'));
+ // TODO:
+ // Play (if not paused during buffering)
+ }
+ else if (!wcscmp(parameters.functionName, L"Complete"))
+ {
+ PostMessage(plugin.hMainWindow, WM_WA_MPEG_EOF, 0, 0);
+ }
+ else if (!wcscmp(parameters.functionName, L"Metadata"))
+ {
+ // MessageBox(NULL, xml, L"Flash ExternalInterface.call()", MB_OK);
+ double duration;
+ if (parameters.GetDouble(0, &duration))
+ playLength = (int)(duration * 1000.0);
+
+ }
+ else if (!wcscmp(parameters.functionName, L"Buffering"))
+ {
+ Nullsoft::Utility::AutoLock autolock(statusGuard);
+ StringCchCopy(status, 256, L"buffering");
+ PostMessage(plugin.hMainWindow, WM_USER, 0, IPC_UPDTITLE);
+ }
+ else if (!wcscmp(parameters.functionName, L"Playing"))
+ {
+ Nullsoft::Utility::AutoLock autolock(statusGuard);
+ status[0]=0;
+ PostMessage(plugin.hMainWindow, WM_USER, 0, IPC_UPDTITLE);
+ }
+ else if (!wcscmp(parameters.functionName, L"Playhead"))
+ {
+ double playhead;
+ if (parameters.GetDouble(0, &playhead))
+ playPosition = (int)(playhead * 1000.0);
+ }
+ }
+ }
+ parserFactory->releaseInterface(parser);
+ }
+
+ return 0;
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/FLVExternalInterface.h b/Src/Plugins/Input/in_swf/FLVExternalInterface.h
new file mode 100644
index 00000000..01c79934
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/FLVExternalInterface.h
@@ -0,0 +1,8 @@
+#pragma once
+#include "FlashDispInterface.h"
+
+class FLVExternalInterface : public FlashDispInterface
+{
+private:
+ BSTR ExternalInterface_call(BSTR xml);
+}; \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/FlashDispInterface.h b/Src/Plugins/Input/in_swf/FlashDispInterface.h
new file mode 100644
index 00000000..9cd3a600
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/FlashDispInterface.h
@@ -0,0 +1,7 @@
+#pragma once
+#include <wtypes.h>
+class FlashDispInterface
+{
+public:
+ virtual BSTR ExternalInterface_call(BSTR xml) = 0;
+}; \ No newline at end of file
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;
+}
diff --git a/Src/Plugins/Input/in_swf/SWFContainer.h b/Src/Plugins/Input/in_swf/SWFContainer.h
new file mode 100644
index 00000000..2591bc0c
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/SWFContainer.h
@@ -0,0 +1,144 @@
+#ifndef NULLSOFT_HTMLCONTAINERH
+#define NULLSOFT_HTMLCONTAINERH
+
+#include <oleidl.h>
+#include <ocidl.h>
+//#import <system32/macromed/Flash/Flash9e.ocx> /*no_namespace, */named_guids, raw_interfaces_only, exclude("IServiceProvider")
+#include "Flash9e.tlh"
+#include "FlashDispInterface.h"
+//#include <shlobj.h>
+
+/**************************************************************************
+ class definitions
+**************************************************************************/
+
+
+#ifndef DOCHOSTUIFLAG_HOST_NAVIGATES
+#define DOCHOSTUIFLAG_HOST_NAVIGATES 0x02000000
+#endif
+#ifndef DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION
+#define DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION 0x04000000
+#endif
+#ifndef DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL
+#define DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL 0x08000000
+#endif
+#ifndef DOCHOSTUIFLAG_USE_WINDOWED_SELECTCONTROL
+#define DOCHOSTUIFLAG_USE_WINDOWED_SELECTCONTROL 0x10000000
+#endif
+#ifndef DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE
+#define DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 0x20000000
+#endif
+
+
+class SWFContainer : public IOleClientSite,
+ public IOleInPlaceSite,
+ public IOleInPlaceFrame,
+ public IOleControlSite,
+ public IDispatch
+{
+protected:
+ ULONG m_cRefs; // ref count
+
+ IUnknown *m_punk; // IUnknown of contained object
+ RECT m_rect; // size of control
+
+ bool bInitialized;
+public:
+ HWND m_hwnd; // window handle of the container
+ SWFContainer(HWND hwnd);
+ virtual ~SWFContainer();
+
+public:
+ // *** IUnknown Methods ***
+ STDMETHOD(QueryInterface)(REFIID riid, PVOID *ppvObject);
+ STDMETHOD_(ULONG, AddRef)(void);
+ STDMETHOD_(ULONG, Release)(void);
+
+ // *** IOleInPlaceUIWindow Methods ***
+ STDMETHOD (GetBorder)(LPRECT lprectBorder);
+ STDMETHOD (RequestBorderSpace)(LPCBORDERWIDTHS lpborderwidths);
+ STDMETHOD (SetBorderSpace)(LPCBORDERWIDTHS lpborderwidths);
+ STDMETHOD (SetActiveObject)(IOleInPlaceActiveObject * pActiveObject,
+ LPCOLESTR lpszObjName);
+ // *** IOleClientSite Methods ***
+ STDMETHOD (SaveObject)();
+ STDMETHOD (GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMk);
+ STDMETHOD (GetContainer)(LPOLECONTAINER *ppContainer);
+ STDMETHOD (ShowObject)();
+ STDMETHOD (OnShowWindow)(BOOL fShow);
+ STDMETHOD (RequestNewObjectLayout)();
+
+ // *** IOleWindow Methods ***
+ STDMETHOD (GetWindow) (HWND * phwnd);
+ STDMETHOD (ContextSensitiveHelp) (BOOL fEnterMode);
+
+ // *** IOleInPlaceSite Methods ***
+ STDMETHOD (CanInPlaceActivate) (void);
+ STDMETHOD (OnInPlaceActivate) (void);
+ STDMETHOD (OnUIActivate) (void);
+ STDMETHOD (GetWindowContext) (IOleInPlaceFrame ** ppFrame, IOleInPlaceUIWindow ** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
+ STDMETHOD (Scroll) (SIZE scrollExtent);
+ STDMETHOD (OnUIDeactivate) (BOOL fUndoable);
+ STDMETHOD (OnInPlaceDeactivate) (void);
+ STDMETHOD (DiscardUndoState) (void);
+ STDMETHOD (DeactivateAndUndo) (void);
+ STDMETHOD (OnPosRectChange) (LPCRECT lprcPosRect);
+
+
+ // *** IOleInPlaceFrame Methods ***
+ STDMETHOD (InsertMenus)(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
+ STDMETHOD (SetMenu)(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
+ STDMETHOD (RemoveMenus)(HMENU hmenuShared);
+ STDMETHOD (SetStatusText)(LPCOLESTR pszStatusText);
+ STDMETHOD (EnableModeless)(BOOL fEnable);
+ STDMETHOD (TranslateAccelerator)(LPMSG lpmsg, WORD wID);
+
+ // *** IOleControlSite Methods ***
+ STDMETHOD (OnControlInfoChanged)(void);
+ STDMETHOD (LockInPlaceActive)(BOOL fLock);
+ STDMETHOD (GetExtendedControl)(IDispatch **ppDisp);
+ STDMETHOD (TransformCoords)(POINTL *pptlHimetric, POINTF *pptfContainer, DWORD dwFlags);
+ STDMETHOD (TranslateAccelerator)(LPMSG pMsg, DWORD grfModifiers);
+ STDMETHOD (OnFocus)(BOOL fGotFocus);
+ STDMETHOD (ShowPropertyFrame)(void);
+
+ // *** IDispatch Methods ***
+ STDMETHOD (GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid);
+ STDMETHOD (GetTypeInfo)(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo);
+ STDMETHOD (GetTypeInfoCount)(unsigned int FAR * pctinfo);
+ STDMETHOD (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);
+
+
+public:
+ void add(CLSID clsid);
+ void remove();
+
+ void setLocation(int x, int y, int width, int height);
+ void setVisible(BOOL fVisible);
+ void setFocus(BOOL fFocus);
+ void setStatusWindow(HWND hwndStatus);
+ bool translateKey(LPMSG pMsg);
+
+
+ void close();
+
+ IUnknown * getUnknown();
+ void SyncSizeToWindow(HWND window);
+ IConnectionPoint *GetConnectionPoint(REFIID riid);
+ DWORD m_dwCookie;
+ struct ShockwaveFlashObjects::IShockwaveFlash *flash;
+ FlashDispInterface *externalInterface;
+private:
+
+};
+
+
+#endif
diff --git a/Src/Plugins/Input/in_swf/SWFParameters.cpp b/Src/Plugins/Input/in_swf/SWFParameters.cpp
new file mode 100644
index 00000000..9f272e6b
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/SWFParameters.cpp
@@ -0,0 +1,104 @@
+#include "SWFParameters.h"
+#include "../xml/obj_xml.h"
+#include <locale.h>
+
+/*
+example:
+<invoke name="Benski" returntype="xml">
+<arguments>
+</arguments>
+</invoke>
+*/
+
+SWFParameters::SWFParameters(obj_xml *_parser)
+{
+ parser = _parser;
+ parser->xmlreader_setCaseSensitive();
+ parser->xmlreader_registerCallback(L"invoke", this);
+ parser->xmlreader_registerCallback(L"invoke\farguments\f*", this);
+ parser->xmlreader_registerCallback(L"invoke\farguments\f*", &currentParameter);
+ functionName=0;
+ C_locale = _create_locale(LC_NUMERIC, "C");
+}
+
+SWFParameters::~SWFParameters()
+{
+ for (ArgumentList::iterator itr=arguments.begin();itr!=arguments.end();itr++)
+ {
+ SWFArgument *argument = *itr;
+ free(argument->type);
+ free(argument->value);
+ free(argument);
+ }
+ arguments.clear();
+ parser->xmlreader_unregisterCallback(this);
+ parser->xmlreader_unregisterCallback(&currentParameter);
+}
+
+void SWFParameters::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ if (!wcscmp(xmlpath, L"invoke"))
+ {
+ const wchar_t *name = params->getItemValue(L"name");
+ if (name)
+ functionName = _wcsdup(name);
+ }
+}
+
+void SWFParameters::EndTag(const wchar_t *xmlpath, const wchar_t *xmltag)
+{
+ if (!wcsncmp(xmlpath, L"invoke\farguments\f", 6 /*invoke*/+ 1/*\f*/ + 9/*arguments*/ + 1/*\f*/))
+ {
+ SWFArgument *argument = new SWFArgument;
+ argument->type = _wcsdup(xmltag);
+ const wchar_t *value = currentParameter.GetString();
+ if (value)
+ argument->value = _wcsdup(value);
+ else
+ argument->value = 0;
+ arguments.push_back(argument);
+ }
+}
+
+bool SWFParameters::GetUnsigned(size_t index, unsigned int *value)
+{
+ if (index < arguments.size())
+ {
+ SWFArgument *argument = arguments[index];
+ if (argument && argument->type && !wcscmp(argument->type, L"number"))
+ {
+ const wchar_t *val = argument->value;
+ if (val)
+ {
+ *value = wcstoul(val, 0, 10);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool SWFParameters::GetDouble(size_t index, double *value)
+{
+ if (index < arguments.size())
+ {
+ SWFArgument *argument = arguments[index];
+ if (argument && argument->type && !wcscmp(argument->type, L"number"))
+ {
+ const wchar_t *val = argument->value;
+ if (val)
+ {
+ *value = _wtof_l(val, C_locale);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+#define CBCLASS SWFParameters
+START_DISPATCH;
+VCB(ONSTARTELEMENT, StartTag)
+VCB(ONENDELEMENT, EndTag)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/SWFParameters.h b/Src/Plugins/Input/in_swf/SWFParameters.h
new file mode 100644
index 00000000..ca9b68e0
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/SWFParameters.h
@@ -0,0 +1,37 @@
+#pragma once
+#include "../xml/ifc_xmlreadercallback.h"
+#include "XMLString.h"
+#include <vector>
+#include <crtdefs.h>
+
+class obj_xml;
+
+struct SWFArgument
+{
+ wchar_t *type;
+ wchar_t *value;
+};
+
+class SWFParameters : public ifc_xmlreadercallback
+{
+public:
+ typedef std::vector<SWFArgument*> ArgumentList;
+
+ SWFParameters(obj_xml *_parser);
+ ~SWFParameters();
+
+ wchar_t *functionName;
+
+ bool GetUnsigned(size_t index, unsigned int *value);
+ bool GetDouble(size_t index, double *value);
+private:
+ void StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params);
+ void EndTag(const wchar_t *xmlpath, const wchar_t *xmltag);
+ XMLString currentParameter;
+ ArgumentList arguments;
+
+ _locale_t C_locale;
+ obj_xml *parser;
+protected:
+ RECVS_DISPATCH;
+}; \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/SWFThread.cpp b/Src/Plugins/Input/in_swf/SWFThread.cpp
new file mode 100644
index 00000000..510cb8b1
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/SWFThread.cpp
@@ -0,0 +1,26 @@
+#include "main.h"
+#include "api.h"
+#include "SWFContainer.h"
+
+SWFContainer *activeContainer=0;
+WNDPROC oldVidProc=0;
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ PAINTSTRUCT ps;
+ HDC hdc;
+
+ switch (message)
+ {
+ case WM_SIZE:
+ activeContainer->SyncSizeToWindow(hWnd);
+ break;
+ case WM_ERASEBKGND:
+ return 1;
+ case WM_PAINT:
+ hdc = BeginPaint(hWnd, &ps);
+ EndPaint(hWnd, &ps);
+ break;
+ }
+ return CallWindowProc(oldVidProc, hWnd, message, wParam, lParam);
+}
+
diff --git a/Src/Plugins/Input/in_swf/XMLString.cpp b/Src/Plugins/Input/in_swf/XMLString.cpp
new file mode 100644
index 00000000..09d893e2
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/XMLString.cpp
@@ -0,0 +1,52 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+ ** Filename:
+ ** Project:
+ ** Description:
+ ** Author: Ben Allison benski@nullsoft.com
+ ** Created:
+ **/
+#include "main.h"
+#include "XMLString.h"
+#include <strsafe.h>
+
+XMLString::XMLString()
+{
+ data[0]=0;
+}
+
+void XMLString::Reset()
+{
+ data[0]=0;
+}
+
+const wchar_t *XMLString::GetString()
+{
+ return data;
+}
+
+void XMLString::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ data[0]=0;
+}
+
+
+void XMLString::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str)
+{
+ StringCchCatW(data, XMLSTRING_SIZE, str);
+}
+
+
+void XMLString::ManualSet(const wchar_t *string)
+{
+StringCchCatW(data, XMLSTRING_SIZE, string);
+}
+
+#ifdef CBCLASS
+#undef CBCLASS
+#endif
+
+#define CBCLASS XMLString
+START_DISPATCH;
+VCB(ONSTARTELEMENT, StartTag)
+VCB(ONCHARDATA, TextHandler)
+END_DISPATCH;
diff --git a/Src/Plugins/Input/in_swf/XMLString.h b/Src/Plugins/Input/in_swf/XMLString.h
new file mode 100644
index 00000000..c26eaee0
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/XMLString.h
@@ -0,0 +1,29 @@
+#ifndef NULLSOFT_WINAMP_XMLSTRING_H
+#define NULLSOFT_WINAMP_XMLSTRING_H
+
+
+#include "../xml/ifc_xmlreadercallback.h"
+/*
+this one is an xml callback that just saves the last encountered string
+*/
+
+#define XMLSTRING_SIZE 1024
+class XMLString : public ifc_xmlreadercallback
+{
+public:
+ XMLString();
+ void Reset();
+ const wchar_t *GetString();
+ void ManualSet(const wchar_t *string);
+private:
+ /* XML callbacks */
+ void StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params);
+ void EndTag(const wchar_t *xmlpath, const wchar_t *xmltag);
+ void TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str);
+
+ wchar_t data[XMLSTRING_SIZE]; // for now, we'll make it dynamic later
+
+ RECVS_DISPATCH;
+};
+
+#endif \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/api.h b/Src/Plugins/Input/in_swf/api.h
new file mode 100644
index 00000000..0d864017
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/api.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include <api/application/api_application.h>
+#define WASABI_API_APP applicationApi
+
+#include "../Agave/Language/api_language.h" \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/flash9e.tlh b/Src/Plugins/Input/in_swf/flash9e.tlh
new file mode 100644
index 00000000..d2d4d9f4
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/flash9e.tlh
@@ -0,0 +1,347 @@
+// Created by Microsoft (R) C/C++ Compiler Version 13.10.6030 (0c25145a).
+//
+// e:\nullsoft\in_swf\release\flash9e.tlh
+//
+// C++ source equivalent of Win32 type library C:/windows/system32/macromed/Flash/Flash9e.ocx
+// compiler-generated file created 04/17/08 at 15:29:08 - DO NOT EDIT!
+
+#pragma once
+#pragma pack(push, 8)
+
+#include <comdef.h>
+
+namespace ShockwaveFlashObjects {
+
+//
+// Forward references and typedefs
+//
+
+struct __declspec(uuid("d27cdb6b-ae6d-11cf-96b8-444553540000"))
+/* LIBID */ __ShockwaveFlashObjects;
+struct __declspec(uuid("d27cdb6c-ae6d-11cf-96b8-444553540000"))
+/* dual interface */ IShockwaveFlash;
+struct __declspec(uuid("d27cdb6d-ae6d-11cf-96b8-444553540000"))
+/* dispinterface */ _IShockwaveFlashEvents;
+struct /* coclass */ ShockwaveFlash;
+struct __declspec(uuid("d27cdb70-ae6d-11cf-96b8-444553540000"))
+/* interface */ IFlashFactory;
+struct __declspec(uuid("d27cdb72-ae6d-11cf-96b8-444553540000"))
+/* interface */ IFlashObjectInterface;
+struct __declspec(uuid("a6ef9860-c720-11d0-9337-00a0c90dcaa9"))
+/* interface */ IDispatchEx;
+struct /* coclass */ FlashObjectInterface;
+
+//
+// Smart pointer typedef declarations
+//
+
+_COM_SMARTPTR_TYPEDEF(IShockwaveFlash, __uuidof(IShockwaveFlash));
+_COM_SMARTPTR_TYPEDEF(_IShockwaveFlashEvents, __uuidof(_IShockwaveFlashEvents));
+_COM_SMARTPTR_TYPEDEF(IFlashFactory, __uuidof(IFlashFactory));
+_COM_SMARTPTR_TYPEDEF(IDispatchEx, __uuidof(IDispatchEx));
+_COM_SMARTPTR_TYPEDEF(IFlashObjectInterface, __uuidof(IFlashObjectInterface));
+
+//
+// Type library items
+//
+
+struct __declspec(uuid("d27cdb6c-ae6d-11cf-96b8-444553540000"))
+IShockwaveFlash : IDispatch
+{
+ //
+ // Raw methods provided by interface
+ //
+
+ virtual HRESULT __stdcall get_ReadyState (
+ /*[out,retval]*/ long * pVal ) = 0;
+ virtual HRESULT __stdcall get_TotalFrames (
+ /*[out,retval]*/ long * pVal ) = 0;
+ virtual HRESULT __stdcall get_Playing (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_Playing (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall get_Quality (
+ /*[out,retval]*/ int * pVal ) = 0;
+ virtual HRESULT __stdcall put_Quality (
+ /*[in]*/ int pVal ) = 0;
+ virtual HRESULT __stdcall get_ScaleMode (
+ /*[out,retval]*/ int * pVal ) = 0;
+ virtual HRESULT __stdcall put_ScaleMode (
+ /*[in]*/ int pVal ) = 0;
+ virtual HRESULT __stdcall get_AlignMode (
+ /*[out,retval]*/ int * pVal ) = 0;
+ virtual HRESULT __stdcall put_AlignMode (
+ /*[in]*/ int pVal ) = 0;
+ virtual HRESULT __stdcall get_BackgroundColor (
+ /*[out,retval]*/ long * pVal ) = 0;
+ virtual HRESULT __stdcall put_BackgroundColor (
+ /*[in]*/ long pVal ) = 0;
+ virtual HRESULT __stdcall get_Loop (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_Loop (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall get_Movie (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_Movie (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_FrameNum (
+ /*[out,retval]*/ long * pVal ) = 0;
+ virtual HRESULT __stdcall put_FrameNum (
+ /*[in]*/ long pVal ) = 0;
+ virtual HRESULT __stdcall SetZoomRect (
+ /*[in]*/ long left,
+ /*[in]*/ long top,
+ /*[in]*/ long right,
+ /*[in]*/ long bottom ) = 0;
+ virtual HRESULT __stdcall Zoom (
+ /*[in]*/ int factor ) = 0;
+ virtual HRESULT __stdcall Pan (
+ /*[in]*/ long x,
+ /*[in]*/ long y,
+ /*[in]*/ int mode ) = 0;
+ virtual HRESULT __stdcall Play ( ) = 0;
+ virtual HRESULT __stdcall Stop ( ) = 0;
+ virtual HRESULT __stdcall Back ( ) = 0;
+ virtual HRESULT __stdcall Forward ( ) = 0;
+ virtual HRESULT __stdcall Rewind ( ) = 0;
+ virtual HRESULT __stdcall StopPlay ( ) = 0;
+ virtual HRESULT __stdcall GotoFrame (
+ /*[in]*/ long FrameNum ) = 0;
+ virtual HRESULT __stdcall CurrentFrame (
+ /*[out,retval]*/ long * FrameNum ) = 0;
+ virtual HRESULT __stdcall IsPlaying (
+ /*[out,retval]*/ VARIANT_BOOL * Playing ) = 0;
+ virtual HRESULT __stdcall PercentLoaded (
+ /*[out,retval]*/ long * percent ) = 0;
+ virtual HRESULT __stdcall FrameLoaded (
+ /*[in]*/ long FrameNum,
+ /*[out,retval]*/ VARIANT_BOOL * loaded ) = 0;
+ virtual HRESULT __stdcall FlashVersion (
+ /*[out,retval]*/ long * version ) = 0;
+ virtual HRESULT __stdcall get_WMode (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_WMode (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_SAlign (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_SAlign (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_Menu (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_Menu (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall get_Base (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_Base (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_Scale (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_Scale (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_DeviceFont (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_DeviceFont (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall get_EmbedMovie (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_EmbedMovie (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall get_BGColor (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_BGColor (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_Quality2 (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_Quality2 (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall LoadMovie (
+ /*[in]*/ int layer,
+ /*[in]*/ BSTR url ) = 0;
+ virtual HRESULT __stdcall TGotoFrame (
+ /*[in]*/ BSTR target,
+ /*[in]*/ long FrameNum ) = 0;
+ virtual HRESULT __stdcall TGotoLabel (
+ /*[in]*/ BSTR target,
+ /*[in]*/ BSTR label ) = 0;
+ virtual HRESULT __stdcall TCurrentFrame (
+ /*[in]*/ BSTR target,
+ /*[out,retval]*/ long * FrameNum ) = 0;
+ virtual HRESULT __stdcall TCurrentLabel (
+ /*[in]*/ BSTR target,
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall TPlay (
+ /*[in]*/ BSTR target ) = 0;
+ virtual HRESULT __stdcall TStopPlay (
+ /*[in]*/ BSTR target ) = 0;
+ virtual HRESULT __stdcall SetVariable (
+ /*[in]*/ BSTR name,
+ /*[in]*/ BSTR value ) = 0;
+ virtual HRESULT __stdcall GetVariable (
+ /*[in]*/ BSTR name,
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall TSetProperty (
+ /*[in]*/ BSTR target,
+ /*[in]*/ int property,
+ /*[in]*/ BSTR value ) = 0;
+ virtual HRESULT __stdcall TGetProperty (
+ /*[in]*/ BSTR target,
+ /*[in]*/ int property,
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall TCallFrame (
+ /*[in]*/ BSTR target,
+ /*[in]*/ int FrameNum ) = 0;
+ virtual HRESULT __stdcall TCallLabel (
+ /*[in]*/ BSTR target,
+ /*[in]*/ BSTR label ) = 0;
+ virtual HRESULT __stdcall TSetPropertyNum (
+ /*[in]*/ BSTR target,
+ /*[in]*/ int property,
+ /*[in]*/ double value ) = 0;
+ virtual HRESULT __stdcall TGetPropertyNum (
+ /*[in]*/ BSTR target,
+ /*[in]*/ int property,
+ /*[out,retval]*/ double * pVal ) = 0;
+ virtual HRESULT __stdcall TGetPropertyAsNumber (
+ /*[in]*/ BSTR target,
+ /*[in]*/ int property,
+ /*[out,retval]*/ double * pVal ) = 0;
+ virtual HRESULT __stdcall get_SWRemote (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_SWRemote (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_FlashVars (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_FlashVars (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_AllowScriptAccess (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_AllowScriptAccess (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_MovieData (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_MovieData (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_InlineData (
+ /*[out,retval]*/ IUnknown * * ppIUnknown ) = 0;
+ virtual HRESULT __stdcall put_InlineData (
+ /*[in]*/ IUnknown * ppIUnknown ) = 0;
+ virtual HRESULT __stdcall get_SeamlessTabbing (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_SeamlessTabbing (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall EnforceLocalSecurity ( ) = 0;
+ virtual HRESULT __stdcall get_Profile (
+ /*[out,retval]*/ VARIANT_BOOL * pVal ) = 0;
+ virtual HRESULT __stdcall put_Profile (
+ /*[in]*/ VARIANT_BOOL pVal ) = 0;
+ virtual HRESULT __stdcall get_ProfileAddress (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_ProfileAddress (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_ProfilePort (
+ /*[out,retval]*/ long * pVal ) = 0;
+ virtual HRESULT __stdcall put_ProfilePort (
+ /*[in]*/ long pVal ) = 0;
+ virtual HRESULT __stdcall CallFunction (
+ /*[in]*/ BSTR request,
+ /*[out,retval]*/ BSTR * response ) = 0;
+ virtual HRESULT __stdcall SetReturnValue (
+ /*[in]*/ BSTR returnValue ) = 0;
+ virtual HRESULT __stdcall DisableLocalSecurity ( ) = 0;
+ virtual HRESULT __stdcall get_AllowNetworking (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_AllowNetworking (
+ /*[in]*/ BSTR pVal ) = 0;
+ virtual HRESULT __stdcall get_AllowFullScreen (
+ /*[out,retval]*/ BSTR * pVal ) = 0;
+ virtual HRESULT __stdcall put_AllowFullScreen (
+ /*[in]*/ BSTR pVal ) = 0;
+};
+
+struct __declspec(uuid("d27cdb6d-ae6d-11cf-96b8-444553540000"))
+_IShockwaveFlashEvents : IDispatch
+{};
+
+struct __declspec(uuid("d27cdb6e-ae6d-11cf-96b8-444553540000"))
+ShockwaveFlash;
+ // [ default ] interface IShockwaveFlash
+ // [ default, source ] dispinterface _IShockwaveFlashEvents
+
+struct __declspec(uuid("d27cdb70-ae6d-11cf-96b8-444553540000"))
+IFlashFactory : IUnknown
+{};
+
+struct __declspec(uuid("a6ef9860-c720-11d0-9337-00a0c90dcaa9"))
+IDispatchEx : IDispatch
+{
+ //
+ // Raw methods provided by interface
+ //
+
+ virtual HRESULT __stdcall GetDispID (
+ /*[in]*/ BSTR bstrName,
+ /*[in]*/ unsigned long grfdex,
+ /*[out]*/ long * pid ) = 0;
+ virtual HRESULT __stdcall RemoteInvokeEx (
+ /*[in]*/ long id,
+ /*[in]*/ unsigned long lcid,
+ /*[in]*/ unsigned long dwFlags,
+ /*[in]*/ struct DISPPARAMS * pdp,
+ /*[out]*/ VARIANT * pvarRes,
+ /*[out]*/ struct EXCEPINFO * pei,
+ /*[in]*/ struct IServiceProvider * pspCaller,
+ /*[in]*/ unsigned int cvarRefArg,
+ /*[in]*/ unsigned int * rgiRefArg,
+ /*[in,out]*/ VARIANT * rgvarRefArg ) = 0;
+ virtual HRESULT __stdcall DeleteMemberByName (
+ /*[in]*/ BSTR bstrName,
+ /*[in]*/ unsigned long grfdex ) = 0;
+ virtual HRESULT __stdcall DeleteMemberByDispID (
+ /*[in]*/ long id ) = 0;
+ virtual HRESULT __stdcall GetMemberProperties (
+ /*[in]*/ long id,
+ /*[in]*/ unsigned long grfdexFetch,
+ /*[out]*/ unsigned long * pgrfdex ) = 0;
+ virtual HRESULT __stdcall GetMemberName (
+ /*[in]*/ long id,
+ /*[out]*/ BSTR * pbstrName ) = 0;
+ virtual HRESULT __stdcall GetNextDispID (
+ /*[in]*/ unsigned long grfdex,
+ /*[in]*/ long id,
+ /*[out]*/ long * pid ) = 0;
+ virtual HRESULT __stdcall GetNameSpaceParent (
+ /*[out]*/ IUnknown * * ppunk ) = 0;
+};
+
+struct __declspec(uuid("d27cdb72-ae6d-11cf-96b8-444553540000"))
+IFlashObjectInterface : IDispatchEx
+{};
+
+struct __declspec(uuid("d27cdb71-ae6d-11cf-96b8-444553540000"))
+FlashObjectInterface;
+ // [ default ] interface IFlashObjectInterface
+
+//
+// Named GUID constants initializations
+//
+
+extern "C" const GUID __declspec(selectany) LIBID_ShockwaveFlashObjects =
+ {0xd27cdb6b,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+extern "C" const GUID __declspec(selectany) IID_IShockwaveFlash =
+ {0xd27cdb6c,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+extern "C" const GUID __declspec(selectany) DIID__IShockwaveFlashEvents =
+ {0xd27cdb6d,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+extern "C" const GUID __declspec(selectany) CLSID_ShockwaveFlash =
+ {0xd27cdb6e,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+extern "C" const GUID __declspec(selectany) IID_IFlashFactory =
+ {0xd27cdb70,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+extern "C" const GUID __declspec(selectany) IID_IDispatchEx =
+ {0xa6ef9860,0xc720,0x11d0,{0x93,0x37,0x00,0xa0,0xc9,0x0d,0xca,0xa9}};
+extern "C" const GUID __declspec(selectany) IID_IFlashObjectInterface =
+ {0xd27cdb72,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+extern "C" const GUID __declspec(selectany) CLSID_FlashObjectInterface =
+ {0xd27cdb71,0xae6d,0x11cf,{0x96,0xb8,0x44,0x45,0x53,0x54,0x00,0x00}};
+
+} // namespace ShockwaveFlashObjects
+
+#pragma pack(pop)
diff --git a/Src/Plugins/Input/in_swf/in_swf.rc b/Src/Plugins/Input/in_swf/in_swf.rc
new file mode 100644
index 00000000..66ac58e9
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/in_swf.rc
@@ -0,0 +1,83 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "#include ""version.rc2""\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_NULLSOFT_SWF "Nullsoft Flash Control Playback v%s"
+ 65535 "{2430A7AC-317D-4d64-B33C-E1452A6384A2}"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NULLSOFT_SWF_OLD "Nullsoft Flash Control Playback"
+ IDS_SWF_FILES "Shockwave Flash Files"
+ IDS_FAMILY_STRING "Shockwave Flash"
+ IDS_ABOUT_TEXT "%s\n© 2008-2023 Winamp SA\nWritten by: Ben Allison\nBuild date: %s"
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#include "version.rc2"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/Src/Plugins/Input/in_swf/in_swf.sln b/Src/Plugins/Input/in_swf/in_swf.sln
new file mode 100644
index 00000000..de471f76
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/in_swf.sln
@@ -0,0 +1,30 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29609.76
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "in_swf", "in_swf.vcxproj", "{2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Debug|Win32.Build.0 = Debug|Win32
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Debug|x64.ActiveCfg = Debug|x64
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Debug|x64.Build.0 = Debug|x64
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Release|Win32.ActiveCfg = Release|Win32
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Release|Win32.Build.0 = Release|Win32
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Release|x64.ActiveCfg = Release|x64
+ {2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {C5DFAD3B-75E6-460A-A5E4-65E1C3027572}
+ EndGlobalSection
+EndGlobal
diff --git a/Src/Plugins/Input/in_swf/in_swf.vcxproj b/Src/Plugins/Input/in_swf/in_swf.vcxproj
new file mode 100644
index 00000000..fca590c7
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/in_swf.vcxproj
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{2B5561EC-78EC-4FA2-A76E-BEBEF3830E80}</ProjectGuid>
+ <RootNamespace>in_swf</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg">
+ <VcpkgEnabled>false</VcpkgEnabled>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <VcpkgConfiguration>Debug</VcpkgConfiguration>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <VcpkgConfiguration>Debug</VcpkgConfiguration>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;IN_SWF_EXPORTS;UNICODE_INPUT_PLUGIN;_WIN32_DCOM;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>false</MinimalRebuild>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\
+xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;IN_SWF_EXPORTS;UNICODE_INPUT_PLUGIN;_WIN32_DCOM;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>false</MinimalRebuild>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\
+xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;IN_SWF_EXPORTS;UNICODE_INPUT_PLUGIN;_WIN32_DCOM;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;IN_SWF_EXPORTS;UNICODE_INPUT_PLUGIN;_WIN32_DCOM;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\Winamp\strutil.h" />
+ <ClInclude Include="api.h" />
+ <ClInclude Include="FlashDispInterface.h" />
+ <ClInclude Include="FLVExternalInterface.h" />
+ <ClInclude Include="main.h" />
+ <ClInclude Include="resource.h" />
+ <ClInclude Include="SWFContainer.h" />
+ <ClInclude Include="SWFParameters.h" />
+ <ClInclude Include="XMLString.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\Winamp\strutil.cpp" />
+ <ClCompile Include="ExtendedFileInfo.cpp" />
+ <ClCompile Include="FLVExternalInterface.cpp" />
+ <ClCompile Include="main.cpp" />
+ <ClCompile Include="SWFContainer.cpp" />
+ <ClCompile Include="SWFParameters.cpp" />
+ <ClCompile Include="SWFThread.cpp" />
+ <ClCompile Include="XMLString.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="in_swf.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj">
+ <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/in_swf.vcxproj.filters b/Src/Plugins/Input/in_swf/in_swf.vcxproj.filters
new file mode 100644
index 00000000..821c542a
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/in_swf.vcxproj.filters
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="ExtendedFileInfo.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="FLVExternalInterface.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="main.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="SWFContainer.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="SWFParameters.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="SWFThread.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="XMLString.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\Winamp\strutil.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="XMLString.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="SWFParameters.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="SWFContainer.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="main.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="FLVExternalInterface.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="FlashDispInterface.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="api.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\Winamp\strutil.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{0f49deee-ec41-4975-9692-7c014e9aa506}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Ressource Files">
+ <UniqueIdentifier>{3afcd986-d90d-4cb4-bbea-d20056ada52e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{3008776d-78c5-48f4-ade1-2aa45acd6338}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="in_swf.rc">
+ <Filter>Ressource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/main.cpp b/Src/Plugins/Input/in_swf/main.cpp
new file mode 100644
index 00000000..8da97055
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/main.cpp
@@ -0,0 +1,447 @@
+#include "main.h"
+#include "api.h"
+#include "../Winamp/wa_ipc.h"
+#include "../Winamp/strutil.h"
+#include <shlwapi.h>
+#include "FLVExternalInterface.h"
+#include <api/service/waServiceFactory.h>
+#include <strsafe.h>
+#include "resource.h"
+
+#define SWF_PLUGIN_VERSION L"1.15"
+
+FLVExternalInterface flashExternalInterface;
+IVideoOutput *videoOutput=0;
+int playPosition=0;
+int playLength=-1000;
+api_application *WASABI_API_APP = 0;
+api_language *WASABI_API_LNG = 0;
+HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0;
+wchar_t pluginName[256] = {0}, status[256] = {0};
+Nullsoft::Utility::LockGuard statusGuard;
+
+template <class api_T>
+static void ServiceBuild(api_T *&api_t, GUID factoryGUID_t)
+{
+ if (plugin.service)
+ {
+ waServiceFactory *factory = plugin.service->service_getServiceByGuid(factoryGUID_t);
+ if (factory)
+ api_t = reinterpret_cast<api_T *>( factory->getInterface() );
+ }
+}
+
+template <class api_T>
+static void ServiceRelease(api_T *api_t, GUID factoryGUID_t)
+{
+ if (plugin.service)
+ {
+ waServiceFactory *factory = plugin.service->service_getServiceByGuid(factoryGUID_t);
+ if (factory)
+ factory->releaseInterface(api_t);
+ }
+ api_t = NULL;
+}
+
+void SetFileExtensions(void)
+{
+ static char fileExtensionsString[1200] = {0}; // "SWF\0Shockwave Flash Files\0"
+ char* end = 0;
+ StringCchCopyExA(fileExtensionsString, 1200, "SWF", &end, 0, 0);
+ StringCchCopyExA(end+1, 1200, WASABI_API_LNGSTRING(IDS_SWF_FILES), 0, 0, 0);
+ plugin.FileExtensions = fileExtensionsString;
+}
+
+int Init()
+{
+ if (!IsWindow(plugin.hMainWindow))
+ return IN_INIT_FAILURE;
+
+ ServiceBuild(WASABI_API_APP, applicationApiServiceGuid);
+ ServiceBuild(WASABI_API_LNG, languageApiGUID);
+
+ WASABI_API_START_LANG(plugin.hDllInstance,InSwfLangGUID);
+ StringCchPrintfW(pluginName,256,WASABI_API_LNGSTRINGW(IDS_NULLSOFT_SWF),SWF_PLUGIN_VERSION);
+ plugin.description = (char*)pluginName;
+ SetFileExtensions();
+
+ return IN_INIT_SUCCESS;
+}
+
+void Quit()
+{
+ ServiceRelease(WASABI_API_APP, applicationApiServiceGuid);
+ ServiceRelease(WASABI_API_LNG, languageApiGUID);
+}
+
+void GetFileInfo(const in_char *file, in_char *title, int *length_in_ms)
+{
+ if (length_in_ms)
+ {
+ if (file && *file)
+ *length_in_ms=-1000;
+ else
+ *length_in_ms = playLength;
+ }
+
+ if (title)
+ {
+ if (file && *file)
+ *title=0;
+ else
+ {
+ Nullsoft::Utility::AutoLock autolock(statusGuard);
+ if (status[0])
+ StringCchPrintf(title, GETFILEINFO_TITLE_LENGTH, L"[%s]", status);
+ else
+ *title=0;
+ }
+ }
+}
+
+int InfoBox(const in_char *file, HWND hwndParent)
+{
+ return INFOBOX_UNCHANGED;
+}
+
+int IsOurFile(const in_char *fn)
+{
+ if (!_wcsnicmp(fn, L"rtmp://", 7))
+ return 1;
+ return 0;
+}
+
+static bool isFLV = false;
+static int PlaySWF(BSTR filename)
+{
+#ifdef WIN64
+ if (!activeContainer || (unsigned long long)activeContainer < 65536)
+ {
+ isFLV = false;
+ return 1;
+ }
+#else
+ if (!activeContainer || (unsigned long)activeContainer < 65536)
+ {
+ isFLV = false;
+ return 1;
+}
+#endif
+
+ isFLV = false;
+ activeContainer->externalInterface = &flashExternalInterface;
+ activeContainer->flash->DisableLocalSecurity();
+ activeContainer->flash->put_BackgroundColor(0);
+ activeContainer->flash->put_EmbedMovie(FALSE);
+ activeContainer->flash->put_Scale(L"showAll");
+ activeContainer->flash->put_AllowScriptAccess(L"always");
+
+ HRESULT hr = activeContainer->flash->LoadMovie(0, filename);
+
+ activeContainer->setVisible(TRUE);
+
+ plugin.is_seekable = 0; // not seekable to start, we'll find out after opening if it's really seekable or not
+ return 0;
+}
+
+static int PlayFLV(const wchar_t *filename)
+{
+#ifdef WIN64
+ if (!activeContainer || (unsigned long long)activeContainer < 65536)
+ {
+ isFLV = false;
+ return 1;
+}
+# else
+ if (!activeContainer || (unsigned long)activeContainer < 65536)
+ {
+ isFLV = false;
+ return 1;
+ }
+#endif //
+
+// if (!activeContainer || (unsigned long)activeContainer < 65536)
+// {
+// isFLV = false;
+// return 1;
+// }
+
+ isFLV = true;
+ activeContainer->externalInterface = &flashExternalInterface;
+ activeContainer->flash->DisableLocalSecurity();
+ activeContainer->flash->put_BackgroundColor(0);
+ activeContainer->flash->put_EmbedMovie(FALSE);
+ activeContainer->flash->put_Scale(L"showAll");
+ activeContainer->flash->put_AllowScriptAccess(L"always");
+
+ static wchar_t pluginPath[MAX_PATH] = {0}, swfPath[MAX_PATH+7] = {0};
+ if (!pluginPath[0] && !swfPath[0])
+ {
+ lstrcpynW(pluginPath, (wchar_t*)SendMessage(plugin.hMainWindow, WM_WA_IPC, 0, IPC_GETPLUGINDIRECTORYW), MAX_PATH);
+ PathAppend(pluginPath, L"winampFLV.swf");
+ for (wchar_t *itr = pluginPath; *itr; itr++)
+ {
+ if (*itr == '\\')
+ *itr = '/';
+ }
+ StringCchPrintf(swfPath, MAX_PATH+7, L"file://%s", pluginPath);
+ }
+
+ HRESULT hr = activeContainer->flash->LoadMovie(0, swfPath);
+
+ activeContainer->setVisible(TRUE);
+
+ // TODO: make filename XML-safe
+ wchar_t funcCall[1024] = {0};
+ StringCchPrintf(funcCall, 1024, L"<invoke name=\"PlayFLV\" returntype=\"xml\"><arguments><string>%s</string></arguments></invoke>", filename);
+ BSTR bstr_ret = 0;
+ activeContainer->flash->CallFunction(funcCall, &bstr_ret);
+ SetVolume(volume);
+ SetPan(pan);
+
+ plugin.is_seekable = 1; // not seekable to start, we'll find out after opening if it's really seekable or not
+ return 0;
+}
+
+int Play(const in_char *filename)
+{
+ status[0]=0;
+ playPosition=0;
+ playLength=-1000;
+
+ if (!filename || !*filename)
+ return 1;
+
+ if (!videoOutput)
+ videoOutput = (IVideoOutput *)SendMessage(plugin.hMainWindow,WM_WA_IPC,0,IPC_GET_IVIDEOOUTPUT);
+
+ if (!videoOutput)
+ return 1;
+
+ HWND videoWnd = (HWND)videoOutput->extended(VIDUSER_GET_VIDEOHWND, 0, 0); // ask for the video hwnd
+
+ wchar_t *mangledFilename = 0;
+ if (PathIsURL(filename))
+ mangledFilename = const_cast<wchar_t *>(filename);
+ else
+ {
+ mangledFilename = (wchar_t *)malloc((MAX_PATH + 7)*sizeof(wchar_t));
+ StringCchPrintf(mangledFilename, MAX_PATH+7, L"file://%s", filename);
+ }
+ videoOutput->open(0, 0, 0, 1.0, 'ENON');
+ activeContainer = new SWFContainer(videoWnd);
+ if (!activeContainer->flash)
+ {
+ delete activeContainer;
+ activeContainer=0;
+ if (mangledFilename != filename)
+ free(mangledFilename);
+ return 1; // failed
+ }
+
+ oldVidProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(videoWnd, GWLP_WNDPROC, (LONG)(LONG_PTR)WndProc);
+
+ wchar_t ext[16]=L"";
+ extension_exW(filename, ext, 16);
+ if (!_wcsicmp(ext, L"swf"))
+ {
+ if (PlaySWF(mangledFilename))
+ {
+ return 1; // failed
+ }
+ }
+ else
+ {
+ if (PlayFLV(mangledFilename))
+ {
+ return 1; // failed
+ }
+ }
+
+ HRESULT hr = activeContainer->flash->Play();
+
+ if (mangledFilename != filename)
+ free(mangledFilename);
+
+ return 0;
+}
+
+int localPause=0;
+void Pause()
+{
+ localPause=1;
+
+ if (isFLV)
+ {
+ BSTR bstr_ret;
+ activeContainer->flash->CallFunction(L"<invoke name=\"Pause\" returntype=\"xml\"><arguments></arguments></invoke>", &bstr_ret);
+ }
+}
+
+void UnPause()
+{
+ localPause=0;
+ if (isFLV)
+ {
+ BSTR bstr_ret;
+ activeContainer->flash->CallFunction(L"<invoke name=\"Resume\" returntype=\"xml\"><arguments></arguments></invoke>", &bstr_ret);
+ }
+}
+
+int IsPaused()
+{
+ return localPause;
+}
+
+void Stop()
+{
+ videoOutput->close();
+ HWND videoWnd = (HWND)videoOutput->extended(VIDUSER_GET_VIDEOHWND, 0, 0); // ask for the video hwnd
+ SetWindowLongPtr(videoWnd, GWLP_WNDPROC, (LONG)(LONG_PTR)oldVidProc);
+ activeContainer->close();
+ activeContainer->Release();
+ activeContainer=0;
+}
+
+int GetLength()
+{
+ return playLength;
+}
+
+int GetOutputTime()
+{
+ return playPosition;
+}
+
+void SetOutputTime(int time_in_ms)
+{
+ if (activeContainer)
+ {
+ if (isFLV)
+ {
+ double seconds = time_in_ms;
+ seconds/=1000.0;
+
+ wchar_t funcCall[1024] = {0};
+ StringCchPrintf(funcCall, 1024, L"<invoke name=\"Seek\" returntype=\"xml\"><arguments><number>%.3f</number></arguments></invoke>", seconds);
+ BSTR bstr_ret;
+ activeContainer->flash->CallFunction(funcCall, &bstr_ret);
+ }
+ else
+ {
+ // TODO: maybe change the frame?
+ }
+ }
+}
+
+int pan = 0, volume = 255;
+void SetVolume(int _volume)
+{
+ volume = _volume;
+ if (activeContainer)
+ {
+ if (isFLV)
+ {
+ int newVolume = (volume * 100) / 255;
+
+ wchar_t funcCall[1024] = {0};
+ StringCchPrintf(funcCall, 1024, L"<invoke name=\"SetVolume\" returntype=\"xml\"><arguments><number>%u</number></arguments></invoke>", newVolume);
+ BSTR bstr_ret;
+ activeContainer->flash->CallFunction(funcCall, &bstr_ret);
+ }
+ }
+}
+
+void SetPan(int _pan)
+{
+ pan = _pan;
+ if (activeContainer)
+ {
+ if (isFLV)
+ {
+ int left = 100;
+ int right = 100;
+ if (pan < 0)
+ left += (pan * 100)/127;
+ if (pan>0)
+ right-=(pan*100)/127;
+
+ wchar_t funcCall[1024] = {0};
+ StringCchPrintf(funcCall, 1024, L"<invoke name=\"SetPan\" returntype=\"xml\"><arguments><number>%u</number><number>%u</number></arguments></invoke>", left, right);
+ BSTR bstr_ret = 0;
+ activeContainer->flash->CallFunction(funcCall, &bstr_ret);
+ }
+ }
+}
+
+void EQSet(int on, char data[10], int preamp)
+{}
+
+int DoAboutMessageBox(HWND parent, wchar_t* title, wchar_t* message)
+{
+ MSGBOXPARAMS msgbx = {sizeof(MSGBOXPARAMS),0};
+ msgbx.lpszText = message;
+ msgbx.lpszCaption = title;
+ msgbx.lpszIcon = MAKEINTRESOURCE(102);
+ msgbx.hInstance = GetModuleHandle(0);
+ msgbx.dwStyle = MB_USERICON;
+ msgbx.hwndOwner = parent;
+ return MessageBoxIndirect(&msgbx);
+}
+
+void About(HWND hwndParent);
+In_Module plugin =
+{
+ IN_VER_RET,
+ "nullsoft(in_swf.dll)",
+ 0,
+ 0,
+ 0 /*"SWF\0Shockwave Flash Files\0"*/,
+ 1,
+ 1,
+ About,
+ About,
+ Init,
+ Quit,
+ GetFileInfo,
+ InfoBox,
+ IsOurFile,
+ Play,
+ Pause,
+ UnPause,
+ IsPaused,
+ Stop,
+ GetLength,
+ GetOutputTime,
+ SetOutputTime,
+ SetVolume,
+ SetPan,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ EQSet,
+ 0,
+ 0
+};
+
+void About(HWND hwndParent)
+{
+ wchar_t message[1024] = {0}, text[1024] = {0};
+ WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_SWF_OLD,text,1024);
+ StringCchPrintf(message, 1024, WASABI_API_LNGSTRINGW(IDS_ABOUT_TEXT),
+ plugin.description, TEXT(__DATE__));
+ DoAboutMessageBox(hwndParent,text,message);
+}
+
+extern "C" __declspec(dllexport) In_Module * winampGetInModule2()
+{
+ return &plugin;
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_swf/main.h b/Src/Plugins/Input/in_swf/main.h
new file mode 100644
index 00000000..ac62679c
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/main.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "../Winamp/in2.h"
+extern In_Module plugin;
+
+#include <windows.h>
+
+#include "../Winamp/wa_ipc.h"
+extern IVideoOutput *videoOutput;
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+extern WNDPROC oldVidProc;
+#include "SWFContainer.h"
+extern SWFContainer *activeContainer;
+
+extern int playPosition;
+extern int playLength;
+extern int volume, pan;
+void SetVolume(int _volume);
+void SetPan(int _pan);
+
+#include "../nu/AutoLock.h"
+extern Nullsoft::Utility::LockGuard statusGuard;
+extern wchar_t status[256];
diff --git a/Src/Plugins/Input/in_swf/resource.h b/Src/Plugins/Input/in_swf/resource.h
new file mode 100644
index 00000000..b96c6314
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/resource.h
@@ -0,0 +1,20 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by in_swf.rc
+//
+#define IDS_NULLSOFT_SWF_OLD 0
+#define IDS_SWF_FILES 1
+#define IDS_FAMILY_STRING 3
+#define IDS_ABOUT_TEXT 4
+#define IDS_NULLSOFT_SWF 65534
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 5
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/Src/Plugins/Input/in_swf/version.rc2 b/Src/Plugins/Input/in_swf/version.rc2
new file mode 100644
index 00000000..c9f11f5c
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/version.rc2
@@ -0,0 +1,39 @@
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+#include "../../../Winamp/buildType.h"
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,15,0,0
+ PRODUCTVERSION WINAMP_PRODUCTVER
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", "Winamp SA"
+ VALUE "FileDescription", "Winamp Input Plug-in"
+ VALUE "FileVersion", "1,15,0,0"
+ VALUE "InternalName", "Nullsoft Flash Control Playback"
+ VALUE "LegalCopyright", "Copyright © 2008-2023 Winamp SA"
+ VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
+ VALUE "OriginalFilename", "in_swf.dll"
+ VALUE "ProductName", "Winamp"
+ VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/Src/Plugins/Input/in_swf/winampFLV.fla b/Src/Plugins/Input/in_swf/winampFLV.fla
new file mode 100644
index 00000000..4a733a79
--- /dev/null
+++ b/Src/Plugins/Input/in_swf/winampFLV.fla
Binary files differ