ReactOS  0.4.15-dev-506-ga3ec01c
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 
29 static 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 
54 static 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 
66 static 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 
184 out:
185  HeapFree(GetProcessHeap(), 0, orig_tmp);
186  return hr;
187 }
188 
189 static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps(IDxDiagContainer *iface,
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 
202 static 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 
230 static 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 
253 static 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;
281  IDxDiagProvider_AddRef(pProv);
282  return IDxDiagContainerImpl_QueryInterface(&container->IDxDiagContainer_iface, riid, ppobj);
283 }
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
REFIID riid
Definition: precomp.h:44
#define IDxDiagProvider_Release(p)
Definition: dxdiag.h:61
#define DXDIAG_E_INSUFFICIENT_BUFFER
Definition: dxdiag.h:57
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define WARN(fmt,...)
Definition: debug.h:112
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
static ULONG WINAPI IDxDiagContainerImpl_AddRef(IDxDiagContainer *iface)
Definition: container.c:54
#define lstrlenW
Definition: compat.h:416
#define E_FAIL
Definition: ddrawi.h:102
int32_t INT
Definition: typedefs.h:57
static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(IDxDiagContainer *iface, LPCWSTR pwszContainer, IDxDiagContainer **ppInstance)
Definition: container.c:140
static void DXDIAGN_UnlockModule(void)
#define lstrcpynW
Definition: compat.h:406
static void DXDIAGN_LockModule(void)
static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer)
Definition: container.c:97
struct container container
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
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
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static HRESULT WINAPI IDxDiagContainerImpl_QueryInterface(IDxDiagContainer *iface, REFIID riid, void **ppobj)
Definition: container.c:35
#define IDxDiagProvider_AddRef(p)
Definition: dxdiag.h:60
static HRESULT IDxDiagContainerImpl_GetChildContainerInternal(IDxDiagContainerImpl_Container *cont, LPCWSTR pwszContainer, IDxDiagContainerImpl_Container **subcont)
Definition: container.c:126
#define debugstr_w
Definition: kernel32.h:32
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszPropName, DWORD cchPropName)
Definition: container.c:202
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:404
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps(IDxDiagContainer *iface, DWORD *pdwCount)
Definition: container.c:189
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
static HRESULT WINAPI IDxDiagContainerImpl_GetProp(IDxDiagContainer *iface, LPCWSTR pwszPropName, VARIANT *pvarProp)
Definition: container.c:230
#define InterlockedDecrement
Definition: armddk.h:52
HRESULT DXDiag_CreateDXDiagContainer(REFIID riid, IDxDiagContainerImpl_Container *cont, IDxDiagProvider *pProv, LPVOID *ppobj)
Definition: container.c:267
uint32_t entry
Definition: isohybrid.c:63
static ULONG WINAPI IDxDiagContainerImpl_Release(IDxDiagContainer *iface)
Definition: container.c:66
#define S_OK
Definition: intsafe.h:59
WINE_DEFAULT_DEBUG_CHANNEL(dxdiag)
#define InterlockedIncrement
Definition: armddk.h:53
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static IDxDiagContainerImpl * impl_from_IDxDiagContainer(IDxDiagContainer *iface)
Definition: container.c:29
static const IDxDiagContainerVtbl DxDiagContainer_Vtbl
Definition: container.c:253
unsigned int ULONG
Definition: retypes.h:1
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:748
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfChildContainers(IDxDiagContainer *iface, DWORD *pdwCount)
Definition: container.c:84
#define HeapFree(x, y, z)
Definition: compat.h:403
#define SUCCEEDED(hr)
Definition: intsafe.h:57