idlefw/src/utility/caistrparser.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 31 Mar 2010 22:04:35 +0300
branchRCL_3
changeset 14 15e4dd19031c
parent 0 79c6a41cd166
permissions -rw-r--r--
Revision: 201011 Kit: 201013

/*
* Copyright (c) 2005 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:  Collection of string parsing methods.
*
*/


#include "caistrparser.h"
#include "aistrcnv.h"

// CONSTANTS

const TInt KThreeOctets = 3;
const TInt KTwoOctets = 2;

namespace
    {
    
    _LIT8( KHexPrefix8, "0x" );
    _LIT16( KHexPrefix16, "0x" );
    
    const TInt KMaxOneOctetValue = 0x007F;
    const TInt KMaxTwoOctetValue = 0x07FF;
    
    TInt Utf8OctetCount( const TDesC16& aString )
    	{
        TInt numOctets(0);
        TInt length(aString.Length());
        const TUint16* stringData = aString.Ptr();
            
       	for ( TInt i = 0; i < length; ++i)
        	{
            if (stringData[i] > KMaxOneOctetValue)
            	{
                if (stringData[i] > KMaxTwoOctetValue)
                	{
                    numOctets += KThreeOctets;
                    }
               	else
                    {
                    numOctets += KTwoOctets;
                    }
                }
           	else
               	{
                ++numOctets;
                }
            }
                
      	return numOctets;
       	}
    
    TPtr8 EnsureBufMaxLengthL(HBufC8*& aBuffer, TInt aMaxLength )
        {
        if ( !aBuffer )
            {
            aBuffer = HBufC8::NewL( aMaxLength );
            }
        else if ( aBuffer->Des().MaxLength() < aMaxLength )
            {
            aBuffer = aBuffer->ReAllocL( aMaxLength );
            }
            
        return aBuffer->Des();
        }
    
    }

namespace AiUtility
    {
    
template< class DescType, class LexType > inline
TInt ParseIntImpl
        ( TInt32& aValue, const DescType& aStringValue, 
        const DescType& aHexPrefix )
    {
    const TInt pos = aStringValue.FindF( aHexPrefix );
    if (pos != KErrNotFound)
        {
        LexType lex( aStringValue.Mid( pos + aHexPrefix.Length() ) );
        // Hex parsing needs unsigned int
        TUint32 value = 0;
        const TInt parseResult = lex.Val( value, EHex );
        if ( parseResult == KErrNone )
            {
            aValue = value;
            }
        return parseResult;
        }
    else
        {
        LexType lex( aStringValue );
        return lex.Val(aValue);
        }
    }

EXPORT_C TInt ParseInt( TInt32& aResult, const TDesC8& aSourceString )
    {
    return ParseIntImpl< TDesC8, TLex8 >
        ( aResult, aSourceString, KHexPrefix8 );
    }
	
EXPORT_C TInt ParseInt( TInt32& aResult, const TDesC16& aSourceString )
    {
    return ParseIntImpl< TDesC16, TLex16 >
        ( aResult, aSourceString, KHexPrefix16 );
    }
	
EXPORT_C HBufC16* CopyToBufferL(HBufC16* aTargetBuffer, const TDesC16& aSourceText)
    {
    EnsureBufMaxLengthL( aTargetBuffer, aSourceText.Length() ).Copy( aSourceText );
    
    return aTargetBuffer;
    }
    
EXPORT_C HBufC16* CopyToBufferL(HBufC16* aTargetBuffer, const TDesC8& aSourceText)
    {
    if (!aTargetBuffer)
        {
        return CnvUtfConverter::ConvertToUnicodeFromUtf8L( aSourceText );
        }
        
    TPtr16 des( EnsureBufMaxLengthL( aTargetBuffer, aSourceText.Length() ) );
    
    CnvUtfConverter::ConvertToUnicodeFromUtf8( des, aSourceText );
    
    return aTargetBuffer;
    }
    
EXPORT_C HBufC8* CopyToBufferL(HBufC8* aTargetBuffer, const TDesC8& aSourceText)
    {
    ::EnsureBufMaxLengthL( aTargetBuffer, aSourceText.Length() ).Copy( aSourceText );
    return aTargetBuffer;
    }

EXPORT_C HBufC8* CopyToBufferL(HBufC8* aTargetBuffer, const TDesC16& aSourceText)
    {
    if ( !aTargetBuffer )
        {
        return CnvUtfConverter::ConvertFromUnicodeToUtf8L( aSourceText );
        }
    
    TInt length = Utf8OctetCount( aSourceText );
    
    TPtr8 des( ::EnsureBufMaxLengthL( aTargetBuffer, length ) );    
    CnvUtfConverter::ConvertFromUnicodeToUtf8( des, aSourceText );
    return aTargetBuffer;
    }
    
EXPORT_C TPtr16 EnsureBufMaxLengthL(HBufC16*& aTargetBuffer, TInt aMaxLength )
    {
    if ( !aTargetBuffer )
        {
        aTargetBuffer = HBufC16::NewL( aMaxLength );
        }
    else
        {
        if ( aTargetBuffer->Des().MaxLength() < aMaxLength )
            {
            aTargetBuffer = aTargetBuffer->ReAllocL( aMaxLength );
            }
        }
        
    return aTargetBuffer->Des();
    }

    }


