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