Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/strmbase/dispatch.c
4389 views
1
/*
2
* ITypeInfo cache for IDispatch
3
*
4
* Copyright 2019 Zebediah Figura
5
*
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19
*/
20
21
#include "strmbase_private.h"
22
23
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
24
25
static ITypeLib *control_typelib;
26
static ITypeInfo *control_typeinfo[last_tid];
27
28
static REFIID control_tid_id[] =
29
{
30
&IID_IBasicAudio,
31
&IID_IBasicVideo,
32
&IID_IMediaControl,
33
&IID_IMediaEvent,
34
&IID_IMediaPosition,
35
&IID_IVideoWindow,
36
};
37
38
HRESULT strmbase_get_typeinfo(enum strmbase_type_id tid, ITypeInfo **ret)
39
{
40
HRESULT hr;
41
42
if (!control_typelib)
43
{
44
ITypeLib *typelib;
45
46
hr = LoadRegTypeLib(&LIBID_QuartzTypeLib, 1, 0, LOCALE_SYSTEM_DEFAULT, &typelib);
47
if (FAILED(hr))
48
{
49
ERR("Failed to load typelib, hr %#lx.\n", hr);
50
return hr;
51
}
52
if (InterlockedCompareExchangePointer((void **)&control_typelib, typelib, NULL))
53
ITypeLib_Release(typelib);
54
}
55
if (!control_typeinfo[tid])
56
{
57
ITypeInfo *typeinfo;
58
59
hr = ITypeLib_GetTypeInfoOfGuid(control_typelib, control_tid_id[tid], &typeinfo);
60
if (FAILED(hr))
61
{
62
ERR("Failed to get type info for %s, hr %#lx.\n", debugstr_guid(control_tid_id[tid]), hr);
63
return hr;
64
}
65
if (InterlockedCompareExchangePointer((void **)(control_typeinfo + tid), typeinfo, NULL))
66
ITypeInfo_Release(typeinfo);
67
}
68
ITypeInfo_AddRef(*ret = control_typeinfo[tid]);
69
return S_OK;
70
}
71
72
void strmbase_release_typelibs(void)
73
{
74
unsigned int i;
75
76
for (i = 0; i < ARRAY_SIZE(control_typeinfo); ++i)
77
{
78
if (control_typeinfo[i])
79
ITypeInfo_Release(control_typeinfo[i]);
80
}
81
if (control_typelib)
82
ITypeLib_Release(control_typelib);
83
}
84
85