1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
29 #define __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
30 
31 //_________________________________________________________________________________________________________________
32 //  includes
33 //_________________________________________________________________________________________________________________
34 
35 #if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS )
36 
37     #ifndef _OSL_DIAGNOSE_H_
38     #include <osl/diagnose.h>
39     #endif
40 
41     #ifndef _RTL_STRBUF_HXX_
42     #include <rtl/strbuf.hxx>
43     #endif
44 
45 #endif
46 
47 //*****************************************************************************************************************
48 //	special macros for assertion handling
49 //      1)  LOGTYPE                                                         use it to define the output of all assertions, errors, exception infos
50 //      2)  LOGFILE_ASSERTIONS                                              use it to define the file name to log assertions if LOGTYPE=LOGTYPE_FILE...
51 //      3)  LOGFILE_WARNINGS                                                use it to define the file name to log warnings if LOGTYPE=LOGTYPE_FILE...
52 //
53 //      active for "non product":
54 //
55 //      4)  LOG_ASSERT( BCONDITION, STEXT )                                 assert some critical errors wich depend from given condition
56 //      4a) LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )                       same like 4) + additional location of error
57 //      5)  LOG_ERROR( SMETHOD, STEXT )                                     show errors without any condition
58 //
59 //      active for debug only!
60 //
61 //      6)  LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )        show/log an exception for easier debug
62 //      7)  LOG_WARNING( SMETHOD, STEXT )                                   should be used to detect leaks in algorithm, mechanism or operation handling
63 //*****************************************************************************************************************
64 
65 //_________________________________________________________________________________________________________________
66 #if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS )
67 
68 	/*_____________________________________________________________________________________________________________
69 		LOGFILE_ASSERTIONS
70 
71 		For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
72 	_____________________________________________________________________________________________________________*/
73 
74 	#ifndef	LOGFILE_ASSERTIONS
75         #define LOGFILE_ASSERTIONS  "_framework_assertions.log"
76 	#endif
77 
78 	/*_____________________________________________________________________________________________________________
79         LOG_ASSERT ( BCONDITION, STEXT )
80         LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
81 
82 		Forward assertion to logfile (if condition is sal_False - like a DBG_ASSERT!) and continue with program.
83 		Set LOGTYPE to LOGTYPE_FILECONTINUE to do this.
84 		BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
85 	_____________________________________________________________________________________________________________*/
86 	#if	LOGTYPE==LOGTYPE_FILECONTINUE
87 
88 		#define	LOG_ASSERT( BCONDITION, STEXT )																	\
89 					if ( ( BCONDITION ) == sal_False )															\
90 					{																							\
91 						WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT )												\
92 					}
93 
94 		#define	LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )														\
95 					if ( ( BCONDITION ) == sal_True )															\
96 					{																							\
97 						::rtl::OStringBuffer _sAssertBuffer( 256 );												\
98 						_sAssertBuffer.append( "ASSERT:\n\t"	);												\
99 						_sAssertBuffer.append( SMETHOD			);												\
100 						_sAssertBuffer.append( "\n\t\""			);												\
101 						_sAssertBuffer.append( STEXT			);												\
102 						_sAssertBuffer.append( "\"\n"			);												\
103 						WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() )				\
104 					}
105 
106 	#endif
107 
108 	/*_____________________________________________________________________________________________________________
109         LOG_ASSERT ( BCONDITION, STEXT )
110         LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
111 
112 		Forward assertion to file and exit the program.
113 		Set LOGTYPE to LOGTYPE_FILEEXIT to do this.
114 		BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
115 	_____________________________________________________________________________________________________________*/
116 	#if	LOGTYPE==LOGTYPE_FILEEXIT
117 
118 		#define	LOG_ASSERT( BCONDITION, STEXT )																	\
119 					if ( ( BCONDITION ) == sal_False )															\
120 					{																							\
121 						WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT )												\
122 						exit(-1);																				\
123 					}
124 
125 		#define	LOG_ASSERT2( BCONDITION, SMETHODE, STEXT )														\
126 					if ( ( BCONDITION ) == sal_True )															\
127 					{																							\
128 						::rtl::OStringBuffer _sAssertBuffer( 256 );												\
129 						_sAssertBuffer.append( "ASSERT:\n\t"	);												\
130 						_sAssertBuffer.append( SMETHOD			);												\
131 						_sAssertBuffer.append( "\n\t\""			);												\
132 						_sAssertBuffer.append( STEXT			);												\
133 						_sAssertBuffer.append( "\"\n"			);												\
134 						WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() )				\
135 						exit(-1);																				\
136 					}
137 
138 	#endif
139 
140 	/*_____________________________________________________________________________________________________________
141         LOG_ASSERT ( BCONDITION, STEXT )
142         LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
143 
144 		Forward assertions to messagebox. (We use OSL_ENSURE to do this.)
145 		Set LOGTYPE to LOGTYPE_MESSAGEBOX to do this.
146 		BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
147 	_____________________________________________________________________________________________________________*/
148 	#if	LOGTYPE==LOGTYPE_MESSAGEBOX
149 
150 		#define	LOG_ASSERT( BCONDITION, STEXT )																	\
151 					OSL_ENSURE( ( BCONDITION ), STEXT );
152 
153 		#define	LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )														\
154 					{																							\
155 						::rtl::OStringBuffer _sAssertBuffer( 256 );												\
156 						_sAssertBuffer.append( "ASSERT:\n\t"	);												\
157 						_sAssertBuffer.append( SMETHOD			);												\
158 						_sAssertBuffer.append( "\n\t\""			);												\
159 						_sAssertBuffer.append( STEXT			);												\
160 						_sAssertBuffer.append( "\"\n"			);												\
161 						OSL_ENSURE( !( BCONDITION ), _sAssertBuffer.makeStringAndClear() );						\
162 					}
163 
164 	#endif
165 
166 	/*_____________________________________________________________________________________________________________
167         LOG_ERROR( SMETHOD, STEXT )
168 
169 		Show an error by using current set output mode by define LOGTYPE!
170 	_____________________________________________________________________________________________________________*/
171 
172 	#define	LOG_ERROR( SMETHOD, STEXT )																			\
173 				LOG_ASSERT2( sal_True, SMETHOD, STEXT )
174 
175 #else
176 
177     // If right testmode is'nt set - implements these macros empty!
178     #undef  LOGFILE_ASSERTIONS
179 	#define	LOG_ASSERT( BCONDITION, STEXT )
180 	#define	LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
181 	#define	LOG_ERROR( SMETHOD, STEXT )
182 
183 #endif  // ENABLE_ASSERTIONS
184 
185 //_________________________________________________________________________________________________________________
186 #if defined( ENABLE_WARNINGS )
187 
188     /*_____________________________________________________________________________________________________________
189         LOGFILE_WARNINGS
190 
191         For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
192 	_____________________________________________________________________________________________________________*/
193 
194     #ifndef LOGFILE_WARNINGS
195         #define LOGFILE_WARNINGS  "_framework_warnings.log"
196 	#endif
197 
198 	/*_____________________________________________________________________________________________________________
199 		LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )
200 
201 		Show some exception info by using current set output mode by define LOGTYPE!
202 		We use a seperated scope {} do protect us against multiple variable definitions.
203 	_____________________________________________________________________________________________________________*/
204 
205 	#define	LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )											\
206 				{																								\
207 					::rtl::OStringBuffer _sAssertBuffer2( 256 );												\
208 					_sAssertBuffer2.append( SOWNMESSAGE				);											\
209 					_sAssertBuffer2.append( "\n"					);											\
210 					_sAssertBuffer2.append( U2B(SEXCEPTIONMESSAGE)	);											\
211 					LOG_ERROR( SMETHOD, _sAssertBuffer2.makeStringAndClear() )									\
212 				}
213 
214     /*_____________________________________________________________________________________________________________
215         LOG_WARNING( SMETHOD, STEXT )
216 
217         Use it to show/log warnings for programmer for follow reasons:
218             - algorithm errors
219             - undefined states
220             - unknown errors from other modules ...
221 	_____________________________________________________________________________________________________________*/
222 
223     #define LOG_WARNING( SMETHOD, STEXT )                                                                       \
224                 LOG_ERROR( SMETHOD, STEXT )
225 
226 #else
227 
228     // If right testmode is'nt set - implements these macros empty!
229     #undef  LOGFILE_WARNINGS
230     #define LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )
231     #define LOG_WARNING( SMETHOD, STEXT )
232 
233 #endif  // ENABLE_WARNINGS
234 
235 #endif	// #ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
236