diff options
Diffstat (limited to 'Src/playlist/JSAPI2_Playlist.cpp')
-rw-r--r-- | Src/playlist/JSAPI2_Playlist.cpp | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/Src/playlist/JSAPI2_Playlist.cpp b/Src/playlist/JSAPI2_Playlist.cpp new file mode 100644 index 00000000..924c4d70 --- /dev/null +++ b/Src/playlist/JSAPI2_Playlist.cpp @@ -0,0 +1,328 @@ +#include "JSAPI2_Playlist.h" +#include "../Winamp/JSAPI.h" +#include "api__playlist.h" +#include "PlaylistManager.h" + +JSAPI2::PlaylistObject::PlaylistObject(const wchar_t *_key) +{ + key = _key; +} + +#define DISP_TABLE \ + CHECK_ID(Clear)\ + CHECK_ID(AppendURL)\ + CHECK_ID(GetItemFilename)\ + CHECK_ID(GetItemTitle)\ + CHECK_ID(GetItemLength)\ + CHECK_ID(GetItemExtendedInfo)\ + CHECK_ID(Reverse)\ + CHECK_ID(SwapItems)\ + CHECK_ID(Randomize)\ + CHECK_ID(RemoveItem)\ + CHECK_ID(SortByTitle)\ + CHECK_ID(SortByFilename)\ + CHECK_ID(SetItemFilename)\ + CHECK_ID(SetItemTitle)\ + CHECK_ID(SetItemLength)\ + CHECK_ID(InsertURL)\ + CHECK_ID(numitems)\ + + +#define CHECK_ID(str) JSAPI_DISP_ENUMIFY(str), +enum { + DISP_TABLE +}; + +#undef CHECK_ID +#define CHECK_ID(str) if (wcscmp(rgszNames[i], L## #str) == 0) { rgdispid[i] = JSAPI_DISP_ENUMIFY(str); continue; } +HRESULT JSAPI2::PlaylistObject::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid) +{ + bool unknowns = false; + for (unsigned int i = 0;i != cNames;i++) + { + DISP_TABLE + + rgdispid[i] = DISPID_UNKNOWN; + unknowns = true; + + } + if (unknowns) + return DISP_E_UNKNOWNNAME; + else + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo) +{ + return E_NOTIMPL; +} + +HRESULT JSAPI2::PlaylistObject::GetTypeInfoCount(unsigned int FAR * pctinfo) +{ + return E_NOTIMPL; +} + +HRESULT JSAPI2::PlaylistObject::Clear(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.Clear(); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::AppendURL(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT_OPTIONAL(pdispparams, 1, 3); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_BSTR, puArgErr); + JSAPI_VERIFY_PARAMTYPE_OPTIONAL(pdispparams, 2, VT_BSTR, puArgErr); + JSAPI_VERIFY_PARAMTYPE_OPTIONAL(pdispparams, 3, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + const wchar_t *filename = JSAPI_PARAM(pdispparams, 1).bstrVal; + const wchar_t *title = JSAPI_PARAM_OPTIONAL(pdispparams, 2, bstrVal, 0); + int length = JSAPI_PARAM_OPTIONAL(pdispparams, 3, lVal, -1); + playlist.AppendWithInfo(filename, title, length); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::InsertURL(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT_OPTIONAL(pdispparams, 2, 4); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 2, VT_BSTR, puArgErr); + JSAPI_VERIFY_PARAMTYPE_OPTIONAL(pdispparams, 3, VT_BSTR, puArgErr); + JSAPI_VERIFY_PARAMTYPE_OPTIONAL(pdispparams, 4, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + const wchar_t *filename = JSAPI_PARAM(pdispparams, 2).bstrVal; + const wchar_t *title = JSAPI_PARAM_OPTIONAL(pdispparams, 3, bstrVal, 0); + int length = JSAPI_PARAM_OPTIONAL(pdispparams, 4, lVal, -1); + playlist.Insert(JSAPI_PARAM(pdispparams, 1).lVal, filename, title, length); + return S_OK; +} + + +HRESULT JSAPI2::PlaylistObject::GetItemFilename(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(playlist.ItemName(JSAPI_PARAM(pdispparams, 1).lVal))); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::GetItemTitle(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(playlist.ItemTitle(JSAPI_PARAM(pdispparams, 1).lVal))); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::GetItemLength(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_I4); + JSAPI_SET_RESULT(pvarResult, lVal, playlist.GetItemLengthMilliseconds(JSAPI_PARAM(pdispparams, 1).lVal)); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::GetItemExtendedInfo(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 2); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 2, VT_BSTR, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + wchar_t metadata[1024]=L""; + playlist.GetItemExtendedInfo(JSAPI_PARAM(pdispparams, 1).lVal, JSAPI_PARAM(pdispparams, 2).bstrVal, metadata, sizeof(metadata)/sizeof(*metadata)); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(metadata)); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::Reverse(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.Reverse(); + return S_OK; +} + + +HRESULT JSAPI2::PlaylistObject::SwapItems(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 2); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 2, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.Swap(JSAPI_PARAM(pdispparams, 1).lVal, JSAPI_PARAM(pdispparams, 2).lVal); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::Randomize(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlistManager.Randomize(&playlist); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::RemoveItem(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.Remove(JSAPI_PARAM(pdispparams, 1).lVal); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::SortByTitle(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.SortByTitle(); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::SortByFilename(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.SortByFilename(); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::SetItemFilename(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 2); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 2, VT_BSTR, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.SetItemFilename(JSAPI_PARAM(pdispparams, 1).lVal, JSAPI_PARAM(pdispparams, 2).bstrVal); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::SetItemTitle(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 2); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 2, VT_BSTR, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.SetItemTitle(JSAPI_PARAM(pdispparams, 1).lVal, JSAPI_PARAM(pdispparams, 2).bstrVal); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::SetItemLength(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 2); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 1, VT_I4, puArgErr); + JSAPI_VERIFY_PARAMTYPE(pdispparams, 2, VT_I4, puArgErr); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE); + playlist.SetItemLengthMilliseconds(JSAPI_PARAM(pdispparams, 1).lVal, JSAPI_PARAM(pdispparams, 2).lVal); + return S_OK; +} + +HRESULT JSAPI2::PlaylistObject::numitems(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ +// JSAPI_VERIFY_METHOD(wFlags); +// JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + if (wFlags & DISPATCH_PROPERTYGET) + { + JSAPI_INIT_RESULT(pvarResult, VT_I4); + JSAPI_SET_RESULT(pvarResult, lVal, (LONG)playlist.GetNumItems()); + return S_OK; + } + else + return DISP_E_MEMBERNOTFOUND; +} + + +#undef CHECK_ID +#define CHECK_ID(str) case JSAPI_DISP_ENUMIFY(str): return str(wFlags, pdispparams, pvarResult, puArgErr); +HRESULT JSAPI2::PlaylistObject::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr) +{ + switch (dispid) + { + DISP_TABLE + } + return DISP_E_MEMBERNOTFOUND; +} + +STDMETHODIMP JSAPI2::PlaylistObject::QueryInterface(REFIID riid, PVOID *ppvObject) +{ + if (!ppvObject) + return E_POINTER; + + else if (IsEqualIID(riid, IID_IDispatch)) + *ppvObject = (IDispatch *)this; + else if (IsEqualIID(riid, IID_IUnknown)) + *ppvObject = this; + else if (IsEqualIID(riid, IID_PlaylistObject)) + *ppvObject = (PlaylistObject *)this; + else + { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; +} + +ULONG JSAPI2::PlaylistObject::AddRef(void) +{ + return this->_refCount.fetch_add( 1 ); +} + + +ULONG JSAPI2::PlaylistObject::Release( void ) +{ + std::size_t l_Ref = this->_refCount.fetch_sub( 1 ); + if ( l_Ref == 0 ) + delete this; + + return l_Ref; +} |