diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmSimLockTsy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmSimLockTsy.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,471 @@ +// 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: +// + + + +// INCLUDE FILES +#include "CMmSimLockTsy.h" +#include +#include + +// ======== MEMBER FUNCTIONS ======== + +CMmSimLockTsy::CMmSimLockTsy() + { + return; + } + +void CMmSimLockTsy::ConstructL( + CMmCustomTsy* aMmCustomTsy ) + { + iMmCustomTsy = aMmCustomTsy; + + // Create req handle store +#ifdef REQHANDLE_TIMER + iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( iMmCustomTsy, + iMmCustomTsy->iMmPhoneTsy, ESimLockRequestTypeMaxNumOfRequests, + iSimLockReqHandles ); +#else + iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( + ESimLockRequestTypeMaxNumOfRequests, iSimLockReqHandles ); +#endif // REQHANDLE_TIMER + + return; + } + +CMmSimLockTsy* CMmSimLockTsy::NewL( + CMmCustomTsy* aMmCustomTsy ) + { + CMmSimLockTsy* self = new (ELeave) CMmSimLockTsy(); + + CleanupStack::PushL( self ); + self->ConstructL( aMmCustomTsy ); + CleanupStack::Pop(); + + return self; + } + +CMmSimLockTsy::~CMmSimLockTsy() + { + delete iTsyReqHandleStore; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::Init +// Initialisation method that is called from ETel Server. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmSimLockTsy::Init() + { + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::SupportingIPC +// Tells whether the object supports given IPC. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TBool CMmSimLockTsy::SupportingIPC( + TInt aIpc ) + { + TBool ret( EFalse ); + + switch ( aIpc ) + { + case ECustomSimLockActivateIPC: + case ECustomSimLockDeActivateIPC: + { + ret = ETrue; + break; + } + default: + { + ret = EFalse; + break; + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::DoExtFuncL +// Dispatches extension function requests. At the beginning of this method, +// packaged pointers are unpacked. Then the correct function is selected +// using the IPC number. +// If the IPC is supported, return the return value of corresponding function, +// else return KErrNotSupported. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::DoExtFuncL( + const TTsyReqHandle aTsyReqHandle, + const TInt aIpc, + const TDataPackage& aPackage ) + { + switch ( aIpc ) + { + case ECustomSimLockActivateIPC: + return ActivateSimLockL( aTsyReqHandle, + REINTERPRET_CAST( RMmCustomAPI::TSimLockPassword*, + aPackage.Ptr1() ), + REINTERPRET_CAST( RMmCustomAPI::TLockNumber*, + aPackage.Ptr2() ) ); + case ECustomSimLockDeActivateIPC: + return DeActivateSimLockL( aTsyReqHandle, + REINTERPRET_CAST( RMmCustomAPI::TSimLockPassword*, + aPackage.Ptr1() ), + REINTERPRET_CAST( RMmCustomAPI::TLockNumber*, + aPackage.Ptr2() ) ); + default: + return KErrNotSupported; + } + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::ReqModeL +// Returns request mode for given IPC. Leaves with error code KErrNotSupported +// if the IPC number does not belong to some of the SimLock API functions. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CTelObject::TReqMode CMmSimLockTsy::ReqModeL( + const TInt aIpc ) + { + CTelObject::TReqMode ret = 0; + + switch ( aIpc ) + { + case ECustomSimLockActivateIPC: + case ECustomSimLockDeActivateIPC: + ret = 0; // flow control in tsy + break; + default: + User::Leave(KErrNotSupported); + break; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::NumberOfSlotsL +// Returns number of slots to be used for given IPC. Leaves with error code +// KErrNotSupported if the IPC number does not belong to some of the SimLock +// API functions. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::NumberOfSlotsL( + const TInt aIpc ) + { + TInt numberOfSlots = KMmCustomDefaultSlots; + + switch ( aIpc ) + { + case ECustomSimLockActivateIPC: + case ECustomSimLockDeActivateIPC: + numberOfSlots = KMmCustomSimLockSlots; + break; + default: + // Unknown or invalid IPC + User::Leave( KErrNotSupported ); + break; + } + + return numberOfSlots; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::CancelService +// When the clients close their sub-sessions (eg. by calling RPhone::Close), +// they may not have cancelled all their outstanding asynchronous requests +// before closing. It is up to the ETel server to clean up in this situation, +// so the server will find the list of outstanding requests related to that +// sub-session object and pass these outstanding IPC request numbers, one at +// a time, to the CancelService function in the TSY. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::CancelService( + const TInt aIpc, + const TTsyReqHandle ) + { + TInt ret( KErrGeneral ); + + switch ( aIpc ) + { + case ECustomSimLockActivateIPC: + case ECustomSimLockDeActivateIPC: + // request can't be cancelled on DOS side + ret = KErrNone; + break; + default: + return KErrGeneral; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::RegisterNotification +// Called when the server recognises this notification being posted for +// the first time on this sub-session object. It enables the TSY to "turn on" +// any regular notification messages that it may receive from DOS. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::RegisterNotification( + const TInt ) + { + return KErrNotSupported; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::DeregisterNotification +// Called when the server recognises that this notification will not be posted +// again because the last client to have a handle on this sub-session object +// has just closed the handle. It enables the TSY to "turn off" any regular +// notification messages that it may receive from DOS. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::DeregisterNotification( + const TInt ) + { + return KErrNotSupported; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::ActivateSimLockL +// This method activates SimLock. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::ActivateSimLockL( + const TTsyReqHandle aTsyReqHandle, + RMmCustomAPI::TSimLockPassword* aPassword, + RMmCustomAPI::TLockNumber* aLockNumber ) + { + TInt ret( KErrArgument ); + + if ( NULL != iTsyReqHandleStore->GetTsyReqHandle( + ESimLockRequestTypeActivateSimLock ) ) + { + return KErrServerBusy; + } + + switch ( *aLockNumber ) + { + case RMmCustomAPI::EOperator: + case RMmCustomAPI::EGid1: + case RMmCustomAPI::EGid2: + case RMmCustomAPI::EImsi: + case RMmCustomAPI::EOperator_Gid1: + case RMmCustomAPI::EOperator_Gid2: + iActivateSimLockNumber = aLockNumber; + break; + default: + return KErrArgument; + } + iActivateSimLockPassword = aPassword; + + // Ask DOS to activate SimLock + // packed parameters: RMmCustomAPI::TSimLockPassword and + // RMmCustomAPI::TLockNumber + CMmDataPackage dataPackage; + dataPackage.PackData( aPassword, aLockNumber ); + ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL( + ECustomSimLockActivateIPC, &dataPackage ); + + if ( KErrNone == ret ) + { +#ifdef REQHANDLE_TIMER + SetTypeOfResponse( ESimLockRequestTypeActivateSimLock, + aTsyReqHandle ); +#else + iTsyReqHandleStore->SetTsyReqHandle( + ESimLockRequestTypeActivateSimLock, aTsyReqHandle ); +#endif // REQHANDLE_TIMER + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::CompleteActivateSimLock +// Completes ActivateSimLock request. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmSimLockTsy::CompleteActivateSimLock( + TInt aError ) + { + if ( NULL != iTsyReqHandleStore->GetTsyReqHandle( + ESimLockRequestTypeActivateSimLock ) ) + { + iMmCustomTsy->ReqCompleted( iTsyReqHandleStore-> + ResetTsyReqHandle( ESimLockRequestTypeActivateSimLock ), aError ); + } + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::DeActivateSimLockL +// This method deactivates SimLock. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmSimLockTsy::DeActivateSimLockL( + const TTsyReqHandle aTsyReqHandle, + RMmCustomAPI::TSimLockPassword* aPassword, + RMmCustomAPI::TLockNumber* aLockNumber ) + { + TInt ret( KErrArgument ); + + if ( NULL != iTsyReqHandleStore->GetTsyReqHandle( + ESimLockRequestTypeDeActivateSimLock ) ) + { + return KErrServerBusy; + } + + switch ( *aLockNumber ) + { + case RMmCustomAPI::EOperator: + case RMmCustomAPI::EGid1: + case RMmCustomAPI::EGid2: + case RMmCustomAPI::EImsi: + case RMmCustomAPI::EOperator_Gid1: + case RMmCustomAPI::EOperator_Gid2: + case RMmCustomAPI::EGlobalUnlock: + iDeActivateSimLockNumber = aLockNumber; + break; + default: + return KErrArgument; + } + + iDeActivateSimLockPassword = aPassword; + + // Ask DOS to deactivate SimLock + // packed parameters: RMmCustomAPI::TSimLockPassword and + // RMmCustomAPI::TLockNumber + CMmDataPackage dataPackage; + dataPackage.PackData( aPassword, aLockNumber ); + ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL( + ECustomSimLockDeActivateIPC, &dataPackage ); + + if ( KErrNone == ret ) + { +#ifdef REQHANDLE_TIMER + SetTypeOfResponse( ESimLockRequestTypeDeActivateSimLock, + aTsyReqHandle ); +#else + iTsyReqHandleStore->SetTsyReqHandle( + ESimLockRequestTypeDeActivateSimLock, aTsyReqHandle ); +#endif // REQHANDLE_TIMER + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::CompleteDeActivateSimLock +// Completes DeActivateSimLock request. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmSimLockTsy::CompleteDeActivateSimLock( + TInt aError ) + { + if ( NULL != iTsyReqHandleStore->GetTsyReqHandle( + ESimLockRequestTypeDeActivateSimLock ) ) + { + iMmCustomTsy->ReqCompleted( iTsyReqHandleStore-> + ResetTsyReqHandle( ESimLockRequestTypeDeActivateSimLock ), + aError ); + } + } + +#ifdef REQHANDLE_TIMER +// --------------------------------------------------------------------------- +// CMmSimLockTsy::SetTypeOfResponse +// Sets the type of response for a given handle. Automatic mode includes an +// automatic response in case of non response from the DOS in a specified time. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmSimLockTsy::SetTypeOfResponse( + const TInt aReqHandleType, + const TTsyReqHandle aTsyReqHandle ) + { + TInt timeOut( 0 ); + TInt ipc( 0 ); + + switch ( aReqHandleType ) + { + case ESimLockRequestTypeActivateSimLock: + timeOut = KMmActivateSimLockTimeOut; + ipc = ECustomSimLockActivateIPC; + break; + case ESimLockRequestTypeDeActivateSimLock: + timeOut = KMmDeactivateSimLockTimeOut; + ipc = ECustomSimLockDeActivateIPC; + break; + default: + // Does not use timer + iTsyReqHandleStore->SetTsyReqHandle( + aReqHandleType, aTsyReqHandle ); + break; + } + + if ( 0 < timeOut ) + { + // The timeout parameter is given in seconds. + iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, aTsyReqHandle, + timeOut, ipc ); + } + } + +// --------------------------------------------------------------------------- +// CMmSimLockTsy::Complete +// Completes the request due the timer expiration. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CMmSimLockTsy::Complete( + TInt aReqHandleType, + TInt aError ) + { +TFLOGSTRING3( "CMmCustomTsy: CMmSimLockTsy::Complete.\n\t ReqHandleType:%d \n\t Error:%d\n", aReqHandleType, aError ); + + // All possible TSY req handle types are listed in the + // switch case below. + switch ( aReqHandleType ) + { + case ESimLockRequestTypeActivateSimLock: + CompleteActivateSimLock( aError ); + break; + case ESimLockRequestTypeDeActivateSimLock: + CompleteDeActivateSimLock( aError ); + break; + default: + iMmCustomTsy->ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle( + aReqHandleType ), aError ); + break; + } + } +#endif // REQHANDLE_TIMER + +// End of File