diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_nowplaying/external.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_nowplaying/external.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_nowplaying/external.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_nowplaying/external.cpp b/Src/Plugins/Library/ml_nowplaying/external.cpp new file mode 100644 index 00000000..add50723 --- /dev/null +++ b/Src/Plugins/Library/ml_nowplaying/external.cpp @@ -0,0 +1,110 @@ +#include "main.h" +#include "./resource.h" +#include "./external.h" + +ExternalDispatch::ExternalDispatch() + : ref(1) +{ +} + +ExternalDispatch::~ExternalDispatch() +{ +} + +HRESULT ExternalDispatch::CreateInstance(ExternalDispatch **instance) +{ + if (NULL == instance) return E_POINTER; + + *instance = new ExternalDispatch(); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +LPCWSTR ExternalDispatch::GetName() +{ + return L"NowPlaying"; +} + + +ULONG ExternalDispatch::AddRef(void) +{ + return InterlockedIncrement((LONG*)&ref); +} + + +ULONG ExternalDispatch::Release(void) +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + delete(this); + + return r; +} + +STDMETHODIMP ExternalDispatch::QueryInterface(REFIID riid, void **ppvObject) +{ + if (NULL == ppvObject) return E_POINTER; + + if (IsEqualIID(riid, IID_IDispatch)) + *ppvObject = static_cast<IDispatch*>(this); + else if (IsEqualIID(riid, IID_IUnknown)) + *ppvObject = static_cast<IUnknown*>(this); + else + { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; +} + +HRESULT ExternalDispatch::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++) + { + if (_wcsicmp(rgszNames[i], L"hidden") == 0) + rgdispid[i] = DISPATCH_HIDDEN; + else + { + rgdispid[i] = DISPID_UNKNOWN; + unknowns = true; + } + } + if (unknowns) + return DISP_E_UNKNOWNNAME; + else + return S_OK; +} + +HRESULT ExternalDispatch::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo) +{ + return E_NOTIMPL; +} + +HRESULT ExternalDispatch::GetTypeInfoCount(unsigned int FAR * pctinfo) +{ + return E_NOTIMPL; +} + +HRESULT ExternalDispatch::Invoke(DISPID dispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr) +{ + switch(dispId) + { + case DISPATCH_HIDDEN: + if (NULL != pvarResult) + { + HWND hLibrary = Plugin_GetLibrary(); + VariantInit(pvarResult); + V_VT(pvarResult) = VT_BOOL; + V_BOOL(pvarResult) = (NULL == hLibrary || FALSE == SENDMLIPC(hLibrary, ML_IPC_IS_VISIBLE, 0)); + } + return S_OK; + } + return DISP_E_MEMBERNOTFOUND; +}
\ No newline at end of file |