9181df48effaaa8af1844a7228e59f63115e1551
[reactos.git] / reactos / dll / win32 / netshell / classfactory.cpp
1 #include "precomp.h"
2
3 WINE_DEFAULT_DEBUG_CHANNEL (shell);
4
5 class CNetshellClassFactory: public IClassFactory
6 {
7 public:
8 CNetshellClassFactory(REFCLSID rclsid);
9
10 /* IUnknown */
11 virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
12 virtual ULONG WINAPI AddRef();
13 virtual ULONG WINAPI Release();
14
15 /* IClassFactory */
16 virtual HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
17 virtual HRESULT WINAPI LockServer(BOOL fLock);
18
19 private:
20 LONG ref;
21 CLSID clsid;
22 };
23
24 CNetshellClassFactory::CNetshellClassFactory(REFCLSID rclsid)
25 {
26 ref = 0;
27 clsid = rclsid;
28 }
29
30 HRESULT
31 WINAPI
32 CNetshellClassFactory::QueryInterface(
33 REFIID riid,
34 LPVOID *ppvObj)
35 {
36 *ppvObj = NULL;
37 if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
38 {
39 *ppvObj = (IClassFactory*)this;
40 InterlockedIncrement(&ref);
41 return S_OK;
42 }
43 return E_NOINTERFACE;
44 }
45
46 ULONG
47 WINAPI
48 CNetshellClassFactory::AddRef()
49 {
50 ULONG refCount = InterlockedIncrement(&ref);
51
52 return refCount;
53 }
54
55 ULONG
56 WINAPI
57 CNetshellClassFactory::Release()
58 {
59 ULONG refCount = InterlockedDecrement(&ref);
60
61 if (!refCount)
62 {
63 CoTaskMemFree(this);
64 return 0;
65 }
66 return refCount;
67 }
68
69 HRESULT
70 WINAPI
71 CNetshellClassFactory::CreateInstance(
72 LPUNKNOWN pUnkOuter,
73 REFIID riid,
74 LPVOID *ppvObject)
75 {
76 *ppvObject = NULL;
77
78 if (IsEqualCLSID(clsid, CLSID_NetworkConnections))
79 return ISF_NetConnect_Constructor(pUnkOuter, riid, ppvObject);
80 else if (IsEqualCLSID(clsid, CLSID_ConnectionManager))
81 return INetConnectionManager_Constructor(pUnkOuter, riid, ppvObject);
82 else if (IsEqualCLSID(clsid, CLSID_LANConnectUI))
83 return LanConnectUI_Constructor(pUnkOuter, riid, ppvObject);
84 else if (IsEqualCLSID(clsid, CLSID_LanConnectStatusUI))
85 return LanConnectStatusUI_Constructor(pUnkOuter, riid, ppvObject);
86
87 return E_NOINTERFACE;
88 }
89
90 HRESULT
91 WINAPI
92 CNetshellClassFactory::LockServer(BOOL fLock)
93 {
94 return E_NOTIMPL;
95 }
96
97 HRESULT IClassFactory_fnConstructor(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
98 {
99 CNetshellClassFactory *pClsFactory = new CNetshellClassFactory(rclsid);
100 if (!pClsFactory)
101 return E_OUTOFMEMORY;
102
103 pClsFactory->AddRef();
104 HRESULT hr = pClsFactory->QueryInterface(riid, ppvOut);
105 pClsFactory->Release();
106
107 return hr;
108 }