VirtualBox

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

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

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

© 2023 Oracle
ContactPrivacy policyTerms of Use