VirtualBox

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

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

Main/glue/ErrorInfo: fix burn

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