VirtualBox

source: vbox/trunk/include/VBox/com/errorprint2.h@ 17661

Last change on this file since 17661 was 16580, checked in by vboxsync, 16 years ago

Main: make new error functions more granular

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.0 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 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
28 * Clara, CA 95054 USA or visit http://www.sun.com if you need
29 * additional information or have any questions.
30 */
31
32#ifndef ___VBox_com_errorprint_h
33#define ___VBox_com_errorprint_h
34
35namespace com
36{
37
38// shared prototypes; these are defined in shared glue code and are
39// compiled only once for all front-ends
40void GluePrintErrorInfo(com::ErrorInfo &info);
41void GluePrintErrorContext(const char *pcszContext, const char *pcszSourceFile, uint32_t ulLine);
42void GluePrintRCMessage(HRESULT rc);
43void GlueHandleComError(ComPtr<IUnknown> iface, const char *pcszContext, HRESULT rc, const char *pcszSourceFile, uint32_t ulLine);
44
45/**
46 * Calls the given method of the given interface and then checks if the return
47 * value (COM result code) indicates a failure. If so, prints the failed
48 * function/line/file, the description of the result code and attempts to
49 * query the extended error information on the current thread (using
50 * com::ErrorInfo) if the interface reports that it supports error information.
51 *
52 * Used by command line tools or for debugging and assumes the |HRESULT rc|
53 * variable is accessible for assigning in the current scope.
54 */
55#define CHECK_ERROR(iface, method) \
56 do { \
57 rc = iface->method; \
58 if (FAILED(rc)) \
59 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
60 } while (0)
61
62/**
63 * Does the same as CHECK_ERROR(), but executes the |break| statement on
64 * failure.
65 */
66#ifdef __GNUC__
67# define CHECK_ERROR_BREAK(iface, method) \
68 ({ \
69 rc = iface->method; \
70 if (FAILED(rc)) \
71 { \
72 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
73 break; \
74 } \
75 })
76#else
77# define CHECK_ERROR_BREAK(iface, method) \
78 if (1) \
79 { \
80 rc = iface->method; \
81 if (FAILED(rc)) \
82 { \
83 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
84 break; \
85 } \
86 } \
87 else do {} while (0)
88#endif
89
90/**
91 * Does the same as CHECK_ERROR(), but executes the |return ret| statement on
92 * failure.
93 */
94#define CHECK_ERROR_RET(iface, method, ret) \
95 do { \
96 rc = iface->method; \
97 if (FAILED(rc)) \
98 { \
99 com::GlueHandleComError(iface, #method, rc, __FILE__, __LINE__); \
100 return (ret); \
101 } \
102 } while (0)
103
104/**
105 * Asserts the given expression is true. When the expression is false, prints
106 * a line containing the failed function/line/file; otherwise does nothing.
107 */
108#define ASSERT(expr) \
109 do { \
110 if (!(expr)) \
111 { \
112 RTPrintf ("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr); \
113 Log (("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr)); \
114 } \
115 } while (0)
116
117#endif
118
119} /* 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