diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/inc/Pbk2Debug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/inc/Pbk2Debug.h Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Phonebook 2 debugging support. +* +*/ + + +#ifndef PBK2DEBUG_H +#define PBK2DEBUG_H + +// INCLUDES +#include +#include +#include + +// MACROS +#ifdef _DEBUG + + /// Helper macro for defining debug-only test code + #define PBK2_DEBUG_ONLY(f) f + + /// Helper macro for calling invariant on function entry and + /// (normal) exit. Declare typedef SelfType as the type of + /// the class you're using this macro in. + #define PBK2_DEBUG_TEST_INVARIANT_ON_ENTRY_AND_EXIT \ + TPbk2DebugCallInvariantOnEntryAndExit \ + pbk2_debug_test_invariant(this) + +#else // _DEBUG + + /// Helper macro for defining debug-only test code (empty release version) + #define PBK2_DEBUG_ONLY(f) + + /// Helper macro for calling invariant on function entry and + /// (normal) exit. This is empty release build version. + #define PBK2_DEBUG_TEST_INVARIANT_ON_ENTRY_AND_EXIT + +#endif // _DEBUG + +/** + * Phonebook 2 debug printing implementation. + * + */ +#ifdef PBK2_ENABLE_DEBUG_PRINT + + // Debug logging is enabled + + /// Warn if this is a release build + #ifndef __WINSCW__ + #ifndef _DEBUG + #if defined(__VC32__) + #pragma message("Warning: Phonebook2 debug printing is on in release build!") + #else // __GCC32__ + #warning "Phonebook2 debug printing is on in release build!" + #endif // __VC32__ + #endif // _DEBUG + #endif // __WINSCW__ + + /// Macro for defining debug-only literal strings + #define PBK2_DEBUG_STRING(s) _L(s) + + #ifdef PBK2_ENABLE_DEBUG_LOGGER + + /// Print to log file + #define PBK2_DEBUG_PRINT Pbk2PrintToLog + + #include + + namespace { + + void Pbk2PrintToLog( TRefByValue aFormat, ... ) + { + _LIT( KLogDir, "Pbk2" ); + _LIT( KLogName, "Pbk2.log" ); + + VA_LIST args; + VA_START( args, aFormat ); + RFileLogger::WriteFormat + (KLogDir, KLogName, EFileLoggingModeAppend, aFormat, args); + VA_END( args ); + } + + } /// namespace + + #else // PBK2_ENABLE_DEBUG_LOGGER + + /// Prints to debugger output + #define PBK2_DEBUG_PRINT RDebug::Print + + #endif // PBK2_ENABLE_DEBUG_LOGGER + +#else // PBK2_ENABLE_DEBUG_PRINT + + /// Dummy struct for checking that all PBK2_DEBUG_PRINT's define string + /// literals using space-saving PBK2_DEBUG_STRING. + struct TPbk2EmptyDebugString { }; + + /// Macro for defining debug-only literal strings (empty release version) + #define PBK2_DEBUG_STRING(s) TPbk2EmptyDebugString() + + /// Empty debug print function for release builds. + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2,T3) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2,T3,T4) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2,T3,T4,T5) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2,T3,T4,T5,T6) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2,T3,T4,T5,T6,T7) + { + } + + /// Empty debug print function for release builds. + template + inline void PBK2_DEBUG_PRINT(TPbk2EmptyDebugString,T1,T2,T3,T4,T5,T6,T7,T8) + { + } + +#endif // PBK2_ENABLE_DEBUG_PRINT + +#ifdef _DEBUG + + /// Asserts and checks that statement doesn't allocate any memory. + /// If allocation happens evaluates failed. + #define PBK2_ASSERT_NO_ALLOC(statement,failed) \ + { __UHEAP_FAILNEXT(1); \ + TRAPD(err, statement); \ + __UHEAP_RESET; \ + if (err==KErrNoMemory) { failed; } } + +#else // _DEBUG + + /// Release version of macro. Just executes the statement. + #define PBK2_ASSERT_NO_ALLOC(statement,failed) statement + +#endif // _DEBUG + + +// CLASS DECLARATION + +/** + * Helper class for calling class invariant automatically on function + * entry and exit. + */ +template +class TPbk2DebugCallInvariantOnEntryAndExit + { + public: // Construction and destruction + + /** + * Constructor. + * + * @param aObj The object. + */ + inline TPbk2DebugCallInvariantOnEntryAndExit( const T* aObj ): + iObj( aObj ) + { + iObj->__DbgTestInvariant(); + } + + /** + * Destructor. + */ + inline ~TPbk2DebugCallInvariantOnEntryAndExit() + { + iObj->__DbgTestInvariant(); + } + + private: // Data + /// Ref: The object + const T* iObj; + }; + +#endif // PBK2DEBUG_H + +// End of File