aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_wire/ExternalCOM.cpp
blob: 0586810d3171f34eaae48c92894ad70019c25a53 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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;
}