VirtualBox

source: vbox/trunk/src/VBox/Main/glue/VirtualBoxErrorInfo.cpp@ 21288

Last change on this file since 21288 was 21079, checked in by vboxsync, 15 years ago

Main: move libxml2 to IPRT unconditionally (remove VBOX_WITH_LIBXML2_IN_VBOXRT); move xml classes to IPRT; introduce IPRT ministring class as base for both Utf8Str and xml.cpp, with better performance; introduce some Utf8Str helpers to avoid string buffer hacks in Main code; remove std::auto_ptr<> from some headers

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1/* $Id: VirtualBoxErrorInfo.cpp 21079 2009-06-30 15:59:22Z vboxsync $ */
2
3/** @file
4 * MS COM / XPCOM Abstraction Layer:
5 * VirtualBoxErrorInfo COM class implementation
6 */
7
8/*
9 * Copyright (C) 2008 Sun Microsystems, Inc.
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20 * Clara, CA 95054 USA or visit http://www.sun.com if you need
21 * additional information or have any questions.
22 */
23
24#include "VBox/com/VirtualBoxErrorInfo.h"
25
26#include "../include/Logging.h"
27
28#include <list>
29
30namespace com
31{
32
33////////////////////////////////////////////////////////////////////////////////
34// VirtualBoxErrorInfo class
35////////////////////////////////////////////////////////////////////////////////
36
37// public initializer/uninitializer for internal purposes only
38////////////////////////////////////////////////////////////////////////////////
39
40/**
41 * Initializes the error info object with the given error details.
42 */
43HRESULT VirtualBoxErrorInfo::init (HRESULT aResultCode, const GUID *aIID,
44 const char *aComponent, const char *aText,
45 IVirtualBoxErrorInfo *aNext)
46{
47 mResultCode = aResultCode;
48
49 if (aIID != NULL)
50 mIID = *aIID;
51
52 mComponent = aComponent;
53 mText = aText;
54 mNext = aNext;
55
56 return S_OK;
57}
58
59// IVirtualBoxErrorInfo properties
60////////////////////////////////////////////////////////////////////////////////
61
62STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(ResultCode) (LONG *aResultCode)
63{
64 if (!aResultCode)
65 return E_POINTER;
66
67 *aResultCode = mResultCode;
68 return S_OK;
69}
70
71STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(InterfaceID) (OUT_GUID aIID)
72{
73 if (!aIID)
74 return E_POINTER;
75
76 mIID.cloneTo (aIID);
77 return S_OK;
78}
79
80STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(Component) (BSTR *aComponent)
81{
82 if (!aComponent)
83 return E_POINTER;
84
85 mComponent.cloneTo (aComponent);
86 return S_OK;
87}
88
89STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(Text) (BSTR *aText)
90{
91 if (!aText)
92 return E_POINTER;
93
94 mText.cloneTo (aText);
95 return S_OK;
96}
97
98STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(Next) (IVirtualBoxErrorInfo **aNext)
99{
100 if (!aNext)
101 return E_POINTER;
102
103 /* this will set aNext to NULL if mNext is null */
104 return mNext.queryInterfaceTo (aNext);
105}
106
107#if !defined (VBOX_WITH_XPCOM)
108
109/**
110 * Initializes itself by fetching error information from the given error info
111 * object.
112 */
113HRESULT VirtualBoxErrorInfo::init (IErrorInfo *aInfo)
114{
115 AssertReturn (aInfo, E_FAIL);
116
117 HRESULT rc = S_OK;
118
119 /* We don't return a failure if talking to IErrorInfo fails below to
120 * protect ourselves from bad IErrorInfo implementations (the
121 * corresponding fields will simply remain null in this case). */
122
123 mResultCode = S_OK;
124 rc = aInfo->GetGUID (mIID.asOutParam());
125 AssertComRC (rc);
126 rc = aInfo->GetSource (mComponent.asOutParam());
127 AssertComRC (rc);
128 rc = aInfo->GetDescription (mText.asOutParam());
129 AssertComRC (rc);
130
131 return S_OK;
132}
133
134// IErrorInfo methods
135////////////////////////////////////////////////////////////////////////////////
136
137STDMETHODIMP VirtualBoxErrorInfo::GetDescription (BSTR *description)
138{
139 return COMGETTER(Text) (description);
140}
141
142STDMETHODIMP VirtualBoxErrorInfo::GetGUID (GUID *guid)
143{
144 return COMGETTER(InterfaceID) (guid);
145}
146
147STDMETHODIMP VirtualBoxErrorInfo::GetHelpContext (DWORD *pdwHelpContext)
148{
149 return E_NOTIMPL;
150}
151
152STDMETHODIMP VirtualBoxErrorInfo::GetHelpFile (BSTR *pbstrHelpFile)
153{
154 return E_NOTIMPL;
155}
156
157STDMETHODIMP VirtualBoxErrorInfo::GetSource (BSTR *source)
158{
159 return COMGETTER(Component) (source);
160}
161
162#else // !defined (VBOX_WITH_XPCOM)
163
164/**
165 * Initializes itself by fetching error information from the given error info
166 * object.
167 */
168HRESULT VirtualBoxErrorInfo::init (nsIException *aInfo)
169{
170 AssertReturn (aInfo, E_FAIL);
171
172 HRESULT rc = S_OK;
173
174 /* We don't return a failure if talking to nsIException fails below to
175 * protect ourselves from bad nsIException implementations (the
176 * corresponding fields will simply remain null in this case). */
177
178 rc = aInfo->GetResult (&mResultCode);
179 AssertComRC (rc);
180 Utf8Str message;
181 rc = aInfo->GetMessage(message.asOutParam());
182 message.jolt();
183 AssertComRC (rc);
184 mText = message;
185
186 return S_OK;
187}
188
189// nsIException methods
190////////////////////////////////////////////////////////////////////////////////
191
192/* readonly attribute string message; */
193NS_IMETHODIMP VirtualBoxErrorInfo::GetMessage (char **aMessage)
194{
195 if (!aMessage)
196 return NS_ERROR_INVALID_POINTER;
197
198 Utf8Str (mText).cloneTo (aMessage);
199 return S_OK;
200}
201
202/* readonly attribute nsresult result; */
203NS_IMETHODIMP VirtualBoxErrorInfo::GetResult (nsresult *aResult)
204{
205 if (!aResult)
206 return NS_ERROR_INVALID_POINTER;
207
208 PRInt32 lrc;
209 nsresult rc = COMGETTER(ResultCode) (&lrc);
210 if (SUCCEEDED(rc))
211 *aResult = lrc;
212 return rc;
213}
214
215/* readonly attribute string name; */
216NS_IMETHODIMP VirtualBoxErrorInfo::GetName (char **aName)
217{
218 return NS_ERROR_NOT_IMPLEMENTED;
219}
220
221/* readonly attribute string filename; */
222NS_IMETHODIMP VirtualBoxErrorInfo::GetFilename (char **aFilename)
223{
224 return NS_ERROR_NOT_IMPLEMENTED;
225}
226
227/* readonly attribute PRUint32 lineNumber; */
228NS_IMETHODIMP VirtualBoxErrorInfo::GetLineNumber (PRUint32 *aLineNumber)
229{
230 return NS_ERROR_NOT_IMPLEMENTED;
231}
232
233/* readonly attribute PRUint32 columnNumber; */
234NS_IMETHODIMP VirtualBoxErrorInfo::GetColumnNumber (PRUint32 *aColumnNumber)
235{
236 return NS_ERROR_NOT_IMPLEMENTED;
237}
238
239/* readonly attribute nsIStackFrame location; */
240NS_IMETHODIMP VirtualBoxErrorInfo::GetLocation (nsIStackFrame **aLocation)
241{
242 return NS_ERROR_NOT_IMPLEMENTED;
243}
244
245/* readonly attribute nsIException inner; */
246NS_IMETHODIMP VirtualBoxErrorInfo::GetInner (nsIException **aInner)
247{
248 ComPtr <IVirtualBoxErrorInfo> info;
249 nsresult rv = COMGETTER(Next) (info.asOutParam());
250 CheckComRCReturnRC (rv);
251 return info.queryInterfaceTo (aInner);
252}
253
254/* readonly attribute nsISupports data; */
255NS_IMETHODIMP VirtualBoxErrorInfo::GetData (nsISupports **aData)
256{
257 return NS_ERROR_NOT_IMPLEMENTED;
258}
259
260/* string toString (); */
261NS_IMETHODIMP VirtualBoxErrorInfo::ToString (char **_retval)
262{
263 return NS_ERROR_NOT_IMPLEMENTED;
264}
265
266NS_IMPL_THREADSAFE_ISUPPORTS2 (VirtualBoxErrorInfo,
267 nsIException, IVirtualBoxErrorInfo)
268
269#endif /* !defined (VBOX_WITH_XPCOM) */
270
271////////////////////////////////////////////////////////////////////////////////
272// VirtualBoxErrorInfoGlue class
273////////////////////////////////////////////////////////////////////////////////
274
275// public initializer/uninitializer for internal purposes only
276////////////////////////////////////////////////////////////////////////////////
277
278/**
279 * Initializes the glue object with two given error info chains.
280 *
281 * @param aHead Chain placed to the beginning.
282 * @param aTail Chain placed to the end.
283 */
284HRESULT VirtualBoxErrorInfoGlue::init (IVirtualBoxErrorInfo *aHead,
285 IVirtualBoxErrorInfo *aTail)
286{
287 AssertReturn (aHead != NULL, E_INVALIDARG);
288 AssertReturn (aTail != NULL, E_INVALIDARG);
289
290 HRESULT rc = S_OK;
291
292 typedef std::list <ComPtr <IVirtualBoxErrorInfo> > List;
293 List list;
294
295 ComPtr <IVirtualBoxErrorInfo> cur = aHead;
296
297 do
298 {
299 ComPtr <IVirtualBoxErrorInfo> next;
300 rc = cur->COMGETTER(Next) (next.asOutParam());
301 CheckComRCReturnRC (rc);
302
303 if (next.isNull())
304 break;
305
306 list.push_back (next);
307 cur = next;
308 }
309 while (true);
310
311 if (list.size() == 0)
312 {
313 /* simplest case */
314 mReal = aHead;
315 mNext = aTail;
316 return S_OK;
317 }
318
319 for (List::iterator it = list.end(), prev = it; it != list.begin(); -- it)
320 {
321 ComObjPtr <VirtualBoxErrorInfoGlue> wrapper;
322 rc = wrapper.createObject();
323 CheckComRCBreakRC (rc);
324
325 -- prev;
326
327 if (it == list.end())
328 rc = wrapper->protectedInit (*prev, aTail);
329 else
330 rc = wrapper->protectedInit (*prev, *it);
331
332 *prev = wrapper;
333
334 CheckComRCBreakRC (rc);
335 }
336
337 mReal = aHead;
338 mNext = list.front();
339
340 return S_OK;
341}
342
343/**
344 * Protected initializer that just sets the data fields as given.
345 *
346 * @param aReal Real error info object (not NULL) to forward calls to.
347 * @param aNext Next error info object (may be NULL).
348 */
349HRESULT VirtualBoxErrorInfoGlue::protectedInit (IVirtualBoxErrorInfo *aReal,
350 IVirtualBoxErrorInfo *aNext)
351{
352 AssertReturn (aReal != NULL, E_INVALIDARG);
353
354 mReal = aReal;
355 mNext = aNext;
356
357 return S_OK;
358}
359
360// IVirtualBoxErrorInfo properties
361////////////////////////////////////////////////////////////////////////////////
362
363STDMETHODIMP VirtualBoxErrorInfoGlue::COMGETTER(Next) (IVirtualBoxErrorInfo **aNext)
364{
365 if (!aNext)
366 return E_POINTER;
367
368 /* this will set aNext to NULL if mNext is null */
369 return mNext.queryInterfaceTo (aNext);
370}
371
372#if defined (VBOX_WITH_XPCOM)
373
374NS_IMPL_THREADSAFE_ISUPPORTS2 (VirtualBoxErrorInfoGlue,
375 nsIException, IVirtualBoxErrorInfo)
376
377#endif /* defined (VBOX_WITH_XPCOM) */
378
379} /* namespace com */
380
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