ReactOS 0.4.16-dev-2320-ge1853c6
errorinfo.c
Go to the documentation of this file.
1/*
2 * ErrorInfo API
3 *
4 * Copyright 2000 Patrik Stridvall, Juergen Schmied
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#define COBJMACROS
22#define WINOLEAUTAPI
23
24#include "oleauto.h"
25
26#include "combase_private.h"
27
28#include "wine/debug.h"
29
31
33{
38
44};
45
47{
48 return CONTAINING_RECORD(iface, struct error_info, IErrorInfo_iface);
49}
50
52{
54}
55
57{
59}
60
62{
64
65 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
66
67 *obj = NULL;
68
69 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IErrorInfo))
70 {
72 }
73 else if (IsEqualIID(riid, &IID_ICreateErrorInfo))
74 {
76 }
77 else if (IsEqualIID(riid, &IID_ISupportErrorInfo))
78 {
80 }
81
82 if (*obj)
83 {
84 IUnknown_AddRef((IUnknown *)*obj);
85 return S_OK;
86 }
87
88 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
89 return E_NOINTERFACE;
90}
91
93{
96
97 TRACE("%p, refcount %lu.\n", iface, refcount);
98
99 return refcount;
100}
101
103{
106
107 TRACE("%p, refcount %lu.\n", iface, refcount);
108
109 if (!refcount)
110 {
115 }
116
117 return refcount;
118}
119
121{
123
124 TRACE("%p, %p.\n", iface, guid);
125
126 if (!guid) return E_INVALIDARG;
127 *guid = error_info->guid;
128 return S_OK;
129}
130
132{
134
135 TRACE("%p, %p.\n", iface, source);
136
137 if (!source)
138 return E_INVALIDARG;
140 return S_OK;
141}
142
144{
146
147 TRACE("%p, %p.\n", iface, description);
148
149 if (!description)
150 return E_INVALIDARG;
152 return S_OK;
153}
154
156{
158
159 TRACE("%p, %p.\n", iface, helpfile);
160
161 if (!helpfile)
162 return E_INVALIDARG;
164 return S_OK;
165}
166
168{
170
171 TRACE("%p, %p.\n", iface, help_context);
172
173 if (!help_context)
174 return E_INVALIDARG;
176
177 return S_OK;
178}
179
180static const IErrorInfoVtbl errorinfo_vtbl =
181{
190};
191
193{
195 return IErrorInfo_QueryInterface(&error_info->IErrorInfo_iface, riid, obj);
196}
197
199{
201 return IErrorInfo_AddRef(&error_info->IErrorInfo_iface);
202}
203
205{
207 return IErrorInfo_Release(&error_info->IErrorInfo_iface);
208}
209
211{
213
214 TRACE("%p, %s.\n", iface, debugstr_guid(guid));
215
216 error_info->guid = *guid;
217
218 return S_OK;
219}
220
222{
224
225 TRACE("%p, %s.\n", iface, debugstr_w(source));
226
229
230 return S_OK;
231}
232
234{
236
237 TRACE("%p, %s.\n", iface, debugstr_w(description));
238
241
242 return S_OK;
243}
244
246{
248
249 TRACE("%p, %s.\n", iface, debugstr_w(helpfile));
250
253
254 return S_OK;
255}
256
258{
260
261 TRACE("%p, %#lx.\n", iface, help_context);
262
264
265 return S_OK;
266}
267
268static const ICreateErrorInfoVtbl create_errorinfo_vtbl =
269{
278};
279
281{
283 return IErrorInfo_QueryInterface(&error_info->IErrorInfo_iface, riid, obj);
284}
285
287{
289 return IErrorInfo_AddRef(&error_info->IErrorInfo_iface);
290}
291
293{
295 return IErrorInfo_Release(&error_info->IErrorInfo_iface);
296}
297
299{
301
302 TRACE("%p, %s.\n", iface, debugstr_guid(riid));
303
304 return IsEqualIID(riid, &error_info->guid) ? S_OK : S_FALSE;
305}
306
307static const ISupportErrorInfoVtbl support_errorinfo_vtbl =
308{
313};
314
315/***********************************************************************
316 * CreateErrorInfo (combase.@)
317 */
319{
320 struct error_info *error_info;
321
322 TRACE("%p.\n", ret);
323
324 if (!ret) return E_INVALIDARG;
325
326 if (!(error_info = malloc(sizeof(*error_info))))
327 return E_OUTOFMEMORY;
328
332 error_info->refcount = 1;
337
339
340 return S_OK;
341}
342
343/***********************************************************************
344 * GetErrorInfo (combase.@)
345 */
347{
348 struct tlsdata *tlsdata;
349 HRESULT hr;
350
351 TRACE("%lu, %p\n", reserved, error_info);
352
353 if (reserved || !error_info)
354 return E_INVALIDARG;
355
357 return hr;
358
359 if (!tlsdata->errorinfo)
360 {
361 *error_info = NULL;
362 return S_FALSE;
363 }
364
367
368 return S_OK;
369}
370
371/***********************************************************************
372 * SetErrorInfo (combase.@)
373 */
375{
376 struct tlsdata *tlsdata;
377 HRESULT hr;
378
379 TRACE("%lu, %p\n", reserved, error_info);
380
381 if (reserved)
382 return E_INVALIDARG;
383
385 return hr;
386
387 if (tlsdata->errorinfo)
388 IErrorInfo_Release(tlsdata->errorinfo);
389
391 if (error_info)
392 IErrorInfo_AddRef(error_info);
393
394 return S_OK;
395}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static const TCHAR helpfile[]
Definition: dialog.c:19
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
static HRESULT com_get_tlsdata(struct tlsdata **data)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
static ULONG WINAPI errorinfo_Release(IErrorInfo *iface)
Definition: errorinfo.c:102
static HRESULT WINAPI create_errorinfo_SetGUID(ICreateErrorInfo *iface, REFGUID guid)
Definition: errorinfo.c:210
static ULONG WINAPI errorinfo_AddRef(IErrorInfo *iface)
Definition: errorinfo.c:92
static const IErrorInfoVtbl errorinfo_vtbl
Definition: errorinfo.c:180
static HRESULT WINAPI create_errorinfo_QueryInterface(ICreateErrorInfo *iface, REFIID riid, void **obj)
Definition: errorinfo.c:192
static const ISupportErrorInfoVtbl support_errorinfo_vtbl
Definition: errorinfo.c:307
static ULONG WINAPI support_errorinfo_AddRef(ISupportErrorInfo *iface)
Definition: errorinfo.c:286
static HRESULT WINAPI errorinfo_GetHelpFile(IErrorInfo *iface, BSTR *helpfile)
Definition: errorinfo.c:155
static HRESULT WINAPI create_errorinfo_SetSource(ICreateErrorInfo *iface, LPOLESTR source)
Definition: errorinfo.c:221
static HRESULT WINAPI errorinfo_QueryInterface(IErrorInfo *iface, REFIID riid, void **obj)
Definition: errorinfo.c:61
static HRESULT WINAPI create_errorinfo_SetHelpFile(ICreateErrorInfo *iface, LPOLESTR helpfile)
Definition: errorinfo.c:245
static HRESULT WINAPI errorinfo_GetDescription(IErrorInfo *iface, BSTR *description)
Definition: errorinfo.c:143
static ULONG WINAPI create_errorinfo_Release(ICreateErrorInfo *iface)
Definition: errorinfo.c:204
HRESULT WINAPI CreateErrorInfo(ICreateErrorInfo **ret)
Definition: errorinfo.c:318
static ULONG WINAPI support_errorinfo_Release(ISupportErrorInfo *iface)
Definition: errorinfo.c:292
static HRESULT WINAPI create_errorinfo_SetDescription(ICreateErrorInfo *iface, LPOLESTR description)
Definition: errorinfo.c:233
HRESULT WINAPI GetErrorInfo(ULONG reserved, IErrorInfo **error_info)
Definition: errorinfo.c:346
static ULONG WINAPI create_errorinfo_AddRef(ICreateErrorInfo *iface)
Definition: errorinfo.c:198
static HRESULT WINAPI errorinfo_GetHelpContext(IErrorInfo *iface, DWORD *help_context)
Definition: errorinfo.c:167
static HRESULT WINAPI create_errorinfo_SetHelpContext(ICreateErrorInfo *iface, DWORD help_context)
Definition: errorinfo.c:257
HRESULT WINAPI SetErrorInfo(ULONG reserved, IErrorInfo *error_info)
Definition: errorinfo.c:374
static struct error_info * impl_from_ICreateErrorInfo(ICreateErrorInfo *iface)
Definition: errorinfo.c:51
static HRESULT WINAPI errorinfo_GetGUID(IErrorInfo *iface, GUID *guid)
Definition: errorinfo.c:120
static struct error_info * impl_from_IErrorInfo(IErrorInfo *iface)
Definition: errorinfo.c:46
static const ICreateErrorInfoVtbl create_errorinfo_vtbl
Definition: errorinfo.c:268
static HRESULT WINAPI support_errorinfo_QueryInterface(ISupportErrorInfo *iface, REFIID riid, void **obj)
Definition: errorinfo.c:280
static struct error_info * impl_from_ISupportErrorInfo(ISupportErrorInfo *iface)
Definition: errorinfo.c:56
static HRESULT WINAPI support_errorinfo_InterfaceSupportsErrorInfo(ISupportErrorInfo *iface, REFIID riid)
Definition: errorinfo.c:298
static HRESULT WINAPI errorinfo_GetSource(IErrorInfo *iface, BSTR *source)
Definition: errorinfo.c:131
OLECHAR * BSTR
Definition: compat.h:2293
GUID guid
Definition: version.c:147
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
return ret
Definition: mutex.c:146
r reserved
Definition: btrfs.c:3006
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
static BSTR *static LPOLESTR
Definition: varformat.c:44
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
ISupportErrorInfo ISupportErrorInfo_iface
Definition: errorinfo.c:36
WCHAR * description
Definition: errorinfo.c:41
WCHAR * help_file
Definition: errorinfo.c:42
IErrorInfo IErrorInfo_iface
Definition: errorinfo.c:34
GUID guid
Definition: errorinfo.c:39
DWORD help_context
Definition: errorinfo.c:43
LONG refcount
Definition: errorinfo.c:37
ICreateErrorInfo ICreateErrorInfo_iface
Definition: errorinfo.c:35
WCHAR * source
Definition: errorinfo.c:40
IErrorInfo * errorinfo
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
const char * description
Definition: directx.c:2497
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
__wchar_t WCHAR
Definition: xmlstorage.h:180