telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmSimLockTsy.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /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 <ctsy/tflogger.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+// ======== 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