diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_wire/ExternalCOM.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Plugins/Library/ml_wire/ExternalCOM.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_wire/ExternalCOM.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_wire/ExternalCOM.cpp b/Src/Plugins/Library/ml_wire/ExternalCOM.cpp new file mode 100644 index 00000000..0586810d --- /dev/null +++ b/Src/Plugins/Library/ml_wire/ExternalCOM.cpp @@ -0,0 +1,85 @@ +#include "main.h" +#include "./externalCOM.h" +#include "./util.h" +#include "./rssCOM.h" + +#define DISPTABLE_CLASS ExternalCOM + +DISPTABLE_BEGIN() + DISPENTRY_ADD(DISPATCH_PODCAST, L"Podcast", OnPodcast) +DISPTABLE_END + +#undef DISPTABLE_CLASS + +ExternalCOM::ExternalCOM() +{} + +ExternalCOM::~ExternalCOM() +{} + +HRESULT ExternalCOM::CreateInstance(ExternalCOM **instance) +{ + if (NULL == instance) return E_POINTER; + + *instance = new ExternalCOM(); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +STDMETHODIMP_( ULONG ) ExternalCOM::AddRef( void ) +{ + return _ref.fetch_add( 1 ); +} + +STDMETHODIMP_( ULONG ) ExternalCOM::Release( void ) +{ + if ( 0 == _ref.load() ) + return _ref.load(); + + LONG r = _ref.fetch_sub( 1 ); + if ( 0 == r ) + delete( this ); + + return r; +} + +STDMETHODIMP ExternalCOM::QueryInterface(REFIID riid, PVOID *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 ExternalCOM::OnPodcast(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + if (NULL != pvarResult) + { + VariantInit(pvarResult); + + RssCOM *rss; + if (SUCCEEDED(RssCOM::CreateInstance(&rss))) + { + V_VT(pvarResult) = VT_DISPATCH; + V_DISPATCH(pvarResult) = rss; + } + else + { + V_VT(pvarResult) = VT_NULL; + } + + } + return S_OK; +}
\ No newline at end of file |