homescreenpluginsrv/hspstools/src/hspslogbus.cpp
author jake
Tue, 13 Apr 2010 15:07:27 +0300
branchv5backport
changeset 56 7b5c31fac191
parent 0 79c6a41cd166
permissions -rw-r--r--
Many of the components were not compilingm,because bld.inf had undefined flag #ifdef RD_CUSTOMIZABLE_AI. All the flags removed now. Components do not compile right away. E.g. many icons are missing and need to be copied from Symbian3. See example from MCSPlugin. Shortcut plugin does not need to be compiled as MCSPlugin replaces it.

/*
* Copyright (c) 2008 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:  Implementation of ChspsLogBus.
*
*/


#include "hspslogbus.h"

#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
const TInt KMessageGranularity = 256; // initial size and grow-by factor. 
const TInt KMessageSanityLimit = 16384; // 16kb.
_LIT( KLogError, "Warning: Logging failed." );
const TInt KDefaultMaxLineLen = 128;
#endif

//----------------------------------------------------------------------------
// ChspsLogBus::~ChspsLogBus
// ----------------------------------------------------------------------------
//
EXPORT_C ChspsLogBus::~ChspsLogBus()
    {
    }

//----------------------------------------------------------------------------
// ChspsLogBus::LogText
// ----------------------------------------------------------------------------
//
#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
EXPORT_C void ChspsLogBus::LogText( TRefByValue<const TDesC16> aFmt, ... )
    {    
    VA_LIST list;
    VA_START( list, aFmt );
       
    HBufC* formatted = FormatMessage( aFmt, list );    
    if( formatted )
        {
        CropAndLogText( *formatted );
        delete formatted;
        formatted = NULL;
        }
    else
        {
        _LogText( KLogError() );
        }
    
    VA_END( list );    
    }
#else
EXPORT_C void ChspsLogBus::LogText( TRefByValue<const TDesC16> /*aFmt*/, ... )
    {
    }
#endif

//----------------------------------------------------------------------------
// ChspsLogBus::LogText
// ----------------------------------------------------------------------------
//
#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
EXPORT_C void ChspsLogBus::LogText( TRefByValue<const TDesC8> aFmt, ... )
    {    
    VA_LIST list;
    VA_START( list, aFmt );
       
    HBufC* formatted = FormatMessage( aFmt, list );    
    if( formatted )
        {
        CropAndLogText( *formatted );
        delete formatted;
        formatted = NULL;
        }
    else
        {
        _LogText( KLogError() );
        }
    
    VA_END( list );    
    }
#else
EXPORT_C void ChspsLogBus::LogText( TRefByValue<const TDesC8> /*aFmt*/, ... )
    {
    }
#endif

//----------------------------------------------------------------------------
// ChspsLogBus::ChspsLogBus
// ----------------------------------------------------------------------------
//
#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
TInt ChspsLogBus::MaxLineLen() const
    {    
    return KDefaultMaxLineLen;
    }
#else
TInt ChspsLogBus::MaxLineLen() const
    {
    return KErrNotSupported;
    }    
#endif

//----------------------------------------------------------------------------
// ChspsLogBus::ChspsLogBus
// ----------------------------------------------------------------------------
//
EXPORT_C ChspsLogBus::ChspsLogBus()
    {
    // No implementation required
    }

//----------------------------------------------------------------------------
// ChspsLogBus::FormatMessage
// ----------------------------------------------------------------------------
//
#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
HBufC* ChspsLogBus::FormatMessage( TRefByValue<const TDesC16> aFmt, VA_LIST aList )
    {
    HBufC* message = NULL;
    
    TInt messageSize = KMessageGranularity;    
    
    while( ETrue )
        {        
        TRAPD( err, message = HBufC::NewL( messageSize ) );        
        if( err != KErrNone )
            {
            delete message;
            message = NULL;

            break;
            }

        iOverflow = EFalse;
        message->Des().AppendFormatList( aFmt, aList, this );        
        if( !iOverflow )
            {
            // All ok.
            break;
            }
        else
            {
            messageSize *= 2;
            
            delete message;
            message = NULL;

            // Sanity check.
            if( messageSize > KMessageSanityLimit )
                {
                break;
                }            
            }        
        }
    
    return message; 
    }
