aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/ExternalCOM.h
blob: 9a9aa5fcd0e69ac80773f3d0be6cbfa5ab0faab9 (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
86
87
88
89
#ifndef NULLSOFT_EXTERNALCOMH
#define NULLSOFT_EXTERNALCOMH

#include <ocidl.h>


#if defined(__cplusplus)

#include <vector>
#include "JSAPI_DispatchTable.h"
#include "IWasabiDispatchable.h"
#include "JSAPI_Info.h"

class SkinCOM;
class MediaCoreCOM;
class CurrentSongCOM;
class ExternalCOM;
class ConfigCOM;
namespace JSAPI2 { class ExternalObject; }

HRESULT __cdecl JSAPI1_GetExternal(ExternalCOM **instance);
HRESULT __cdecl JSAPI1_GetSkinCOM(SkinCOM **instance);
HRESULT __cdecl JSAPI1_GetMediaCoreCOM(MediaCoreCOM **instance);
HRESULT __cdecl JSAPI1_GetCurrentSongCOM(CurrentSongCOM **instance);

class ExternalCOM : public IDispatch, 
		public IWasabiDispatchable,
		public JSAPI::ifc_info
{
public:
	enum
	{
		DISP_EXTERNAL_SIDECAR = 777,
		DISP_EXTERNAL_BROWSER,
		DISP_EXTERNAL_CURRENTSONG,
		DISP_EXTERNAL_CURRENTSKIN,
		DISP_EXTERNAL_NEW_ENTRIES_MARKER,
	};

public:
	ExternalCOM();
	~ExternalCOM();
	
	// *** IUnknown ***
	STDMETHOD(QueryInterface)(REFIID riid, PVOID *ppvObject);
	STDMETHOD_(ULONG, AddRef)(void);
	STDMETHOD_(ULONG, Release)(void);
	// *** IDispatch ***
	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)(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr);

	JSAPI::DispatchTable dispatchTable;
	DISPID AddDispatch(const wchar_t *name, IDispatch *object);
	BOOL RemoveDispatch(DISPID dispatchId);
	

	// *** IWasabiDispatchable Methods ***
	STDMETHOD(QueryDispatchable)(REFIID riid, Dispatchable **ppDispatchable);

	// *** JSAPI::ifc_info Methods ***
	const wchar_t *GetUserAgent();

	HRESULT FindDispatch(DISPID dispId, IDispatch **instance);
	HRESULT GetSkinCOM(SkinCOM **instance);
	HRESULT GetMediaCoreCOM(MediaCoreCOM **instance);
	HRESULT GetCurrentSongCOM(CurrentSongCOM **instance);
	
	HRESULT GetConfig(LPCWSTR configName, ConfigCOM **config);

protected:
	RECVS_DISPATCH;

private:
	typedef std::vector<ConfigCOM*> ConfigsList;

private:
	ULONG ref;
	CRITICAL_SECTION tableLock;
	wchar_t configFilename[MAX_PATH];
	MediaCoreCOM *mediaCoreCOM;
	SkinCOM *skinCOM;
	CurrentSongCOM *songCOM;
	JSAPI2::ExternalObject *api2;
	ConfigsList configs;
};
#endif // __cplusplus
#endif