Fix the case of product and company names.
[wine] / dlls / quartz / enummedia.c
1 /*
2  * Implementation of IEnumMediaTypes Interface
3  *
4  * Copyright 2003 Robert Shearman
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "quartz_private.h"
22
23 #include "wine/debug.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
26
27 void CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc)
28 {
29     memcpy(pDest, pSrc, sizeof(AM_MEDIA_TYPE));
30     pDest->pbFormat = CoTaskMemAlloc(pSrc->cbFormat);
31     memcpy(pDest->pbFormat, pSrc->pbFormat, pSrc->cbFormat);
32 }
33
34 BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards)
35 {
36     TRACE("pmt1: ");
37     dump_AM_MEDIA_TYPE(pmt1);
38     TRACE("pmt2: ");
39     dump_AM_MEDIA_TYPE(pmt2);
40     return (((bWildcards && (IsEqualGUID(&pmt1->majortype, &GUID_NULL) || IsEqualGUID(&pmt2->majortype, &GUID_NULL))) || IsEqualGUID(&pmt1->majortype, &pmt2->majortype)) &&
41             ((bWildcards && (IsEqualGUID(&pmt1->subtype, &GUID_NULL)   || IsEqualGUID(&pmt2->subtype, &GUID_NULL)))   || IsEqualGUID(&pmt1->subtype, &pmt2->subtype)));
42 }
43
44 void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt)
45 {
46     if (!pmt)
47         return;
48     TRACE("\t%s\n\t%s\n\t...\n\t%s\n", qzdebugstr_guid(&pmt->majortype), qzdebugstr_guid(&pmt->subtype), qzdebugstr_guid(&pmt->formattype));
49 }
50
51 typedef struct IEnumMediaTypesImpl
52 {
53     const IEnumMediaTypesVtbl * lpVtbl;
54     ULONG refCount;
55     ENUMMEDIADETAILS enumMediaDetails;
56     ULONG uIndex;
57 } IEnumMediaTypesImpl;
58
59 static const struct IEnumMediaTypesVtbl IEnumMediaTypesImpl_Vtbl;
60
61 HRESULT IEnumMediaTypesImpl_Construct(const ENUMMEDIADETAILS * pDetails, IEnumMediaTypes ** ppEnum)
62 {
63     ULONG i;
64     IEnumMediaTypesImpl * pEnumMediaTypes = CoTaskMemAlloc(sizeof(IEnumMediaTypesImpl));
65
66     if (!pEnumMediaTypes)
67     {
68         *ppEnum = NULL;
69         return E_OUTOFMEMORY;
70     }
71     pEnumMediaTypes->lpVtbl = &IEnumMediaTypesImpl_Vtbl;
72     pEnumMediaTypes->refCount = 1;
73     pEnumMediaTypes->uIndex = 0;
74     pEnumMediaTypes->enumMediaDetails.cMediaTypes = pDetails->cMediaTypes;
75     pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * pDetails->cMediaTypes);
76     for (i = 0; i < pDetails->cMediaTypes; i++)
77         pEnumMediaTypes->enumMediaDetails.pMediaTypes[i] = pDetails->pMediaTypes[i];
78     *ppEnum = (IEnumMediaTypes *)(&pEnumMediaTypes->lpVtbl);
79     return S_OK;
80 }
81
82 static HRESULT WINAPI IEnumMediaTypesImpl_QueryInterface(IEnumMediaTypes * iface, REFIID riid, LPVOID * ppv)
83 {
84     TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
85
86     *ppv = NULL;
87
88     if (IsEqualIID(riid, &IID_IUnknown))
89         *ppv = (LPVOID)iface;
90     else if (IsEqualIID(riid, &IID_IEnumMediaTypes))
91         *ppv = (LPVOID)iface;
92
93     if (*ppv)
94     {
95         IUnknown_AddRef((IUnknown *)(*ppv));
96         return S_OK;
97     }
98
99     FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
100
101     return E_NOINTERFACE;
102 }
103
104 static ULONG WINAPI IEnumMediaTypesImpl_AddRef(IEnumMediaTypes * iface)
105 {
106     ICOM_THIS(IEnumMediaTypesImpl, iface);
107     TRACE("()\n");
108     return ++This->refCount;
109 }
110
111 static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface)
112 {
113     ICOM_THIS(IEnumMediaTypesImpl, iface);
114     TRACE("()\n");
115     if (!--This->refCount)
116     {
117         CoTaskMemFree(This->enumMediaDetails.pMediaTypes);
118         CoTaskMemFree(This);
119         return 0;
120     }
121     else
122         return This->refCount;
123 }
124
125 static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes, ULONG * pcFetched)
126 {
127     ULONG cFetched; 
128     ICOM_THIS(IEnumMediaTypesImpl, iface);
129
130     cFetched = min(This->enumMediaDetails.cMediaTypes, This->uIndex + cMediaTypes) - This->uIndex;
131
132     TRACE("(%lu, %p, %p)\n", cMediaTypes, ppMediaTypes, pcFetched);
133     TRACE("Next uIndex: %lu, cFetched: %lu\n", This->uIndex, cFetched);
134
135     if (cFetched > 0)
136     {
137         ULONG i;
138         *ppMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * cFetched);
139         for (i = 0; i < cFetched; i++)
140             (*ppMediaTypes)[i] = This->enumMediaDetails.pMediaTypes[This->uIndex + i];
141     }
142
143     if ((cMediaTypes != 1) || pcFetched)
144         *pcFetched = cFetched;
145
146     This->uIndex += cFetched;
147
148     if (cFetched != cMediaTypes)
149         return S_FALSE;
150     return S_OK;
151 }
152
153 static HRESULT WINAPI IEnumMediaTypesImpl_Skip(IEnumMediaTypes * iface, ULONG cMediaTypes)
154 {
155     ICOM_THIS(IEnumMediaTypesImpl, iface);
156
157     TRACE("(%lu)\n", cMediaTypes);
158
159     if (This->uIndex + cMediaTypes < This->enumMediaDetails.cMediaTypes)
160     {
161         This->uIndex += cMediaTypes;
162         return S_OK;
163     }
164     return S_FALSE;
165 }
166
167 static HRESULT WINAPI IEnumMediaTypesImpl_Reset(IEnumMediaTypes * iface)
168 {
169     ICOM_THIS(IEnumMediaTypesImpl, iface);
170
171     TRACE("()\n");
172
173     This->uIndex = 0;
174     return S_OK;
175 }
176
177 static HRESULT WINAPI IEnumMediaTypesImpl_Clone(IEnumMediaTypes * iface, IEnumMediaTypes ** ppEnum)
178 {
179     HRESULT hr;
180     ICOM_THIS(IEnumMediaTypesImpl, iface);
181
182     TRACE("(%p)\n", ppEnum);
183
184     hr = IEnumMediaTypesImpl_Construct(&This->enumMediaDetails, ppEnum);
185     if (FAILED(hr))
186         return hr;
187     return IEnumMediaTypes_Skip(*ppEnum, This->uIndex);
188 }
189
190 static const IEnumMediaTypesVtbl IEnumMediaTypesImpl_Vtbl =
191 {
192     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
193     IEnumMediaTypesImpl_QueryInterface,
194     IEnumMediaTypesImpl_AddRef,
195     IEnumMediaTypesImpl_Release,
196     IEnumMediaTypesImpl_Next,
197     IEnumMediaTypesImpl_Skip,
198     IEnumMediaTypesImpl_Reset,
199     IEnumMediaTypesImpl_Clone
200 };