diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/simatktsy/src/CSatNotifyRefresh.cpp --- a/telephonyserverplugins/simatktsy/src/CSatNotifyRefresh.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/simatktsy/src/CSatNotifyRefresh.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,720 +1,720 @@ -// Copyright (c) 2006-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 : CSatNotifyRefresh.cpp -// Part of : Common SIM ATK TSY / commonsimatktsy -// Refresh notification functionality of Sat Tsy -// Version : 1.0 -// - - - -//INCLUDES -#include // Etel SAT IPC definitions -#include "CSatTsy.h" // Tsy class header -#include "CSatNotifyRefresh.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 "CSatTsyReqHandleStore.h" // Request handle class -#include "cmmmessagemanagerbase.h" // Message manager class for forwarding req. -//#include "CMmCustomTsy.h" // Custom Tsy class -#include "MSatTsy_IPCDefs.h" // Sat Tsy internal request types - - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CSatNotifyRefresh* CSatNotifyRefresh::NewL - ( - CSatNotificationsTsy* aNotificationsTsy - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::NewL"); - CSatNotifyRefresh* const satNotifyRefresh = - new ( ELeave ) CSatNotifyRefresh( aNotificationsTsy ); - CleanupStack::PushL( satNotifyRefresh ); - satNotifyRefresh->ConstructL(); - CleanupStack::Pop( satNotifyRefresh ); - TFLOGSTRING("CSAT: CSatNotifyRefresh::NewL, end of method"); - return satNotifyRefresh; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::~CSatNotifyRefresh -// Destructor -// ----------------------------------------------------------------------------- -// -CSatNotifyRefresh::~CSatNotifyRefresh - ( - // None - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::~CSatNotifyRefresh"); - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CSatNotifyRefresh -// Default C++ constructor -// ----------------------------------------------------------------------------- -// -CSatNotifyRefresh::CSatNotifyRefresh - ( - CSatNotificationsTsy* aNotificationsTsy - ) : iNotificationsTsy ( aNotificationsTsy ) - { - // None - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::ConstructL -// Symbian 2nd phase constructor -// ----------------------------------------------------------------------------- -// -void CSatNotifyRefresh::ConstructL - ( - // None - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::ConstructL"); - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::Notify -// This request allows a client to be notified of a REFRESH proactive command -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::Notify - ( - const TTsyReqHandle aTsyReqHandle, - const TDataPackage& aPackage - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::Notify"); - - // Save data pointer to client side for completion - iRefreshV2Pckg = reinterpret_cast( - aPackage.Des1n() ); - - // Save the request handle - iNotificationsTsy->iSatTsy->SaveReqHandle( aTsyReqHandle, - CSatTsy::ESatNotifyRefreshPCmdReqType ); - - if ( iNotificationsTsy->iSatReqHandleStore->TsyReqHandle( - CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ) ) - { - // Check the command buffer, if both notifications are received - iNotificationsTsy->NotifySatReadyForNotification( KRefresh ); - } - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::Notify -// This request allows a client to be notified of a REFRESH proactive -// command -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::NotifyRefreshRequired - ( - const TTsyReqHandle aTsyReqHandle, - const TDataPackage& aPackage - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::NotifyRefreshRequired"); - - // Save data pointer to client side for completion - iRefreshRequiredV2Pckg = reinterpret_cast( - aPackage.Des1n() ); - - // Save the request handle - iNotificationsTsy->iSatTsy->SaveReqHandle( aTsyReqHandle, - CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ); - - if ( iNotificationsTsy->iSatReqHandleStore->TsyReqHandle( - CSatTsy::ESatNotifyRefreshPCmdReqType ) ) - { - // Check the command buffer, if both notifications are received - iNotificationsTsy->NotifySatReadyForNotification( KRefresh ); - } - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CancelNotification -// This method cancels an outstanding asynchronous -// NotifyRefresh request. -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::CancelNotification - ( - const TTsyReqHandle aTsyReqHandle - ) - { - TFLOGSTRING( "CSAT: CSatNotifyRefresh::CancelNotification" ); - - // Reset the request handle - iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle( - CSatTsy::ESatNotifyRefreshPCmdReqType ); - - // Reset the data pointer - iRefreshV2Pckg = NULL; - - // Complete the request with KErrCancel - iNotificationsTsy->iSatTsy->ReqCompleted( aTsyReqHandle, KErrCancel ); - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CancelRefreshRequiredNotification -// Cancels the current notification request set the request handle -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::CancelRefreshRequiredNotification - ( - const TTsyReqHandle aTsyReqHandle - ) - { - TFLOGSTRING( "CSAT: CSatNotifyRefresh::CancelRefreshRequiredNotification" ); - - // Reset the request handle - iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle( - CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ); - - // Reset the data pointer - iRefreshRequiredV2Pckg = NULL; - - // Complete the request with KErrCancel - iNotificationsTsy->iSatTsy->ReqCompleted( aTsyReqHandle, KErrCancel ); - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CompleteNotifyL -// This method completes an outstanding asynchronous -// NotifyRefresh request. -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::CompleteNotifyL - ( - CSatDataPackage* aDataPackage, - TInt aErrorCode - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL"); - - TInt ret( KErrNone ); - TBuf<1> additionalInfo; - // Unpack parameters - TPtrC8* data; - aDataPackage->UnPackData( &data ); - TFLOGSTRING2("CSAT: CSatNotifyRefresh::CompleteNotifyL, dataLength: %d", - data->Length()); - // Reset req handle. Returns the deleted req handle - TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> - TsyReqHandle( CSatTsy::ESatNotifyRefreshPCmdReqType ); - TTsyReqHandle reqHandleRefreshRequired = iNotificationsTsy-> - iSatReqHandleStore->ResetTsyReqHandle( - CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ); - - // 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 ) ); - - // In case the request was ongoing, continue.. - if ( ( CSatTsy::ESatReqHandleUnknown != reqHandle ) && - ( CSatTsy::ESatReqHandleUnknown != reqHandleRefreshRequired ) ) - { - // Complete right away if error has occured, otherwise continue.. - if ( KErrNone == aErrorCode ) - { - // Fill the refresh structure - RSat::TRefreshV2& refreshV2 = ( *iRefreshV2Pckg )(); - - TInt returnValue( KErrNone ); - - refreshV2.iAid.Zero(); - - // File list - refreshV2.iFileList.Zero(); - iFileList.Zero(); - iInternalCache = 0; - - // Used in case of SimInit refresh + Imsi change - iImsiState = ENotSet; - - CTlv fileListTlv; - returnValue = berTlv.TlvByTagValue( &fileListTlv, - KTlvFileListTag ); - if ( KErrNone == returnValue ) - { - // Filelist found - // File list length, -1 for number of files - TUint8 fileLength( (TUint8)( fileListTlv.GetLength() - 1 ) ); - - // Save file list with full path. - iFileList = fileListTlv.GetData( ETLV_Files ); - - // Going through all files - // Received as 8-bit, append to 16-bit - TInt i( 0 ); - - for ( i = 0; i < fileLength / 2; i++ ) - { - TUint16 oneItem( 0 ); - // Read 16-bit - TSatUtility::CopyTwo8toOne16LE( iFileList, oneItem, 2 * i ); - // File header 8-bit - TUint8 header( TUint8( oneItem >> 8 ) ); - - // The TSY needs to strip the Refresh File List - // provided by the ICC to remove the paths to the files. - // '3FXX': Master File; - // '7FXX': 1st level Dedicated File; - // '5FXX': 2nd level Dedicated File; - if ( ( KRefreshMasterFileHeader != header ) - && ( KRefresh1StLevelDedicatedFileHeader != header ) - && ( KRefresh2StLevelDedicatedFileHeader != header ) ) - { - // Append file to the file list, without path - refreshV2.iFileList.Append( oneItem ); - } - } - // Check if the file list contains the EF-SST file which is cached - // in COMMON SIM ATK TSY - if ( KErrNotFound != refreshV2.iFileList.Locate( RSat::KSstEf ) ) - { - iInternalCache |= CSatNotificationsTsy::ECacheEFSST; - } - // Check EF-CBMID - if ( KErrNotFound != refreshV2.iFileList.Locate( RSat::KCbmidEf ) ) - { - iInternalCache |= CSatNotificationsTsy::ECacheEFCBMID; - } - } - else if ( KFileChangeNotification == iNotificationsTsy-> - iTerminalRespData.iCommandDetails[KCommandQualifier] ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL,\ - File list missing"); - // File list object is missing, return terminal resp immediately. - ret = KErrCorrupt; - additionalInfo.Zero(); - additionalInfo.Append( RSat::KNoSpecificMeProblem ); - CreateTerminalRespL( pCmdNumber, - RSat::KErrorRequiredValuesMissing, additionalInfo ); - } - if ( KErrNone == ret ) - { - // Set refresh mode - switch ( iNotificationsTsy->iTerminalRespData. - iCommandDetails[KCommandQualifier] ) - { - case KSimInitFullFileChangeNotification: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::\ - CompleteNotifyL, Refresh mode: Sim init \ - and full file change notification"); - refreshV2.iType = - RSat::ESimInitFullFileChangeNotification; - iInternalCache = CSatNotificationsTsy::ECacheEFSST + - CSatNotificationsTsy::ECacheEFCBMID; - break; - } - case KFileChangeNotification: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Refresh mode: File Change Notification"); - TFLOGSTRING2("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Number of files: %d", - refreshV2.iFileList.Length() ); - refreshV2.iType = RSat::EFileChangeNotification; - - if ( ( KErrNotFound != refreshV2.iFileList.Locate( - RSat::KImsiEf ) ) && - ( !fileListTlv.GetComprehensionRequired() ) ) - { - // IMSI was part of file list, CR bit was cleared - // This is done here because client does not have - // the CR bit information available, - // Other error values comes from Client - ret = KErrCorrupt; - additionalInfo.Zero(); - additionalInfo.Append( - RSat::KNoSpecificMeProblem ); - CreateTerminalRespL( pCmdNumber, - RSat::KErrorRequiredValuesMissing, - additionalInfo ); - } - break; - } - case KSimInitFileChangeNotification: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL,\ - Refresh mode: Sim init and file \ - change notification"); - TFLOGSTRING2("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Number of files: %d", - refreshV2.iFileList.Length() ); - refreshV2.iType = RSat::ESimInitFileChangeNotification; - break; - } - case KSimInit: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Refresh mode: Sim init "); - refreshV2.iType = RSat::ESimInit; - iInternalCache = CSatNotificationsTsy::ECacheEFSST - + CSatNotificationsTsy::ECacheEFCBMID; - // Used in case of SimInit refresh + Imsi change - iImsiState = ERefreshSimInitReceived; - break; - } - case KSimReset: - { - refreshV2.iType = RSat::ESimReset; - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Refresh mode: Reset"); - iInternalCache = CSatNotificationsTsy::ECacheEFSST + - CSatNotificationsTsy::ECacheEFCBMID; - break; - } - case KUSIMApplicationReset: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Refresh mode: USIM Application Reset"); - refreshV2.iType = RSat::EUsimApplicationReset; - iInternalCache = CSatNotificationsTsy::ECacheEFSST + - CSatNotificationsTsy::ECacheEFCBMID; - break; - } - case K3GSessionReset: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Refresh mode: 3G Session Reset"); - refreshV2.iType = RSat::E3GSessionReset; - break; - } - default: - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ - Refresh type not set!"); - // This migth be an error case - refreshV2.iType = RSat::ERefreshTypeNotSet; - break; - } - } - - // Application identifies(optional) - // If an AID TLV is present, it indicates the USIM application which - // needs to be refreshed. If it is not present, the ME shall assume - // the current USIM application needs to be refreshed. - CTlv applicationId; - returnValue = berTlv.TlvByTagValue( &applicationId, KTlvAIDTag ); - iAid.Zero(); - if ( KErrNone == returnValue ) - { - // Set application identifies - refreshV2.iAid = applicationId.GetData( ETLV_AID ); - // Store aplication Id to member variable. - iAid = refreshV2.iAid; - } - } - // Copy parameters - (*iRefreshRequiredV2Pckg)() = (*iRefreshV2Pckg)(); - - } - else - { - ret = aErrorCode; - } - - iNotificationsTsy->iSatTsy->ReqCompleted( reqHandleRefreshRequired, ret ); - } - else - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL,\ - One or more of the requests not ongoing"); - // Some of the request were not on, returning response immediately - additionalInfo.Zero(); - additionalInfo.Append( RSat::KNoSpecificMeProblem ); - CreateTerminalRespL( pCmdNumber, RSat::KMeUnableToProcessCmd, - additionalInfo ); - - ret = KErrCorrupt; - } - return ret; - } - - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::TerminalResponseL -// Response for Refresh query -// Called by ETel server, passes terminal response to DOS -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::TerminalResponseL - ( - TDes8* aRsp - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::TerminalResponseL"); - - RSat::TRefreshRspV1Pckg* aRspPckg = - reinterpret_cast( aRsp ); - RSat::TRefreshRspV1& rspV1 = ( *aRspPckg ) (); - TBuf<1> additionalInfo; - additionalInfo.Append( RSat::KNoSpecificMeProblem ); - // Get Proactive command number - TUint8 pCmdNumber( rspV1.PCmdNumber() ); - - if ( RSat::KNoAdditionalInfo != rspV1.iInfoType ) - { - additionalInfo.Zero(); - additionalInfo.Append( rspV1.iAdditionalInfo[0] ); - } - - // At this point the result should be always Success - if ( ( ( KSimReset != iNotificationsTsy->iTerminalRespData. - iCommandDetails[KCommandQualifier] ) || - ( RSat::KSuccess != rspV1.iGeneralResult ) ) && - ( EImsiNotEqual != iImsiState ) ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::TerminalResponseL, \ - S60 has done the Refresh" ); - // Send terminal response - CreateTerminalRespL( pCmdNumber, (TUint8) rspV1.iGeneralResult, - additionalInfo ); - // Case was not SimInit refresh + Imsi change, set back to default - iImsiState = ENotSet; - } - else - { - // Set flag off indicating that proactive command is not ongoing - // Normaly this is cleared after a terminal response. - iNotificationsTsy->GetSatTimer()->SetProactiveCommandOnGoingStatus( - EFalse ); - // Case was not SimInit refresh + Imsi change, set back to default - iImsiState = ENotSet; - } - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CompleteImsiChange -// Compeletes refresh request -// ----------------------------------------------------------------------------- -// -void CSatNotifyRefresh::CompleteImsiChange - ( - // None - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteImsiChange"); - if ( ERefreshSimInitReceived == iImsiState ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteImsiChange, \ - IMSI not equal"); - iImsiState = EImsiNotEqual; - } - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CreateTerminalRespL -// Constructs Refresh specific part of terminal response and calls -// DOS to send the actual message. -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::CreateTerminalRespL - ( - TUint8 aPCmdNumber, - TUint8 aGeneralResult, - TDesC16& aAdditionalInfo - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CreateTerminalRespL"); - // Create and append response data - TTlv tlvSpecificData; - // append result tag - tlvSpecificData.AddTag( KTlvResultTag ); - - // General result - tlvSpecificData.AddByte( aGeneralResult ); - - if ( RSat::KMeUnableToProcessCmd == aGeneralResult ) - { - if ( aAdditionalInfo.Length() ) - { - tlvSpecificData.AddByte( ( TUint8 ) aAdditionalInfo[0] ); - } - } - // 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 ); - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::RefreshAllowedL -// Response to RefreshRequired notify. Tells if the refresh is -// allowed by the Client. -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::RefreshAllowedL - ( - const TDataPackage& aPackage - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::RefreshAllowed "); - RSat::TRefreshRspV1Pckg* aRspPckg = - reinterpret_cast( aPackage.Des1n() ); - RSat::TRefreshRspV1& rspV1 = ( *aRspPckg ) (); - TUint8 pCmdNumber( rspV1.PCmdNumber() ); - CSatNotificationsTsy::TRefreshInfo refreshInfo; - - if ( ( RSat::KSuccess == rspV1.iGeneralResult ) || - ( RSat::KRefreshAdditionEFRead == rspV1.iGeneralResult ) ) - { - // Refresh allowed - refreshInfo.iAid.Copy( iAid ); - refreshInfo.iFileList.Copy( iFileList ); - refreshInfo.iInternalCache = iInternalCache; - // Pack data - CSatDataPackage dataPackage; - dataPackage.PackData( &iNotificationsTsy->iTerminalRespData, &refreshInfo ); - // Send refresh request - iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( - ESatTsyServiceRequest, &dataPackage ); - } - else - { - // Refresh not allowed by the client - TFLOGSTRING("CSAT: CSatNotifyRefresh::RefreshAllowed, refresh was not \ - allowed by the client"); - TBuf additionalInfo; - additionalInfo.Append(RSat::KNoSpecificMeProblem); - if ( RSat::KNoAdditionalInfo != rspV1.iInfoType ) - { - additionalInfo.Zero(); - additionalInfo.Append( rspV1.iAdditionalInfo[0] ); - } - // Send terminal response - CreateTerminalRespL( pCmdNumber, (TUint8) rspV1.iGeneralResult, - additionalInfo ); - } - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CompleteTerminalRespDataL -// Unpacks Refresh specific part of terminal response and calls -// CreateTerminalRespL to send the actual message. -// ----------------------------------------------------------------------------- -// -TInt CSatNotifyRefresh::CompleteTerminalRespDataL - ( - CSatDataPackage* aDataPackage, - TInt /*aErrorCode*/ - ) - { - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteTerminalRespDataL"); - TInt ret( KErrNone ); - CSatNotificationsTsy::TTerminalRespData* terminalRespData; - // Send terminal response - aDataPackage->UnPackData( &terminalRespData ); - CreateTerminalRespL( iNotificationsTsy->iTerminalRespData.iPCmdNumber, - terminalRespData->iGeneralResult, - terminalRespData->iAdditionalInfo ); - return ret; - } - -// ----------------------------------------------------------------------------- -// CSatNotifyRefresh::CompleteRequest -// Compeletes refresh request -// ----------------------------------------------------------------------------- -// -#ifdef USING_CTSY_DISPATCHER -void CSatNotifyRefresh::CompleteRequest - ( - CSatDataPackage* /*aDataPackage*/, - TInt aErrorCode - ) - { - // Reset req handle. Returns the deleted req handle - TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> - ResetTsyReqHandle( CSatTsy::ESatNotifyRefreshPCmdReqType ); - - TFLOGSTRING3("CSAT: CSatNotifyRefresh::CompleteRequest.\ - \n\t\t\t Handle:%d\n\t\t\t Error:%d", reqHandle, aErrorCode); - - iNotificationsTsy->iSatTsy->ReqCompleted( reqHandle, aErrorCode); - - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteRequest. Request is \ - now completed"); - } -#else //USING_CTSY_DISPATCHER -void CSatNotifyRefresh::CompleteRequest - ( - CSatDataPackage* aDataPackage, - TInt /*aErrorCode*/ - ) - { - TInt retValue; - aDataPackage->UnPackData( retValue ); - // Reset req handle. Returns the deleted req handle - TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> - ResetTsyReqHandle( CSatTsy::ESatNotifyRefreshPCmdReqType ); - - TFLOGSTRING3("CSAT: CSatNotifyRefresh::CompleteRequest.\ - \n\t\t\t Handle:%d\n\t\t\t Error:%d", reqHandle, retValue); - - if(CSatTsy::ESatReqHandleUnknown != reqHandle) - { - iNotificationsTsy->iSatTsy->ReqCompleted( reqHandle, retValue ); - - TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteRequest. Request is \ - now completed"); - } - - } -#endif //USING_CTSY_DISPATCHER - -// End of file - +// Copyright (c) 2006-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 : CSatNotifyRefresh.cpp +// Part of : Common SIM ATK TSY / commonsimatktsy +// Refresh notification functionality of Sat Tsy +// Version : 1.0 +// + + + +//INCLUDES +#include // Etel SAT IPC definitions +#include "CSatTsy.h" // Tsy class header +#include "CSatNotifyRefresh.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 "CSatTsyReqHandleStore.h" // Request handle class +#include "cmmmessagemanagerbase.h" // Message manager class for forwarding req. +//#include "CMmCustomTsy.h" // Custom Tsy class +#include "MSatTsy_IPCDefs.h" // Sat Tsy internal request types + + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatNotifyRefresh* CSatNotifyRefresh::NewL + ( + CSatNotificationsTsy* aNotificationsTsy + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::NewL"); + CSatNotifyRefresh* const satNotifyRefresh = + new ( ELeave ) CSatNotifyRefresh( aNotificationsTsy ); + CleanupStack::PushL( satNotifyRefresh ); + satNotifyRefresh->ConstructL(); + CleanupStack::Pop( satNotifyRefresh ); + TFLOGSTRING("CSAT: CSatNotifyRefresh::NewL, end of method"); + return satNotifyRefresh; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::~CSatNotifyRefresh +// Destructor +// ----------------------------------------------------------------------------- +// +CSatNotifyRefresh::~CSatNotifyRefresh + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::~CSatNotifyRefresh"); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CSatNotifyRefresh +// Default C++ constructor +// ----------------------------------------------------------------------------- +// +CSatNotifyRefresh::CSatNotifyRefresh + ( + CSatNotificationsTsy* aNotificationsTsy + ) : iNotificationsTsy ( aNotificationsTsy ) + { + // None + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::ConstructL +// Symbian 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CSatNotifyRefresh::ConstructL + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::ConstructL"); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::Notify +// This request allows a client to be notified of a REFRESH proactive command +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::Notify + ( + const TTsyReqHandle aTsyReqHandle, + const TDataPackage& aPackage + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::Notify"); + + // Save data pointer to client side for completion + iRefreshV2Pckg = reinterpret_cast( + aPackage.Des1n() ); + + // Save the request handle + iNotificationsTsy->iSatTsy->SaveReqHandle( aTsyReqHandle, + CSatTsy::ESatNotifyRefreshPCmdReqType ); + + if ( iNotificationsTsy->iSatReqHandleStore->TsyReqHandle( + CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ) ) + { + // Check the command buffer, if both notifications are received + iNotificationsTsy->NotifySatReadyForNotification( KRefresh ); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::Notify +// This request allows a client to be notified of a REFRESH proactive +// command +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::NotifyRefreshRequired + ( + const TTsyReqHandle aTsyReqHandle, + const TDataPackage& aPackage + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::NotifyRefreshRequired"); + + // Save data pointer to client side for completion + iRefreshRequiredV2Pckg = reinterpret_cast( + aPackage.Des1n() ); + + // Save the request handle + iNotificationsTsy->iSatTsy->SaveReqHandle( aTsyReqHandle, + CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ); + + if ( iNotificationsTsy->iSatReqHandleStore->TsyReqHandle( + CSatTsy::ESatNotifyRefreshPCmdReqType ) ) + { + // Check the command buffer, if both notifications are received + iNotificationsTsy->NotifySatReadyForNotification( KRefresh ); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CancelNotification +// This method cancels an outstanding asynchronous +// NotifyRefresh request. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::CancelNotification + ( + const TTsyReqHandle aTsyReqHandle + ) + { + TFLOGSTRING( "CSAT: CSatNotifyRefresh::CancelNotification" ); + + // Reset the request handle + iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle( + CSatTsy::ESatNotifyRefreshPCmdReqType ); + + // Reset the data pointer + iRefreshV2Pckg = NULL; + + // Complete the request with KErrCancel + iNotificationsTsy->iSatTsy->ReqCompleted( aTsyReqHandle, KErrCancel ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CancelRefreshRequiredNotification +// Cancels the current notification request set the request handle +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::CancelRefreshRequiredNotification + ( + const TTsyReqHandle aTsyReqHandle + ) + { + TFLOGSTRING( "CSAT: CSatNotifyRefresh::CancelRefreshRequiredNotification" ); + + // Reset the request handle + iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle( + CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ); + + // Reset the data pointer + iRefreshRequiredV2Pckg = NULL; + + // Complete the request with KErrCancel + iNotificationsTsy->iSatTsy->ReqCompleted( aTsyReqHandle, KErrCancel ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CompleteNotifyL +// This method completes an outstanding asynchronous +// NotifyRefresh request. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::CompleteNotifyL + ( + CSatDataPackage* aDataPackage, + TInt aErrorCode + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL"); + + TInt ret( KErrNone ); + TBuf<1> additionalInfo; + // Unpack parameters + TPtrC8* data; + aDataPackage->UnPackData( &data ); + TFLOGSTRING2("CSAT: CSatNotifyRefresh::CompleteNotifyL, dataLength: %d", + data->Length()); + // Reset req handle. Returns the deleted req handle + TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> + TsyReqHandle( CSatTsy::ESatNotifyRefreshPCmdReqType ); + TTsyReqHandle reqHandleRefreshRequired = iNotificationsTsy-> + iSatReqHandleStore->ResetTsyReqHandle( + CSatTsy::ESatNotifyRefreshRequiredPCmdReqType ); + + // 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 ) ); + + // In case the request was ongoing, continue.. + if ( ( CSatTsy::ESatReqHandleUnknown != reqHandle ) && + ( CSatTsy::ESatReqHandleUnknown != reqHandleRefreshRequired ) ) + { + // Complete right away if error has occured, otherwise continue.. + if ( KErrNone == aErrorCode ) + { + // Fill the refresh structure + RSat::TRefreshV2& refreshV2 = ( *iRefreshV2Pckg )(); + + TInt returnValue( KErrNone ); + + refreshV2.iAid.Zero(); + + // File list + refreshV2.iFileList.Zero(); + iFileList.Zero(); + iInternalCache = 0; + + // Used in case of SimInit refresh + Imsi change + iImsiState = ENotSet; + + CTlv fileListTlv; + returnValue = berTlv.TlvByTagValue( &fileListTlv, + KTlvFileListTag ); + if ( KErrNone == returnValue ) + { + // Filelist found + // File list length, -1 for number of files + TUint8 fileLength( (TUint8)( fileListTlv.GetLength() - 1 ) ); + + // Save file list with full path. + iFileList = fileListTlv.GetData( ETLV_Files ); + + // Going through all files + // Received as 8-bit, append to 16-bit + TInt i( 0 ); + + for ( i = 0; i < fileLength / 2; i++ ) + { + TUint16 oneItem( 0 ); + // Read 16-bit + TSatUtility::CopyTwo8toOne16LE( iFileList, oneItem, 2 * i ); + // File header 8-bit + TUint8 header( TUint8( oneItem >> 8 ) ); + + // The TSY needs to strip the Refresh File List + // provided by the ICC to remove the paths to the files. + // '3FXX': Master File; + // '7FXX': 1st level Dedicated File; + // '5FXX': 2nd level Dedicated File; + if ( ( KRefreshMasterFileHeader != header ) + && ( KRefresh1StLevelDedicatedFileHeader != header ) + && ( KRefresh2StLevelDedicatedFileHeader != header ) ) + { + // Append file to the file list, without path + refreshV2.iFileList.Append( oneItem ); + } + } + // Check if the file list contains the EF-SST file which is cached + // in COMMON SIM ATK TSY + if ( KErrNotFound != refreshV2.iFileList.Locate( RSat::KSstEf ) ) + { + iInternalCache |= CSatNotificationsTsy::ECacheEFSST; + } + // Check EF-CBMID + if ( KErrNotFound != refreshV2.iFileList.Locate( RSat::KCbmidEf ) ) + { + iInternalCache |= CSatNotificationsTsy::ECacheEFCBMID; + } + } + else if ( KFileChangeNotification == iNotificationsTsy-> + iTerminalRespData.iCommandDetails[KCommandQualifier] ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL,\ + File list missing"); + // File list object is missing, return terminal resp immediately. + ret = KErrCorrupt; + additionalInfo.Zero(); + additionalInfo.Append( RSat::KNoSpecificMeProblem ); + CreateTerminalRespL( pCmdNumber, + RSat::KErrorRequiredValuesMissing, additionalInfo ); + } + if ( KErrNone == ret ) + { + // Set refresh mode + switch ( iNotificationsTsy->iTerminalRespData. + iCommandDetails[KCommandQualifier] ) + { + case KSimInitFullFileChangeNotification: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::\ + CompleteNotifyL, Refresh mode: Sim init \ + and full file change notification"); + refreshV2.iType = + RSat::ESimInitFullFileChangeNotification; + iInternalCache = CSatNotificationsTsy::ECacheEFSST + + CSatNotificationsTsy::ECacheEFCBMID; + break; + } + case KFileChangeNotification: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Refresh mode: File Change Notification"); + TFLOGSTRING2("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Number of files: %d", + refreshV2.iFileList.Length() ); + refreshV2.iType = RSat::EFileChangeNotification; + + if ( ( KErrNotFound != refreshV2.iFileList.Locate( + RSat::KImsiEf ) ) && + ( !fileListTlv.GetComprehensionRequired() ) ) + { + // IMSI was part of file list, CR bit was cleared + // This is done here because client does not have + // the CR bit information available, + // Other error values comes from Client + ret = KErrCorrupt; + additionalInfo.Zero(); + additionalInfo.Append( + RSat::KNoSpecificMeProblem ); + CreateTerminalRespL( pCmdNumber, + RSat::KErrorRequiredValuesMissing, + additionalInfo ); + } + break; + } + case KSimInitFileChangeNotification: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL,\ + Refresh mode: Sim init and file \ + change notification"); + TFLOGSTRING2("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Number of files: %d", + refreshV2.iFileList.Length() ); + refreshV2.iType = RSat::ESimInitFileChangeNotification; + break; + } + case KSimInit: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Refresh mode: Sim init "); + refreshV2.iType = RSat::ESimInit; + iInternalCache = CSatNotificationsTsy::ECacheEFSST + + CSatNotificationsTsy::ECacheEFCBMID; + // Used in case of SimInit refresh + Imsi change + iImsiState = ERefreshSimInitReceived; + break; + } + case KSimReset: + { + refreshV2.iType = RSat::ESimReset; + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Refresh mode: Reset"); + iInternalCache = CSatNotificationsTsy::ECacheEFSST + + CSatNotificationsTsy::ECacheEFCBMID; + break; + } + case KUSIMApplicationReset: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Refresh mode: USIM Application Reset"); + refreshV2.iType = RSat::EUsimApplicationReset; + iInternalCache = CSatNotificationsTsy::ECacheEFSST + + CSatNotificationsTsy::ECacheEFCBMID; + break; + } + case K3GSessionReset: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Refresh mode: 3G Session Reset"); + refreshV2.iType = RSat::E3GSessionReset; + break; + } + default: + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL\ + Refresh type not set!"); + // This migth be an error case + refreshV2.iType = RSat::ERefreshTypeNotSet; + break; + } + } + + // Application identifies(optional) + // If an AID TLV is present, it indicates the USIM application which + // needs to be refreshed. If it is not present, the ME shall assume + // the current USIM application needs to be refreshed. + CTlv applicationId; + returnValue = berTlv.TlvByTagValue( &applicationId, KTlvAIDTag ); + iAid.Zero(); + if ( KErrNone == returnValue ) + { + // Set application identifies + refreshV2.iAid = applicationId.GetData( ETLV_AID ); + // Store aplication Id to member variable. + iAid = refreshV2.iAid; + } + } + // Copy parameters + (*iRefreshRequiredV2Pckg)() = (*iRefreshV2Pckg)(); + + } + else + { + ret = aErrorCode; + } + + iNotificationsTsy->iSatTsy->ReqCompleted( reqHandleRefreshRequired, ret ); + } + else + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteNotifyL,\ + One or more of the requests not ongoing"); + // Some of the request were not on, returning response immediately + additionalInfo.Zero(); + additionalInfo.Append( RSat::KNoSpecificMeProblem ); + CreateTerminalRespL( pCmdNumber, RSat::KMeUnableToProcessCmd, + additionalInfo ); + + ret = KErrCorrupt; + } + return ret; + } + + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::TerminalResponseL +// Response for Refresh query +// Called by ETel server, passes terminal response to DOS +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::TerminalResponseL + ( + TDes8* aRsp + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::TerminalResponseL"); + + RSat::TRefreshRspV1Pckg* aRspPckg = + reinterpret_cast( aRsp ); + RSat::TRefreshRspV1& rspV1 = ( *aRspPckg ) (); + TBuf<1> additionalInfo; + additionalInfo.Append( RSat::KNoSpecificMeProblem ); + // Get Proactive command number + TUint8 pCmdNumber( rspV1.PCmdNumber() ); + + if ( RSat::KNoAdditionalInfo != rspV1.iInfoType ) + { + additionalInfo.Zero(); + additionalInfo.Append( rspV1.iAdditionalInfo[0] ); + } + + // At this point the result should be always Success + if ( ( ( KSimReset != iNotificationsTsy->iTerminalRespData. + iCommandDetails[KCommandQualifier] ) || + ( RSat::KSuccess != rspV1.iGeneralResult ) ) && + ( EImsiNotEqual != iImsiState ) ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::TerminalResponseL, \ + S60 has done the Refresh" ); + // Send terminal response + CreateTerminalRespL( pCmdNumber, (TUint8) rspV1.iGeneralResult, + additionalInfo ); + // Case was not SimInit refresh + Imsi change, set back to default + iImsiState = ENotSet; + } + else + { + // Set flag off indicating that proactive command is not ongoing + // Normaly this is cleared after a terminal response. + iNotificationsTsy->GetSatTimer()->SetProactiveCommandOnGoingStatus( + EFalse ); + // Case was not SimInit refresh + Imsi change, set back to default + iImsiState = ENotSet; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CompleteImsiChange +// Compeletes refresh request +// ----------------------------------------------------------------------------- +// +void CSatNotifyRefresh::CompleteImsiChange + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteImsiChange"); + if ( ERefreshSimInitReceived == iImsiState ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteImsiChange, \ + IMSI not equal"); + iImsiState = EImsiNotEqual; + } + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CreateTerminalRespL +// Constructs Refresh specific part of terminal response and calls +// DOS to send the actual message. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::CreateTerminalRespL + ( + TUint8 aPCmdNumber, + TUint8 aGeneralResult, + TDesC16& aAdditionalInfo + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CreateTerminalRespL"); + // Create and append response data + TTlv tlvSpecificData; + // append result tag + tlvSpecificData.AddTag( KTlvResultTag ); + + // General result + tlvSpecificData.AddByte( aGeneralResult ); + + if ( RSat::KMeUnableToProcessCmd == aGeneralResult ) + { + if ( aAdditionalInfo.Length() ) + { + tlvSpecificData.AddByte( ( TUint8 ) aAdditionalInfo[0] ); + } + } + // 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 ); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::RefreshAllowedL +// Response to RefreshRequired notify. Tells if the refresh is +// allowed by the Client. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::RefreshAllowedL + ( + const TDataPackage& aPackage + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::RefreshAllowed "); + RSat::TRefreshRspV1Pckg* aRspPckg = + reinterpret_cast( aPackage.Des1n() ); + RSat::TRefreshRspV1& rspV1 = ( *aRspPckg ) (); + TUint8 pCmdNumber( rspV1.PCmdNumber() ); + CSatNotificationsTsy::TRefreshInfo refreshInfo; + + if ( ( RSat::KSuccess == rspV1.iGeneralResult ) || + ( RSat::KRefreshAdditionEFRead == rspV1.iGeneralResult ) ) + { + // Refresh allowed + refreshInfo.iAid.Copy( iAid ); + refreshInfo.iFileList.Copy( iFileList ); + refreshInfo.iInternalCache = iInternalCache; + // Pack data + CSatDataPackage dataPackage; + dataPackage.PackData( &iNotificationsTsy->iTerminalRespData, &refreshInfo ); + // Send refresh request + iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( + ESatTsyServiceRequest, &dataPackage ); + } + else + { + // Refresh not allowed by the client + TFLOGSTRING("CSAT: CSatNotifyRefresh::RefreshAllowed, refresh was not \ + allowed by the client"); + TBuf additionalInfo; + additionalInfo.Append(RSat::KNoSpecificMeProblem); + if ( RSat::KNoAdditionalInfo != rspV1.iInfoType ) + { + additionalInfo.Zero(); + additionalInfo.Append( rspV1.iAdditionalInfo[0] ); + } + // Send terminal response + CreateTerminalRespL( pCmdNumber, (TUint8) rspV1.iGeneralResult, + additionalInfo ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CompleteTerminalRespDataL +// Unpacks Refresh specific part of terminal response and calls +// CreateTerminalRespL to send the actual message. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyRefresh::CompleteTerminalRespDataL + ( + CSatDataPackage* aDataPackage, + TInt /*aErrorCode*/ + ) + { + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteTerminalRespDataL"); + TInt ret( KErrNone ); + CSatNotificationsTsy::TTerminalRespData* terminalRespData; + // Send terminal response + aDataPackage->UnPackData( &terminalRespData ); + CreateTerminalRespL( iNotificationsTsy->iTerminalRespData.iPCmdNumber, + terminalRespData->iGeneralResult, + terminalRespData->iAdditionalInfo ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyRefresh::CompleteRequest +// Compeletes refresh request +// ----------------------------------------------------------------------------- +// +#ifdef USING_CTSY_DISPATCHER +void CSatNotifyRefresh::CompleteRequest + ( + CSatDataPackage* /*aDataPackage*/, + TInt aErrorCode + ) + { + // Reset req handle. Returns the deleted req handle + TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> + ResetTsyReqHandle( CSatTsy::ESatNotifyRefreshPCmdReqType ); + + TFLOGSTRING3("CSAT: CSatNotifyRefresh::CompleteRequest.\ + \n\t\t\t Handle:%d\n\t\t\t Error:%d", reqHandle, aErrorCode); + + iNotificationsTsy->iSatTsy->ReqCompleted( reqHandle, aErrorCode); + + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteRequest. Request is \ + now completed"); + } +#else //USING_CTSY_DISPATCHER +void CSatNotifyRefresh::CompleteRequest + ( + CSatDataPackage* aDataPackage, + TInt /*aErrorCode*/ + ) + { + TInt retValue; + aDataPackage->UnPackData( retValue ); + // Reset req handle. Returns the deleted req handle + TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> + ResetTsyReqHandle( CSatTsy::ESatNotifyRefreshPCmdReqType ); + + TFLOGSTRING3("CSAT: CSatNotifyRefresh::CompleteRequest.\ + \n\t\t\t Handle:%d\n\t\t\t Error:%d", reqHandle, retValue); + + if(CSatTsy::ESatReqHandleUnknown != reqHandle) + { + iNotificationsTsy->iSatTsy->ReqCompleted( reqHandle, retValue ); + + TFLOGSTRING("CSAT: CSatNotifyRefresh::CompleteRequest. Request is \ + now completed"); + } + + } +#endif //USING_CTSY_DISPATCHER + +// End of file +