[MMIXER] Fix additional data size initialization for different audio formats (#6753)
[reactos.git] / dll / win32 / browseui / aclmulti.cpp
1 /*
2 * Multisource AutoComplete list
3 *
4 * Copyright 2007 Mikolaj Zalewski
5 * Copyright 2009 Andrew Hill
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22 #include "precomp.h"
23
24 void CACLMulti::release_obj(struct ACLMultiSublist *obj)
25 {
26 obj->punk->Release();
27 if (obj->pEnum)
28 obj->pEnum->Release();
29 if (obj->pACL)
30 obj->pACL->Release();
31 }
32
33 CACLMulti::CACLMulti()
34 {
35 fObjectCount = 0;
36 fCurrentObject = 0;
37 fObjects = NULL;
38 }
39
40 CACLMulti::~CACLMulti()
41 {
42 int i;
43
44 TRACE("destroying %p\n", this);
45 for (i = 0; i < fObjectCount; i++)
46 release_obj(&fObjects[i]);
47 CoTaskMemFree(fObjects);
48 }
49
50 HRESULT STDMETHODCALLTYPE CACLMulti::Append(IUnknown *punk)
51 {
52 TRACE("(%p, %p)\n", this, punk);
53 if (punk == NULL)
54 return E_FAIL;
55
56 fObjects = static_cast<ACLMultiSublist *>(
57 CoTaskMemRealloc(fObjects, sizeof(fObjects[0]) * (fObjectCount + 1)));
58 fObjects[fObjectCount].punk = punk;
59 punk->AddRef();
60 if (FAILED_UNEXPECTEDLY(punk->QueryInterface(IID_PPV_ARG(IEnumString, &fObjects[fObjectCount].pEnum))))
61 fObjects[fObjectCount].pEnum = NULL;
62 if (FAILED_UNEXPECTEDLY(punk->QueryInterface(IID_PPV_ARG(IACList, &fObjects[fObjectCount].pACL))))
63 fObjects[fObjectCount].pACL = NULL;
64 fObjectCount++;
65 return S_OK;
66 }
67
68 HRESULT STDMETHODCALLTYPE CACLMulti::Remove(IUnknown *punk)
69 {
70 int i;
71
72 TRACE("(%p, %p)\n", this, punk);
73 for (i = 0; i < fObjectCount; i++)
74 if (fObjects[i].punk == punk)
75 {
76 release_obj(&fObjects[i]);
77 MoveMemory(&fObjects[i], &fObjects[i + 1], (fObjectCount - i - 1) * sizeof(ACLMultiSublist));
78 fObjectCount--;
79 fObjects = static_cast<ACLMultiSublist *>(
80 CoTaskMemRealloc(fObjects, sizeof(fObjects[0]) * fObjectCount));
81 return S_OK;
82 }
83
84 return E_FAIL;
85 }
86
87 HRESULT STDMETHODCALLTYPE CACLMulti::Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched)
88 {
89 TRACE("(%p, %d, %p, %p)\n", this, celt, rgelt, pceltFetched);
90 while (fCurrentObject < fObjectCount)
91 {
92 if (fObjects[fCurrentObject].pEnum)
93 {
94 /* native browseui 6.0 also returns only one element */
95 HRESULT ret = fObjects[fCurrentObject].pEnum->Next(1, rgelt, pceltFetched);
96 if (ret != S_FALSE)
97 return ret;
98 }
99 fCurrentObject++;
100 }
101
102 if (pceltFetched)
103 *pceltFetched = 0;
104 *rgelt = NULL;
105 return S_FALSE;
106 }
107
108 HRESULT STDMETHODCALLTYPE CACLMulti::Reset()
109 {
110 int i;
111
112 fCurrentObject = 0;
113 for (i = 0; i < fObjectCount; i++)
114 {
115 if (fObjects[i].pEnum)
116 fObjects[i].pEnum->Reset();
117 }
118 return S_OK;
119 }
120
121 HRESULT STDMETHODCALLTYPE CACLMulti::Skip(ULONG celt)
122 {
123 /* native browseui 6.0 returns this: */
124 return E_NOTIMPL;
125 }
126
127 HRESULT STDMETHODCALLTYPE CACLMulti::Clone(IEnumString **ppOut)
128 {
129 *ppOut = NULL;
130 /* native browseui 6.0 returns this: */
131 return E_OUTOFMEMORY;
132 }
133
134 HRESULT STDMETHODCALLTYPE CACLMulti::Expand(LPCWSTR wstr)
135 {
136 HRESULT res = S_OK;
137 int i;
138
139 for (i = 0; i < fObjectCount; i++)
140 {
141 if (!fObjects[i].pACL)
142 continue;
143 res = fObjects[i].pACL->Expand(wstr);
144 if (res == S_OK)
145 break;
146 }
147 return res;
148 }