VirtualBox

source: vbox/trunk/include/VBox/com/ErrorInfo.h@ 229

Last change on this file since 229 was 1, checked in by vboxsync, 55 years ago

import

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.2 KB
Line 
1/** @file
2 *
3 * MS COM / XPCOM Abstraction Layer:
4 * ErrorInfo class declaration
5 */
6
7/*
8 * Copyright (C) 2006 InnoTek Systemberatung GmbH
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License as published by the Free Software Foundation,
14 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
15 * distribution. VirtualBox OSE is distributed in the hope that it will
16 * be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * If you received this file as part of a commercial VirtualBox
19 * distribution, then only the terms of your commercial VirtualBox
20 * license agreement apply instead of the previous paragraph.
21 */
22
23#ifndef __VBox_com_ErrorInfo_h__
24#define __VBox_com_ErrorInfo_h__
25
26#include "VBox/com/ptr.h"
27#include "VBox/com/string.h"
28#include "VBox/com/Guid.h"
29#include "VBox/com/assert.h"
30
31struct IProgress;
32struct IVirtualBoxErrorInfo;
33
34namespace com
35{
36
37/**
38 * The ErrorInfo class provides a convenient way to retrieve error
39 * information set by the most recent interface method, that was invoked on
40 * the current thread and returned an unsuccessful result code.
41 *
42 * Once the instance of this class is created, the error information for
43 * the current thread is cleared.
44 *
45 * There is no sence to use instances of this class after the last
46 * invoked interface method returns a success.
47 *
48 * The class usage pattern is as follows:
49 * <code>
50 * IFoo *foo;
51 * ...
52 * HRESULT rc = foo->SomeMethod();
53 * if (FAILED (rc)) {
54 * ErrorInfo info (foo);
55 * if (info.isFullAvailable()) {
56 * printf ("error message = %ls\n", info.getText().raw());
57 * }
58 * }
59 * </code>
60 *
61 * This class fetches error information using the IErrorInfo interface on
62 * Win32 (MS COM) or the nsIException interface on other platforms (XPCOM),
63 * or the extended IVirtualBoxErrorInfo interface when when it is available
64 * (i.e. a given IErrorInfo or nsIException instance implements it).
65 * Currently, IVirtualBoxErrorInfo is only available for VirtualBox components.
66 *
67 * ErrorInfo::isFullAvailable() and ErrorInfo::isBasicAvailable() determine
68 * what level of error information is available. If #isBasicAvailable()
69 * returns true, it means that only IErrorInfo or nsIException is available as
70 * the source of information (depending on the platform), but not
71 * IVirtualBoxErrorInfo. If #isFullAvailable() returns true, it means that all
72 * three interfaces are available. If both methods return false, no error info
73 * is available at all.
74 *
75 * Here is a table of correspondence between this class methods and
76 * and IErrorInfo/nsIException/IVirtualBoxErrorInfo attributes/methods:
77 *
78 * ErrorInfo IErrorInfo nsIException IVirtualBoxErrorInfo
79 * --------------------------------------------------------------------
80 * getResultCode -- result resultCode
81 * getIID GetGUID -- interfaceID
82 * getComponent GetSource -- component
83 * getText GetDescription message text
84 *
85 * '--' means that this interface does not provide the corresponding portion
86 * of information, therefore it is useless to query it if only
87 * #isBasicAvailable() returns true. As it can be seen, the amount of
88 * information provided at the basic level, depends on the platform
89 * (MS COM or XPCOM).
90 */
91class ErrorInfo
92{
93public:
94
95 /**
96 * Constructs a new, "interfaceless" ErrorInfo instance that takes
97 * the error information possibly set on the current thread by an
98 * interface method of some COM component or by the COM subsystem.
99 *
100 * This constructor is useful, for example, after an unsuccessful attempt
101 * to instantiate (create) a component, so there is no any valid interface
102 * pointer available.
103 */
104 explicit ErrorInfo() :
105 mIsBasicAvailable (false), mIsFullAvailable (false), mResultCode (S_OK)
106 { init(); }
107
108 /**
109 * Constructs a new, "interfaceless" ErrorInfo instance that takes
110 * the error information possibly set on the current thread by an
111 * interface method of the given interface pointer.
112
113 * If the given interface does not support providing error information or,
114 * for some reason didn't set any error information, both
115 * #isFullAvailable() and #isBasicAvailable() will return |false|.
116 *
117 * @param aPtr pointer to the interface whose method returned an
118 * error
119 */
120 template <class I> ErrorInfo (I *aPtr) :
121 mIsBasicAvailable (false), mIsFullAvailable (false), mResultCode (S_OK)
122 { init (aPtr, COM_IIDOF(I)); }
123
124 /**
125 * Constructs a new ErrorInfo instance from the smart interface pointer.
126 * See template <class I> ErrorInfo (I *aPtr) for details
127 *
128 * @param aPtr smart pointer to the interface whose method returned
129 * an error
130 */
131 template <class I> ErrorInfo (const ComPtr <I> &aPtr) :
132 mIsBasicAvailable (false), mIsFullAvailable (false), mResultCode (S_OK)
133 { init (static_cast <I*> (aPtr), COM_IIDOF(I)); }
134
135 /** Specialization for the IVirtualBoxErrorInfo smart pointer */
136 ErrorInfo (const ComPtr <IVirtualBoxErrorInfo> &aPtr) :
137 mIsBasicAvailable (false), mIsFullAvailable (false), mResultCode (S_OK)
138 { init (aPtr); }
139
140 /**
141 * Constructs a new ErrorInfo instance from the IVirtualBoxErrorInfo
142 * interface pointer. If this pointer is not NULL, both #isFullAvailable()
143 * and #isBasicAvailable() will return |true|.
144 *
145 * @param aInfo pointer to the IVirtualBoxErrorInfo interface that
146 * holds error info to be fetched by this instance
147 */
148 ErrorInfo (IVirtualBoxErrorInfo *aInfo) :
149 mIsBasicAvailable (false), mIsFullAvailable (false), mResultCode (S_OK)
150 { init (aInfo); }
151
152 ~ErrorInfo();
153
154 /**
155 * Returns whether basic error info is actually available for the current
156 * thread. If the instance was created from an interface pointer that
157 * supports basic error info and successfully provided it, or if it is an
158 * "interfaceless" instance and there is some error info for the current
159 * thread, the returned value will be true.
160 *
161 * See the class description for details about the basic error info level.
162 *
163 * The appropriate methods of this class provide meaningful info only when
164 * this method returns true (otherwise they simply return NULL-like values).
165 */
166 bool isBasicAvailable() const { return mIsBasicAvailable; }
167
168 /**
169 * Returns whether full error info is actually available for the current
170 * thread. If the instance was created from an interface pointer that
171 * supports full error info and successfully provided it, or if it is an
172 * "interfaceless" instance and there is some error info for the current
173 * thread, the returned value will be true.
174 *
175 * See the class description for details about the full error info level.
176 *
177 * The appropriate methods of this class provide meaningful info only when
178 * this method returns true (otherwise they simply return NULL-like values).
179 */
180 bool isFullAvailable() const { return mIsFullAvailable; }
181
182 /**
183 * Returns the COM result code of the failed operation.
184 */
185 HRESULT getResultCode() const { return mResultCode; }
186
187 /**
188 * Returns the IID of the interface that defined the error.
189 */
190 const Guid &getInterfaceID() const { return mInterfaceID; }
191
192 /**
193 * Returns the name of the component that generated the error.
194 */
195 const Bstr &getComponent() const { return mComponent; }
196
197 /**
198 * Returns the textual description of the error.
199 */
200 const Bstr &getText() const { return mText; }
201
202 /**
203 * Returns the name of the interface that defined the error
204 */
205 const Bstr &getInterfaceName() const { return mInterfaceName; }
206
207 /**
208 * Returns the IID of the interface that returned the error.
209 *
210 * This method returns a non-null IID only if the instance was created
211 * using #template <class I> ErrorInfo (I *i) or
212 * template <class I> ErrorInfo (const ComPtr <I> &i) constructor.
213 */
214 const Guid &getCalleeIID() const { return mCalleeIID; }
215
216 /**
217 * Returns the name of the interface that returned the error
218 *
219 * This method returns a non-null name only if the instance was created
220 * using #template <class I> ErrorInfo (I *i) or
221 * template <class I> ErrorInfo (const ComPtr <I> &i) constructor.
222 */
223 const Bstr &getCalleeName() const { return mCalleeName; }
224
225 /**
226 * Prints error information stored in this instance to the console.
227 * Intended mainly for debugging and for simple command-line tools.
228 *
229 * @param aPrefix optional prefix
230 */
231 void print (const char *aPrefix = NULL);
232
233protected:
234
235 ErrorInfo (bool dummy) :
236 mIsBasicAvailable (false), mIsFullAvailable (false), mResultCode (S_OK)
237 {}
238
239 void init();
240 void init (IUnknown *i, const GUID &iid);
241 void init (IVirtualBoxErrorInfo *info);
242
243private:
244
245 bool mIsBasicAvailable;
246 bool mIsFullAvailable;
247
248 HRESULT mResultCode;
249 Guid mInterfaceID;
250 Bstr mComponent;
251 Bstr mText;
252
253 Bstr mInterfaceName;
254 Guid mCalleeIID;
255 Bstr mCalleeName;
256};
257
258/**
259 * A convenience subclass of ErrorInfo, that, given an IProgress interface
260 * pointer, reads its errorInfo attribute and uses the returned
261 * IVirtualBoxErrorInfo instance to construct itself.
262 */
263class ProgressErrorInfo : public ErrorInfo
264{
265public:
266
267 /**
268 * Constructs a new instance by fetchig error information from the
269 * IProgress interface pointer. If the progress object is not NULL,
270 * its completed attribute is true, resultCode represents a failure,
271 * and the errorInfo attribute returns a valid IVirtualBoxErrorInfo pointer,
272 * both #isFullAvailable() and #isBasicAvailable() will return true.
273 *
274 * @param progress the progress object representing a failed operation
275 */
276 ProgressErrorInfo (IProgress *progress);
277};
278
279}; // namespace com
280
281#endif // __VBox_com_ErrorInfo_h__
282
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette