ReactOS 0.4.17-dev-966-gf06eace
container.c File Reference
#include "dxdiag_private.h"
#include "wine/debug.h"
Include dependency graph for container.c:

Go to the source code of this file.

Macros

#define COBJMACROS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dxdiag)
 
static IDxDiagContainerImpl * impl_from_IDxDiagContainer (IDxDiagContainer *iface)
 
static HRESULT WINAPI IDxDiagContainerImpl_QueryInterface (IDxDiagContainer *iface, REFIID riid, void **ppobj)
 
static ULONG WINAPI IDxDiagContainerImpl_AddRef (IDxDiagContainer *iface)
 
static ULONG WINAPI IDxDiagContainerImpl_Release (IDxDiagContainer *iface)
 
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfChildContainers (IDxDiagContainer *iface, DWORD *pdwCount)
 
static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames (IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer)
 
static HRESULT IDxDiagContainerImpl_GetChildContainerInternal (IDxDiagContainerImpl_Container *cont, LPCWSTR pwszContainer, IDxDiagContainerImpl_Container **subcont)
 
static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer (IDxDiagContainer *iface, LPCWSTR pwszContainer, IDxDiagContainer **ppInstance)
 
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps (IDxDiagContainer *iface, DWORD *pdwCount)
 
static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames (IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszPropName, DWORD cchPropName)
 
static HRESULT WINAPI IDxDiagContainerImpl_GetProp (IDxDiagContainer *iface, LPCWSTR pwszPropName, VARIANT *pvarProp)
 
HRESULT DXDiag_CreateDXDiagContainer (REFIID riid, IDxDiagContainerImpl_Container *cont, IDxDiagProvider *pProv, LPVOID *ppobj)
 

Variables

static const IDxDiagContainerVtbl DxDiagContainer_Vtbl
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 23 of file container.c.

Function Documentation

◆ DXDiag_CreateDXDiagContainer()

HRESULT DXDiag_CreateDXDiagContainer ( REFIID  riid,
IDxDiagContainerImpl_Container *  cont,
IDxDiagProvider *  pProv,
LPVOID *  ppobj 
)

internal factory

Definition at line 275 of file container.c.

275 {
277
278 TRACE("(%s, %p)\n", debugstr_guid(riid), ppobj);
279
281 if (NULL == container) {
282 *ppobj = NULL;
283 return E_OUTOFMEMORY;
284 }
285 container->IDxDiagContainer_iface.lpVtbl = &DxDiagContainer_Vtbl;
286 container->ref = 0; /* will be inited with QueryInterface */
287 container->cont = cont;
288 container->pProv = pProv;
290 return IDxDiagContainerImpl_QueryInterface(&container->IDxDiagContainer_iface, riid, ppobj);
291}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define NULL
Definition: types.h:112
static HRESULT WINAPI IDxDiagContainerImpl_QueryInterface(IDxDiagContainer *iface, REFIID riid, void **ppobj)
Definition: container.c:35
static const IDxDiagContainerVtbl DxDiagContainer_Vtbl
Definition: container.c:261
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define IDxDiagProvider_AddRef(p)
Definition: dxdiag.h:60
REFIID riid
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by IDxDiagContainerImpl_GetChildContainer(), and IDxDiagProviderImpl_GetRootContainer().

◆ IDxDiagContainerImpl_AddRef()

static ULONG WINAPI IDxDiagContainerImpl_AddRef ( IDxDiagContainer *  iface)
static

Definition at line 54 of file container.c.

55{
57 ULONG refCount = InterlockedIncrement(&This->ref);
58
59 TRACE("(%p)->(ref before=%lu)\n", This, refCount - 1);
60
62
63 return refCount;
64}
#define InterlockedIncrement
Definition: armddk.h:53
static IDxDiagContainerImpl * impl_from_IDxDiagContainer(IDxDiagContainer *iface)
Definition: container.c:29
static void DXDIAGN_LockModule(void)
uint32_t ULONG
Definition: typedefs.h:59

◆ IDxDiagContainerImpl_EnumChildContainerNames()

