2 * Implementation of IEnumRegFilters Interface
4 * Copyright 2004 Christian Costa
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.
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.
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
21 #include "quartz_private.h"
23 #include "wine/unicode.h"
25 #include "wine/debug.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(quartz
);
29 typedef struct IEnumRegFiltersImpl
31 const IEnumRegFiltersVtbl
* lpVtbl
;
34 REGFILTER
* RegFilters
;
36 } IEnumRegFiltersImpl
;
38 static const struct IEnumRegFiltersVtbl IEnumRegFiltersImpl_Vtbl
;
40 HRESULT
IEnumRegFiltersImpl_Construct(REGFILTER
* pInRegFilters
, const ULONG size
, IEnumRegFilters
** ppEnum
)
42 IEnumRegFiltersImpl
* pEnumRegFilters
;
43 REGFILTER
* pRegFilters
= NULL
;
46 TRACE("(%p, %ld, %p)\n", pInRegFilters
, size
, ppEnum
);
48 pEnumRegFilters
= CoTaskMemAlloc(sizeof(IEnumRegFiltersImpl
));
55 /* Accept size of 0 */
58 pRegFilters
= CoTaskMemAlloc(sizeof(REGFILTER
)*size
);
61 CoTaskMemFree(pEnumRegFilters
);
67 for(i
= 0; i
< size
; i
++)
69 pRegFilters
[i
].Clsid
= pInRegFilters
[i
].Clsid
;
70 pRegFilters
[i
].Name
= (WCHAR
*)CoTaskMemAlloc((strlenW(pInRegFilters
[i
].Name
)+1)*sizeof(WCHAR
));
71 if (!pRegFilters
[i
].Name
)
74 CoTaskMemFree(pRegFilters
[--i
].Name
);
75 CoTaskMemFree(pRegFilters
);
76 CoTaskMemFree(pEnumRegFilters
);
79 CopyMemory(pRegFilters
[i
].Name
, pInRegFilters
[i
].Name
, (strlenW(pInRegFilters
[i
].Name
)+1)*sizeof(WCHAR
));
82 pEnumRegFilters
->lpVtbl
= &IEnumRegFiltersImpl_Vtbl
;
83 pEnumRegFilters
->refCount
= 1;
84 pEnumRegFilters
->uIndex
= 0;
85 pEnumRegFilters
->RegFilters
= pRegFilters
;
86 pEnumRegFilters
->size
= size
;
88 *ppEnum
= (IEnumRegFilters
*)(&pEnumRegFilters
->lpVtbl
);
93 static HRESULT WINAPI
IEnumRegFiltersImpl_QueryInterface(IEnumRegFilters
* iface
, REFIID riid
, LPVOID
* ppv
)
95 TRACE("(%p)->(%s, %p)\n", iface
, qzdebugstr_guid(riid
), ppv
);
99 if (IsEqualIID(riid
, &IID_IUnknown
))
100 *ppv
= (LPVOID
)iface
;
101 else if (IsEqualIID(riid
, &IID_IEnumRegFilters
))
102 *ppv
= (LPVOID
)iface
;
106 IUnknown_AddRef((IUnknown
*)(*ppv
));
110 FIXME("No interface for %s!\n", qzdebugstr_guid(riid
));
112 return E_NOINTERFACE
;
115 static ULONG WINAPI
IEnumRegFiltersImpl_AddRef(IEnumRegFilters
* iface
)
117 IEnumRegFiltersImpl
*This
= (IEnumRegFiltersImpl
*)iface
;
119 TRACE("(%p)\n", iface
);
121 return ++This
->refCount
;
124 static ULONG WINAPI
IEnumRegFiltersImpl_Release(IEnumRegFilters
* iface
)
126 IEnumRegFiltersImpl
*This
= (IEnumRegFiltersImpl
*)iface
;
128 TRACE("(%p)\n", iface
);
130 if (!--This
->refCount
)
135 return This
->refCount
;
138 static HRESULT WINAPI
IEnumRegFiltersImpl_Next(IEnumRegFilters
* iface
, ULONG cFilters
, REGFILTER
** ppRegFilter
, ULONG
* pcFetched
)
141 IEnumRegFiltersImpl
*This
= (IEnumRegFiltersImpl
*)iface
;
144 cFetched
= min(This
->size
, This
->uIndex
+ cFilters
) - This
->uIndex
;
146 TRACE("(%p)->(%lu, %p, %p)\n", iface
, cFilters
, ppRegFilter
, pcFetched
);
150 for(i
= 0; i
< cFetched
; i
++)
152 /* The string in the REGFILTER structure must be allocated in the same block as the REGFILTER structure itself */
153 ppRegFilter
[i
] = (REGFILTER
*)CoTaskMemAlloc(sizeof(REGFILTER
)+(strlenW(This
->RegFilters
[i
].Name
)+1)*sizeof(WCHAR
));
158 CoTaskMemFree(ppRegFilter
[--i
]);
159 ppRegFilter
[i
] = NULL
;
161 return E_OUTOFMEMORY
;
163 ppRegFilter
[i
]->Clsid
= This
->RegFilters
[i
].Clsid
;
164 ppRegFilter
[i
]->Name
= (WCHAR
*)((char*)ppRegFilter
[i
]+sizeof(REGFILTER
));
165 CopyMemory(ppRegFilter
[i
]->Name
, This
->RegFilters
[i
].Name
, (strlenW(This
->RegFilters
[i
].Name
)+1)*sizeof(WCHAR
));
168 This
->uIndex
+= cFetched
;
170 *pcFetched
= cFetched
;
177 static HRESULT WINAPI
IEnumRegFiltersImpl_Skip(IEnumRegFilters
* iface
, ULONG n
)
179 TRACE("(%p)->(%lu)\n", iface
, n
);
184 static HRESULT WINAPI
IEnumRegFiltersImpl_Reset(IEnumRegFilters
* iface
)
186 IEnumRegFiltersImpl
*This
= (IEnumRegFiltersImpl
*)iface
;
188 TRACE("(%p)\n", iface
);
194 static HRESULT WINAPI
IEnumRegFiltersImpl_Clone(IEnumRegFilters
* iface
, IEnumRegFilters
** ppEnum
)
196 TRACE("(%p)->(%p)\n", iface
, ppEnum
);
201 static const IEnumRegFiltersVtbl IEnumRegFiltersImpl_Vtbl
=
203 IEnumRegFiltersImpl_QueryInterface
,
204 IEnumRegFiltersImpl_AddRef
,
205 IEnumRegFiltersImpl_Release
,
206 IEnumRegFiltersImpl_Next
,
207 IEnumRegFiltersImpl_Skip
,
208 IEnumRegFiltersImpl_Reset
,
209 IEnumRegFiltersImpl_Clone