#else
HBufC* ChspsLogBus::FormatMessage( TRefByValue<const TDesC16> /*aFmt*/, VA_LIST /*aList*/ )
    {
    return NULL;
    }
#endif

//----------------------------------------------------------------------------
// ChspsLogBus::Overflow
// ----------------------------------------------------------------------------
//
void ChspsLogBus::Overflow( TDes16& /*aDes*/ )
    {
    iOverflow = ETrue;
    }

//----------------------------------------------------------------------------
// ChspsLogBus::FormatMessage
// ----------------------------------------------------------------------------
//
#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
HBufC* ChspsLogBus::FormatMessage( TRefByValue<const TDesC8> aFmt, VA_LIST aList )
    {
    HBufC8* message8bit = NULL;
    
    TInt messageSize = KMessageGranularity;    
    
    while( ETrue )
        {        
        TRAPD( err, message8bit = HBufC8::NewL( messageSize ) );        
        if( err != KErrNone )
            {
            delete message8bit;
            message8bit = NULL;

            break;
            }

        iOverflow = EFalse;
        message8bit->Des().AppendFormatList( aFmt, aList, this );        
        if( !iOverflow )
            {
            // All ok.
            break;
            }
        else
            {
            messageSize *= 2;
            
            delete message8bit;
            message8bit = NULL;

            // Sanity check.
            if( messageSize >= KMessageSanityLimit )
                {
                break;
                }            
            }        
        }
    
    // Convert 8bit to 16bit for logging.    
    HBufC* message16bit = NULL;
    if( message8bit && message8bit->Length() > 0 )
        {
        TRAPD( err, message16bit = HBufC::NewL( message8bit->Length() ));
        if( err == KErrNone )
            {
            message16bit->Des().Copy( *message8bit );
            }
        else
            {
            delete message16bit;
            message16bit = NULL;
            }
        }
    else if( message8bit && message8bit->Length() == 0 )
        {
        // Source is empty.
        TRAP_IGNORE( message16bit = KNullDesC().AllocL() );
        }
    
    delete message8bit;
    message8bit = NULL;
    
    return message16bit; 
    }
#else
HBufC* ChspsLogBus::FormatMessage( TRefByValue<const TDesC8> /*aFmt*/, VA_LIST /*aList*/ )
    {
    return NULL;
    }
#endif

//----------------------------------------------------------------------------
// ChspsLogBus::Overflow
// ----------------------------------------------------------------------------
//
void ChspsLogBus::Overflow( TDes8& /*aDes*/ )
    {
    iOverflow = ETrue;
    }

#ifdef HSPS_BUILD_LOG_IMPLEMENTATION
void ChspsLogBus::CropAndLogText( const TDesC& aText )
    {
    const TInt KLineMax = MaxLineLen();
    
    // Fits to one line.
    if( aText.Length() <= KLineMax )
        {
        _LogText( aText );
        return;
        }
    
    // Does not fit. Log cropped.    
    TPtrC ptr = aText;    
    while( ETrue )
        {                
        const TInt KRemainingLen = ptr.Length();
        if( KRemainingLen == 0 )
            {
            break;
            }
        
        if( KRemainingLen <= KLineMax )
            {
            _LogText( ptr );
            break;
            }
        else
            {
            _LogText( ptr.Left( KLineMax ) );
            ptr.Set( ptr.Right( ptr.Length() - KLineMax ) );
            }
        }
    }
#else
void ChspsLogBus::CropAndLogText( const TDesC& /*aText*/ )
    {
    }
#endif