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 __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_ 25*b1cdbd2cSJim Jagielski #define __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_ 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 28*b1cdbd2cSJim Jagielski // includes 29*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS ) 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski #ifndef _OSL_DIAGNOSE_H_ 34*b1cdbd2cSJim Jagielski #include <osl/diagnose.h> 35*b1cdbd2cSJim Jagielski #endif 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski #ifndef _RTL_STRBUF_HXX_ 38*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx> 39*b1cdbd2cSJim Jagielski #endif 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski #endif 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski //***************************************************************************************************************** 44*b1cdbd2cSJim Jagielski // special macros for assertion handling 45*b1cdbd2cSJim Jagielski // 1) LOGTYPE use it to define the output of all assertions, errors, exception infos 46*b1cdbd2cSJim Jagielski // 2) LOGFILE_ASSERTIONS use it to define the file name to log assertions if LOGTYPE=LOGTYPE_FILE... 47*b1cdbd2cSJim Jagielski // 3) LOGFILE_WARNINGS use it to define the file name to log warnings if LOGTYPE=LOGTYPE_FILE... 48*b1cdbd2cSJim Jagielski // 49*b1cdbd2cSJim Jagielski // active for "non product": 50*b1cdbd2cSJim Jagielski // 51*b1cdbd2cSJim Jagielski // 4) LOG_ASSERT( BCONDITION, STEXT ) assert some critical errors wich depend from given condition 52*b1cdbd2cSJim Jagielski // 4a) LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) same like 4) + additional location of error 53*b1cdbd2cSJim Jagielski // 5) LOG_ERROR( SMETHOD, STEXT ) show errors without any condition 54*b1cdbd2cSJim Jagielski // 55*b1cdbd2cSJim Jagielski // active for debug only! 56*b1cdbd2cSJim Jagielski // 57*b1cdbd2cSJim Jagielski // 6) LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE ) show/log an exception for easier debug 58*b1cdbd2cSJim Jagielski // 7) LOG_WARNING( SMETHOD, STEXT ) should be used to detect leaks in algorithm, mechanism or operation handling 59*b1cdbd2cSJim Jagielski //***************************************************************************************************************** 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 62*b1cdbd2cSJim Jagielski #if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS ) 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 65*b1cdbd2cSJim Jagielski LOGFILE_ASSERTIONS 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski For follow macros we need a special log file. If user forget to specify anyone, we must do it for him! 68*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski #ifndef LOGFILE_ASSERTIONS 71*b1cdbd2cSJim Jagielski #define LOGFILE_ASSERTIONS "_framework_assertions.log" 72*b1cdbd2cSJim Jagielski #endif 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 75*b1cdbd2cSJim Jagielski LOG_ASSERT ( BCONDITION, STEXT ) 76*b1cdbd2cSJim Jagielski LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski Forward assertion to logfile (if condition is sal_False - like a DBG_ASSERT!) and continue with program. 79*b1cdbd2cSJim Jagielski Set LOGTYPE to LOGTYPE_FILECONTINUE to do this. 80*b1cdbd2cSJim Jagielski BCONDITION is inserted in "(...)" because user can call this macro with an complex expression! 81*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 82*b1cdbd2cSJim Jagielski #if LOGTYPE==LOGTYPE_FILECONTINUE 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski #define LOG_ASSERT( BCONDITION, STEXT ) \ 85*b1cdbd2cSJim Jagielski if ( ( BCONDITION ) == sal_False ) \ 86*b1cdbd2cSJim Jagielski { \ 87*b1cdbd2cSJim Jagielski WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT ) \ 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski #define LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) \ 91*b1cdbd2cSJim Jagielski if ( ( BCONDITION ) == sal_True ) \ 92*b1cdbd2cSJim Jagielski { \ 93*b1cdbd2cSJim Jagielski ::rtl::OStringBuffer _sAssertBuffer( 256 ); \ 94*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "ASSERT:\n\t" ); \ 95*b1cdbd2cSJim Jagielski _sAssertBuffer.append( SMETHOD ); \ 96*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "\n\t\"" ); \ 97*b1cdbd2cSJim Jagielski _sAssertBuffer.append( STEXT ); \ 98*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "\"\n" ); \ 99*b1cdbd2cSJim Jagielski WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() ) \ 100*b1cdbd2cSJim Jagielski } 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski #endif 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 105*b1cdbd2cSJim Jagielski LOG_ASSERT ( BCONDITION, STEXT ) 106*b1cdbd2cSJim Jagielski LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski Forward assertion to file and exit the program. 109*b1cdbd2cSJim Jagielski Set LOGTYPE to LOGTYPE_FILEEXIT to do this. 110*b1cdbd2cSJim Jagielski BCONDITION is inserted in "(...)" because user can call this macro with an complex expression! 111*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 112*b1cdbd2cSJim Jagielski #if LOGTYPE==LOGTYPE_FILEEXIT 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski #define LOG_ASSERT( BCONDITION, STEXT ) \ 115*b1cdbd2cSJim Jagielski if ( ( BCONDITION ) == sal_False ) \ 116*b1cdbd2cSJim Jagielski { \ 117*b1cdbd2cSJim Jagielski WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT ) \ 118*b1cdbd2cSJim Jagielski exit(-1); \ 119*b1cdbd2cSJim Jagielski } 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski #define LOG_ASSERT2( BCONDITION, SMETHODE, STEXT ) \ 122*b1cdbd2cSJim Jagielski if ( ( BCONDITION ) == sal_True ) \ 123*b1cdbd2cSJim Jagielski { \ 124*b1cdbd2cSJim Jagielski ::rtl::OStringBuffer _sAssertBuffer( 256 ); \ 125*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "ASSERT:\n\t" ); \ 126*b1cdbd2cSJim Jagielski _sAssertBuffer.append( SMETHOD ); \ 127*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "\n\t\"" ); \ 128*b1cdbd2cSJim Jagielski _sAssertBuffer.append( STEXT ); \ 129*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "\"\n" ); \ 130*b1cdbd2cSJim Jagielski WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() ) \ 131*b1cdbd2cSJim Jagielski exit(-1); \ 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski #endif 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 137*b1cdbd2cSJim Jagielski LOG_ASSERT ( BCONDITION, STEXT ) 138*b1cdbd2cSJim Jagielski LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski Forward assertions to messagebox. (We use OSL_ENSURE to do this.) 141*b1cdbd2cSJim Jagielski Set LOGTYPE to LOGTYPE_MESSAGEBOX to do this. 142*b1cdbd2cSJim Jagielski BCONDITION is inserted in "(...)" because user can call this macro with an complex expression! 143*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 144*b1cdbd2cSJim Jagielski #if LOGTYPE==LOGTYPE_MESSAGEBOX 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski #define LOG_ASSERT( BCONDITION, STEXT ) \ 147*b1cdbd2cSJim Jagielski OSL_ENSURE( ( BCONDITION ), STEXT ); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski #define LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) \ 150*b1cdbd2cSJim Jagielski { \ 151*b1cdbd2cSJim Jagielski ::rtl::OStringBuffer _sAssertBuffer( 256 ); \ 152*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "ASSERT:\n\t" ); \ 153*b1cdbd2cSJim Jagielski _sAssertBuffer.append( SMETHOD ); \ 154*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "\n\t\"" ); \ 155*b1cdbd2cSJim Jagielski _sAssertBuffer.append( STEXT ); \ 156*b1cdbd2cSJim Jagielski _sAssertBuffer.append( "\"\n" ); \ 157*b1cdbd2cSJim Jagielski OSL_ENSURE( !( BCONDITION ), _sAssertBuffer.getStr() ); \ 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski #endif 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 163*b1cdbd2cSJim Jagielski LOG_ERROR( SMETHOD, STEXT ) 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski Show an error by using current set output mode by define LOGTYPE! 166*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski #define LOG_ERROR( SMETHOD, STEXT ) \ 169*b1cdbd2cSJim Jagielski LOG_ASSERT2( sal_True, SMETHOD, STEXT ) 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski #else 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski // If right testmode is'nt set - implements these macros empty! 174*b1cdbd2cSJim Jagielski #undef LOGFILE_ASSERTIONS 175*b1cdbd2cSJim Jagielski #define LOG_ASSERT( BCONDITION, STEXT ) 176*b1cdbd2cSJim Jagielski #define LOG_ASSERT2( BCONDITION, SMETHOD, STEXT ) 177*b1cdbd2cSJim Jagielski #define LOG_ERROR( SMETHOD, STEXT ) 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski #endif // ENABLE_ASSERTIONS 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 182*b1cdbd2cSJim Jagielski #if defined( ENABLE_WARNINGS ) 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 185*b1cdbd2cSJim Jagielski LOGFILE_WARNINGS 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski For follow macros we need a special log file. If user forget to specify anyone, we must do it for him! 188*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski #ifndef LOGFILE_WARNINGS 191*b1cdbd2cSJim Jagielski #define LOGFILE_WARNINGS "_framework_warnings.log" 192*b1cdbd2cSJim Jagielski #endif 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 195*b1cdbd2cSJim Jagielski LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE ) 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski Show some exception info by using current set output mode by define LOGTYPE! 198*b1cdbd2cSJim Jagielski We use a seperated scope {} do protect us against multiple variable definitions. 199*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski #define LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE ) \ 202*b1cdbd2cSJim Jagielski { \ 203*b1cdbd2cSJim Jagielski ::rtl::OStringBuffer _sAssertBuffer2( 256 ); \ 204*b1cdbd2cSJim Jagielski _sAssertBuffer2.append( SOWNMESSAGE ); \ 205*b1cdbd2cSJim Jagielski _sAssertBuffer2.append( "\n" ); \ 206*b1cdbd2cSJim Jagielski _sAssertBuffer2.append( U2B(SEXCEPTIONMESSAGE) ); \ 207*b1cdbd2cSJim Jagielski LOG_ERROR( SMETHOD, _sAssertBuffer2.makeStringAndClear() ) \ 208*b1cdbd2cSJim Jagielski } 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski /*_____________________________________________________________________________________________________________ 211*b1cdbd2cSJim Jagielski LOG_WARNING( SMETHOD, STEXT ) 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski Use it to show/log warnings for programmer for follow reasons: 214*b1cdbd2cSJim Jagielski - algorithm errors 215*b1cdbd2cSJim Jagielski - undefined states 216*b1cdbd2cSJim Jagielski - unknown errors from other modules ... 217*b1cdbd2cSJim Jagielski _____________________________________________________________________________________________________________*/ 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski #define LOG_WARNING( SMETHOD, STEXT ) \ 220*b1cdbd2cSJim Jagielski LOG_ERROR( SMETHOD, STEXT ) 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski #else 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski // If right testmode is'nt set - implements these macros empty! 225*b1cdbd2cSJim Jagielski #undef LOGFILE_WARNINGS 226*b1cdbd2cSJim Jagielski #define LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE ) 227*b1cdbd2cSJim Jagielski #define LOG_WARNING( SMETHOD, STEXT ) 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski #endif // ENABLE_WARNINGS 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski #endif // #ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_ 232