/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
#define __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_

//_________________________________________________________________________________________________________________
//  includes
//_________________________________________________________________________________________________________________

#if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS )

    #ifndef _OSL_DIAGNOSE_H_
    #include <osl/diagnose.h>
    #endif

    #ifndef _RTL_STRBUF_HXX_
    #include <rtl/strbuf.hxx>
    #endif

#endif

//*****************************************************************************************************************
//	special macros for assertion handling
//      1)  LOGTYPE                                                         use it to define the output of all assertions, errors, exception infos
//      2)  LOGFILE_ASSERTIONS                                              use it to define the file name to log assertions if LOGTYPE=LOGTYPE_FILE...
//      3)  LOGFILE_WARNINGS                                                use it to define the file name to log warnings if LOGTYPE=LOGTYPE_FILE...
//
//      active for "non product":
//
//      4)  LOG_ASSERT( BCONDITION, STEXT )                                 assert some critical errors wich depend from given condition
//      4a) LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )                       same like 4) + additional location of error
//      5)  LOG_ERROR( SMETHOD, STEXT )                                     show errors without any condition
//
//      active for debug only!
//
//      6)  LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )        show/log an exception for easier debug
//      7)  LOG_WARNING( SMETHOD, STEXT )                                   should be used to detect leaks in algorithm, mechanism or operation handling
//*****************************************************************************************************************

//_________________________________________________________________________________________________________________
#if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS )

	/*_____________________________________________________________________________________________________________
		LOGFILE_ASSERTIONS

		For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
	_____________________________________________________________________________________________________________*/

	#ifndef	LOGFILE_ASSERTIONS
        #define LOGFILE_ASSERTIONS  "_framework_assertions.log"
	#endif

	/*_____________________________________________________________________________________________________________
        LOG_ASSERT ( BCONDITION, STEXT )
        LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )

		Forward assertion to logfile (if condition is sal_False - like a DBG_ASSERT!) and continue with program.
		Set LOGTYPE to LOGTYPE_FILECONTINUE to do this.
		BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
	_____________________________________________________________________________________________________________*/
	#if	LOGTYPE==LOGTYPE_FILECONTINUE

		#define	LOG_ASSERT( BCONDITION, STEXT )																	\
					if ( ( BCONDITION ) == sal_False )															\
					{																							\
						WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT )												\
					}

		#define	LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )														\
					if ( ( BCONDITION ) == sal_True )															\
					{																							\
						::rtl::OStringBuffer _sAssertBuffer( 256 );												\
						_sAssertBuffer.append( "ASSERT:\n\t"	);												\
						_sAssertBuffer.append( SMETHOD			);												\
						_sAssertBuffer.append( "\n\t\""			);												\
						_sAssertBuffer.append( STEXT			);												\
						_sAssertBuffer.append( "\"\n"			);												\
						WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() )				\
					}

	#endif

	/*_____________________________________________________________________________________________________________
        LOG_ASSERT ( BCONDITION, STEXT )
        LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )

		Forward assertion to file and exit the program.
		Set LOGTYPE to LOGTYPE_FILEEXIT to do this.
		BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
	_____________________________________________________________________________________________________________*/
	#if	LOGTYPE==LOGTYPE_FILEEXIT

		#define	LOG_ASSERT( BCONDITION, STEXT )																	\
					if ( ( BCONDITION ) == sal_False )															\
					{																							\
						WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT )												\
						exit(-1);																				\
					}

		#define	LOG_ASSERT2( BCONDITION, SMETHODE, STEXT )														\
					if ( ( BCONDITION ) == sal_True )															\
					{																							\
						::rtl::OStringBuffer _sAssertBuffer( 256 );												\
						_sAssertBuffer.append( "ASSERT:\n\t"	);												\
						_sAssertBuffer.append( SMETHOD			);												\
						_sAssertBuffer.append( "\n\t\""			);												\
						_sAssertBuffer.append( STEXT			);												\
						_sAssertBuffer.append( "\"\n"			);												\
						WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() )				\
						exit(-1);																				\
					}

	#endif

	/*_____________________________________________________________________________________________________________
        LOG_ASSERT ( BCONDITION, STEXT )
        LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )

		Forward assertions to messagebox. (We use OSL_ENSURE to do this.)
		Set LOGTYPE to LOGTYPE_MESSAGEBOX to do this.
		BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
	_____________________________________________________________________________________________________________*/
	#if	LOGTYPE==LOGTYPE_MESSAGEBOX

		#define	LOG_ASSERT( BCONDITION, STEXT )																	\
					OSL_ENSURE( ( BCONDITION ), STEXT );

		#define	LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )														\
					{																							\
						::rtl::OStringBuffer _sAssertBuffer( 256 );												\
						_sAssertBuffer.append( "ASSERT:\n\t"	);												\
						_sAssertBuffer.append( SMETHOD			);												\
						_sAssertBuffer.append( "\n\t\""			);												\
						_sAssertBuffer.append( STEXT			);												\
						_sAssertBuffer.append( "\"\n"			);												\
						OSL_ENSURE( !( BCONDITION ), _sAssertBuffer.getStr() );						\
					}

	#endif

	/*_____________________________________________________________________________________________________________
        LOG_ERROR( SMETHOD, STEXT )

		Show an error by using current set output mode by define LOGTYPE!
	_____________________________________________________________________________________________________________*/

	#define	LOG_ERROR( SMETHOD, STEXT )																			\
				LOG_ASSERT2( sal_True, SMETHOD, STEXT )

#else

    // If right testmode is'nt set - implements these macros empty!
    #undef  LOGFILE_ASSERTIONS
	#define	LOG_ASSERT( BCONDITION, STEXT )
	#define	LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
	#define	LOG_ERROR( SMETHOD, STEXT )

#endif  // ENABLE_ASSERTIONS

//_________________________________________________________________________________________________________________
#if defined( ENABLE_WARNINGS )

    /*_____________________________________________________________________________________________________________
        LOGFILE_WARNINGS

        For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
	_____________________________________________________________________________________________________________*/

    #ifndef LOGFILE_WARNINGS
        #define LOGFILE_WARNINGS  "_framework_warnings.log"
	#endif

	/*_____________________________________________________________________________________________________________
		LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )

		Show some exception info by using current set output mode by define LOGTYPE!
		We use a seperated scope {} do protect us against multiple variable definitions.
	_____________________________________________________________________________________________________________*/

	#define	LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )											\
				{																								\
					::rtl::OStringBuffer _sAssertBuffer2( 256 );												\
					_sAssertBuffer2.append( SOWNMESSAGE				);											\
					_sAssertBuffer2.append( "\n"					);											\
					_sAssertBuffer2.append( U2B(SEXCEPTIONMESSAGE)	);											\
					LOG_ERROR( SMETHOD, _sAssertBuffer2.makeStringAndClear() )									\
				}

    /*_____________________________________________________________________________________________________________
        LOG_WARNING( SMETHOD, STEXT )

        Use it to show/log warnings for programmer for follow reasons:
            - algorithm errors
            - undefined states
            - unknown errors from other modules ...
	_____________________________________________________________________________________________________________*/

    #define LOG_WARNING( SMETHOD, STEXT )                                                                       \
                LOG_ERROR( SMETHOD, STEXT )

#else

    // If right testmode is'nt set - implements these macros empty!
    #undef  LOGFILE_WARNINGS
    #define LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )
    #define LOG_WARNING( SMETHOD, STEXT )

#endif  // ENABLE_WARNINGS

#endif	// #ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
