ReactOS 0.4.15-dev-7788-g1ad9096
container.c
Go to the documentation of this file.
1/*
2 * IDxDiagContainer Implementation
3 *
4 * Copyright 2004 Raphael Junqueira
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 *
20 */
21
22
23#define COBJMACROS
24#include "dxdiag_private.h"
25#include "wine/debug.h"
26
28
29static inline IDxDiagContainerImpl *impl_from_IDxDiagContainer(IDxDiagContainer *iface)
30{
31 return CONTAINING_RECORD(iface, IDxDiagContainerImpl, IDxDiagContainer_iface);
32}
33
34/* IDxDiagContainer IUnknown parts follow: */
36 void **ppobj)
37{
39
40 if (!ppobj) return E_INVALIDARG;
41
43 || IsEqualGUID(riid, &IID_IDxDiagContainer)) {
44 IUnknown_AddRef(iface);
45 *ppobj = This;
46 return S_OK;
47 }
48
49 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
50 *ppobj = NULL;
51 return E_NOINTERFACE;
52}
53
54static ULONG WINAPI IDxDiagContainerImpl_AddRef(IDxDiagContainer *iface)
55{
57 ULONG refCount = InterlockedIncrement(&This->ref);
58
59 TRACE("(%p)->(ref before=%u)\n", This, refCount - 1);
60
62
63 return refCount;
64}
65
66static ULONG WINAPI IDxDiagContainerImpl_Release(IDxDiagContainer *iface)
67{
69 ULONG refCount = InterlockedDecrement(&This->ref);
70
71 TRACE("(%p)->(ref before=%u)\n", This, refCount + 1);
72
73 if (!refCount) {
76 }
77
79
80 return refCount;
81}
82
83/* IDxDiagContainer Interface follow: */
85 DWORD *pdwCount)
86{
88
89 TRACE("(%p)\n", iface);
90 if (NULL == pdwCount) {
91 return E_INVALIDARG;
92 }
93 *pdwCount = This->cont->nSubContainers;
94 return S_OK;
95}
96
98 DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer)
99{
102 DWORD i = 0;
103
104 TRACE("(%p, %u, %p, %u)\n", iface, dwIndex, pwszContainer, cchContainer);
105
106 if (NULL == pwszContainer || 0 == cchContainer) {
107 return E_INVALIDARG;
108 }
109
111 {
112 if (dwIndex == i) {
113 TRACE("Found container name %s, copying string\n", debugstr_w(p->contName));
114 lstrcpynW(pwszContainer, p->contName, cchContainer);
115 return (cchContainer <= lstrlenW(p->contName)) ?
117 }
118 ++i;
119 }
120
121 TRACE("Failed to find container name at specified index\n");
122 *pwszContainer = '\0';
123 return E_INVALIDARG;
124}
125
128
130 {
131 if (0 == lstrcmpW(p->contName, pwszContainer)) {
132 *subcont = p;
133 return S_OK;
134 }
135 }
136
137 return E_INVALIDARG;
138}
139
141 LPCWSTR pwszContainer, IDxDiagContainer **ppInstance)
142{
144 IDxDiagContainerImpl_Container *pContainer = This->cont;
145 LPWSTR tmp, orig_tmp;
146 INT tmp_len;
147 WCHAR* cur;
149
150 TRACE("(%p, %s, %p)\n", iface, debugstr_w(pwszContainer), ppInstance);
151
152 if (NULL == ppInstance || NULL == pwszContainer) {
153 return E_INVALIDARG;
154 }
155
156 *ppInstance = NULL;
157
158 tmp_len = lstrlenW(pwszContainer) + 1;
159 orig_tmp = tmp = HeapAlloc(GetProcessHeap(), 0, tmp_len * sizeof(WCHAR));
160 if (NULL == tmp) return E_FAIL;
161 lstrcpynW(tmp, pwszContainer, tmp_len);
162
163 cur = wcschr(tmp, '.');
164 while (NULL != cur) {
165 *cur = '\0'; /* cut tmp string to '.' */
166 if (!*(cur + 1)) break; /* Account for a lone terminating period, as in "cont1.cont2.". */
167 TRACE("Trying to get parent container %s\n", debugstr_w(tmp));
168 hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, &pContainer);
169 if (FAILED(hr))
170 goto out;
171 cur++; /* go after '.' (just replaced by \0) */
172 tmp = cur;
173 cur = wcschr(tmp, '.');
174 }
175
176 TRACE("Trying to get container %s\n", debugstr_w(tmp));
177 hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, &pContainer);
178 if (SUCCEEDED(hr)) {
179 hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, pContainer, This->pProv, (void **)ppInstance);
180 if (SUCCEEDED(hr))
181 TRACE("Succeeded in getting the container instance\n");
182 }
183
184out:
185 HeapFree(GetProcessHeap(), 0, orig_tmp);
186 return hr;
187}
188
190 DWORD *pdwCount)
191{
193
194 TRACE("(%p)\n", iface);
195 if (NULL == pdwCount) {
196 return E_INVALIDARG;
197 }
198 *pdwCount = This->cont->nProperties;
199 return S_OK;
200}
201
202static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(IDxDiagContainer *iface, DWORD dwIndex,
203 LPWSTR pwszPropName, DWORD cchPropName)
204{
207 DWORD i = 0;
208
209 TRACE("(%p, %u, %p, %u)\n", iface, dwIndex, pwszPropName, cchPropName);
210
211 if (NULL == pwszPropName || 0 == cchPropName) {
212 return E_INVALIDARG;
213 }
214
216 {
217 if (dwIndex == i) {
218 TRACE("Found property name %s, copying string\n", debugstr_w(p->propName));
219 lstrcpynW(pwszPropName, p->propName, cchPropName);
220 return (cchPropName <= lstrlenW(p->propName)) ?
222 }
223 ++i;
224 }
225
226 TRACE("Failed to find property name at specified index\n");
227 return E_INVALIDARG;
228}
229
230static HRESULT WINAPI IDxDiagContainerImpl_GetProp(IDxDiagContainer *iface, LPCWSTR pwszPropName,
231 VARIANT *pvarProp)
232{
235
236 TRACE("(%p, %s, %p)\n", iface, debugstr_w(pwszPropName), pvarProp);
237
238 if (NULL == pvarProp || NULL == pwszPropName) {
239 return E_INVALIDARG;
240 }
241
243 {
244 if (0 == lstrcmpW(p->propName, pwszPropName)) {
245 VariantInit(pvarProp);
246 return VariantCopy(pvarProp, &p->vProp);
247 }
248 }
249
250 return E_INVALIDARG;
251}
252
253static const IDxDiagContainerVtbl DxDiagContainer_Vtbl =
254{
264};
265
266
269
270 TRACE("(%s, %p)\n", debugstr_guid(riid), ppobj);
271
273 if (NULL == container) {
274 *ppobj = NULL;
275 return E_OUTOFMEMORY;
276 }
277 container->IDxDiagContainer_iface.lpVtbl = &DxDiagContainer_Vtbl;
278 container->ref = 0; /* will be inited with QueryInterface */
279 container->cont = cont;
280 container->pProv = pProv;
282 return IDxDiagContainerImpl_QueryInterface(&container->IDxDiagContainer_iface, riid, ppobj);
283}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define WARN(fmt,...)
Definition: debug.h:112
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
static HRESULT WINAPI IDxDiagContainerImpl_QueryInterface(IDxDiagContainer *iface, REFIID riid, void **ppobj)
Definition: container.c:35
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps(IDxDiagContainer *iface, DWORD *pdwCount)
Definition: container.c:189
static const IDxDiagContainerVtbl DxDiagContainer_Vtbl
Definition: container.c:253
static ULONG WINAPI IDxDiagContainerImpl_AddRef(IDxDiagContainer *iface)
Definition: container.c:54
static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(IDxDiagContainer *iface, LPCWSTR pwszContainer, IDxDiagContainer **ppInstance)
Definition: container.c:140
static IDxDiagContainerImpl * impl_from_IDxDiagContainer(IDxDiagContainer *iface)
Definition: container.c:29
static HRESULT WINAPI IDxDiagContainerImpl_GetProp(IDxDiagContainer *iface, LPCWSTR pwszPropName, VARIANT *pvarProp)
Definition: container.c:230
static ULONG WINAPI IDxDiagContainerImpl_Release(IDxDiagContainer *iface)
Definition: container.c:66
HRESULT DXDiag_CreateDXDiagContainer(REFIID riid, IDxDiagContainerImpl_Container *cont, IDxDiagProvider *pProv, LPVOID *ppobj)
Definition: container.c:267
static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer)
Definition: container.c:97
static HRESULT IDxDiagContainerImpl_GetChildContainerInternal(IDxDiagContainerImpl_Container *cont, LPCWSTR pwszContainer, IDxDiagContainerImpl_Container **subcont)
Definition: container.c:126
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfChildContainers(IDxDiagContainer *iface, DWORD *pdwCount)
Definition: container.c:84
static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszPropName, DWORD cchPropName)
Definition: container.c:202
#define wcschr
Definition: compat.h:17
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
static void DXDIAGN_UnlockModule(void)
static void DXDIAGN_LockModule(void)
#define IDxDiagProvider_Release(p)
Definition: dxdiag.h:61
#define IDxDiagProvider_AddRef(p)
Definition: dxdiag.h:60
#define DXDIAG_E_INSUFFICIENT_BUFFER
Definition: dxdiag.h:57
unsigned long DWORD
Definition: ntddk_ex.h:95
FxCollectionEntry * cur
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
static FILE * out
Definition: regtests2xml.c:44
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:748
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185