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