cellular/telephonysettings/src/PsetCli.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002 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:  CPsetCli is provides calling line identification SS.
*
*
*/


//INCLUDE FILES
#include "PsetCli.h"
#include "PSetPanic.h"
#include "PsetConstants.h"
#include "MPsetRequestObs.h"
#include <bldvariant.hrh>
#include <featmgr.h>

// CONSTANTS    
_LIT( KPSNameOfClass, "CPsetCli" );

//  MEMBER FUNCTIONS
// ---------------------------------------------------------------------------
// Symbian OS 1st phase Constructor.
// ---------------------------------------------------------------------------
//
EXPORT_C CPsetCli* CPsetCli::NewL( RMobilePhone& aPhone, MPsetCliObserver& aObserver )
    {
    CPsetCli* self = new ( ELeave ) CPsetCli( aPhone );
    CleanupStack::PushL( self );
    // Sets up TLS, must be done before FeatureManager is used.
    FeatureManager::InitializeLibL();
    CleanupStack::Pop( self );
    self->SetObserver( aObserver );
    return self;
    }

// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
//
EXPORT_C CPsetCli::~CPsetCli()
    {
    // Remove FeatureManager
    FeatureManager::UnInitializeLib();
    Cancel();
    iReqObserver = NULL;
    }

// ---------------------------------------------------------------------------
// C++ Constructor.
// ---------------------------------------------------------------------------
//
CPsetCli::CPsetCli( RMobilePhone& aPhone ) : CActive( EPriorityStandard ),
iPhone( aPhone )
    {
    CActiveScheduler::Add( this );
    }

// ---------------------------------------------------------------------------
// Cancels all requests.
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::CancelAll()
    {
    // Set PSUI so that correct observer is used and hide requesting note.
    // When interrupting a note, does not leave.
    // This needs to be done first, since notes must be cleared from screen
    // even though request is not active.
    iObserver->SetEngineContact( this );
    TRAPD( ignore, iObserver->HandleCliRequestingL( EFalse, ETrue ) );
    // Line below fixes armv5 warning.
    ignore = ignore;
    
    if ( !IsActive() )
        {
        return;
        }    
    
    Cancel();
    }

// ---------------------------------------------------------------------------
// Requests for COLP mode.
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::GetColpModeL()
    {
    /*****************************************************
    *    Series 60 Customer / ETel
    *    Series 60  ETel API
    *****************************************************/
    IssueRequestL( RMobilePhone::EIdServiceConnectedPresentation );
    }

// ---------------------------------------------------------------------------
// Requests for CLIP mode.
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::GetClipModeL()
    {
    /*****************************************************
    *    Series 60 Customer / ETel
    *    Series 60  ETel API
    *****************************************************/
    IssueRequestL( RMobilePhone::EIdServiceCallerPresentation );
    }

// ---------------------------------------------------------------------------
// Requests for COLP mode.
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::GetClirModeL()
    {
    /*****************************************************
    *    Series 60 Customer / ETel
    *    Series 60  ETel API
    *****************************************************/
    IssueRequestL( RMobilePhone::EIdServiceCallerRestriction );
    }

// ---------------------------------------------------------------------------
// Requests for COLR mode.
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::GetColrModeL()
    {
    /*****************************************************
    *    Series 60 Customer / ETel
    *    Series 60  ETel API
    *****************************************************/
    IssueRequestL( RMobilePhone::EIdServiceConnectedRestriction );
    }

// ---------------------------------------------------------------------------
// Sets request observer.
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::SetRequestObserver( MPsetRequestObserver* aObs )
    {
    iReqObserver = aObs;
    }

// ---------------------------------------------------------------------------
// Make request to get CNAP status
// ---------------------------------------------------------------------------
//
EXPORT_C void CPsetCli::GetCnapL()
    {
    if ( FeatureManager::FeatureSupported( KFeatureIdPhoneCnap ) )
        {
        /*****************************************************
        *    Series 60 Customer / ETel
        *    Series 60  ETel API
        *****************************************************/
        IssueRequestL( RMobilePhone::EIdServiceCallerName );
        }
    }

