2 * IDxDiagContainer Implementation
4 * Copyright 2004 Raphael Junqueira
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
23 #include "dxdiag_private.h"
24 #include "wine/debug.h"
25 #include "wine/unicode.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(dxdiag
);
29 /* IDxDiagContainer IUnknown parts follow: */
30 HRESULT WINAPI
IDxDiagContainerImpl_QueryInterface(PDXDIAGCONTAINER iface
, REFIID riid
, LPVOID
*ppobj
)
32 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
34 if (IsEqualGUID(riid
, &IID_IUnknown
)
35 || IsEqualGUID(riid
, &IID_IDxDiagContainer
)) {
36 IDxDiagContainerImpl_AddRef(iface
);
41 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
45 ULONG WINAPI
IDxDiagContainerImpl_AddRef(PDXDIAGCONTAINER iface
) {
46 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
47 ULONG refCount
= InterlockedIncrement(&This
->ref
);
49 TRACE("(%p)->(ref before=%lu)\n", This
, refCount
- 1);
56 ULONG WINAPI
IDxDiagContainerImpl_Release(PDXDIAGCONTAINER iface
) {
57 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
58 ULONG refCount
= InterlockedDecrement(&This
->ref
);
60 TRACE("(%p)->(ref before=%lu)\n", This
, refCount
+ 1);
63 HeapFree(GetProcessHeap(), 0, This
);
66 DXDIAGN_UnlockModule();
71 /* IDxDiagContainer Interface follow: */
72 HRESULT WINAPI
IDxDiagContainerImpl_GetNumberOfChildContainers(PDXDIAGCONTAINER iface
, DWORD
* pdwCount
) {
73 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
74 TRACE("(%p)\n", iface
);
75 if (NULL
== pdwCount
) {
78 *pdwCount
= This
->nSubContainers
;
82 HRESULT WINAPI
IDxDiagContainerImpl_EnumChildContainerNames(PDXDIAGCONTAINER iface
, DWORD dwIndex
, LPWSTR pwszContainer
, DWORD cchContainer
) {
83 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
84 IDxDiagContainerImpl_SubContainer
* p
= NULL
;
87 TRACE("(%p, %lu, %s, %lu)\n", iface
, dwIndex
, debugstr_w(pwszContainer
), cchContainer
);
89 if (NULL
== pwszContainer
) {
92 if (256 > cchContainer
) {
93 return DXDIAG_E_INSUFFICIENT_BUFFER
;
96 p
= This
->subContainers
;
99 if (cchContainer
<= strlenW(p
->contName
)) {
100 return DXDIAG_E_INSUFFICIENT_BUFFER
;
102 lstrcpynW(pwszContainer
, p
->contName
, cchContainer
);
111 HRESULT WINAPI
IDxDiagContainerImpl_GetChildContainer(PDXDIAGCONTAINER iface
, LPCWSTR pwszContainer
, IDxDiagContainer
** ppInstance
) {
112 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
113 IDxDiagContainerImpl_SubContainer
* p
= NULL
;
115 FIXME("(%p, %s, %p)\n", iface
, debugstr_w(pwszContainer
), ppInstance
);
117 if (NULL
== ppInstance
|| NULL
== pwszContainer
) {
121 p
= This
->subContainers
;
123 if (0 == lstrcmpW(p
->contName
, pwszContainer
)) {
124 IDxDiagContainerImpl_QueryInterface((PDXDIAGCONTAINER
)p
->pCont
, &IID_IDxDiagContainer
, (void**) ppInstance
);
125 /*TRACE"(%p) returns %p\n", iface, *ppInstance);*/
134 HRESULT WINAPI
IDxDiagContainerImpl_GetNumberOfProps(PDXDIAGCONTAINER iface
, DWORD
* pdwCount
) {
135 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
136 TRACE("(%p)\n", iface
);
137 if (NULL
== pdwCount
) {
140 *pdwCount
= This
->nProperties
;
144 HRESULT WINAPI
IDxDiagContainerImpl_EnumPropNames(PDXDIAGCONTAINER iface
, DWORD dwIndex
, LPWSTR pwszPropName
, DWORD cchPropName
) {
145 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
146 IDxDiagContainerImpl_Property
* p
= NULL
;
149 FIXME("(%p, %lu, %s, %lu)\n", iface
, dwIndex
, debugstr_w(pwszPropName
), cchPropName
);
151 if (NULL
== pwszPropName
) {
154 if (256 > cchPropName
) {
155 return DXDIAG_E_INSUFFICIENT_BUFFER
;
158 p
= This
->properties
;
161 if (cchPropName
<= lstrlenW(p
->vName
)) {
162 return DXDIAG_E_INSUFFICIENT_BUFFER
;
164 lstrcpynW(pwszPropName
, p
->vName
, cchPropName
);
173 HRESULT WINAPI
IDxDiagContainerImpl_GetProp(PDXDIAGCONTAINER iface
, LPCWSTR pwszPropName
, VARIANT
* pvarProp
) {
174 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
175 IDxDiagContainerImpl_Property
* p
= NULL
;
176 FIXME("(%p, %s, %p)\n", iface
, debugstr_w(pwszPropName
), pvarProp
);
178 if (NULL
== pvarProp
|| NULL
== pwszPropName
) {
182 p
= This
->properties
;
184 if (0 == lstrcmpW(p
->vName
, pwszPropName
)) {
185 VariantCopy(pvarProp
, &p
->v
);
193 HRESULT WINAPI
IDxDiagContainerImpl_AddProp(PDXDIAGCONTAINER iface
, LPCWSTR pwszPropName
, VARIANT
* pVarProp
) {
194 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
195 IDxDiagContainerImpl_Property
* p
= NULL
;
196 IDxDiagContainerImpl_Property
* pNew
= NULL
;
198 FIXME("(%p, %s, %p)\n", iface
, debugstr_w(pwszPropName
), pVarProp
);
200 if (NULL
== pVarProp
|| NULL
== pwszPropName
) {
204 pNew
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDxDiagContainerImpl_Property
));
206 return E_OUTOFMEMORY
;
208 VariantInit(&pNew
->v
);
209 VariantCopy(&pNew
->v
, pVarProp
);
210 pNew
->vName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lstrlenW(pwszPropName
) * sizeof(WCHAR
));
211 lstrcpyW(pNew
->vName
, pwszPropName
);
214 p
= This
->properties
;
216 This
->properties
= pNew
;
218 while (NULL
!= p
->next
) {
227 HRESULT WINAPI
IDxDiagContainerImpl_AddChildContainer(PDXDIAGCONTAINER iface
, LPCWSTR pszContName
, PDXDIAGCONTAINER pSubCont
) {
228 IDxDiagContainerImpl
*This
= (IDxDiagContainerImpl
*)iface
;
229 IDxDiagContainerImpl_SubContainer
* p
= NULL
;
230 IDxDiagContainerImpl_SubContainer
* pNew
= NULL
;
232 FIXME("(%p, %s, %p)\n", iface
, debugstr_w(pszContName
), pSubCont
);
234 if (NULL
== pSubCont
|| NULL
== pszContName
) {
238 pNew
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDxDiagContainerImpl_SubContainer
));
240 return E_OUTOFMEMORY
;
242 pNew
->pCont
= pSubCont
;
243 pNew
->contName
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, lstrlenW(pszContName
) * sizeof(WCHAR
));
244 lstrcpyW(pNew
->contName
, pszContName
);
247 p
= This
->subContainers
;
249 This
->subContainers
= pNew
;
251 while (NULL
!= p
->next
) {
256 ++This
->nSubContainers
;
261 IDxDiagContainerVtbl DxDiagContainer_Vtbl
=
263 IDxDiagContainerImpl_QueryInterface
,
264 IDxDiagContainerImpl_AddRef
,
265 IDxDiagContainerImpl_Release
,
266 IDxDiagContainerImpl_GetNumberOfChildContainers
,
267 IDxDiagContainerImpl_EnumChildContainerNames
,
268 IDxDiagContainerImpl_GetChildContainer
,
269 IDxDiagContainerImpl_GetNumberOfProps
,
270 IDxDiagContainerImpl_EnumPropNames
,
271 IDxDiagContainerImpl_GetProp
275 HRESULT
DXDiag_CreateDXDiagContainer(REFIID riid
, LPVOID
*ppobj
) {
276 IDxDiagContainerImpl
* container
;
278 TRACE("(%p, %p)\n", debugstr_guid(riid
), ppobj
);
280 container
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDxDiagContainerImpl
));
281 if (NULL
== container
) {
283 return E_OUTOFMEMORY
;
285 container
->lpVtbl
= &DxDiagContainer_Vtbl
;
286 container
->ref
= 0; /* will be inited with QueryInterface */
287 return IDxDiagContainerImpl_QueryInterface((PDXDIAGCONTAINER
)container
, riid
, ppobj
);