diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIControls/src/CPbk2FieldFormatter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2FieldFormatter.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,416 @@ +/* +* 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 field formatter. +* +*/ + +#include + +// Phonebook 2 +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// System includes +#include +#include + + +/// Unnamed namespace for local definitions +namespace { + +const TInt KBufferLength = 128; + +#ifdef _DEBUG + +enum TPanicCode + { + EPanicPostCond_ReallocBufferL = 1 + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbk2FieldFormatter"); + User::Panic(KPanicText, aReason); + } + +#endif // _DEBUG + +} /// namespace + + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::CPbk2FieldFormatter +// -------------------------------------------------------------------------- +// +inline CPbk2FieldFormatter::CPbk2FieldFormatter + ( const MPbk2FieldPropertyArray& aFieldProperties, + const MVPbkFieldTypeList& aFieldTypeList ): + iFieldProperties( aFieldProperties ), + iFieldTypeList( aFieldTypeList ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::~CPbk2FieldFormatter +// -------------------------------------------------------------------------- +// +CPbk2FieldFormatter::~CPbk2FieldFormatter() + { + delete iTimeFormat; + delete iNumberFormatter; + delete iBuffer; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::ConstructL +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldFormatter::ConstructL() + { + iBuffer = HBufC::NewL( KBufferLength ); + iNumberFormatter = + Pbk2PhoneNumberFormatterFactory::CreatePhoneNumberFormatterL + ( KBufferLength ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::NewL +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2FieldFormatter* CPbk2FieldFormatter::NewL + ( const MPbk2FieldPropertyArray& aFieldProperties, + const MVPbkFieldTypeList& aFieldTypeList ) + { + CPbk2FieldFormatter* self = + new ( ELeave ) CPbk2FieldFormatter + ( aFieldProperties, aFieldTypeList ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatFieldContentL +// -------------------------------------------------------------------------- +// +EXPORT_C TPtrC CPbk2FieldFormatter::FormatFieldContentL + ( const MVPbkBaseContactField& aField, + const MVPbkFieldType& aFieldType ) + { + TPtr text( iBuffer->Des() ); + + switch ( aField.FieldData().DataType() ) + { + case EVPbkFieldStorageTypeText: + { + const MVPbkContactFieldTextData* fieldData = + &MVPbkContactFieldTextData::Cast( aField.FieldData() ); + TPtrC fieldText( fieldData->Text() ); + + if( MatchesFieldTypeL + ( aFieldType, R_PHONEBOOK2_RINGTONE_SELECTOR ) || + MatchesFieldTypeL + ( aFieldType, R_PHONEBOOK2_IMAGE_SELECTOR ) ) + { + FormatFileNameContentL( fieldText,text ); + } + else if ( MatchesFieldTypeL + ( aFieldType, R_PHONEBOOK2_DTMF_SELECTOR ) ) + { + FormatDtmfContentL( fieldText,text ); + } + else if ( MatchesFieldTypeL + ( aFieldType, R_PHONEBOOK2_PHONENUMBER_SELECTOR ) ) + { + FormatPhoneNumberContentL( fieldText, text ); + } + else if ( MatchesFieldTypeL + ( aFieldType, R_PHONEBOOK2_SYNCRONIZATION_SELECTOR ) ) + { + FormatSyncContentL( fieldText, text ); + } + else if ( MatchesFieldTypeL + ( aFieldType, R_PHONEBOOK2_ADDRESS_SELECTOR ) ) + { + FormatAddressContentL( fieldText, text ); + } + else + { + // Default formatting + FormatTextContentL( fieldText, text, aFieldType ); + } + break; + } + + case EVPbkFieldStorageTypeDateTime: + { + const MVPbkContactFieldDateTimeData* fieldData = + &MVPbkContactFieldDateTimeData::Cast + ( aField.FieldData() ); + FormatDateTimeContentL( *fieldData, text ); + break; + } + case EVPbkFieldStorageTypeUri: + { + const MVPbkContactFieldUriData* fieldData = + &MVPbkContactFieldUriData::Cast + ( aField.FieldData() ); + TPtrC fieldText( fieldData->Text() ); + FormatTextContentL( fieldText, text, aFieldType ); + break; + } + default: + { + text.Zero(); + break; + } + } + + return text; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::SetTimeFormatL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2FieldFormatter::SetTimeFormatL( const TDesC& aTimeFormat ) + { + HBufC* timeFormat = aTimeFormat.AllocL(); + delete iTimeFormat; + iTimeFormat = timeFormat; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::ReallocBufferL +// -------------------------------------------------------------------------- +// +TPtr CPbk2FieldFormatter::ReallocBufferL( TInt aNewSize ) + { + const TInt currMaxLength = iBuffer->Des().MaxLength(); + if (aNewSize > currMaxLength) + { + iBuffer = iBuffer->ReAllocL(aNewSize); + } + + // PostCond: + __ASSERT_DEBUG(iBuffer->Des().MaxLength() >= aNewSize, + Panic(EPanicPostCond_ReallocBufferL)); + + return iBuffer->Des(); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::MatchesFieldTypeL +// -------------------------------------------------------------------------- +// +TBool CPbk2FieldFormatter::MatchesFieldTypeL + ( const MVPbkFieldType& aFieldType, TInt aResourceId ) const + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResourceId ); + + CVPbkFieldTypeSelector* selector = CVPbkFieldTypeSelector::NewL + ( reader, iFieldTypeList ); + + // Check if the field type is the one needed + TBool ret = selector->IsFieldTypeIncluded(aFieldType); + CleanupStack::PopAndDestroy(); // resource buffer + delete selector; + return ret; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatPhoneNumberContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatPhoneNumberContentL + ( TPtrC& aRawContent, TPtr& aFormattedContent ) + { + iNumberFormatter->SetMaxBufferLengthL( aRawContent.Length() ); + + TPtrC formattedPhoneNumber + ( iNumberFormatter->FormatPhoneNumberForDisplay( aRawContent ) ); + aFormattedContent.Set( ReallocBufferL( formattedPhoneNumber.Length() ) ); + aFormattedContent.Copy( formattedPhoneNumber ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatDtmfContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatDtmfContentL + ( TPtrC& aRawContent, TPtr& aFormattedContent ) + { + HBufC* numberBuffer = HBufC::NewLC( aRawContent.Length() ); + + TPtr number = numberBuffer->Des(); + number.Copy( aRawContent ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( number ); + + aFormattedContent.Set( ReallocBufferL( number.Length() ) ); + aFormattedContent.Copy( number ); + + CleanupStack::PopAndDestroy( numberBuffer ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatSyncContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatSyncContentL + ( TPtrC& aRawContent, TPtr& aFormattedContent ) + { + if ( !aRawContent.CompareF( KVPbkContactSyncPublic ) ) + { + HBufC* textBuffer = CCoeEnv::Static()->AllocReadResourceLC + ( R_QTN_CALE_CONFIDENT_PUBLIC ); + + TPtr localizedSyncText = textBuffer->Des(); + aFormattedContent.Set( ReallocBufferL + ( localizedSyncText.Length() ) ); + aFormattedContent.Copy( localizedSyncText ); + + CleanupStack::PopAndDestroy( textBuffer ); + } + else if ( !aRawContent.CompareF( KVPbkContactSyncNoSync ) ) + { + HBufC* textBuffer = CCoeEnv::Static()->AllocReadResourceLC + ( R_QTN_CALE_CONFIDENT_NONE ); + + TPtr localizedSyncText = textBuffer->Des(); + aFormattedContent.Set( ReallocBufferL + ( localizedSyncText.Length() ) ); + aFormattedContent.Copy( localizedSyncText ); + + CleanupStack::PopAndDestroy( textBuffer ); + } + else + { + // Otherwise sync setting is the default value - private + HBufC* textBuffer = CCoeEnv::Static()->AllocReadResourceLC + ( R_QTN_CALE_CONFIDENT_PRIVATE ); + + TPtr localizedSyncText = textBuffer->Des(); + aFormattedContent.Set( ReallocBufferL + ( localizedSyncText.Length() ) ); + aFormattedContent.Copy( localizedSyncText ); + + CleanupStack::PopAndDestroy( textBuffer ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatFileNameContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatFileNameContentL + ( TPtrC& aRawContent, TPtr& aFormattedContent ) + { + aFormattedContent.Set( ReallocBufferL ( KMaxFileName ) ); + aFormattedContent.Copy( aRawContent ); + TParsePtr fileNameParser( aFormattedContent ); + TPtrC baseName( fileNameParser.Name() ); + aFormattedContent.Copy( baseName ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatTextContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatTextContentL + ( TPtrC& aRawContent, TPtr& aFormattedContent, + const MVPbkFieldType& aFieldType ) + { + aFormattedContent.Set( ReallocBufferL( aRawContent.Length() ) ); + aFormattedContent.Zero(); + Pbk2PresentationUtils::AppendWithNewlineTranslationL + ( aFormattedContent, aRawContent ); + + // Check is there need to display the digits in the text with + // foreign characters. If the field is of numeric type, + // language specific conversion is needed. + const MPbk2FieldProperty* property = + iFieldProperties.FindProperty( aFieldType ); + + if ( property && + property->EditMode() == EPbk2FieldEditModeNumeric ) + { + AknTextUtils::DisplayTextLanguageSpecificNumberConversion + ( aFormattedContent ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatAddressContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatAddressContentL + ( TPtrC& aRawContent, TPtr& aFormattedContent ) + { + aFormattedContent.Set( ReallocBufferL( aRawContent.Length() ) ); + aFormattedContent.Zero(); + Pbk2PresentationUtils::AppendWithNewlineTranslationL + ( aFormattedContent, aRawContent ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldFormatter::FormatDateTimeContentL +// -------------------------------------------------------------------------- +// +void CPbk2FieldFormatter::FormatDateTimeContentL + ( const MVPbkContactFieldDateTimeData& aRawContent, + TPtr& aFormattedContent ) + { + TInt error = KErrNone; + do + { + TRAPD( error, aRawContent.DateTime().FormatL + ( aFormattedContent, *iTimeFormat ) ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion + ( aFormattedContent ); + + if ( error == KErrOverflow ) + { + // Allocate bigger buffer for formatting text + aFormattedContent.Set( ReallocBufferL + ( 2 * aFormattedContent.MaxLength() ) ); + } + else + { + // Rethrow other errors + User::LeaveIfError( error ); + } + } while ( error == KErrOverflow ); + } + +// End of File