// ---------------------------------------------------------------------------
// CStrParser()
// ---------------------------------------------------------------------------
//
CStrParser::CStrParser()
    {
    }

// ---------------------------------------------------------------------------
// CStrParser* NewL()
// ---------------------------------------------------------------------------
//
CStrParser* CStrParser::NewL()
    { 
    CStrParser* self = new ( ELeave ) CStrParser();
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// void ConstructL()
// ---------------------------------------------------------------------------
//
void CStrParser::ConstructL()
    {
    }

// ---------------------------------------------------------------------------
// void Release()
// ---------------------------------------------------------------------------
//
void CStrParser::Release()
    {
    delete this;
    }
    
// ---------------------------------------------------------------------------
// TInt ParseInt( TInt32& aValue, const TDesC8& aStringValue )
// ---------------------------------------------------------------------------
//
TInt CStrParser::ParseInt( TInt32& aResult, const TDesC8& aSourceString )
    {
    return AiUtility::ParseInt( aResult, aSourceString );
    }

// ---------------------------------------------------------------------------
// HBufC16* CopyToBufferL( HBufC16* aTargetBuffer, const TDesC16& aSourceText )
// ---------------------------------------------------------------------------
//    
HBufC16* CStrParser::CopyToBufferL( HBufC16* aTargetBuffer, const TDesC16& aSourceText )
    {
    return AiUtility::CopyToBufferL( aTargetBuffer, aSourceText );
    }

// ---------------------------------------------------------------------------
// HBufC16* CopyToBufferL( HBufC16* aTargetBuffer, const TDesC8& aSourceText )
// ---------------------------------------------------------------------------
//
HBufC16* CStrParser::CopyToBufferL( HBufC16* aTargetBuffer, const TDesC8& aSourceText )
    {
    return AiUtility::CopyToBufferL( aTargetBuffer, aSourceText );
    }

// ---------------------------------------------------------------------------
// HBufC8* CopyToBufferL( HBufC8* aTargetBuffer, const TDesC8& aSourceText )
// ---------------------------------------------------------------------------
//    
HBufC8* CStrParser::CopyToBufferL( HBufC8* aTargetBuffer, const TDesC8& aSourceText )
    {
    return AiUtility::CopyToBufferL( aTargetBuffer, aSourceText );
    }

// ---------------------------------------------------------------------------
// HBufC8* CopyToBufferL( HBufC8* aTargetBuffer, const TDesC16& aSourceText )
// ---------------------------------------------------------------------------
//
HBufC8* CStrParser::CopyToBufferL( HBufC8* aTargetBuffer, const TDesC16& aSourceText )
    {
    return AiUtility::CopyToBufferL( aTargetBuffer, aSourceText );
    }
    
// End of File.