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