2 * Copyright 2019 Nikolay Sivov for CodeWeavers
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.
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.
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
19 #define NONAMELESSUNION
27 #include "wine/heap.h"
28 #include "wine/debug.h"
38 IMFAttributes IMFAttributes_iface
;
41 struct attribute
*attributes
;
46 extern HRESULT
init_attributes_object(struct attributes
*object
, UINT32 size
) DECLSPEC_HIDDEN
;
47 extern void clear_attributes_object(struct attributes
*object
) DECLSPEC_HIDDEN
;
48 extern const char *debugstr_attr(const GUID
*guid
) DECLSPEC_HIDDEN
;
49 extern const char *debugstr_mf_guid(const GUID
*guid
) DECLSPEC_HIDDEN
;
51 extern HRESULT
attributes_GetItem(struct attributes
*object
, REFGUID key
, PROPVARIANT
*value
) DECLSPEC_HIDDEN
;
52 extern HRESULT
attributes_GetItemType(struct attributes
*object
, REFGUID key
, MF_ATTRIBUTE_TYPE
*type
) DECLSPEC_HIDDEN
;
53 extern HRESULT
attributes_CompareItem(struct attributes
*object
, REFGUID key
, REFPROPVARIANT value
,
54 BOOL
*result
) DECLSPEC_HIDDEN
;
55 extern HRESULT
attributes_Compare(struct attributes
*object
, IMFAttributes
*theirs
,
56 MF_ATTRIBUTES_MATCH_TYPE match_type
, BOOL
*ret
) DECLSPEC_HIDDEN
;
57 extern HRESULT
attributes_GetUINT32(struct attributes
*object
, REFGUID key
, UINT32
*value
) DECLSPEC_HIDDEN
;
58 extern HRESULT
attributes_GetUINT64(struct attributes
*object
, REFGUID key
, UINT64
*value
) DECLSPEC_HIDDEN
;
59 extern HRESULT
attributes_GetDouble(struct attributes
*object
, REFGUID key
, double *value
) DECLSPEC_HIDDEN
;
60 extern HRESULT
attributes_GetGUID(struct attributes
*object
, REFGUID key
, GUID
*value
) DECLSPEC_HIDDEN
;
61 extern HRESULT
attributes_GetStringLength(struct attributes
*object
, REFGUID key
, UINT32
*length
) DECLSPEC_HIDDEN
;
62 extern HRESULT
attributes_GetString(struct attributes
*object
, REFGUID key
, WCHAR
*value
, UINT32 size
,
63 UINT32
*length
) DECLSPEC_HIDDEN
;
64 extern HRESULT
attributes_GetAllocatedString(struct attributes
*object
, REFGUID key
, WCHAR
**value
,
65 UINT32
*length
) DECLSPEC_HIDDEN
;
66 extern HRESULT
attributes_GetBlobSize(struct attributes
*object
, REFGUID key
, UINT32
*size
) DECLSPEC_HIDDEN
;
67 extern HRESULT
attributes_GetBlob(struct attributes
*object
, REFGUID key
, UINT8
*buf
, UINT32 bufsize
,
68 UINT32
*blobsize
) DECLSPEC_HIDDEN
;
69 extern HRESULT
attributes_GetAllocatedBlob(struct attributes
*object
, REFGUID key
, UINT8
**buf
,
70 UINT32
*size
) DECLSPEC_HIDDEN
;
71 extern HRESULT
attributes_GetUnknown(struct attributes
*object
, REFGUID key
, REFIID riid
, void **out
) DECLSPEC_HIDDEN
;
72 extern HRESULT
attributes_SetItem(struct attributes
*object
, REFGUID key
, REFPROPVARIANT value
) DECLSPEC_HIDDEN
;
73 extern HRESULT
attributes_DeleteItem(struct attributes
*object
, REFGUID key
) DECLSPEC_HIDDEN
;
74 extern HRESULT
attributes_DeleteAllItems(struct attributes
*object
) DECLSPEC_HIDDEN
;
75 extern HRESULT
attributes_SetUINT32(struct attributes
*object
, REFGUID key
, UINT32 value
) DECLSPEC_HIDDEN
;
76 extern HRESULT
attributes_SetUINT64(struct attributes
*object
, REFGUID key
, UINT64 value
) DECLSPEC_HIDDEN
;
77 extern HRESULT
attributes_SetDouble(struct attributes
*object
, REFGUID key
, double value
) DECLSPEC_HIDDEN
;
78 extern HRESULT
attributes_SetGUID(struct attributes
*object
, REFGUID key
, REFGUID value
) DECLSPEC_HIDDEN
;
79 extern HRESULT
attributes_SetString(struct attributes
*object
, REFGUID key
, const WCHAR
*value
) DECLSPEC_HIDDEN
;
80 extern HRESULT
attributes_SetBlob(struct attributes
*object
, REFGUID key
, const UINT8
*buf
,
81 UINT32 size
) DECLSPEC_HIDDEN
;
82 extern HRESULT
attributes_SetUnknown(struct attributes
*object
, REFGUID key
, IUnknown
*unknown
) DECLSPEC_HIDDEN
;
83 extern HRESULT
attributes_LockStore(struct attributes
*object
) DECLSPEC_HIDDEN
;
84 extern HRESULT
attributes_UnlockStore(struct attributes
*object
) DECLSPEC_HIDDEN
;
85 extern HRESULT
attributes_GetCount(struct attributes
*object
, UINT32
*items
) DECLSPEC_HIDDEN
;
86 extern HRESULT
attributes_GetItemByIndex(struct attributes
*object
, UINT32 index
, GUID
*key
,
87 PROPVARIANT
*value
) DECLSPEC_HIDDEN
;
88 extern HRESULT
attributes_CopyAllItems(struct attributes
*object
, IMFAttributes
*dest
) DECLSPEC_HIDDEN
;
90 extern void init_system_queues(void) DECLSPEC_HIDDEN
;
91 extern void shutdown_system_queues(void) DECLSPEC_HIDDEN
;
92 extern BOOL
is_platform_locked(void) DECLSPEC_HIDDEN
;
94 static inline BOOL
mf_array_reserve(void **elements
, size_t *capacity
, size_t count
, size_t size
)
96 size_t new_capacity
, max_capacity
;
99 if (count
<= *capacity
)
102 max_capacity
= ~(SIZE_T
)0 / size
;
103 if (count
> max_capacity
)
106 new_capacity
= max(4, *capacity
);
107 while (new_capacity
< count
&& new_capacity
<= max_capacity
/ 2)
109 if (new_capacity
< count
)
110 new_capacity
= max_capacity
;
112 if (!(new_elements
= heap_realloc(*elements
, new_capacity
* size
)))
115 *elements
= new_elements
;
116 *capacity
= new_capacity
;
121 static inline const char *debugstr_propvar(const PROPVARIANT
*v
)
129 return wine_dbg_sprintf("%p {VT_EMPTY}", v
);
131 return wine_dbg_sprintf("%p {VT_NULL}", v
);
133 return wine_dbg_sprintf("%p {VT_UI4: %d}", v
, v
->u
.ulVal
);
135 return wine_dbg_sprintf("%p {VT_UI8: %s}", v
, wine_dbgstr_longlong(v
->u
.uhVal
.QuadPart
));
137 return wine_dbg_sprintf("%p {VT_R8: %lf}", v
, v
->u
.dblVal
);
139 return wine_dbg_sprintf("%p {VT_CLSID: %s}", v
, debugstr_guid(v
->u
.puuid
));
141 return wine_dbg_sprintf("%p {VT_LPWSTR: %s}", v
, wine_dbgstr_w(v
->u
.pwszVal
));
142 case VT_VECTOR
| VT_UI1
:
143 return wine_dbg_sprintf("%p {VT_VECTOR|VT_UI1: %p}", v
, v
->u
.caub
.pElems
);
145 return wine_dbg_sprintf("%p {VT_UNKNOWN: %p}", v
, v
->u
.punkVal
);
147 return wine_dbg_sprintf("%p {vt %#x}", v
, v
->vt
);