--- /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 <satcs.h> // 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
+
+
+
+
+
+
+
+
+