diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simatktsy/src/CSatNotifyTimerMgmt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simatktsy/src/CSatNotifyTimerMgmt.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,380 @@ +// Copyright (c) 2005-2009 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: +// Name : CSatNotifyTimerMgmt.cpp +// Part of : Common SIM ATK TSY / commonsimatktsy +// Timer management notification functionality of Sat Tsy +// Version : 1.0 +// + + + +//INCLUDES +#include // Etel SAT IPC definitions +#include "CSatTsy.h" // Tsy class header +#include "CSatNotifyTimerMgmt.h" // Class header +#include "CSatNotificationsTsy.h" // Tsy class header +#include "CBerTlv.h" // Ber Tlv data handling +#include "TTlv.h" // TTlv class +#include "CSatDataPackage.h" // Parameter packing +#include "TfLogger.h" // For TFLOGSTRING +#include "TSatUtility.h" // Utilities +#include "cmmmessagemanagerbase.h" // Message manager class for forwarding req. +#include "MSatTsy_IPCDefs.h" // Sat Tsy internal request types + + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatNotifyTimerMgmt* CSatNotifyTimerMgmt::NewL + ( + CSatNotificationsTsy* aNotificationsTsy + ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::NewL"); + CSatNotifyTimerMgmt* const satNotifyTimerMgmt = + new ( ELeave ) CSatNotifyTimerMgmt( aNotificationsTsy ); + CleanupStack::PushL( satNotifyTimerMgmt ); + satNotifyTimerMgmt->ConstructL(); + CleanupStack::Pop( satNotifyTimerMgmt ); + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::NewL, end of method"); + return satNotifyTimerMgmt; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::~CSatNotifyTimerMgmt +// Destructor +// ----------------------------------------------------------------------------- +// +CSatNotifyTimerMgmt::~CSatNotifyTimerMgmt + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::~CSatNotifyTimerMgmt"); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::CSatNotifyTimerMgmt +// Default C++ constructor +// ----------------------------------------------------------------------------- +// +CSatNotifyTimerMgmt::CSatNotifyTimerMgmt + ( + CSatNotificationsTsy* aNotificationsTsy + ) : iNotificationsTsy ( aNotificationsTsy ) + { + // None + } + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::ConstructL +// Symbian 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CSatNotifyTimerMgmt::ConstructL + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::ConstructL, does nothing"); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::CompleteNotifyL +// This method completes a NotifyTimerMgmt request by sending terminal response. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyTimerMgmt::CompleteNotifyL + ( + CSatDataPackage* aDataPackage, + TInt aErrorCode + ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::CompleteNotifyL"); + + TInt ret( KErrNone ); + TInt returnValue( KErrNone ); + TUint8 generalResult ( RSat::KSuccess ); + + // Unpack parameters + TPtrC8* data; + aDataPackage->UnPackData( &data ); + // Get ber tlv + CBerTlv berTlv; + berTlv.SetData( *data ); + + // Get command details tlv + CTlv commandDetails; + berTlv.TlvByTagValue( &commandDetails, KTlvCommandDetailsTag ); + // Store command details tlv + iNotificationsTsy->iTerminalRespData.iCommandDetails.Copy( + commandDetails.Data() ); + + // Get command qualifier + TUint8 cmdQualifier( commandDetails.GetShortInfo( + ETLV_CommandQualifier ) ); + + TUint8 pCmdNumber( commandDetails.GetShortInfo( ETLV_CommandNumber ) ); + + // Don't do anything if error has occured, otherwise continue.. + if ( KErrNone == aErrorCode ) + { + // Get timer id tlv + CTlv timerId; + returnValue = berTlv.TlvByTagValue( &timerId, KTlvTimerIdentifierTag ); + + // Initalize + iTimerId = 0; + for( TInt i = 0; i < 3; i++ ) + { + iTimerValue[i] = 0; + } + + if ( KErrNone == returnValue ) + { + iTimerId = timerId.GetShortInfo( ETLV_TimerIdentifier ); + // The Timer Identifier can take 8 different values + if ( ( RSat::KTimer8 < iTimerId ) + || ( RSat::KTimer1 > iTimerId ) ) + { + generalResult = RSat::KCmdDataNotUnderstood; + } + else + { + // if operation type is startTimer = 0x00; + if ( !cmdQualifier ) + { + // Get timer value tlv + CTlv timerValue; + returnValue = berTlv.TlvByTagValue( &timerValue, + KTlvTimerValueTag ); + + if ( KErrNotFound != returnValue ) + { + TPtrC8 temp; + TUint32 timeValue( 0 ); + + // Value of a timer, expressed using + // the format hour, minute, second + // Semi-octec presentation used (23.040) + temp.Set( timerValue.GetData( ETLV_TimerValue ) ); + + // Convert to seconds + timeValue = ConvertToSeconds( temp ); + + // The possible duration of a timer is + // between 1 second and 24 hours + if ( KMinTimerValue < timeValue && + KMaxTimerValueInSeconds >= timeValue ) + { + ret = iNotificationsTsy->GetSatTimer()->Start( + iTimerId, timeValue ); + + if ( KErrNone != ret ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::\ + CompleteNotifyL, Unable to process cmd"); + generalResult = RSat::KMeUnableToProcessCmd; + } + } + else + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::\ + CompleteNotifyL, Data not understood"); + generalResult = RSat::KCmdDataNotUnderstood; + } + } + else + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::\ + CompleteNotifyL, Timer value missing"); + generalResult = RSat::KErrorRequiredValuesMissing; + } + } + // If operation type is KDeactivateTimer or KGetTimerValue + else if ( ( KDeactivateTimer == cmdQualifier ) || + ( KGetTimerValue == cmdQualifier ) ) + { + TInt retValue( KErrNone ); + + // Get current value of the timer + ret = iNotificationsTsy->GetSatTimer()-> + CurrentValueOfTimerById( iTimerId ); + + if ( ( KErrNotFound != ret ) && ( KDeactivateTimer == + cmdQualifier ) ) + { + // Deactivate timer + retValue = iNotificationsTsy->GetSatTimer()-> + DeleteTimerById( iTimerId ); + } + + // If timer is found convert timer value to semi-octets + if ( ( KErrNotFound != ret ) && ( KErrNotFound != + retValue ) ) + { + generalResult = RSat::KSuccess; + + TInt num[3]; + num[0] = ret/3600; //hours + num[1] = ( ret%3600 )/60; //minutes + num[2] = ( ret%3600 )%60; //seconds + + TInt i( 0 ); + for ( i = 0; i < 3; i++ ) + { + //convert to semi-octet + iTimerValue[i] = + TSatUtility::ConvertToSemiOctet( num[i] ); + } + } + else + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::\ + CompleteNotifyL, Contradiction with timer state"); + generalResult = RSat::KContradictionWithTimerState; + } + } + else + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::\ + CompleteNotifyL, Cmd type not understood"); + generalResult = RSat::KCmdTypeNotUnderstood; + } + } + } + else + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::\ + CompleteNotifyL, Required values missing"); + generalResult = RSat::KErrorRequiredValuesMissing; + } + + CreateTerminalRespL( pCmdNumber, generalResult ); + + } // End of if (KErrNone) + + return ret; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::CreateTerminalRespL +// Constructs LocalInfo specific part of terminal response and calls +// DOS to send the actual message. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyTimerMgmt::CreateTerminalRespL + ( + TUint8 aPCmdNumber, + TUint8 aGeneralResult + ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::CreateTerminalRespL"); + + // Create and append response data + TTlv tlvSpecificData; + // Create General Result TLV here + tlvSpecificData.AddTag( KTlvResultTag ); + + // General result + tlvSpecificData.AddByte( aGeneralResult ); + + // Include timer value and id only when command is performed successfully + if( RSat::KSuccess == aGeneralResult ) + { + // Timer Id + // Value KTlvTimerIdentifierTagCRBitOn ( 0xA4 ) is added, + // because used KTlvTimerIdentifierTag ( 0x24 ) doesn't + // include comprehension bit in tag the value and it is expected + // to be present in indications and terminal responses. + tlvSpecificData.AddTag( KTlvTimerIdentifierTagCRBitOn ); + + tlvSpecificData.AddByte( iTimerId ); + + // Timer value is included when the Command Qualifier is indicating + // "deactivate" or "get the current value of the timer" + if ( iNotificationsTsy->iTerminalRespData.iCommandDetails[4] ) + { + tlvSpecificData.AddTag( KTlvTimerValueTag ); + // Timer value in semi-octets + tlvSpecificData.AddByte( iTimerValue[0] ); // Hours + tlvSpecificData.AddByte( iTimerValue[1] ); // Minutes + tlvSpecificData.AddByte( iTimerValue[2] ); // Seconds + } + } + else if( ( RSat::KContradictionWithTimerState != aGeneralResult ) && + ( RSat::KErrorRequiredValuesMissing != aGeneralResult ) && + ( RSat::KCmdDataNotUnderstood != aGeneralResult ) && + ( RSat::KCmdTypeNotUnderstood != aGeneralResult ) ) + { + tlvSpecificData.AddByte( KNoCause ); + } + else + { + // None. + } + + // Prepare data + iNotificationsTsy->iTerminalRespData.iPCmdNumber = aPCmdNumber; + TPtrC8 data = tlvSpecificData.GetDataWithoutTopLevelTag(); + + // Pack data + CSatDataPackage dataPackage; + dataPackage.PackData( &iNotificationsTsy->iTerminalRespData, &data ); + + // Forward request to the DOS + return iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( + ESatTerminalRsp, &dataPackage ); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyTimerMgmt::ConvertToSeconds +// Converts to seconds semi-octet presented value of timer, expressed using +// the format hour, minute, second +// ----------------------------------------------------------------------------- +// +TUint32 CSatNotifyTimerMgmt::ConvertToSeconds + ( + TPtrC8 time + ) + { + TFLOGSTRING("CSAT: CSatNotifyTimerMgmt::ConvertToSeconds"); + TUint32 timeValue( 0 ); + // Value of a timer, expressed using + // the format hour, minute, second + // Semi-octec presentation used (23.040) + // time[0] is hours + // time[1] is minutes + // time[2] is seconds + TInt i( 0 ); + for ( i = 0; i < 3; i++ ) + { + TUint value = ( time[i] & 0x0F )*10 + ( ( time[i] & 0xF0 ) >> 4 ); + timeValue = timeValue * 60 + value; + } + return timeValue; + } + +// End of file + + + + + + + + +