VirtualBox

source: vbox/trunk/include/VBox/com/errorprint.h@ 37631

Last change on this file since 37631 was 36536, checked in by vboxsync, 14 years ago

include/*: Made the headers build on linux again (kmk -C include).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 KB
Line 
1/** @file
2 * MS COM / XPCOM Abstraction Layer:
3 * Error printing macros using shared functions defined in shared glue code.
4 * Use these CHECK_* macros for efficient error checking around calling COM methods.
5 */
6
7/*
8 * Copyright (C) 2009 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * The contents of this file may alternatively be used under the terms
19 * of the Common Development and Distribution License Version 1.0
20 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
21 * VirtualBox OSE distribution, in which case the provisions of the
22 * CDDL are applicable instead of those of the GPL.
23 *
24 * You may elect to license modified versions of this file under the
25 * terms and conditions of either the GPL or the CDDL or both.
26 */
27
28#ifndef ___VBox_com_errorprint_h
29#define ___VBox_com_errorprint_h
30
31#include <VBox/com/ErrorInfo.h>
32
33namespace com
34{
35
36// shared prototypes; these are defined in shared glue code and are
37// compiled only once for all front-ends
38void GluePrintErrorInfo(com::ErrorInfo &info);
39void GluePrintErrorContext(const char *pcszContext, const char *pcszSourceFile, uint32_t ulLine);
40void GluePrintRCMessage(HRESULT rc);
41void GlueHandleComError(ComPtr<IUnknown> iface, const char *pcszContext, HRESULT rc, const char *pcszSourceFile, uint32_t ulLine);
42
43/**
44 * Calls the given method of the given interface and then checks if the return
45 * value (COM result code) indicates a failure. If so, prints the failed
46 * function/line/file, the description of the result code and attempts to
47 * query the extended error information on the current thread (using
48 * com::ErrorInfo) if the interface reports that it supports error information.
49 *
50 * Used by command line tools or for debugging and assumes the |HRESULT rc|
51 * variable is accessible for assigning in the current scope.
52 */
53#define CHECK_ERROR(iface, method) \
54 do { \
55 rc = iface->method; \
56 if (FAILED(rc)) \
57 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
58 } while (0)
59
60/**
61 * Same as CHECK_ERROR except that it also executes the statement |stmt| on
62 * failure.
63 */
64#define CHECK_ERROR_STMT(iface, method, stmt) \
65 do { \
66 rc = iface->method; \
67 if (FAILED(rc)) \
68 { \
69 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
70 stmt; \
71 } \
72 } while (0)
73
74/**
75 * Same as CHECK_ERROR_STMT except that it uses an internal variable |hrcCheck|
76 * for holding the result.
77 */
78#define CHECK_ERROR2_STMT(iface, method, stmt) \
79 do { \
80 HRESULT hrcCheck = iface->method; \
81 if (FAILED(hrcCheck)) \
82 { \
83 com::GlueHandleComError(iface, #method, hrcCheck, __FILE__, __LINE__); \
84 stmt; \
85 } \
86 } while (0)
87
88
89/**
90 * Does the same as CHECK_ERROR(), but executes the |break| statement on
91 * failure.
92 */
93#ifdef __GNUC__
94# define CHECK_ERROR_BREAK(iface, method) \
95 __extension__ \
96 ({ \
97 rc = iface->method; \
98 if (FAILED(rc)) \
99 { \
100 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
101 break; \
102 } \
103 })
104#else
105# define CHECK_ERROR_BREAK(iface, method) \
106 if (1) \
107 { \
108 rc = iface->method; \
109 if (FAILED(rc)) \
110 { \
111 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
112 break; \
113 } \
114 } \
115 else do {} while (0)
116#endif
117
118/**
119 * Does the same as CHECK_ERROR(), but executes the |return ret| statement on
120 * failure.
121 */
122#define CHECK_ERROR_RET(iface, method, ret) \
123 do { \
124 rc = iface->method; \
125 if (FAILED(rc)) \
126 { \
127 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
128 return (ret); \
129 } \
130 } while (0)
131
132/**
133 * Does the same as CHECK_ERROR(), but returns @a ret on failure.
134 *
135 * Unlike CHECK_ERROR and CHECK_ERROR_RET, this macro does not presuppose a
136 * |rc| variable but instead employs a local variable |hrcCheck| in its own
137 * scope. This |hrcCheck| variable can be referenced by the @a rcRet
138 * parameter.
139 *
140 * @param iface The interface pointer (can be a smart pointer object).
141 * @param method The method to invoke together with the parameters.
142 * @param rcRet What to return on failure. Use |hrcCheck| to return
143 * the status code of the method call.
144 */
145#define CHECK_ERROR2_RET(iface, method, rcRet) \
146 do { \
147 HRESULT hrcCheck = iface->method; \
148 if (FAILED(hrcCheck)) \
149 { \
150 com::GlueHandleComError(iface, #method, hrcCheck, __FILE__, __LINE__); \
151 return (rcRet); \
152 } \
153 } while (0)
154
155/**
156 * Asserts the given expression is true. When the expression is false, prints
157 * a line containing the failed function/line/file; otherwise does nothing.
158 */
159#define ASSERT(expr) \
160 do { \
161 if (!(expr)) \
162 { \
163 RTPrintf ("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr); \
164 Log (("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr)); \
165 } \
166 } while (0)
167
168#endif
169
170/**
171 * Does the same as ASSERT(), but executes the |return ret| statement if the
172 * expression to assert is false;
173 */
174#define ASSERT_RET(expr, ret) \
175 do { ASSERT(expr); if (!(expr)) return (ret); } while (0)
176
177/**
178 * Does the same as ASSERT(), but executes the |break| statement if the
179 * expression to assert is false;
180 */
181#define ASSERT_BREAK(expr, ret) \
182 if (1) { ASSERT(expr); if (!(expr)) break; } else do {} while (0)
183
184} /* namespace com */
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