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