diff -r 000000000000 -r 5f000ab63145 phoneuis/Ussd/src/UssdNaviPane.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/Ussd/src/UssdNaviPane.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,313 @@ +/* +* 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: Declares navi pane control for application. +* +*/ + + +// INCLUDE FILES +#include // CCnvCharacterSetConverter +#include // CAknEnv +#include // CAknNavigationDecorator +#include +#include +#include +#include "UssdComms.h" + +#include "UssdAppUi.h" +#include "UssdNaviPane.h" + +#include +// CONSTANTS + +// Unicode char codes for GSM 03.38 7 bit ext table characters +static const TUint KUssdEdEuroSymbol = 0x20ac; +static const TUint KUssdEdLeftSquareBracket = 0x5b; +static const TUint KUssdEdReverseSolidus = 0x5c; +static const TUint KUssdEdRightSquareBracket = 0x5d; +static const TUint KUssdEdCircumflexAccent = 0x5e; +static const TUint KUssdEdLeftCurlyBracket = 0x7b; +static const TUint KUssdEdVerticalLine = 0x7c; +static const TUint KUssdEdRightCurlyBracket = 0x7d; +static const TUint KUssdEdTilde = 0x7e; +static const TUint KUssdDownwardsArrowLeft = 0x21B2; +static const TUint KUssdDownwardsArrowRight = 0x21B3; +static const TUint KUssdCharDwithLine = 0xD0; +static const TUint KUssdCharBigRhoo = 0xDE; +static const TUint KUssdCharSmallDelta = 0xF0; +static const TUint KUssdCharSmallFii = 0xFE; +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUssdNaviPane::CUssdNaviPane +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUssdNaviPane::CUssdNaviPane( CUssdAppUi& aAppUi ): iAppUi( aAppUi ) + { + } + +// ----------------------------------------------------------------------------- +// CUssdNaviPane::NewL +// +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CUssdNaviPane* CUssdNaviPane::NewL( CUssdAppUi& aAppUi ) + { + CUssdNaviPane* self = new ( ELeave ) CUssdNaviPane( aAppUi ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CUssdNaviPane::ConstructL +// +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUssdNaviPane::ConstructL() + { + + CreateExtraNaviLabelL(); + + iCharacterSetConverter = CCnvCharacterSetConverter::NewL(); + + iCharacterSetConverter->PrepareToConvertToOrFromL( + KCharacterSetIdentifierSms7Bit, + iCoeEnv->FsSession() ); + + iCharacterSetConverter->SetDowngradeForExoticLineTerminatingCharacters( + CCnvCharacterSetConverter::EDowngradeExoticLineTerminatingCharactersToJustLineFeed ); + + } + +// ----------------------------------------------------------------------------- +// CUssdNaviPane::~CUssdNaviPane +// +// Destructor +// ----------------------------------------------------------------------------- +// +CUssdNaviPane::~CUssdNaviPane() + { + + if ( iNaviPane && iNaviDecorator ) + { + iNaviPane->Pop( iNaviDecorator ); + delete iNaviDecorator; + iNaviDecorator = NULL; + iNaviPane = NULL; + } + + delete iCharacterSetConverter; + iCharacterSetConverter = NULL; + + iNaviLabel = NULL; + + } + +// ---------------------------------------------------- +// CUssdNaviPane::CreateExtraNaviLabelL +// Creates an extra navi label. +// (other items were commented in a header). +// ---------------------------------------------------- +// +void CUssdNaviPane::CreateExtraNaviLabelL() + { + + CEikStatusPane* sp = iAppUi.StatusPane(); + iNaviPane = static_cast( + sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + + iNaviDecorator = iNaviPane->CreateNavigationLabelL( + KNullDesC ); + iNaviLabel = static_cast( + iNaviDecorator->DecoratedControl() ); + iNaviPane->PushL( *iNaviDecorator ) ; + + } + +// --------------------------------------------------------- +// CUssdNaviPane::UpdateMsgLengthL +// Update the message length information to navipane +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CUssdNaviPane::UpdateMsgLengthL( const TDesC& aInputString, + CCoeControl* aControl ) + { + TInt maxLen(0); + const TInt txtLen = aInputString.Length(); + + HBufC* digitBuffer = HBufC::NewLC( EAknMaxIntegerDigits ); + TPtr bufPtr( digitBuffer->Des() ); + + if ( NeedsToBeSentAsUnicodeL( aInputString ) ) + { + bufPtr.AppendNum( KUssdEditorMaxLenght/2 - txtLen ); + maxLen=KUssdEditorMaxLenght/2; + } + else + { + TInt extendedCount = CountExtendedTableChars( aInputString ); + TInt totalLen = KUssdEditorMaxLenght - ( txtLen + extendedCount ); + if ( totalLen < 0 ) // last was alphabet extended when one left + { + GenerateBackSpaceKeyL( aControl ); + extendedCount--; + totalLen = totalLen+2; + } + bufPtr.AppendNum( totalLen ); + maxLen=KUssdEditorMaxLenght-extendedCount; + } + + AknTextUtils::LanguageSpecificNumberConversion( bufPtr ); + + // Giving msg length string to indicator container + MAknEditingStateIndicator* stateIndicator = + iAvkonEnv->EditingStateIndicator(); + if ( stateIndicator ) + { + CAknIndicatorContainer* iIndicatorContainerSMS = + stateIndicator->IndicatorContainer(); + if ( iIndicatorContainerSMS ) + { + iIndicatorContainerSMS->SetIndicatorState( + TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ), + EAknIndicatorStateOn ); + iIndicatorContainerSMS->SetIndicatorValueL( + TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ), + *digitBuffer ); + } + } + + iNaviLabel->SetTextL( *digitBuffer ); + CleanupStack::PopAndDestroy( digitBuffer ); + + return maxLen; + } + + +// --------------------------------------------------------- +// CUssdNaviPane::NeedsToBeSentAsUnicodeL +// Checks if there are any unicode characters in the message +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CUssdNaviPane::NeedsToBeSentAsUnicodeL( const TDesC& aInputString ) const + { + + TBool needsToBeSentAsUnicode = EFalse; + + for ( TPtrC remainderOfInputString( aInputString ); + remainderOfInputString.Length()>0 ; ) + { + TBuf8 notUsedForeignParam; + TInt numberOfUnconvertibleCharacters = 0; + const TInt returnValue = + iCharacterSetConverter->ConvertFromUnicode( + notUsedForeignParam, + remainderOfInputString, + numberOfUnconvertibleCharacters ); + if ( ( returnValue < 0 ) || + ( numberOfUnconvertibleCharacters > 0 )) + // if there was an error in trying to do the conversion, or if + // there was an unconvertible character (e.g. a Chinese character) + { + TUint uChar; + for ( TInt i = 0;i < remainderOfInputString.Length();i++ ) + { + uChar = TUint( remainderOfInputString[ i ] ); + if ( uChar == KUssdDownwardsArrowLeft || + uChar == KUssdDownwardsArrowRight || + uChar == KUssdCharDwithLine || + uChar == KUssdCharBigRhoo || + uChar == KUssdCharSmallDelta || + uChar == KUssdCharSmallFii ) + { + numberOfUnconvertibleCharacters--; + } + } + + if ( returnValue < 0 || numberOfUnconvertibleCharacters > 0 ) + { + // if there was an error in trying to do the conversion, or if there was an + // unconvertible character (e.g. a Chinese character) + needsToBeSentAsUnicode = ETrue; + break; + } + } + + remainderOfInputString.Set( + remainderOfInputString.Right( returnValue ) ); + } + return needsToBeSentAsUnicode; + } + +// --------------------------------------------------------- +// CUssdNaviPane::CountExtendedTableChars +// Counts if there are 7bit extended table characters in message +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CUssdNaviPane::CountExtendedTableChars( const TDesC& aInputString ) const + { + const TInt total = aInputString.Length(); + TInt extChars = 0; + + TUint uChar; + for ( TInt i=0; i < total; i++ ) + { + uChar = TUint(aInputString[i]); + if (( uChar == KUssdEdLeftSquareBracket) || + ( uChar == KUssdEdReverseSolidus ) || + ( uChar == KUssdEdRightSquareBracket ) || + ( uChar == KUssdEdCircumflexAccent ) || + ( uChar == KUssdEdLeftCurlyBracket ) || + ( uChar == KUssdEdVerticalLine ) || + ( uChar == KUssdEdRightCurlyBracket ) || + ( uChar == KUssdEdTilde ) || + ( uChar == KUssdEdEuroSymbol )) + { + extChars = extChars + 1; + } + } + return extChars; + } + +// --------------------------------------------------------- +// CUssdNaviPane::GenerateBackSpaceKeyL +// Generates a backspace key press event. +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CUssdNaviPane::GenerateBackSpaceKeyL( CCoeControl* aControl ) + { + TKeyEvent keyEvent; + keyEvent.iCode = EKeyBackspace; + keyEvent.iScanCode = EStdKeyBackspace; + keyEvent.iRepeats = 1; + keyEvent.iModifiers = 0; + TEventCode type = EEventKey; + + if ( aControl ) + { + aControl->OfferKeyEventL( keyEvent, type ); + } + } + +// End of File