//---------------------------------------------------------------------------
// Handles completed request. 
// 
//---------------------------------------------------------------------------
//
void CPsetCli::RunL()
    {
    __ASSERT_ALWAYS( iObserver, Panic( KPSNameOfClass, ECliNoObserver ) );
    TBool commonNotes = ETrue;
    
    //Hide requesting note - does not leave when deleting a note.
    iObserver->SetEngineContact( this );
    iObserver->HandleCliRequestingL( EFalse, EFalse );
    if ( iStatus != KErrNone )
        {
        iObserver->HandleCliErrorL( iStatus.Int() );
        RequestCompleted( iStatus.Int() );        
        return;
        }
    
    TPsuiCli type = EPsuiCliUnknown; 
    
    switch ( iRequestedService )
        {
        /*****************************************************
        *    Series 60 Customer / ETel
        *    Series 60  ETel API
        *****************************************************/
        case RMobilePhone::EIdServiceConnectedRestriction:
            switch ( iServiceStatus )
                {
                case RMobilePhone::EIdServiceActivePermanent:
                    type = EPsuiColrOn;
                    break;
                case RMobilePhone::EIdServiceNotProvisioned:
                    type = EPsuiColrOff;
                    break;
                case RMobilePhone::EIdServiceUnknown:
                    type = EPsuiCliUnknown;
                    break;
                default:
                    break;
                }
            break;
        case RMobilePhone::EIdServiceConnectedPresentation:
            switch ( iServiceStatus )
                
                {
                case RMobilePhone::EIdServiceActivePermanent:
                    type = EPsuiColpOn;
                    break;
                case RMobilePhone::EIdServiceNotProvisioned:
                    type = EPsuiColpOff;
                    break;
                case RMobilePhone::EIdServiceUnknown:
                    type = EPsuiCliUnknown;
                    break;
                default:
                    break;
                }
            break;
        case RMobilePhone::EIdServiceCallerRestriction:
            switch ( iServiceStatus )
            
                {
                case RMobilePhone::EIdServiceActivePermanent:                
                case RMobilePhone::EIdServiceActiveDefaultRestricted:
                    type = EPsuiClirOn;
                    break;
                case RMobilePhone::EIdServiceActiveDefaultAllowed:
                case RMobilePhone::EIdServiceNotProvisioned:
                    type = EPsuiClirOff;
                    break;
                case RMobilePhone::EIdServiceUnknown:
                    type = EPsuiCliUnknown;
                    break;
                default:
                    break;
                }
            break;
        case RMobilePhone::EIdServiceCallerPresentation:
            switch ( iServiceStatus )
                {
                case RMobilePhone::EIdServiceActivePermanent:
                    type = EPsuiClipOn;
                    break;
                case RMobilePhone::EIdServiceNotProvisioned:
                    type = EPsuiClipOff;
                    break;
                case RMobilePhone::EIdServiceUnknown:
                    type = EPsuiCliUnknown;
                    break;
                default:
                    break;
                }
            break;
        case RMobilePhone::EIdServiceCallerName:
            commonNotes = EFalse;
            iObserver->HandleCnapStatusL( iServiceStatus );
            break;
        default:
            Panic( KPSNameOfClass, ECliParameter );
            break;
        } 

    if ( commonNotes )
        {
        iObserver->CliInformationL( type );
        }    
    RequestCompleted( KErrNone );
    }

// ---------------------------------------------------------------------------
// Cancels pending request.
// 
// ---------------------------------------------------------------------------
//
void CPsetCli::DoCancel()
    {
    if ( !IsActive() )
        {
        return;
        }
    switch ( iRequestedService )
        {
        /*****************************************************
        *    Series 60 Customer / ETel
        *    Series 60  ETel API
        *****************************************************/
        case RMobilePhone::EIdServiceConnectedRestriction:
        case RMobilePhone::EIdServiceConnectedPresentation:
        case RMobilePhone::EIdServiceCallerRestriction:
        case RMobilePhone::EIdServiceCallerPresentation:
        case RMobilePhone::EIdServiceCallerName:
            iPhone.CancelAsyncRequest( EMobilePhoneGetIdentityServiceStatus );
            break;
        default:
            break;            
        }
    SetRequestStatus( RMobilePhone::EIdServiceUnspecified );
    }

// ---------------------------------------------------------------------------
// Sets observer.
// ---------------------------------------------------------------------------
//
void CPsetCli::SetObserver( MPsetCliObserver& aObserver )
    {
    iObserver = &aObserver;
    iObserver->SetEngineContact( this );
    }

// ---------------------------------------------------------------------------
// 
// Push object into cleanupstack to catch leaving.
// 
// ---------------------------------------------------------------------------
//
void CPsetCli::CleanupLeavePushL()
    {
    CleanupStack::PushL( TCleanupItem( DoHandleLeave, this ) );
    }

// ---------------------------------------------------------------------------
// 
// Things to do when leave occurs.
// 
// ---------------------------------------------------------------------------
//
void CPsetCli::HandleLeave()
    {
    CancelAll();
    }

// ---------------------------------------------------------------------------
// 
// Object has caused a leave.
// 
// ---------------------------------------------------------------------------
//
void CPsetCli::DoHandleLeave( TAny* aAny )
    {
    REINTERPRET_CAST( CPsetCli*, aAny )->HandleLeave();
    }

// ---------------------------------------------------------------------------
// Inform the request observer that request has been completed.
// ---------------------------------------------------------------------------
//
void CPsetCli::RequestCompleted( const TInt& aError )
    {
    if ( aError != KErrNone )
        {
        SetRequestStatus( 
            static_cast <RMobilePhone::TMobilePhoneIdService> (aError) );
        }
    SetRequestStatus( RMobilePhone::EIdServiceUnspecified );
    
    if ( iReqObserver )
        {
        iReqObserver->RequestComplete(); 
        }
    }

// ---------------------------------------------------------------------------
// Issues pre-defined request.
// ---------------------------------------------------------------------------
//
void CPsetCli::IssueRequestL( RMobilePhone::TMobilePhoneIdService aService ) 
    {    
    if ( IsActive() )
        {
        /*****************************************************
        *    Series 60 Customer / ETel
        *    Series 60  ETel API
        *****************************************************/
        User::Leave( KErrGeneral );
        }    
    SetRequestStatus( aService );
       
    iPhone.GetIdentityServiceStatus( iStatus, aService, iServiceStatus );    
    SetActive();
    
    // Set PSUI so that correct observer is used and show note.
    iObserver->SetEngineContact( this );
    CleanupLeavePushL();    
    iObserver->HandleCliRequestingL( ETrue, EFalse );
    CleanupStack::Pop(); // CleanupCancelPushL
    }

// ---------------------------------------------------------------------------
// Update the request status - both internally and to observers.
// ---------------------------------------------------------------------------
//
void CPsetCli::SetRequestStatus( RMobilePhone::TMobilePhoneIdService aStatus )
    {
    iRequestedService = aStatus;
    if ( iReqObserver )
        {
        iReqObserver->RequestStatusChanged( aStatus );
        }
    }

// End of file