xref: /reactos/dll/win32/hnetcfg/manager.c (revision 682f85ad)
1 /*
2  * Copyright 2009 Hans Leidekker for CodeWeavers
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 #include <stdio.h>
21 
22 #define COBJMACROS
23 
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28 #include "netfw.h"
29 
30 #include "wine/debug.h"
31 #include "hnetcfg_private.h"
32 
33 WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
34 
35 typedef struct fw_manager
36 {
37     INetFwMgr INetFwMgr_iface;
38     LONG refs;
39 } fw_manager;
40 
41 static inline fw_manager *impl_from_INetFwMgr( INetFwMgr *iface )
42 {
43     return CONTAINING_RECORD(iface, fw_manager, INetFwMgr_iface);
44 }
45 
46 static ULONG WINAPI fw_manager_AddRef(
47     INetFwMgr *iface )
48 {
49     fw_manager *fw_manager = impl_from_INetFwMgr( iface );
50     return InterlockedIncrement( &fw_manager->refs );
51 }
52 
53 static ULONG WINAPI fw_manager_Release(
54     INetFwMgr *iface )
55 {
56     fw_manager *fw_manager = impl_from_INetFwMgr( iface );
57     LONG refs = InterlockedDecrement( &fw_manager->refs );
58     if (!refs)
59     {
60         TRACE("destroying %p\n", fw_manager);
61         HeapFree( GetProcessHeap(), 0, fw_manager );
62     }
63     return refs;
64 }
65 
66 static HRESULT WINAPI fw_manager_QueryInterface(
67     INetFwMgr *iface,
68     REFIID riid,
69     void **ppvObject )
70 {
71     fw_manager *This = impl_from_INetFwMgr( iface );
72 
73     TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
74 
75     if ( IsEqualGUID( riid, &IID_INetFwMgr ) ||
76          IsEqualGUID( riid, &IID_IDispatch ) ||
77          IsEqualGUID( riid, &IID_IUnknown ) )
78     {
79         *ppvObject = iface;
80     }
81     else
82     {
83         FIXME("interface %s not implemented\n", debugstr_guid(riid));
84         return E_NOINTERFACE;
85     }
86     INetFwMgr_AddRef( iface );
87     return S_OK;
88 }
89 
90 static HRESULT WINAPI fw_manager_GetTypeInfoCount(
91     INetFwMgr *iface,
92     UINT *pctinfo )
93 {
94     fw_manager *This = impl_from_INetFwMgr( iface );
95 
96     TRACE("%p %p\n", This, pctinfo);
97     *pctinfo = 1;
98     return S_OK;
99 }
100 
101 static HRESULT WINAPI fw_manager_GetTypeInfo(
102     INetFwMgr *iface,
103     UINT iTInfo,
104     LCID lcid,
105     ITypeInfo **ppTInfo )
106 {
107     fw_manager *This = impl_from_INetFwMgr( iface );
108 
109     TRACE("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
110     return get_typeinfo( INetFwMgr_tid, ppTInfo );
111 }
112 
113 static HRESULT WINAPI fw_manager_GetIDsOfNames(
114     INetFwMgr *iface,
115     REFIID riid,
116     LPOLESTR *rgszNames,
117     UINT cNames,
118     LCID lcid,
119     DISPID *rgDispId )
120 {
121     fw_manager *This = impl_from_INetFwMgr( iface );
122     ITypeInfo *typeinfo;
123     HRESULT hr;
124 
125     TRACE("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
126 
127     hr = get_typeinfo( INetFwMgr_tid, &typeinfo );
128     if (SUCCEEDED(hr))
129     {
130         hr = ITypeInfo_GetIDsOfNames( typeinfo, rgszNames, cNames, rgDispId );
131         ITypeInfo_Release( typeinfo );
132     }
133     return hr;
134 }
135 
136 static HRESULT WINAPI fw_manager_Invoke(
137     INetFwMgr *iface,
138     DISPID dispIdMember,
139     REFIID riid,
140     LCID lcid,
141     WORD wFlags,
142     DISPPARAMS *pDispParams,
143     VARIANT *pVarResult,
144     EXCEPINFO *pExcepInfo,
145     UINT *puArgErr )
146 {
147     fw_manager *This = impl_from_INetFwMgr( iface );
148     ITypeInfo *typeinfo;
149     HRESULT hr;
150 
151     TRACE("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
152           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
153 
154     hr = get_typeinfo( INetFwMgr_tid, &typeinfo );
155     if (SUCCEEDED(hr))
156     {
157         hr = ITypeInfo_Invoke( typeinfo, &This->INetFwMgr_iface, dispIdMember,
158                                wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr );
159         ITypeInfo_Release( typeinfo );
160     }
161     return hr;
162 }
163 
164 static HRESULT WINAPI fw_manager_get_LocalPolicy(
165     INetFwMgr *iface,
166     INetFwPolicy **localPolicy )
167 {
168     fw_manager *This = impl_from_INetFwMgr( iface );
169 
170     TRACE("%p, %p\n", This, localPolicy);
171     return NetFwPolicy_create( NULL, (void **)localPolicy );
172 }
173 
174 static HRESULT WINAPI fw_manager_get_CurrentProfileType(
175     INetFwMgr *iface,
176     NET_FW_PROFILE_TYPE *profileType )
177 {
178     fw_manager *This = impl_from_INetFwMgr( iface );
179 
180     FIXME("%p, %p\n", This, profileType);
181     return E_NOTIMPL;
182 }
183 
184 static HRESULT WINAPI fw_manager_RestoreDefaults(
185     INetFwMgr *iface )
186 {
187     fw_manager *This = impl_from_INetFwMgr( iface );
188 
189     FIXME("%p\n", This);
190     return E_NOTIMPL;
191 }
192 
193 static HRESULT WINAPI fw_manager_IsPortAllowed(
194     INetFwMgr *iface,
195     BSTR imageFileName,
196     NET_FW_IP_VERSION ipVersion,
197     LONG portNumber,
198     BSTR localAddress,
199     NET_FW_IP_PROTOCOL ipProtocol,
200     VARIANT *allowed,
201     VARIANT *restricted )
202 {
203     fw_manager *This = impl_from_INetFwMgr( iface );
204 
205     FIXME("%p, %s, %u, %d, %s, %u, %p, %p\n", This, debugstr_w(imageFileName),
206           ipVersion, portNumber, debugstr_w(localAddress), ipProtocol, allowed, restricted);
207     return E_NOTIMPL;
208 }
209 
210 static HRESULT WINAPI fw_manager_IsIcmpTypeAllowed(
211     INetFwMgr *iface,
212     NET_FW_IP_VERSION ipVersion,
213     BSTR localAddress,
214     BYTE type,
215     VARIANT *allowed,
216     VARIANT *restricted )
217 {
218     fw_manager *This = impl_from_INetFwMgr( iface );
219 
220     FIXME("%p, %u, %s, %u, %p, %p\n", This, ipVersion, debugstr_w(localAddress),
221           type, allowed, restricted);
222     return E_NOTIMPL;
223 }
224 
225 static const struct INetFwMgrVtbl fw_manager_vtbl =
226 {
227     fw_manager_QueryInterface,
228     fw_manager_AddRef,
229     fw_manager_Release,
230     fw_manager_GetTypeInfoCount,
231     fw_manager_GetTypeInfo,
232     fw_manager_GetIDsOfNames,
233     fw_manager_Invoke,
234     fw_manager_get_LocalPolicy,
235     fw_manager_get_CurrentProfileType,
236     fw_manager_RestoreDefaults,
237     fw_manager_IsPortAllowed,
238     fw_manager_IsIcmpTypeAllowed
239 };
240 
241 HRESULT NetFwMgr_create( IUnknown *pUnkOuter, LPVOID *ppObj )
242 {
243     fw_manager *fm;
244 
245     TRACE("(%p,%p)\n", pUnkOuter, ppObj);
246 
247     fm = HeapAlloc( GetProcessHeap(), 0, sizeof(*fm) );
248     if (!fm) return E_OUTOFMEMORY;
249 
250     fm->INetFwMgr_iface.lpVtbl = &fw_manager_vtbl;
251     fm->refs = 1;
252 
253     *ppObj = &fm->INetFwMgr_iface;
254 
255     TRACE("returning iface %p\n", *ppObj);
256     return S_OK;
257 }
258