xref: /aoo4110/main/tools/inc/tools/diagnose_ex.h (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef TOOLS_DIAGNOSE_EX_H
25*b1cdbd2cSJim Jagielski #define TOOLS_DIAGNOSE_EX_H
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
28*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/RuntimeException.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <boost/current_function.hpp>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #define OSL_UNUSED( expression ) \
37*b1cdbd2cSJim Jagielski     (void)(expression)
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski     #include <cppuhelper/exc_hlp.hxx>
42*b1cdbd2cSJim Jagielski     #include <osl/diagnose.h>
43*b1cdbd2cSJim Jagielski     #include <osl/thread.h>
44*b1cdbd2cSJim Jagielski     #include <boost/current_function.hpp>
45*b1cdbd2cSJim Jagielski     #include <typeinfo>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski     /** reports a caught UNO exception via OSL diagnostics
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski         Note that whenever you use this, it might be an indicator that your error
50*b1cdbd2cSJim Jagielski         handling is not correct ....
51*b1cdbd2cSJim Jagielski     */
52*b1cdbd2cSJim Jagielski     #define DBG_UNHANDLED_EXCEPTION()   \
53*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Any caught( ::cppu::getCaughtException() ); \
54*b1cdbd2cSJim Jagielski 	    ::rtl::OString sMessage( "caught an exception!" ); \
55*b1cdbd2cSJim Jagielski         sMessage += "\nin function:"; \
56*b1cdbd2cSJim Jagielski         sMessage += BOOST_CURRENT_FUNCTION; \
57*b1cdbd2cSJim Jagielski 	    sMessage += "\ntype: "; \
58*b1cdbd2cSJim Jagielski 	    sMessage += ::rtl::OString( caught.getValueTypeName().getStr(), caught.getValueTypeName().getLength(), osl_getThreadTextEncoding() ); \
59*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Exception exception; \
60*b1cdbd2cSJim Jagielski         caught >>= exception; \
61*b1cdbd2cSJim Jagielski         if ( exception.Message.getLength() ) \
62*b1cdbd2cSJim Jagielski         { \
63*b1cdbd2cSJim Jagielski 	        sMessage += "\nmessage: "; \
64*b1cdbd2cSJim Jagielski 	        sMessage += ::rtl::OString( exception.Message.getStr(), exception.Message.getLength(), osl_getThreadTextEncoding() ); \
65*b1cdbd2cSJim Jagielski         } \
66*b1cdbd2cSJim Jagielski         if ( exception.Context.is() ) \
67*b1cdbd2cSJim Jagielski         { \
68*b1cdbd2cSJim Jagielski             const char* pContext = typeid( *exception.Context.get() ).name(); \
69*b1cdbd2cSJim Jagielski             sMessage += "\ncontext: "; \
70*b1cdbd2cSJim Jagielski             sMessage += pContext; \
71*b1cdbd2cSJim Jagielski         } \
72*b1cdbd2cSJim Jagielski         sMessage += "\n"; \
73*b1cdbd2cSJim Jagielski 	    OSL_ENSURE( false, sMessage )
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski #else   // OSL_DEBUG_LEVEL
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     #define DBG_UNHANDLED_EXCEPTION()
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski #endif  // OSL_DEBUG_LEVEL
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski /** This macro asserts the given condition (in debug mode), and throws
83*b1cdbd2cSJim Jagielski     an IllegalArgumentException afterwards.
84*b1cdbd2cSJim Jagielski  */
85*b1cdbd2cSJim Jagielski #define ENSURE_ARG_OR_THROW(c, m) if( !(c) ) { \
86*b1cdbd2cSJim Jagielski                                      OSL_ENSURE(c, m); \
87*b1cdbd2cSJim Jagielski                                      throw ::com::sun::star::lang::IllegalArgumentException( \
88*b1cdbd2cSJim Jagielski                                      ::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
89*b1cdbd2cSJim Jagielski                                      ::rtl::OUString::createFromAscii( ",\n" m), \
90*b1cdbd2cSJim Jagielski                                      ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(), \
91*b1cdbd2cSJim Jagielski                                      0 ); }
92*b1cdbd2cSJim Jagielski #define ENSURE_ARG_OR_THROW2(c, m, ifc, arg) if( !(c) ) { \
93*b1cdbd2cSJim Jagielski                                                OSL_ENSURE(c, m); \
94*b1cdbd2cSJim Jagielski                                                throw ::com::sun::star::lang::IllegalArgumentException( \
95*b1cdbd2cSJim Jagielski                                                ::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
96*b1cdbd2cSJim Jagielski                                                ::rtl::OUString::createFromAscii( ",\n" m), \
97*b1cdbd2cSJim Jagielski                                                ifc, \
98*b1cdbd2cSJim Jagielski                                                arg ); }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski /** This macro asserts the given condition (in debug mode), and throws
101*b1cdbd2cSJim Jagielski     an RuntimeException afterwards.
102*b1cdbd2cSJim Jagielski  */
103*b1cdbd2cSJim Jagielski #define ENSURE_OR_THROW(c, m) if( !(c) ) { \
104*b1cdbd2cSJim Jagielski                                      OSL_ENSURE(c, m); \
105*b1cdbd2cSJim Jagielski                                      throw ::com::sun::star::uno::RuntimeException( \
106*b1cdbd2cSJim Jagielski                                      ::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
107*b1cdbd2cSJim Jagielski                                      ::rtl::OUString::createFromAscii( ",\n" m), \
108*b1cdbd2cSJim Jagielski                                      ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() ); }
109*b1cdbd2cSJim Jagielski #define ENSURE_OR_THROW2(c, m, ifc) if( !(c) ) { \
110*b1cdbd2cSJim Jagielski                                           OSL_ENSURE(c, m); \
111*b1cdbd2cSJim Jagielski                                           throw ::com::sun::star::uno::RuntimeException( \
112*b1cdbd2cSJim Jagielski                                           ::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
113*b1cdbd2cSJim Jagielski                                           ::rtl::OUString::createFromAscii( ",\n" m), \
114*b1cdbd2cSJim Jagielski                                           ifc ); }
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski /** This macro asserts the given condition (in debug mode), and
117*b1cdbd2cSJim Jagielski     returns the given value afterwards.
118*b1cdbd2cSJim Jagielski  */
119*b1cdbd2cSJim Jagielski #define ENSURE_OR_RETURN(c, m, r) if( !(c) ) { \
120*b1cdbd2cSJim Jagielski                                      OSL_ENSURE(c, m); \
121*b1cdbd2cSJim Jagielski                                      return r; }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski /** This macro asserts the given condition (in debug mode), and
124*b1cdbd2cSJim Jagielski     returns false afterwards.
125*b1cdbd2cSJim Jagielski  */
126*b1cdbd2cSJim Jagielski #define ENSURE_OR_RETURN_FALSE(c, m) \
127*b1cdbd2cSJim Jagielski     ENSURE_OR_RETURN(c, m, false)
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski /** This macro asserts the given condition (in debug mode), and
130*b1cdbd2cSJim Jagielski     returns afterwards, without return value "void".
131*b1cdbd2cSJim Jagielski  */
132*b1cdbd2cSJim Jagielski #define ENSURE_OR_RETURN_VOID( c, m ) \
133*b1cdbd2cSJim Jagielski     if( !(c) )  \
134*b1cdbd2cSJim Jagielski     { \
135*b1cdbd2cSJim Jagielski         OSL_ENSURE( c, m ); \
136*b1cdbd2cSJim Jagielski         return;   \
137*b1cdbd2cSJim Jagielski     }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski /** This macro asserts the given condition (in debug mode), and
142*b1cdbd2cSJim Jagielski     returns afterwards, without return value "void".
143*b1cdbd2cSJim Jagielski  */
144*b1cdbd2cSJim Jagielski #define ENSURE_OR_RETURN_VOID( c, m ) \
145*b1cdbd2cSJim Jagielski     if( !(c) )  \
146*b1cdbd2cSJim Jagielski     { \
147*b1cdbd2cSJim Jagielski         OSL_ENSURE( c, m ); \
148*b1cdbd2cSJim Jagielski         return;   \
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski /** asserts a given condition (in debug mode), and continues the most-inner
152*b1cdbd2cSJim Jagielski     loop if the condition is not met
153*b1cdbd2cSJim Jagielski */
154*b1cdbd2cSJim Jagielski #define ENSURE_OR_CONTINUE( c, m ) \
155*b1cdbd2cSJim Jagielski     if ( !(c) ) \
156*b1cdbd2cSJim Jagielski     {   \
157*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, m ); \
158*b1cdbd2cSJim Jagielski         continue;   \
159*b1cdbd2cSJim Jagielski     }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski /** asserts a given condition (in debug mode), and continues the most-inner
162*b1cdbd2cSJim Jagielski     loop if the condition is not met
163*b1cdbd2cSJim Jagielski */
164*b1cdbd2cSJim Jagielski #define ENSURE_OR_BREAK( c, m ) \
165*b1cdbd2cSJim Jagielski     if ( !(c) ) \
166*b1cdbd2cSJim Jagielski     {   \
167*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, m ); \
168*b1cdbd2cSJim Jagielski         break;  \
169*b1cdbd2cSJim Jagielski     }
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski #endif // TOOLS_DIAGNOSE_EX_H
172