diff -r 2313cb430f28 -r d841fb1cc818 satengine/SatServer/Commands/SendUSSDCmd/src/CSendUssdHandler.cpp --- a/satengine/SatServer/Commands/SendUSSDCmd/src/CSendUssdHandler.cpp Fri Sep 17 08:33:29 2010 +0300 +++ b/satengine/SatServer/Commands/SendUSSDCmd/src/CSendUssdHandler.cpp Mon Oct 04 00:54:29 2010 +0300 @@ -17,12 +17,16 @@ #include -#include +#include #include +#include +#include +#include #include "MSatSystemState.h" #include "MSatApi.h" #include "MSatUtils.h" +#include "msatmultimodeapi.h" #include "MSatUiSession.h" #include "SatSOpcodes.h" #include "MSatSUiClientHandler.h" @@ -30,13 +34,11 @@ #include "TSatExtErrorUtils.h" #include "SatLog.h" -const TUint8 KQuarterShift( 2 ); -const TUint8 KHighNibbleShift( 4 ); -const TUint8 KDcsCharacterSet7Bit( 0x00 ); -const TUint8 KDcsCharacterSet8Bit( 0x01 ); -const TUint8 KDcsCharacterSet16Bit( 0x02 ); -const TUint8 KDcsCharacterSet7Bit2( 0x00 ); -const TUint8 KDcsCharacterSet16Bit2( 0x01 ); + /** + * USSD messages coded as a packed string within 160 octets, as defined for a + * ussd-String within GSM 04.80 and GSM 03.38. if the Dcs is 7 bit, a ussd + * string can have 182 charactor + */ const TInt KSatMaxUSSDString( 182 ); // USSD DCS coding. @@ -309,7 +311,8 @@ { LOG( SIMPLE, "SENDUSSD: dataValid true" ) // Validate Data Coding Scheme. - dataValid = DcsValid( iSendUssdData.iUssdString.iDcs ); + dataValid = iUtils->MultiModeApi().IsValidUssdDcs( + iSendUssdData.iUssdString.iDcs ); if ( !dataValid ) { LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::CommandAllowed Dcs \ @@ -564,10 +567,17 @@ iNotificationRsp(), iNotificationRspPckg( iNotificationRsp ), // To be removed when icons are allowed in this command - iIconCommand( EFalse ) + iIconCommand( EFalse ), + iIsSatDisplayUssdResult( EFalse ) { LOG( SIMPLE, - "SENDUSSD: CSendUssdHandler::CSendUssdHandler calling - exiting" ) + "SENDUSSD: CSendUssdHandler::CSendUssdHandler calling" ) + TRAPD( result, iIsSatDisplayUssdResult = SatDisplayUssdResultL(); ) + LOG2( NORMAL, "SENDUSSD: CSendUssdHandler::CSendUssdHandler \ + get CRepository key failed result: %d", result ) + + LOG( SIMPLE, + "SENDUSSD: CSendUssdHandler::CSendUssdHandler exiting" ) } @@ -595,6 +605,15 @@ iSendUssdRsp.iUssdString.iUssdString.Copy( receiveMessage ); + if ( ( RSat::EAlphaIdProvided != iSendUssdData.iAlphaId.iStatus ) + && iIsSatDisplayUssdResult ) + { + // if no Alpha ID provided, show the text note. + LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::SendUssdString Show Note" ) + TRAP_IGNORE( + ShowUssdResponseNoteL( iSendUssdRsp.iUssdString.iUssdString ) ); + } + HandleSendUssdResult( error ); LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::SendUssdString exiting" ) @@ -671,6 +690,23 @@ } // ----------------------------------------------------------------------------- +// Show the ussd response note. +// ----------------------------------------------------------------------------- +// +void CSendUssdHandler::ShowUssdResponseNoteL( const TDesC& aText ) + { + LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::ShowUssdResponseNoteL calling" ) + CHbDeviceMessageBoxSymbian::InformationL( aText ); + + CHbDeviceMessageBoxSymbian* messageNote = CHbDeviceMessageBoxSymbian::NewL(); + CleanupStack::PushL( messageNote ); + messageNote->SetButton( CHbDeviceMessageBoxSymbian::ERejectButton, EFalse ); + CleanupStack::PopAndDestroy(); // messageNote + + LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::ShowUssdResponseNoteL exiting" ) + } + +// ----------------------------------------------------------------------------- // Handles the result of Ussd sending. // ----------------------------------------------------------------------------- // @@ -902,71 +938,6 @@ LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::SendTerminalResponse exiting" ) } -// ----------------------------------------------------------------------------- -// Check validity of a given Data Coding Cheme (Dcs). -// ----------------------------------------------------------------------------- -// -TBool CSendUssdHandler::DcsValid( const TUint8 aDcs ) const - { - LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::DcsValid calling" ) - - TBool isDcsValid( EFalse ); - // 76543210 - TUint8 codingGroup = ( aDcs & 0xF0 ) >> KHighNibbleShift; // bits XXXX____ - TUint8 characterSet = ( aDcs & 0x0C ) >> KQuarterShift; // bits ____XX__ - TUint8 lowQuartet = ( aDcs & 0x0F ); // bits ____XXXX - LOG2( SIMPLE, - "SENDUSSD: CSendUssdHandler::DcsValid codingGroup: %x", codingGroup) - switch ( codingGroup ) - { - case 0x00: - case 0x02: - case 0x03: - case 0x0F: - { - isDcsValid = ETrue; - break; - } - - case 0x01: - { - if ( ( KDcsCharacterSet7Bit2 == lowQuartet ) || - ( KDcsCharacterSet16Bit2 == lowQuartet ) ) - { - LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::DcsValid valid" ) - isDcsValid = ETrue; - } - break; - } - - case 0x04: - case 0x05: - case 0x06: - case 0x07: - case 0x09: - { - if ( ( KDcsCharacterSet7Bit == characterSet ) || - ( KDcsCharacterSet8Bit == characterSet ) || - ( KDcsCharacterSet16Bit == characterSet ) ) - { - LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::DcsValid isDcsValid" ) - isDcsValid = ETrue; - } - break; - } - - default: - { - LOG2( SIMPLE, "SENDUSSD: Reserved Dcs found: %x", aDcs ) - } - } - - LOG2( - SIMPLE, - "SENDUSSD: CSendUssdHandler::DcsValid exiting, valid = %d", - isDcsValid ) - return isDcsValid; - } // ----------------------------------------------------------------------------- // USSD sending should be transparent if alpha identifier is provided but it's @@ -1002,3 +973,32 @@ return result; } +// ----------------------------------------------------------------------------- +// Check whether the ussd sending result is displayed +// ----------------------------------------------------------------------------- +// +TInt CSendUssdHandler::SatDisplayUssdResultL() + { + LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::SatDisplayUssdResultL calling" ) + TInt result( KErrNone ); + TInt ussdDisplayResult( KErrNone ); + + CRepository* repository = NULL; + repository = CRepository::NewL( KCRUidSatServer ); + + if ( repository ) + { + result = repository->Get( KSatDisplayUssdResult, ussdDisplayResult ); + LOG3( NORMAL, + "SENDUSSD: CSendUssdHandler::CSendUssdHandler \ + get CRepository key DisplayResult: %d, result: %d ", + ussdDisplayResult, result ) + } + + delete repository; + repository = NULL; + + LOG( SIMPLE, "SENDUSSD: CSendUssdHandler::SatDisplayUssdResultL exiting" ) + return ussdDisplayResult; + } +