xref: /reactos/dll/win32/hnetcfg/hnetcfg.c (revision e1338178)
1 /*
2  * Copyright (C) 2007 Jeff Latimer
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include <stdarg.h>
20 
21 #define COBJMACROS
22 
23 #include "windef.h"
24 #include "winbase.h"
25 #include "objbase.h"
26 #include "rpcproxy.h"
27 #include "netfw.h"
28 #include "natupnp.h"
29 
30 #include "wine/debug.h"
31 #include "hnetcfg_private.h"
32 
33 WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
34 
35 static HINSTANCE instance;
36 
37 typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj );
38 
39 typedef struct
40 {
41     IClassFactory IClassFactory_iface;
42     fnCreateInstance pfnCreateInstance;
43 } hnetcfg_cf;
44 
45 static inline hnetcfg_cf *impl_from_IClassFactory( IClassFactory *iface )
46 {
47     return CONTAINING_RECORD(iface, hnetcfg_cf, IClassFactory_iface);
48 }
49 
50 static HRESULT WINAPI hnetcfg_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj )
51 {
52     if (IsEqualGUID(riid, &IID_IUnknown) ||
53         IsEqualGUID(riid, &IID_IClassFactory))
54     {
55         IClassFactory_AddRef( iface );
56         *ppobj = iface;
57         return S_OK;
58     }
59     FIXME("interface %s not implemented\n", debugstr_guid(riid));
60     return E_NOINTERFACE;
61 }
62 
63 static ULONG WINAPI hnetcfg_cf_AddRef( IClassFactory *iface )
64 {
65     return 2;
66 }
67 
68 static ULONG WINAPI hnetcfg_cf_Release( IClassFactory *iface )
69 {
70     return 1;
71 }
72 
73 static HRESULT WINAPI hnetcfg_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter,
74                                                   REFIID riid, LPVOID *ppobj )
75 {
76     hnetcfg_cf *This = impl_from_IClassFactory( iface );
77     HRESULT r;
78     IUnknown *punk;
79 
80     TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj);
81 
82     *ppobj = NULL;
83 
84     if (pOuter)
85         return CLASS_E_NOAGGREGATION;
86 
87     r = This->pfnCreateInstance( pOuter, (LPVOID *)&punk );
88     if (FAILED(r))
89         return r;
90 
91     r = IUnknown_QueryInterface( punk, riid, ppobj );
92     if (FAILED(r))
93         return r;
94 
95     IUnknown_Release( punk );
96     return r;
97 }
98 
99 static HRESULT WINAPI hnetcfg_cf_LockServer( IClassFactory *iface, BOOL dolock )
100 {
101     FIXME("(%p)->(%d)\n", iface, dolock);
102     return S_OK;
103 }
104 
105 static const struct IClassFactoryVtbl hnetcfg_cf_vtbl =
106 {
107     hnetcfg_cf_QueryInterface,
108     hnetcfg_cf_AddRef,
109     hnetcfg_cf_Release,
110     hnetcfg_cf_CreateInstance,
111     hnetcfg_cf_LockServer
112 };
113 
114 static hnetcfg_cf fw_manager_cf = { { &hnetcfg_cf_vtbl }, NetFwMgr_create };
115 static hnetcfg_cf fw_app_cf = { { &hnetcfg_cf_vtbl }, NetFwAuthorizedApplication_create };
116 static hnetcfg_cf fw_openport_cf = { { &hnetcfg_cf_vtbl }, NetFwOpenPort_create };
117 static hnetcfg_cf fw_policy2_cf = { { &hnetcfg_cf_vtbl }, NetFwPolicy2_create };
118 static hnetcfg_cf upnpnat_cf = { { &hnetcfg_cf_vtbl }, IUPnPNAT_create };
119 
120 
121 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID reserved)
122 {
123     TRACE("(0x%p, %d, %p)\n", hInstDLL, fdwReason, reserved);
124 
125     switch(fdwReason) {
126         case DLL_WINE_PREATTACH:
127             return FALSE;
128         case DLL_PROCESS_ATTACH:
129             instance = hInstDLL;
130             DisableThreadLibraryCalls(hInstDLL);
131             break;
132         case DLL_PROCESS_DETACH:
133             if (reserved) break;
134             release_typelib();
135             break;
136     }
137     return TRUE;
138 }
139 
140 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
141 {
142     IClassFactory *cf = NULL;
143 
144     TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
145 
146     if (IsEqualGUID( rclsid, &CLSID_NetFwMgr ))
147     {
148        cf = &fw_manager_cf.IClassFactory_iface;
149     }
150     else if (IsEqualGUID( rclsid, &CLSID_NetFwAuthorizedApplication ))
151     {
152        cf = &fw_app_cf.IClassFactory_iface;
153     }
154     else if (IsEqualGUID( rclsid, &CLSID_NetFwOpenPort ))
155     {
156        cf = &fw_openport_cf.IClassFactory_iface;
157     }
158     else if (IsEqualGUID( rclsid, &CLSID_NetFwPolicy2 ))
159     {
160        cf = &fw_policy2_cf.IClassFactory_iface;
161     }
162     else if (IsEqualGUID( rclsid, &CLSID_UPnPNAT ))
163     {
164         cf = &upnpnat_cf.IClassFactory_iface;
165     }
166 
167     if (!cf) return CLASS_E_CLASSNOTAVAILABLE;
168     return IClassFactory_QueryInterface( cf, iid, ppv );
169 }
170 
171 HRESULT WINAPI DllCanUnloadNow( void )
172 {
173     return S_FALSE;
174 }
175 
176 /***********************************************************************
177  *		DllRegisterServer (HNETCFG.@)
178  */
179 HRESULT WINAPI DllRegisterServer(void)
180 {
181     return __wine_register_resources( instance );
182 }
183 
184 /***********************************************************************
185  *		DllUnregisterServer (HNETCFG.@)
186  */
187 HRESULT WINAPI DllUnregisterServer(void)
188 {
189     return __wine_unregister_resources( instance );
190 }
191