VirtualBox

source: vbox/trunk/src/VBox/Main/glue/errorprint.cpp@ 38509

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

Main/glue/ErrorInfo: print _all_ error messages, not only the last one; add glue code for printing errors from a IProgress object

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.1 KB
Line 
1/* $Id: errorprint.cpp 38509 2011-08-23 15:07:55Z vboxsync $ */
2
3/** @file
4 * MS COM / XPCOM Abstraction Layer:
5 * Error info print helpers. This implements the shared code from the macros from errorprint.h.
6 */
7
8/*
9 * Copyright (C) 2009-2010 Oracle Corporation
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
20
21#include <VBox/com/ErrorInfo.h>
22#include <VBox/com/errorprint.h>
23#include <VBox/log.h>
24
25#include <iprt/stream.h>
26#include <iprt/message.h>
27#include <iprt/path.h>
28
29namespace com
30{
31
32void GluePrintErrorInfo(const com::ErrorInfo &info)
33{
34 bool haveResultCode = false;
35#if defined (RT_OS_WIN)
36 haveResultCode = info.isFullAvailable();
37 bool haveComponent = true;
38 bool haveInterfaceID = true;
39#else /* defined (RT_OS_WIN) */
40 haveResultCode = true;
41 bool haveComponent = info.isFullAvailable();
42 bool haveInterfaceID = info.isFullAvailable();
43#endif
44
45 Utf8Str str;
46 RTCList<Utf8Str> comp;
47
48 Bstr bstrDetailsText = info.getText();
49 if (!bstrDetailsText.isEmpty())
50 str = Utf8StrFmt("%ls\n",
51 bstrDetailsText.raw());
52 if (haveResultCode)
53 comp.append(Utf8StrFmt("code %Rhrc (0x%RX32)",
54 info.getResultCode(),
55 info.getResultCode()));
56 if (haveComponent)
57 comp.append(Utf8StrFmt("component %ls",
58 info.getComponent().raw()));
59 if (haveInterfaceID)
60 comp.append(Utf8StrFmt("interface %ls",
61 info.getInterfaceName().raw()));
62 if (!info.getCalleeName().isEmpty())
63 comp.append(Utf8StrFmt("callee %ls",
64 info.getCalleeName().raw()));
65
66 if (comp.size() > 0)
67 {
68 str += "Details: ";
69 for (size_t i = 0; i < comp.size() - 1; ++i)
70 str += comp.at(i) + ", ";
71 str += comp.last();
72 str += "\n";
73 }
74
75 // print and log
76 RTMsgError("%s", str.c_str());
77 Log(("ERROR: %s", str.c_str()));
78}
79
80void GluePrintErrorContext(const char *pcszContext, const char *pcszSourceFile, uint32_t ulLine)
81{
82 // pcszSourceFile comes from __FILE__ macro, which always contains the full path,
83 // which we don't want to see printed:
84 Utf8Str strFilename(RTPathFilename(pcszSourceFile));
85 Utf8Str str = Utf8StrFmt("Context: \"%s\" at line %d of file %s\n",
86 pcszContext,
87 ulLine,
88 strFilename.c_str());
89 // print and log
90 RTMsgError("%s", str.c_str());
91 Log(("%s", str.c_str()));
92}
93
94void GluePrintRCMessage(HRESULT rc)
95{
96 Utf8Str str = Utf8StrFmt("Code %Rhra (extended info not available)\n", rc);
97 // print and log
98 RTMsgError("%s", str.c_str());
99 Log(("ERROR: %s", str.c_str()));
100}
101
102static void glueHandleComErrorInternal(com::ErrorInfo &info,
103 const char *pcszContext,
104 HRESULT rc,
105 const char *pcszSourceFile,
106 uint32_t ulLine)
107{
108 const com::ErrorInfo *pInfo = &info;
109 do
110 {
111 if (pInfo->isFullAvailable() || pInfo->isBasicAvailable())
112 GluePrintErrorInfo(*pInfo);
113 else
114#if defined (RT_OS_WIN)
115 GluePrintRCMessage(rc);
116#else /* defined (RT_OS_WIN) */
117 GluePrintRCMessage(pInfo->getResultCode());
118#endif
119 pInfo = pInfo->getNext();
120 /* If there is more than one error, separate them visually. */
121 if (pInfo)
122 RTMsgError("--------\n");
123 }
124 while(pInfo);
125
126 GluePrintErrorContext(pcszContext, pcszSourceFile, ulLine);
127}
128
129void GlueHandleComError(ComPtr<IUnknown> iface,
130 const char *pcszContext,
131 HRESULT rc,
132 const char *pcszSourceFile,
133 uint32_t ulLine)
134{
135 /* If we have full error info, print something nice, and start with the
136 * actual error message. */
137 com::ErrorInfo info(iface, COM_IIDOF(IUnknown));
138
139 glueHandleComErrorInternal(info,
140 pcszContext,
141 rc,
142 pcszSourceFile,
143 ulLine);
144
145}
146
147void GlueHandleComErrorProgress(ComPtr<IProgress> progress,
148 const char *pcszContext,
149 HRESULT rc,
150 const char *pcszSourceFile,
151 uint32_t ulLine)
152{
153 /* Get the error info out of the progress object. */
154 ProgressErrorInfo ei(progress);
155
156 glueHandleComErrorInternal(ei,
157 pcszContext,
158 rc,
159 pcszSourceFile,
160 ulLine);
161}
162
163} /* namespace com */
164
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