static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames ( IDxDiagContainer *  iface,
DWORD  dwIndex,
LPWSTR  pwszContainer,
DWORD  cchContainer 
)
static

Definition at line 97 of file container.c.

99{
102 DWORD i = 0;
103
104 TRACE("(%p, %lu, %p, %lu)\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}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
#define DXDIAG_E_INSUFFICIENT_BUFFER
Definition: dxdiag.h:57
unsigned long DWORD
Definition: ntddk_ex.h:95
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
#define S_OK
Definition: intsafe.h:52
uint32_t entry
Definition: isohybrid.c:63
#define debugstr_w
Definition: kernel32.h:32
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236

◆ IDxDiagContainerImpl_EnumPropNames()

static HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames ( IDxDiagContainer *  iface,
DWORD  dwIndex,
LPWSTR  pwszPropName,
DWORD  cchPropName 
)
static

Definition at line 210 of file container.c.

212{
215 DWORD i = 0;
216
217 TRACE("(%p, %lu, %p, %lu)\n", iface, dwIndex, pwszPropName, cchPropName);
218
219 if (NULL == pwszPropName || 0 == cchPropName) {
220 return E_INVALIDARG;
221 }
222
224 {
225 if (dwIndex == i) {
226 TRACE("Found property name %s, copying string\n", debugstr_w(p->propName));
227 lstrcpynW(pwszPropName, p->propName, cchPropName);
228 return (cchPropName <= lstrlenW(p->propName)) ?
230 }
231 ++i;
232 }
233
234 TRACE("Failed to find property name at specified index\n");
235 return E_INVALIDARG;
236}

◆ IDxDiagContainerImpl_GetChildContainer()

static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer ( IDxDiagContainer *  iface,
LPCWSTR  pwszContainer,
IDxDiagContainer **  ppInstance 
)
static

Definition at line 140 of file container.c.

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 /* special handling for an empty string and leaf container */
164 if (!tmp[0] && list_empty(&pContainer->subContainers)) {
165 hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, pContainer, This->pProv, (void **)ppInstance);
166 if (SUCCEEDED(hr))
167 TRACE("Succeeded in getting the container instance\n");
168 goto out;
169 }
170
171 cur = wcschr(tmp, '.');
172 while (NULL != cur) {
173 *cur = '\0'; /* cut tmp string to '.' */
174 if (!*(cur + 1)) break; /* Account for a lone terminating period, as in "cont1.cont2.". */
175 TRACE("Trying to get parent container %s\n", debugstr_w(tmp));
176 hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, &pContainer);
177 if (FAILED(hr))
178 goto out;
179 cur++; /* go after '.' (just replaced by \0) */
180 tmp = cur;
181 cur = wcschr(tmp, '.');
182 }
183
184 TRACE("Trying to get container %s\n", debugstr_w(tmp));
185 hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, &pContainer);
186 if (SUCCEEDED(hr)) {
187 hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, pContainer, This->pProv, (void **)ppInstance);
188 if (SUCCEEDED(hr))
189 TRACE("Succeeded in getting the container instance\n");
190 }
191
192out:
193 HeapFree(GetProcessHeap(), 0, orig_tmp);
194 return hr;
195}
static int list_empty(struct list_entry *head)
Definition: list.h:58
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
HRESULT DXDiag_CreateDXDiagContainer(REFIID riid, IDxDiagContainerImpl_Container *cont, IDxDiagProvider *pProv, LPVOID *ppobj)
Definition: container.c:275
static HRESULT IDxDiagContainerImpl_GetChildContainerInternal(IDxDiagContainerImpl_Container *cont, LPCWSTR pwszContainer, IDxDiagContainerImpl_Container **subcont)
Definition: container.c:126
#define wcschr
Definition: compat.h:17
#define HeapFree(x, y, z)
Definition: compat.h:735
FxCollectionEntry * cur
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
short WCHAR
Definition: pedump.c:58
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

◆ IDxDiagContainerImpl_GetChildContainerInternal()

