bluetoothengine/headsetsimulator/profiles/hfpprofile/src/features/hfpfeaturemanager.cpp
author michal.sulewski
Wed, 15 Sep 2010 15:59:44 +0200
branchheadsetsimulator
changeset 60 90dbfc0435e3
permissions -rw-r--r--
source code commit

/* 
 *
 * Copyright (c) <2010> Comarch S.A. and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Original Contributors:
 * Comarch S.A. - original contribution.
 *
 * Contributors:
 *
 * Description:
 *
 */

#include "hfpfeaturemanager.h"
#include "hfpcalltermination.h"
#include "hfpconnectionmanagement.h"
#include "hfpincomingcallacceptance.h"
#include "hfpincomingcallrejection.h"
#include "hfpphonestatusinformation.h"
#include "hfpremoteaudiovolumecontrol.h"
#include "hfplastnumberredialing.h"
#include "hfpphonenumberdialing.h"
#include "hfpcallinglineidentification.h"
#include "hfpcommand.h"
#include "debug.h"

CHsHFPFeatureManager* CHsHFPFeatureManager::NewL()
    {
    CHsHFPFeatureManager *self = CHsHFPFeatureManager::NewLC();
    CleanupStack::Pop( self );

    return self;
    }

CHsHFPFeatureManager* CHsHFPFeatureManager::NewLC()
    {

    CHsHFPFeatureManager *self = new ( ELeave ) CHsHFPFeatureManager();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

CHsHFPFeatureManager::~CHsHFPFeatureManager()
    {
    TRACE_FUNC_ENTRY
    if ( iConnectionManagement )
        {
        delete iConnectionManagement;
        }
    if ( iCallTermProc )
        {
        delete iCallTermProc;
        }
    if ( iCallAcceptProc )
        {
        delete iCallAcceptProc;
        }
    if ( iCallRejectProc )
        {
        delete iCallRejectProc;
        }
    if ( iPhoneStatus )
        {
        delete iPhoneStatus;
        }
    if ( iVolumeControl )
        {
        delete iVolumeControl;
        }
    if ( iLastNumberRedialing )
        {
        delete iLastNumberRedialing;
        }
    if ( iPhoneNumberDialing )
        {
        delete iPhoneNumberDialing;
        }
    if ( iCallingLineIdentification )
        {
        delete iCallingLineIdentification;
        }
    TRACE_FUNC_EXIT

    }

void CHsHFPFeatureManager::PerformDataProcessingL(
        const CHsHFPCommand* aATCommandIn, CHsHFPCommand& aATCommandOut )
    {
    TRACE_FUNC_ENTRY
    if ( iSrvLvlConnEstablished )
        {
        //decide which procedure should be used
        switch ( aATCommandIn->Type() )
            {
            case EHFPCmdCHUP:
                {
                if ( iPhoneStatus->IsCallOngoing() )
                    {
                    //start releasing connection
                    User::LeaveIfNull( iCallTermProc );
                    User::LeaveIfError( iCallTermProc->ProcessCommand(
                            *aATCommandIn, aATCommandOut ) );
                    iProcedureStarted = EHFPCallTerminate;
                    }
                else
                    {
                    //start call rejection
                    User::LeaveIfNull( iCallRejectProc );
                    User::LeaveIfError( iCallRejectProc->ProcessCommand(
                            *aATCommandIn, aATCommandOut ) );
                    iProcedureStarted = EHFPCallReject;
                    }
                }
                break;

            case EHFPCmdOK:
                {
                HandleOKCommandL( aATCommandIn, aATCommandOut );
                }
                break;
            case EHFPCmdERROR:
                {
                if ( iProcedureStarted == EHFPLastNumberRedialing )
                    {
                    User::LeaveIfNull( iLastNumberRedialing );
                    User::LeaveIfError( iLastNumberRedialing->ProcessCommand(
                            *aATCommandIn, aATCommandOut ) );
                    }
                else if ( iProcedureStarted == EHFPPhoneNumberDialing )
                    {
                    User::LeaveIfNull( iPhoneNumberDialing );
                    User::LeaveIfError( iPhoneNumberDialing->ProcessCommand(
                            *aATCommandIn, aATCommandOut ) );
                    }
                else
                    {
                    User::Leave( KErrArgument );
                    }
                }
                break;
            case EHFPCmdCIEV:
                {
                HandleCIEVCommandL( aATCommandIn, aATCommandOut );
                }
                break;
            case EHFPCmdRING:
                {
                User::LeaveIfNull( iCallAcceptProc );
                User::LeaveIfError( iCallAcceptProc->ProcessCommand(
                        *aATCommandIn, aATCommandOut ) );
                iProcedureStarted = EHFPCallAccept;
                }
                break;
            case EHFPCmdATA:
                {
                if ( iProcedureStarted == EHFPCallAccept )
                    {
                    User::LeaveIfNull( iCallAcceptProc );
                    User::LeaveIfError( iCallAcceptProc->ProcessCommand(
                            *aATCommandIn, aATCommandOut ) );
                    }
                else
                    {
                    User::Leave( KErrArgument );
                    }
                }
                break;
            case EHFPCmdCOPS:
                {
                iProcedureStarted = EHFPOperatorSelection;
                User::LeaveIfNull( iPhoneStatus );
                User::LeaveIfError( iPhoneStatus->ProcessCommand(
                        *aATCommandIn, aATCommandOut ) );
                }
                break;
            case EHFPCmdVGS: // fall-through intended here
            case EHFPCmdVGM:
                {
                iProcedureStarted = EHFPVolumeControl;
                User::LeaveIfNull( iVolumeControl );
                User::LeaveIfError( iVolumeControl->ProcessCommand(
                        *aATCommandIn, aATCommandOut ) );
                }
                break;
            case EHFPCmdBLDN:
                {
                iProcedureStarted = EHFPLastNumberRedialing;
                User::LeaveIfNull( iLastNumberRedialing );
                User::LeaveIfError( iLastNumberRedialing->ProcessCommand(
                        *aATCommandIn, aATCommandOut ) );
                }
                break;
            case EHFPCmdATD:
                {
                iProcedureStarted = EHFPPhoneNumberDialing;
                User::LeaveIfNull( iPhoneNumberDialing );
                User::LeaveIfError( iPhoneNumberDialing->ProcessCommand(
                        *aATCommandIn, aATCommandOut ) );
                }
                break;
            case EHFPCmdCLIP:
                {
                iProcedureStarted = EHFPCallingLineIdentification;
                User::LeaveIfNull( iCallingLineIdentification );
                User::LeaveIfError( iCallingLineIdentification->ProcessCommand(
                        *aATCommandIn, aATCommandOut ) );
                }
                break;
            default:
                User::Leave( KErrArgument );
            }
        }
    else
        {
        //start ServiceLevelConnectionProcedure
        User::LeaveIfNull( iConnectionManagement );
        iProcedureStarted = EHFPServiceLevelConnectionEstablishment;
        User::LeaveIfError(
                iConnectionManagement->EstablishServiceLevelConnection(
                        *aATCommandIn, aATCommandOut ) );
        }

    TRACE_FUNC_EXIT
    }

void CHsHFPFeatureManager::HandleClientDisconnected( TInt aErr )
    {
    TRACE_FUNC_ENTRY
    iProcedureStarted = EHFPServiceLevelConnectionRelease;
    iConnectionManagement->HandleServiceLevelConnectionRelease( aErr );
    iVolumeControl->Reset();
    TRACE_FUNC_EXIT
    }

void CHsHFPFeatureManager::HandleClientConnectedL( TDes8& aCommandOut )
    {
    TRACE_FUNC_ENTRY
    CHsHFPCommand* cmdIn = CHsHFPCommand::NewL();
    CleanupStack::PushL( cmdIn );
    CHsHFPCommand* cmdOut = CHsHFPCommand::NewL();
    CleanupStack::Pop( cmdIn );
    iProcedureStarted = EHFPServiceLevelConnectionEstablishment;
    iConnectionManagement->EstablishServiceLevelConnection( *cmdIn, *cmdOut );
    cmdOut->ToDes8( aCommandOut );

    delete cmdIn;
    delete cmdOut;

    TRACE_FUNC_EXIT
    }

void CHsHFPFeatureManager::HandleProcedureCompleted( TInt aErr )
    {
    TRACE_FUNC_ENTRY
    switch ( iProcedureStarted )
        {
        case EHFPServiceLevelConnectionEstablishment:
            if ( aErr == KErrNone )
                {
                TRACE_INFO(_L8("Connection established"))
                iSrvLvlConnEstablished = ETrue;
                iProcedureStarted = EHFPVolumeControl;
                }
            break;
        case EHFPServiceLevelConnectionRelease:
            if ( aErr == KErrNone )
                {
                TRACE_INFO(_L8("Connection released"))
                iSrvLvlConnEstablished = EFalse;
                iProcedureStarted = EHFPIdle;
                }
            break;
        case EHFPCallTerminate:
            iProcedureStarted = EHFPIdle;
            TRACE_INFO(_L8("Call terminated"))
            break;
        case EHFPCallAccept:
            TRACE_INFO(_L("Call answered"))
            iProcedureStarted = EHFPIdle;
            break;
        case EHFPCallReject:
            TRACE_INFO(_L("Call rejected"))
            iProcedureStarted = EHFPIdle;
            break;
        case EHFPOperatorSelection:
            TRACE_INFO(_L("Operator selection"))
            iProcedureStarted = EHFPIdle;
            break;
        case EHFPVolumeControl:
            TRACE_INFO(_L("Volume control"))
            break;
        case EHFPLastNumberRedialing:
            TRACE_INFO(_L("Last number re-dial"))
            iProcedureStarted = EHFPIdle;
            break;
        case EHFPPhoneNumberDialing:
            TRACE_INFO(_L("Phone number dialing"))
            iProcedureStarted = EHFPIdle;
            break;
        case EHFPCallingLineIdentification:
            TRACE_INFO(_L("Calling line identification"))
            iProcedureStarted = EHFPCallAccept;
            break;
        default:
            iProcedureStarted = EHFPIdle;
        }
    TRACE_FUNC_EXIT
    }

CHsHFPFeatureManager::CHsHFPFeatureManager()
    {

    }

void CHsHFPFeatureManager::ConstructL()
    {
    TRACE_FUNC_ENTRY
    iConnectionManagement = CHsHFPConnectionManagement::NewL( this );
    iCallTermProc = CHsHFPCallTerminationProc::NewL( this );
    iCallAcceptProc = CHsHFPIncomingCallAcceptance::NewL( this );
    iCallRejectProc = CHsHFPIncomingCallRejection::NewL( this );
    iPhoneStatus = CHsHFPPhoneStatusInformation::NewL( this );
    iVolumeControl = CHsHFPRemoteAudioVolumeControl::NewL( this );
    iLastNumberRedialing = CHsHFPLastNumberRedialing::NewL( this );
    iPhoneNumberDialing = CHsHFPPhoneNumberDialing::NewL( this );
    iCallingLineIdentification = CHsHFPCallingLineIdentification::NewL( this );
    TRACE_FUNC_EXIT
    }

void CHsHFPFeatureManager::HandleOKCommandL( const CHsHFPCommand* aATCommandIn,
        CHsHFPCommand& aATCommandOut )
    {
    TRACE_FUNC_ENTRY
    if ( iProcedureStarted == EHFPCallTerminate )
        {
        User::LeaveIfNull( iCallTermProc );
        User::LeaveIfError( iCallTermProc->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPCallAccept )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPCallAccept"))
        User::LeaveIfNull( iCallAcceptProc );
        User::LeaveIfError( iCallAcceptProc->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPCallReject )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPCallReject"))
        User::LeaveIfNull( iCallRejectProc );
        User::LeaveIfError( iCallRejectProc->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPOperatorSelection )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPOperatorSelection"))
        User::LeaveIfNull( iPhoneStatus );
        User::LeaveIfError( iPhoneStatus->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPVolumeControl )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPVolumeControl"))
        User::LeaveIfNull( iVolumeControl );
        User::LeaveIfError( iVolumeControl->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPLastNumberRedialing )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPLastNumberRedialing"))
        User::LeaveIfNull( iLastNumberRedialing );
        User::LeaveIfError( iLastNumberRedialing->ProcessCommand(
                *aATCommandIn, aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPPhoneNumberDialing )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPPhoneNumberDialing"))
        User::LeaveIfNull( iPhoneNumberDialing );
        User::LeaveIfError( iPhoneNumberDialing->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPCallingLineIdentification )
        {
        TRACE_INFO(_L("iProcedureStarted == EHFPCallingLineIdentification"))
        User::LeaveIfNull( iCallingLineIdentification );
        User::LeaveIfError( iCallingLineIdentification->ProcessCommand(
                *aATCommandIn, aATCommandOut ) );
        }
    else
        {
        User::Leave( KErrArgument );
        }
    TRACE_FUNC_EXIT
    }

void CHsHFPFeatureManager::HandleCIEVCommandL(
        const CHsHFPCommand* aATCommandIn, CHsHFPCommand& aATCommandOut )
    {
    TRACE_FUNC_ENTRY

    // refresh settings
    iPhoneStatus->ProcessCommand( *aATCommandIn, aATCommandOut );

    if ( iProcedureStarted == EHFPCallTerminate )
        {
        TRACE_INFO(_L8("CIEV : CALL TERMINATE"))
        User::LeaveIfNull( iCallTermProc );
        User::LeaveIfError( iCallTermProc->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPCallReject )
        {
        TRACE_INFO(_L("CIEV : CALL REJECT"))
        User::LeaveIfNull( iCallRejectProc );
        User::LeaveIfError( iCallRejectProc->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPCallAccept )
        {
        TRACE_INFO(_L("CIEV : CALL ACCEPT"))
        User::LeaveIfNull( iCallAcceptProc );
        User::LeaveIfError( iCallAcceptProc->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPLastNumberRedialing )
        {
        TRACE_INFO(_L("CIEV : LAST NUMBER REDIAL"))
        User::LeaveIfNull( iLastNumberRedialing );
        User::LeaveIfError( iLastNumberRedialing->ProcessCommand(
                *aATCommandIn, aATCommandOut ) );
        }
    else if ( iProcedureStarted == EHFPPhoneNumberDialing )
        {
        TRACE_INFO(_L("CIEV : PHONE NUMBER DIALING"))
        User::LeaveIfNull( iPhoneNumberDialing );
        User::LeaveIfError( iPhoneNumberDialing->ProcessCommand( *aATCommandIn,
                aATCommandOut ) );
        }
    else
        {
        User::Leave( KErrArgument );
        }

    TRACE_FUNC_EXIT
    }