VirtualBox

source: vbox/trunk/src/VBox/Main/src-all/VirtualBoxErrorInfoImpl.cpp@ 39650

Last change on this file since 39650 was 38533, checked in by vboxsync, 13 years ago

Main/ErrorInfo: allow to set standard errors without text and error setting
from an existing com::ErrorInfo object

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
1/** @file
2 *
3 * VirtualBoxErrorInfo COM classe implementation
4 */
5
6/*
7 * Copyright (C) 2006-2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#include "VirtualBoxErrorInfoImpl.h"
19#include "Logging.h"
20
21#include <VBox/com/ErrorInfo.h>
22
23// public initializer/uninitializer for internal purposes only
24////////////////////////////////////////////////////////////////////////////////
25
26HRESULT VirtualBoxErrorInfo::init(HRESULT aResultCode,
27 const GUID &aIID,
28 const char *pcszComponent,
29 const Utf8Str &strText,
30 IVirtualBoxErrorInfo *aNext)
31{
32 m_resultCode = aResultCode;
33 m_IID = aIID;
34 m_strComponent = pcszComponent;
35 m_strText = strText;
36 mNext = aNext;
37
38 return S_OK;
39}
40
41HRESULT VirtualBoxErrorInfo::init(const com::ErrorInfo &info,
42 IVirtualBoxErrorInfo *aNext)
43{
44 m_resultCode = info.getResultCode();
45 m_IID = info.getInterfaceID();
46 m_strComponent = info.getComponent();
47 m_strText = info.getText();
48
49 /* Recursively create VirtualBoxErrorInfo instances for the next objects. */
50 const com::ErrorInfo *pInfo = info.getNext();
51 if (pInfo)
52 {
53 ComObjPtr<VirtualBoxErrorInfo> nextEI;
54 HRESULT rc = nextEI.createObject();
55 if (FAILED(rc)) return rc;
56 rc = nextEI->init(*pInfo, aNext);
57 if (FAILED(rc)) return rc;
58 mNext = nextEI;
59 }else
60 mNext = aNext;
61
62 return S_OK;
63}
64
65// IVirtualBoxErrorInfo properties
66////////////////////////////////////////////////////////////////////////////////
67
68STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(ResultCode) (LONG *aResultCode)
69{
70 CheckComArgOutPointerValid(aResultCode);
71
72 *aResultCode = m_resultCode;
73 return S_OK;
74}
75
76STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(InterfaceID) (BSTR *aIID)
77{
78 CheckComArgOutPointerValid(aIID);
79
80 m_IID.toUtf16().cloneTo(aIID);
81 return S_OK;
82}
83
84STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(Component) (BSTR *aComponent)
85{
86 CheckComArgOutPointerValid(aComponent);
87
88 m_strComponent.cloneTo(aComponent);
89 return S_OK;
90}
91
92STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(Text) (BSTR *aText)
93{
94 CheckComArgOutPointerValid(aText);
95
96 m_strText.cloneTo(aText);
97 return S_OK;
98}
99
100STDMETHODIMP VirtualBoxErrorInfo::COMGETTER(Next) (IVirtualBoxErrorInfo **aNext)
101{
102 CheckComArgOutPointerValid(aNext);
103
104 /* this will set aNext to NULL if mNext is null */
105 return mNext.queryInterfaceTo(aNext);
106}
107
108#if !defined(VBOX_WITH_XPCOM)
109
110/**
111 * Initializes itself by fetching error information from the given error info
112 * object.
113 */
114HRESULT VirtualBoxErrorInfo::init (IErrorInfo *aInfo)
115{
116 AssertReturn(aInfo, E_FAIL);
117
118 HRESULT rc = S_OK;
119
120 /* We don't return a failure if talking to IErrorInfo fails below to
121 * protect ourselves from bad IErrorInfo implementations (the
122 * corresponding fields will simply remain null in this case). */
123
124 m_resultCode = S_OK;
125 rc = aInfo->GetGUID(m_IID.asOutParam());
126 AssertComRC (rc);
127 Bstr bstrComponent;
128 rc = aInfo->GetSource(bstrComponent.asOutParam());
129 AssertComRC (rc);
130 m_strComponent = bstrComponent;
131 Bstr bstrText;
132 rc = aInfo->GetDescription(bstrText.asOutParam());
133 AssertComRC (rc);
134 m_strText = bstrText;
135
136 return S_OK;
137}
138
139// IErrorInfo methods
140////////////////////////////////////////////////////////////////////////////////
141
142STDMETHODIMP VirtualBoxErrorInfo::GetDescription (BSTR *description)
143{
144 return COMGETTER(Text) (description);
145}
146
147STDMETHODIMP VirtualBoxErrorInfo::GetGUID (GUID *guid)
148{
149 Bstr iid;
150 HRESULT rc = COMGETTER(InterfaceID) (iid.asOutParam());
151 if (SUCCEEDED(rc))
152 *guid = Guid(iid).ref();
153 return rc;
154}
155
156STDMETHODIMP VirtualBoxErrorInfo::GetHelpContext (DWORD *pdwHelpContext)
157{
158 return E_NOTIMPL;
159}
160
161STDMETHODIMP VirtualBoxErrorInfo::GetHelpFile (BSTR *pbstrHelpFile)
162{
163 return E_NOTIMPL;
164}
165
166STDMETHODIMP VirtualBoxErrorInfo::GetSource (BSTR *source)
167{
168 return COMGETTER(Component) (source);
169}
170
171#else // defined(VBOX_WITH_XPCOM)
172
173/**
174 * Initializes itself by fetching error information from the given error info
175 * object.
176 */
177HRESULT VirtualBoxErrorInfo::init(nsIException *aInfo)
178{
179 AssertReturn(aInfo, E_FAIL);
180
181 HRESULT rc = S_OK;
182
183 /* We don't return a failure if talking to nsIException fails below to
184 * protect ourselves from bad nsIException implementations (the
185 * corresponding fields will simply remain null in this case). */
186
187 rc = aInfo->GetResult(&m_resultCode);
188 AssertComRC(rc);
189
190 char *pszMsg; /* No Utf8Str.asOutParam, different allocator! */
191 rc = aInfo->GetMessage(&pszMsg);
192 AssertComRC(rc);
193 if (NS_SUCCEEDED(rc))
194 {
195 m_strText = pszMsg;
196 nsMemory::Free(pszMsg);
197 }
198 else
199 m_strText.setNull();
200
201 return S_OK;
202}
203
204// nsIException methods
205////////////////////////////////////////////////////////////////////////////////
206
207/* readonly attribute string message; */
208NS_IMETHODIMP VirtualBoxErrorInfo::GetMessage (char **aMessage)
209{
210 CheckComArgOutPointerValid(aMessage);
211
212 m_strText.cloneTo(aMessage);
213 return S_OK;
214}
215
216/* readonly attribute nsresult result; */
217NS_IMETHODIMP VirtualBoxErrorInfo::GetResult (nsresult *aResult)
218{
219 if (!aResult)
220 return NS_ERROR_INVALID_POINTER;
221
222 PRInt32 lrc;
223 nsresult rc = COMGETTER(ResultCode) (&lrc);
224 if (SUCCEEDED(rc))
225 *aResult = lrc;
226 return rc;
227}
228
229/* readonly attribute string name; */
230NS_IMETHODIMP VirtualBoxErrorInfo::GetName (char ** /* aName */)
231{
232 return NS_ERROR_NOT_IMPLEMENTED;
233}
234
235/* readonly attribute string filename; */
236NS_IMETHODIMP VirtualBoxErrorInfo::GetFilename (char ** /* aFilename */)
237{
238 return NS_ERROR_NOT_IMPLEMENTED;
239}
240
241/* readonly attribute PRUint32 lineNumber; */
242NS_IMETHODIMP VirtualBoxErrorInfo::GetLineNumber (PRUint32 * /* aLineNumber */)
243{
244 return NS_ERROR_NOT_IMPLEMENTED;
245}
246
247/* readonly attribute PRUint32 columnNumber; */
248NS_IMETHODIMP VirtualBoxErrorInfo::GetColumnNumber (PRUint32 * /*aColumnNumber */)
249{
250 return NS_ERROR_NOT_IMPLEMENTED;
251}
252
253/* readonly attribute nsIStackFrame location; */
254NS_IMETHODIMP VirtualBoxErrorInfo::GetLocation (nsIStackFrame ** /* aLocation */)
255{
256 return NS_ERROR_NOT_IMPLEMENTED;
257}
258
259/* readonly attribute nsIException inner; */
260NS_IMETHODIMP VirtualBoxErrorInfo::GetInner (nsIException **aInner)
261{
262 ComPtr<IVirtualBoxErrorInfo> info;
263 nsresult rv = COMGETTER(Next) (info.asOutParam());
264 if (FAILED(rv)) return rv;
265 return info.queryInterfaceTo(aInner);
266}
267
268/* readonly attribute nsISupports data; */
269NS_IMETHODIMP VirtualBoxErrorInfo::GetData (nsISupports ** /* aData */)
270{
271 return NS_ERROR_NOT_IMPLEMENTED;
272}
273
274/* string toString (); */
275NS_IMETHODIMP VirtualBoxErrorInfo::ToString (char ** /* retval */)
276{
277 return NS_ERROR_NOT_IMPLEMENTED;
278}
279
280NS_IMPL_THREADSAFE_ISUPPORTS2 (VirtualBoxErrorInfo,
281 nsIException, IVirtualBoxErrorInfo)
282
283#endif // defined(VBOX_WITH_XPCOM)
284/* vi: set tabstop=4 shiftwidth=4 expandtab: */
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