static HRESULT IDxDiagContainerImpl_GetChildContainerInternal ( IDxDiagContainerImpl_Container *  cont,
LPCWSTR  pwszContainer,
IDxDiagContainerImpl_Container **  subcont 
)
static

Definition at line 126 of file container.c.

126 {
128
130 {
131 if (0 == lstrcmpW(p->contName, pwszContainer)) {
132 *subcont = p;
133 return S_OK;
134 }
135 }
136
137 return E_INVALIDARG;
138}
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152

Referenced by IDxDiagContainerImpl_GetChildContainer().

◆ IDxDiagContainerImpl_GetNumberOfChildContainers()

static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfChildContainers ( IDxDiagContainer *  iface,
DWORD *  pdwCount 
)
static

Definition at line 84 of file container.c.

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}

◆ IDxDiagContainerImpl_GetNumberOfProps()

static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps ( IDxDiagContainer *  iface,
DWORD *  pdwCount 
)
static

Definition at line 197 of file container.c.

199{
201
202 TRACE("(%p)\n", iface);
203 if (NULL == pdwCount) {
204 return E_INVALIDARG;
205 }
206 *pdwCount = This->cont->nProperties;
207 return S_OK;
208}

◆ IDxDiagContainerImpl_GetProp()

static HRESULT WINAPI IDxDiagContainerImpl_GetProp ( IDxDiagContainer *  iface,
LPCWSTR  pwszPropName,
VARIANT *  pvarProp 
)
static

Definition at line 238 of file container.c.

240{
243
244 TRACE("(%p, %s, %p)\n", iface, debugstr_w(pwszPropName), pvarProp);
245
246 if (NULL == pvarProp || NULL == pwszPropName) {
247 return E_INVALIDARG;
248 }
249
251 {
252 if (0 == lstrcmpW(p->propName, pwszPropName)) {
253 VariantInit(pvarProp);
254 return VariantCopy(pvarProp, &p->vProp);
255 }
256 }
257
258 return E_INVALIDARG;
259}
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc)
Definition: variant.c:724
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547

◆ IDxDiagContainerImpl_QueryInterface()

static HRESULT WINAPI IDxDiagContainerImpl_QueryInterface ( IDxDiagContainer *  iface,
REFIID  riid,
void **  ppobj 
)
static

Definition at line 35 of file container.c.

37{
39
40 if (!ppobj) return E_INVALIDARG;
41
43 || IsEqualGUID(riid, &IID_IDxDiagContainer)) {
44 IUnknown_AddRef(iface);
45 *ppobj = &This->IDxDiagContainer_iface;
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}
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

Referenced by DXDiag_CreateDXDiagContainer().

◆ IDxDiagContainerImpl_Release()

static ULONG WINAPI IDxDiagContainerImpl_Release ( IDxDiagContainer *  iface)
static

Definition at line 66 of file container.c.

67{
69 ULONG refCount = InterlockedDecrement(&This->ref);
70
71 TRACE("(%p)->(ref before=%lu)\n", This, refCount + 1);
72
73 if (!refCount) {
76 }
77
79
80 return refCount;
81}
#define InterlockedDecrement
Definition: armddk.h:52
static void DXDIAGN_UnlockModule(void)
#define IDxDiagProvider_Release(p)
Definition: dxdiag.h:61

◆ impl_from_IDxDiagContainer()

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dxdiag  )

Variable Documentation

◆ DxDiagContainer_Vtbl

const IDxDiagContainerVtbl DxDiagContainer_Vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps(IDxDiagContainer *iface, DWORD *pdwCount)
Definition: container.c:197
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 HRESULT WINAPI IDxDiagContainerImpl_GetProp(IDxDiagContainer *iface, LPCWSTR pwszPropName, VARIANT *pvarProp)
Definition: container.c:238
static ULONG WINAPI IDxDiagContainerImpl_Release(IDxDiagContainer *iface)
Definition: container.c:66
static HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(IDxDiagContainer *iface, DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer)
Definition: container.c:97
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:210

Definition at line 261 of file container.c.

Referenced by DXDiag_CreateDXDiagContainer().