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