diff options
Diffstat (limited to 'Src/Plugins/Input/in_swf')
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*", ¤tParameter); + 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(¤tParameter); +} + +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 Binary files differnew file mode 100644 index 00000000..4a733a79 --- /dev/null +++ b/Src/Plugins/Input/in_swf/winampFLV.fla |