diff -r 000000000000 -r e686773b3f54 logsui/AppSrc/CPhoneNumberFormat.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/AppSrc/CPhoneNumberFormat.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,288 @@ +/* +* Copyright (c) 2002 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 for number formatting +* +*/ + + +// INCLUDE FILES +#include +#include + +#include "CPhoneNumberFormat.h" +#include "LogsConstants.hrh" + +#include +#include // IDs + +#include +#include + + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +const TInt KDTMF1 ='w'; +const TInt KDTMF2 ='W'; +const TInt KDTMF3 ='p'; +const TInt KDTMF4 ='P'; + +const TInt KSS1 ='#'; +const TInt KSS2 ='*'; + +// CONSTANTS FOR DEBUGGING +#ifdef _DEBUG +_LIT( KPanic, "CPhoneNumberFormat"); +#endif + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// ================= MEMBER FUNCTIONS ======================= + +/** +* Class used for phone number formatting +*/ + + + +CPhoneNumberFormat* CPhoneNumberFormat::NewL() + { + CPhoneNumberFormat* self = new ( ELeave ) CPhoneNumberFormat(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); // self + return self; + } + + +// C++ default constructor cannot contain any code that might leave +CPhoneNumberFormat::CPhoneNumberFormat() + { + } + + +// Destructor +CPhoneNumberFormat::~CPhoneNumberFormat() + { + if (iNumberGrouping) + { + delete iNumberGrouping; + } + } + + +// Constructor for the recent views, second phase +void CPhoneNumberFormat::ConstructL() + { + CRepository* repository = NULL; + TInt value( 0 ); + TRAPD( err, repository = CRepository::NewL( KCRUidNumberGrouping ) ); + + if( err == KErrNone ) + { + err = repository->Get( KNumberGrouping, value ); + } + delete repository; + + if( value == 1 ) + { + iNumberGrouping = CPNGNumberGrouping::NewL( KLogsPhoneNumberMaxLen ); + } + else + { + iNumberGrouping = NULL; + } + } + + +TFormatResult CPhoneNumberFormat::DescriptorCopy + ( const TDesC& aSource + , TDes& aDestination + ) + { + TFormatResult rc( EResultOK ); + + if( aDestination.MaxLength() < aSource.Length() ) + { + rc = EResultTruncated; + aDestination = aSource.Right( aSource.Length() - + ( aSource.Length() - aDestination.MaxLength() ) + ); + } + else + { + aDestination = aSource; + } + + return rc; + } + + +TFormatResult CPhoneNumberFormat::PhoneNumberFormat + ( TPtrC aNumberToFormat + , TDes& aFormattedString + ) + { + TFormatResult rc( EResultOK ); + + if( iNumberGrouping ) + { + TBuf buf; + rc = DescriptorCopy( aNumberToFormat, buf ); //Src, dest + AknTextUtils::LanguageSpecificNumberConversion( buf ); + iNumberGrouping->Set( buf ); + + rc = DescriptorCopy( iNumberGrouping->FormattedNumber(), + aFormattedString); + } + else + { + rc = DescriptorCopy( aNumberToFormat, aFormattedString ); //Src, dest + AknTextUtils::LanguageSpecificNumberConversion( aFormattedString ); + } + + return rc; + } + + +TFormatResult CPhoneNumberFormat::PhoneNumberFormat + ( TPtrC aNumberToFormat + , TDes& aFormattedString + , const CFont* aFont + , TInt aPixelWidth + ) + { + TFormatResult rc = PhoneNumberFormat( aNumberToFormat, aFormattedString ); + if( AknTextUtils::ClipToFit + ( aFormattedString + , *aFont + , aPixelWidth + , AknTextUtils::EClipFromBeginning ) ) + { + rc = EResultClipped; + } + + return rc; + } + + +TFormatResult CPhoneNumberFormat::PhoneNumberFormat + ( TPtrC aNumberToFormat + , TDes& aFormattedString + , AknTextUtils::TClipDirection aClipDirection + , CEikFormattedCellListBox *aListBox + , TInt aItemIndex + , TInt aSubCellNumber + ) + { + TFormatResult rc = PhoneNumberFormat( aNumberToFormat, aFormattedString ); + if( AknTextUtils::ClipToFit + ( aFormattedString + , aClipDirection + , aListBox + , aItemIndex + , aSubCellNumber + ) ) + { + rc = EResultClipped; + } + + return rc; + } + + +TFormatResult CPhoneNumberFormat::PhoneNumberFormat + ( TPtrC aNumberToFormat + , TDes& aFormattedString + , AknTextUtils::TClipDirection aClipDirection + , CEikColumnListBox *aListBox + , TInt aItemIndex + , TInt aColumnNumber + ) + { + TFormatResult rc = PhoneNumberFormat( aNumberToFormat, aFormattedString ); + if( AknTextUtils::ClipToFit + ( aFormattedString + , aClipDirection + , aListBox + , aItemIndex + , aColumnNumber + ) ) + { + rc = EResultClipped; + } + + return rc; + } + +TInt CPhoneNumberFormat::IsDtmf( TChar aChar ) + { + return aChar == KDTMF1 || aChar == KDTMF2 || aChar == KDTMF3 || aChar == KDTMF4; + } + +TInt CPhoneNumberFormat::IsSS( TChar aChar ) + { + return aChar == KSS1 || aChar == KSS2; + } + +TInt CPhoneNumberFormat::DTMFStrip( + TPtrC aNumberToFormat, + TDes& aFormattedString ) + { + + // __ASSERT_DEBUG( aFormattedString.MaxLength() >= aNumberToFormat.Length(), User::Panic(KPanic, KErrCorrupt)); + + TInt start = 0; + if ( aFormattedString.MaxLength() < aNumberToFormat.Length() ) + { + start = aNumberToFormat.Length() - aFormattedString.MaxLength(); + } + + aFormattedString.Zero(); + TBool ss(EFalse); + TBool dtmf(EFalse); + TChar prevChar(' '); + for( TInt i = start ; i < aNumberToFormat.Length() && !dtmf ; i ++ ) + { + dtmf = IsDtmf( aNumberToFormat[i] ); + if( IsSS( aNumberToFormat[i] ) && !IsSS(prevChar) ) + { + ss ? ss = EFalse: ss = ETrue; + } + + if( !dtmf && !ss && !IsSS(aNumberToFormat[i])) + { + aFormattedString.Append(aNumberToFormat[i] ); + } + prevChar = aNumberToFormat[i]; + } + if( aFormattedString.Length() == 0 && (dtmf || ss) ) + { // fallback, full string shown since invalid phone number. + aFormattedString = aNumberToFormat; + return KErrArgument; + } + return KErrNone; + } + +// End of File