Reactos
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS BDA Proxy
4 * FILE: dll/directx/msvidctl/classfactory.cpp
5 * PURPOSE: ClassFactory interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
8 */
9#include "precomp.h"
10
11const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
12const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
13
14class CClassFactory : public IClassFactory
15{
16public:
17 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
18
19 STDMETHODIMP_(ULONG) AddRef()
20 {
21 InterlockedIncrement(&m_Ref);
22 return m_Ref;
23 }
24 STDMETHODIMP_(ULONG) Release()
25 {
26 InterlockedDecrement(&m_Ref);
27 if (!m_Ref)
28 {
29 delete this;
30 return 0;
31 }
32 return m_Ref;
33 }
34
35 HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
36 HRESULT WINAPI LockServer(BOOL fLock);
37
38 CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
39 {};
40
41 virtual ~CClassFactory(){};
42
43protected:
44 LONG m_Ref;
45 LPFNCREATEINSTANCE m_lpfnCI;
46 IID * m_IID;
47};
48
49HRESULT
50WINAPI
51CClassFactory::QueryInterface(
52 REFIID riid,
53 LPVOID *ppvObj)
54{
55 *ppvObj = NULL;
56 if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
57 {
58 *ppvObj = PVOID(this);
59 InterlockedIncrement(&m_Ref);
60 return S_OK;
61 }
62 return E_NOINTERFACE;
63}
64
65HRESULT
66WINAPI
67CClassFactory::CreateInstance(
68 LPUNKNOWN pUnkOuter,
69 REFIID riid,
70 LPVOID *ppvObject)
71{
72 *ppvObject = NULL;
73
74 if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
75 {
76 return m_lpfnCI(pUnkOuter, riid, ppvObject);
77 }
78
79 return E_NOINTERFACE;
80}
81
82HRESULT
83WINAPI
84CClassFactory::LockServer(
85 BOOL fLock)
86{
87 return E_NOTIMPL;
88}
89
90IClassFactory *
91CClassFactory_fnConstructor(
92 LPFNCREATEINSTANCE lpfnCI,
93 PLONG pcRefDll,
94 IID * riidInst)
95{
96 CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
97
98 if (!factory)
99 return NULL;
100
101 if (pcRefDll)
102 InterlockedIncrement(pcRefDll);
103
104 return (LPCLASSFACTORY)factory;
105}
106