[HNETCFG] Sync with Wine 3.0. CORE-14225
[reactos.git] / dll / win32 / hnetcfg / apps.c
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 "hnetcfg_private.h"
20
21 #include <winnls.h>
22 #include <ole2.h>
23
24 typedef struct fw_app
25 {
26 INetFwAuthorizedApplication INetFwAuthorizedApplication_iface;
27 LONG refs;
28 } fw_app;
29
30 static inline fw_app *impl_from_INetFwAuthorizedApplication( INetFwAuthorizedApplication *iface )
31 {
32 return CONTAINING_RECORD(iface, fw_app, INetFwAuthorizedApplication_iface);
33 }
34
35 static ULONG WINAPI fw_app_AddRef(
36 INetFwAuthorizedApplication *iface )
37 {
38 fw_app *fw_app = impl_from_INetFwAuthorizedApplication( iface );
39 return InterlockedIncrement( &fw_app->refs );
40 }
41
42 static ULONG WINAPI fw_app_Release(
43 INetFwAuthorizedApplication *iface )
44 {
45 fw_app *fw_app = impl_from_INetFwAuthorizedApplication( iface );
46 LONG refs = InterlockedDecrement( &fw_app->refs );
47 if (!refs)
48 {
49 TRACE("destroying %p\n", fw_app);
50 HeapFree( GetProcessHeap(), 0, fw_app );
51 }
52 return refs;
53 }
54
55 static HRESULT WINAPI fw_app_QueryInterface(
56 INetFwAuthorizedApplication *iface,
57 REFIID riid,
58 void **ppvObject )
59 {
60 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
61
62 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
63
64 if ( IsEqualGUID( riid, &IID_INetFwAuthorizedApplication ) ||
65 IsEqualGUID( riid, &IID_IDispatch ) ||
66 IsEqualGUID( riid, &IID_IUnknown ) )
67 {
68 *ppvObject = iface;
69 }
70 else
71 {
72 FIXME("interface %s not implemented\n", debugstr_guid(riid));
73 return E_NOINTERFACE;
74 }
75 INetFwAuthorizedApplication_AddRef( iface );
76 return S_OK;
77 }
78
79 static HRESULT WINAPI fw_app_GetTypeInfoCount(
80 INetFwAuthorizedApplication *iface,
81 UINT *pctinfo )
82 {
83 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
84
85 TRACE("%p %p\n", This, pctinfo);
86 *pctinfo = 1;
87 return S_OK;
88 }
89
90 static ITypeLib *typelib;
91 static ITypeInfo *typeinfo[last_tid];
92
93 static REFIID tid_id[] =
94 {
95 &IID_INetFwAuthorizedApplication,
96 &IID_INetFwAuthorizedApplications,
97 &IID_INetFwMgr,
98 &IID_INetFwOpenPort,
99 &IID_INetFwOpenPorts,
100 &IID_INetFwPolicy,
101 &IID_INetFwPolicy2,
102 &IID_INetFwProfile
103 };
104
105 HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret )
106 {
107 HRESULT hr;
108
109 if (!typelib)
110 {
111 ITypeLib *lib;
112
113 hr = LoadRegTypeLib( &LIBID_NetFwPublicTypeLib, 1, 0, LOCALE_SYSTEM_DEFAULT, &lib );
114 if (FAILED(hr))
115 {
116 ERR("LoadRegTypeLib failed: %08x\n", hr);
117 return hr;
118 }
119 if (InterlockedCompareExchangePointer( (void **)&typelib, lib, NULL ))
120 ITypeLib_Release( lib );
121 }
122 if (!typeinfo[tid])
123 {
124 ITypeInfo *info;
125
126 hr = ITypeLib_GetTypeInfoOfGuid( typelib, tid_id[tid], &info );
127 if (FAILED(hr))
128 {
129 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_id[tid]), hr);
130 return hr;
131 }
132 if (InterlockedCompareExchangePointer( (void **)(typeinfo + tid), info, NULL ))
133 ITypeInfo_Release( info );
134 }
135 *ret = typeinfo[tid];
136 ITypeInfo_AddRef(typeinfo[tid]);
137 return S_OK;
138 }
139
140 void release_typelib(void)
141 {
142 unsigned i;
143
144 for (i = 0; i < sizeof(typeinfo)/sizeof(*typeinfo); i++)
145 if (typeinfo[i])
146 ITypeInfo_Release(typeinfo[i]);
147
148 if (typelib)
149 ITypeLib_Release(typelib);
150 }
151
152 static HRESULT WINAPI fw_app_GetTypeInfo(
153 INetFwAuthorizedApplication *iface,
154 UINT iTInfo,
155 LCID lcid,
156 ITypeInfo **ppTInfo )
157 {
158 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
159
160 TRACE("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
161 return get_typeinfo( INetFwAuthorizedApplication_tid, ppTInfo );
162 }
163
164 static HRESULT WINAPI fw_app_GetIDsOfNames(
165 INetFwAuthorizedApplication *iface,
166 REFIID riid,
167 LPOLESTR *rgszNames,
168 UINT cNames,
169 LCID lcid,
170 DISPID *rgDispId )
171 {
172 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
173 ITypeInfo *typeinfo;
174 HRESULT hr;
175
176 TRACE("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
177
178 hr = get_typeinfo( INetFwAuthorizedApplication_tid, &typeinfo );
179 if (SUCCEEDED(hr))
180 {
181 hr = ITypeInfo_GetIDsOfNames( typeinfo, rgszNames, cNames, rgDispId );
182 ITypeInfo_Release( typeinfo );
183 }
184 return hr;
185 }
186
187 static HRESULT WINAPI fw_app_Invoke(
188 INetFwAuthorizedApplication *iface,
189 DISPID dispIdMember,
190 REFIID riid,
191 LCID lcid,
192 WORD wFlags,
193 DISPPARAMS *pDispParams,
194 VARIANT *pVarResult,
195 EXCEPINFO *pExcepInfo,
196 UINT *puArgErr )
197 {
198 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
199 ITypeInfo *typeinfo;
200 HRESULT hr;
201
202 TRACE("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
203 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
204
205 hr = get_typeinfo( INetFwAuthorizedApplication_tid, &typeinfo );
206 if (SUCCEEDED(hr))
207 {
208 hr = ITypeInfo_Invoke( typeinfo, &This->INetFwAuthorizedApplication_iface, dispIdMember,
209 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr );
210 ITypeInfo_Release( typeinfo );
211 }
212 return hr;
213 }
214
215 static HRESULT WINAPI fw_app_get_Name(
216 INetFwAuthorizedApplication *iface,
217 BSTR *name )
218 {
219 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
220
221 FIXME("%p, %p\n", This, name);
222 return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI fw_app_put_Name(
226 INetFwAuthorizedApplication *iface,
227 BSTR name )
228 {
229 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
230
231 FIXME("%p, %s\n", This, debugstr_w(name));
232 return S_OK;
233 }
234
235 static HRESULT WINAPI fw_app_get_ProcessImageFileName(
236 INetFwAuthorizedApplication *iface,
237 BSTR *imageFileName )
238 {
239 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
240
241 FIXME("%p, %p\n", This, imageFileName);
242 return E_NOTIMPL;
243 }
244
245 static HRESULT WINAPI fw_app_put_ProcessImageFileName(
246 INetFwAuthorizedApplication *iface,
247 BSTR imageFileName )
248 {
249 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
250
251 FIXME("%p, %s\n", This, debugstr_w(imageFileName));
252 return S_OK;
253 }
254
255 static HRESULT WINAPI fw_app_get_IpVersion(
256 INetFwAuthorizedApplication *iface,
257 NET_FW_IP_VERSION *ipVersion )
258 {
259 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
260
261 TRACE("%p, %p\n", This, ipVersion);
262
263 if (!ipVersion)
264 return E_POINTER;
265 *ipVersion = NET_FW_IP_VERSION_ANY;
266 return S_OK;
267 }
268
269 static HRESULT WINAPI fw_app_put_IpVersion(
270 INetFwAuthorizedApplication *iface,
271 NET_FW_IP_VERSION ipVersion )
272 {
273 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
274
275 TRACE("%p, %u\n", This, ipVersion);
276 return S_OK;
277 }
278
279 static HRESULT WINAPI fw_app_get_Scope(
280 INetFwAuthorizedApplication *iface,
281 NET_FW_SCOPE *scope )
282 {
283 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
284
285 FIXME("%p, %p\n", This, scope);
286 return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI fw_app_put_Scope(
290 INetFwAuthorizedApplication *iface,
291 NET_FW_SCOPE scope )
292 {
293 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
294
295 FIXME("%p, %u\n", This, scope);
296 return S_OK;
297 }
298
299 static HRESULT WINAPI fw_app_get_RemoteAddresses(
300 INetFwAuthorizedApplication *iface,
301 BSTR *remoteAddrs )
302 {
303 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
304
305 FIXME("%p, %p\n", This, remoteAddrs);
306 return E_NOTIMPL;
307 }
308
309 static HRESULT WINAPI fw_app_put_RemoteAddresses(
310 INetFwAuthorizedApplication *iface,
311 BSTR remoteAddrs )
312 {
313 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
314
315 FIXME("%p, %s\n", This, debugstr_w(remoteAddrs));
316 return E_NOTIMPL;
317 }
318
319 static HRESULT WINAPI fw_app_get_Enabled(
320 INetFwAuthorizedApplication *iface,
321 VARIANT_BOOL *enabled )
322 {
323 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
324
325 FIXME("%p, %p\n", This, enabled);
326
327 *enabled = VARIANT_FALSE;
328 return S_OK;
329 }
330
331 static HRESULT WINAPI fw_app_put_Enabled(
332 INetFwAuthorizedApplication *iface,
333 VARIANT_BOOL enabled )
334 {
335 fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
336
337 FIXME("%p, %d\n", This, enabled);
338 return S_OK;
339 }
340
341 static const struct INetFwAuthorizedApplicationVtbl fw_app_vtbl =
342 {
343 fw_app_QueryInterface,
344 fw_app_AddRef,
345 fw_app_Release,
346 fw_app_GetTypeInfoCount,
347 fw_app_GetTypeInfo,
348 fw_app_GetIDsOfNames,
349 fw_app_Invoke,
350 fw_app_get_Name,
351 fw_app_put_Name,
352 fw_app_get_ProcessImageFileName,
353 fw_app_put_ProcessImageFileName,
354 fw_app_get_IpVersion,
355 fw_app_put_IpVersion,
356 fw_app_get_Scope,
357 fw_app_put_Scope,
358 fw_app_get_RemoteAddresses,
359 fw_app_put_RemoteAddresses,
360 fw_app_get_Enabled,
361 fw_app_put_Enabled
362 };
363
364 HRESULT NetFwAuthorizedApplication_create( IUnknown *pUnkOuter, LPVOID *ppObj )
365 {
366 fw_app *fa;
367
368 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
369
370 fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) );
371 if (!fa) return E_OUTOFMEMORY;
372
373 fa->INetFwAuthorizedApplication_iface.lpVtbl = &fw_app_vtbl;
374 fa->refs = 1;
375
376 *ppObj = &fa->INetFwAuthorizedApplication_iface;
377
378 TRACE("returning iface %p\n", *ppObj);
379 return S_OK;
380 }
381 typedef struct fw_apps
382 {
383 INetFwAuthorizedApplications INetFwAuthorizedApplications_iface;
384 LONG refs;
385 } fw_apps;
386
387 static inline fw_apps *impl_from_INetFwAuthorizedApplications( INetFwAuthorizedApplications *iface )
388 {
389 return CONTAINING_RECORD(iface, fw_apps, INetFwAuthorizedApplications_iface);
390 }
391
392 static ULONG WINAPI fw_apps_AddRef(
393 INetFwAuthorizedApplications *iface )
394 {
395 fw_apps *fw_apps = impl_from_INetFwAuthorizedApplications( iface );
396 return InterlockedIncrement( &fw_apps->refs );
397 }
398
399 static ULONG WINAPI fw_apps_Release(
400 INetFwAuthorizedApplications *iface )
401 {
402 fw_apps *fw_apps = impl_from_INetFwAuthorizedApplications( iface );
403 LONG refs = InterlockedDecrement( &fw_apps->refs );
404 if (!refs)
405 {
406 TRACE("destroying %p\n", fw_apps);
407 HeapFree( GetProcessHeap(), 0, fw_apps );
408 }
409 return refs;
410 }
411
412 static HRESULT WINAPI fw_apps_QueryInterface(
413 INetFwAuthorizedApplications *iface,
414 REFIID riid,
415 void **ppvObject )
416 {
417 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
418
419 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
420
421 if ( IsEqualGUID( riid, &IID_INetFwAuthorizedApplications ) ||
422 IsEqualGUID( riid, &IID_IDispatch ) ||
423 IsEqualGUID( riid, &IID_IUnknown ) )
424 {
425 *ppvObject = iface;
426 }
427 else
428 {
429 FIXME("interface %s not implemented\n", debugstr_guid(riid));
430 return E_NOINTERFACE;
431 }
432 INetFwAuthorizedApplications_AddRef( iface );
433 return S_OK;
434 }
435
436 static HRESULT WINAPI fw_apps_GetTypeInfoCount(
437 INetFwAuthorizedApplications *iface,
438 UINT *pctinfo )
439 {
440 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
441
442 FIXME("%p %p\n", This, pctinfo);
443 return E_NOTIMPL;
444 }
445
446 static HRESULT WINAPI fw_apps_GetTypeInfo(
447 INetFwAuthorizedApplications *iface,
448 UINT iTInfo,
449 LCID lcid,
450 ITypeInfo **ppTInfo )
451 {
452 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
453
454 TRACE("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
455 return get_typeinfo( INetFwAuthorizedApplications_tid, ppTInfo );
456 }
457
458 static HRESULT WINAPI fw_apps_GetIDsOfNames(
459 INetFwAuthorizedApplications *iface,
460 REFIID riid,
461 LPOLESTR *rgszNames,
462 UINT cNames,
463 LCID lcid,
464 DISPID *rgDispId )
465 {
466 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
467 ITypeInfo *typeinfo;
468 HRESULT hr;
469
470 TRACE("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
471
472 hr = get_typeinfo( INetFwAuthorizedApplications_tid, &typeinfo );
473 if (SUCCEEDED(hr))
474 {
475 hr = ITypeInfo_GetIDsOfNames( typeinfo, rgszNames, cNames, rgDispId );
476 ITypeInfo_Release( typeinfo );
477 }
478 return hr;
479 }
480
481 static HRESULT WINAPI fw_apps_Invoke(
482 INetFwAuthorizedApplications *iface,
483 DISPID dispIdMember,
484 REFIID riid,
485 LCID lcid,
486 WORD wFlags,
487 DISPPARAMS *pDispParams,
488 VARIANT *pVarResult,
489 EXCEPINFO *pExcepInfo,
490 UINT *puArgErr )
491 {
492 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
493 ITypeInfo *typeinfo;
494 HRESULT hr;
495
496 TRACE("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
497 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
498
499 hr = get_typeinfo( INetFwAuthorizedApplications_tid, &typeinfo );
500 if (SUCCEEDED(hr))
501 {
502 hr = ITypeInfo_Invoke( typeinfo, &This->INetFwAuthorizedApplications_iface, dispIdMember,
503 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr );
504 ITypeInfo_Release( typeinfo );
505 }
506 return hr;
507 }
508
509 static HRESULT WINAPI fw_apps_get_Count(
510 INetFwAuthorizedApplications *iface,
511 LONG *count )
512 {
513 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
514
515 FIXME("%p, %p\n", This, count);
516 return E_NOTIMPL;
517 }
518
519 static HRESULT WINAPI fw_apps_Add(
520 INetFwAuthorizedApplications *iface,
521 INetFwAuthorizedApplication *app )
522 {
523 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
524
525 FIXME("%p, %p\n", This, app);
526 return S_OK;
527 }
528
529 static HRESULT WINAPI fw_apps_Remove(
530 INetFwAuthorizedApplications *iface,
531 BSTR imageFileName )
532 {
533 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
534
535 FIXME("%p, %s\n", This, debugstr_w(imageFileName));
536 return S_OK;
537 }
538
539 static HRESULT WINAPI fw_apps_Item(
540 INetFwAuthorizedApplications *iface,
541 BSTR imageFileName,
542 INetFwAuthorizedApplication **app )
543 {
544 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
545
546 TRACE("%p, %s, %p\n", This, debugstr_w(imageFileName), app);
547 return NetFwAuthorizedApplication_create( NULL, (void **)app );
548 }
549
550 static HRESULT WINAPI fw_apps_get__NewEnum(
551 INetFwAuthorizedApplications *iface,
552 IUnknown **newEnum )
553 {
554 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
555
556 FIXME("%p, %p\n", This, newEnum);
557 return E_NOTIMPL;
558 }
559
560 static const struct INetFwAuthorizedApplicationsVtbl fw_apps_vtbl =
561 {
562 fw_apps_QueryInterface,
563 fw_apps_AddRef,
564 fw_apps_Release,
565 fw_apps_GetTypeInfoCount,
566 fw_apps_GetTypeInfo,
567 fw_apps_GetIDsOfNames,
568 fw_apps_Invoke,
569 fw_apps_get_Count,
570 fw_apps_Add,
571 fw_apps_Remove,
572 fw_apps_Item,
573 fw_apps_get__NewEnum
574 };
575
576 HRESULT NetFwAuthorizedApplications_create( IUnknown *pUnkOuter, LPVOID *ppObj )
577 {
578 fw_apps *fa;
579
580 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
581
582 fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) );
583 if (!fa) return E_OUTOFMEMORY;
584
585 fa->INetFwAuthorizedApplications_iface.lpVtbl = &fw_apps_vtbl;
586 fa->refs = 1;
587
588 *ppObj = &fa->INetFwAuthorizedApplications_iface;
589
590 TRACE("returning iface %p\n", *ppObj);
591 return S_OK;
592 }