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