callcontinuity/vcc/src/tvccstate.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:12:36 +0200
changeset 0 a4daefaec16c
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2006-2008 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:   Default implementations for the VCC state machine functions
*
*/

#include "tvccstate.h"
#include "cvccperformer.h"
#include "rubydebug.h"


// -----------------------------------------------------------------------------
// c'tor
// -----------------------------------------------------------------------------
//

TVccState::TVccState()
	{
	RUBY_DEBUG_BLOCK( "TVccState::TVccState" );	
	}


// -----------------------------------------------------------------------------
// User has answered the incoming call
// -----------------------------------------------------------------------------
//
TInt TVccState::Answer( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Answer" );
 	return aCall.Answer();
    }
    
// -----------------------------------------------------------------------------
// User has rejected the incoming call
// -----------------------------------------------------------------------------
//
TInt TVccState::Reject( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Reject" );
  	return aCall.Reject();
    }
    
// -----------------------------------------------------------------------------
// Queue incoming call
// -----------------------------------------------------------------------------
//
TInt TVccState::Queue( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Queue" );
 	return aCall.Queue();
    }
    
// -----------------------------------------------------------------------------
// Dial a new call
// -----------------------------------------------------------------------------
//
TInt TVccState::Dial( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Dial" );
 	return aCall.Dial();
    }

// -----------------------------------------------------------------------------
// MT call user ringing now
// -----------------------------------------------------------------------------
//
TInt TVccState::Ringing( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Ringing" );
	return aCall.Ringing();
    }

// -----------------------------------------------------------------------------
// End current call
// -----------------------------------------------------------------------------
//
TInt TVccState::HangUp( CVccPerformer& /*aContext*/, MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::HangUp" );
    return aCall.HangUp();
 
    }

// -----------------------------------------------------------------------------
// Cancel ongoing request
// -----------------------------------------------------------------------------
//
TInt TVccState::Cancel( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Cancel" );
  	return aCall.Cancel();
    }


// -----------------------------------------------------------------------------
// Hold call
// -----------------------------------------------------------------------------
//
TInt TVccState::Hold( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Hold" );
    return aCall.Hold();
 
    }


// -----------------------------------------------------------------------------
// Resume held call
// -----------------------------------------------------------------------------
//
TInt TVccState::Resume( MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Resume" );
 	return aCall.Resume();
    }


// -----------------------------------------------------------------------------
// Swap hold/resume states
// -----------------------------------------------------------------------------
//
TInt TVccState::Swap( MCCPCall& /*aCall*/ )
    {
    RUBY_DEBUG_BLOCK( "TVccState::Swap" );
    //return aCall.Swap();
    return KErrArgument; //not allowed

    }


// -----------------------------------------------------------------------------
// Get call recipient
// -----------------------------------------------------------------------------
//
const TDesC& TVccState::RemoteParty( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::RemoteParty" );
	return aCall.RemoteParty();
    }


// -----------------------------------------------------------------------------
// Get call recipient
// -----------------------------------------------------------------------------
//
const TDesC& TVccState::DialledParty( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::DialledParty" );
    return aCall.DialledParty();
 
    }



// -----------------------------------------------------------------------------
// Is call forwarded or not
// -----------------------------------------------------------------------------
//
TBool TVccState::IsCallForwarded( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::IsCallForwarded" );
 	return aCall.IsCallForwarded();
    }


// -----------------------------------------------------------------------------
// Is call mobile originated or not
// -----------------------------------------------------------------------------
//
TBool TVccState::IsMobileOriginated( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::IsMobileOriginated" );
 	return aCall.IsMobileOriginated();
    }


// -----------------------------------------------------------------------------
// Get current call state
// -----------------------------------------------------------------------------
//
MCCPCallObserver::TCCPCallState TVccState::State( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::State" );
 	return aCall.State();
    }


// -----------------------------------------------------------------------------
// get call capabilities
// -----------------------------------------------------------------------------
//
MCCPCallObserver::TCCPCallControlCaps TVccState::Caps( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::Caps" );
 	return aCall.Caps();
    }

// -----------------------------------------------------------------------------
// SecureSpecified
// -----------------------------------------------------------------------------
//
TBool TVccState::SecureSpecified( const MCCPCall& aCall ) const
    {
    return aCall.SecureSpecified();
    }

// -----------------------------------------------------------------------------
// Is call secured
// -----------------------------------------------------------------------------
//
TBool TVccState::IsSecured( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::IsSecured" );
    return aCall.IsSecured();
    }


// -----------------------------------------------------------------------------
// Set paramaters
// -----------------------------------------------------------------------------
//
void TVccState::SetParameters( const CCCPCallParameters& /*aNewParams*/ )
    {
    RUBY_DEBUG_BLOCK( "TVccState::SetParameters" );
    //not implemented
    }

// -----------------------------------------------------------------------------
// Get paramaters
// -----------------------------------------------------------------------------
//
const CCCPCallParameters& TVccState::Parameters( const MCCPCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::Parameters" );
    return aCall.Parameters();
    
    }

// -----------------------------------------------------------------------------
// Return used tone.
// -----------------------------------------------------------------------------
//
TCCPTone TVccState::Tone( const MCCPCall& aCall ) const
	{
	RUBY_DEBUG_BLOCK( "TVccState::Tone" );
	return aCall.Tone();
	}
    

// -----------------------------------------------------------------------------
// Add observer.
// -----------------------------------------------------------------------------
//
void TVccState::AddObserverL( const MCCPCallObserver& aObserver, 
                              MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCKL( "TVccState::AddObserverL" );
 	aCall.AddObserverL(aObserver);
    }

// -----------------------------------------------------------------------------
// Add observer.
// -----------------------------------------------------------------------------
//
TInt TVccState::RemoveObserver( const MCCPCallObserver& aObserver, 
                                MCCPCall& aCall )
    {
    RUBY_DEBUG_BLOCK( "TVccState::RemoveObserver" );
	return aCall.RemoveObserver(aObserver);
    }


// -----------------------------------------------------------------------------
// Dial from MCCPCSCall
// -----------------------------------------------------------------------------
//
TInt TVccState::Dial( const TDesC8& aCallParams, MCCPCSCall& aCall  )
	{
	RUBY_DEBUG_BLOCK( "TVccState::Dial" );
	return aCall.Dial(aCallParams);
	//!!!!!!!!!!!!!!-> check if "if" is really as this cannot be really invoked
	// for non-cs call
	}

// -----------------------------------------------------------------------------
// NoFDNCheck from MCCPCSCall
// -----------------------------------------------------------------------------
//
void TVccState::NoFDNCheck( MCCPCSCall& aCall )
	{
	RUBY_DEBUG_BLOCK( "TVccState::NoFDNCheck" );
	aCall.NoFDNCheck();
	}

// -----------------------------------------------------------------------------
// GetMobileCallInfo from MCCPCSCall
// -----------------------------------------------------------------------------
//
TInt TVccState::GetMobileCallInfo( TDes8& aCallInfo, 
                                   const MCCPCSCall& aCall ) const
	{
	RUBY_DEBUG_BLOCK( "TVccState::GetMobileCallInfo" );
	return aCall.GetMobileCallInfo(aCallInfo);

	}
	
// -----------------------------------------------------------------------------
// SwitchAlternatingCall from MCCPCSCall
// -----------------------------------------------------------------------------
//
TInt TVccState::SwitchAlternatingCall( MCCPCSCall& aCall )
	{
	RUBY_DEBUG_BLOCK( "TVccState::SwitchAlternatingCall" );
	return aCall.SwitchAlternatingCall();
	}

// -----------------------------------------------------------------------------
// SwitchAlternatingCall from MCCPCSCall
// -----------------------------------------------------------------------------
//
TInt TVccState::GetMobileDataCallCaps( TDes8& aCaps, 
                                       const MCCPCSCall& aCall) const
	{
	RUBY_DEBUG_BLOCK( "TVccState::GetMobileDataCallCaps" );
	return aCall.GetMobileDataCallCaps(aCaps);
	}

// -----------------------------------------------------------------------------
// LogDialedNumber from MCCPCSCall
// -----------------------------------------------------------------------------
//
TBool TVccState::LogDialedNumber( const MCCPCSCall& aCall ) const
    {
    RUBY_DEBUG_BLOCK( "TVccState::GetMobileDataCallCaps" );
    return aCall.LogDialedNumber();
    }
//  Releases ongoing call
// -----------------------------------------------------------------------------
//
TInt TVccState::ReleaseCall( MCCPCall& aCall, 
                             RPointerArray<CConvergedCallProvider>& aProvs )
	{
	RUBY_DEBUG_BLOCK( "TVccState::ReleaseCall" );
	TInt err = KErrNotFound;
	for (TUint i=0; i < aProvs.Count(); i++)
		{
		 err = aProvs[i]->ReleaseCall(aCall);
		 if (err == KErrNone)
		 	{
		 	break;
		 	}
		}
	return err;
	}
	
// -----------------------------------------------------------------------------
//  Releases ongoing call
// -----------------------------------------------------------------------------
//
TInt TVccState::ReleaseCall(CVccPerformer& aContext, 
                                MCCPCall& aCall, 
                                TVccState& aState,
                                TUint aHoValue )
	{
	RUBY_DEBUG_BLOCK( "TVccState::ReleaseCall" );
	TInt err = KErrNotFound;
	err = aContext.CsProvider().ReleaseCall(aCall);
	if (err!=KErrNone)
		{
		aContext.PsProvider().ReleaseCall(aCall);
		}
		
	if( aHoValue == KVccHoNok )
	    {
	    //MT party of the call disconnected the call during HO
	    TRAP_IGNORE(aContext.Notifier().NotifySubscriberL( EVccCsToPsHoFailure, 
	            KErrGeneral ) );
	    }
	else
	    {
	    aContext.HandoverReady();
	    TRAP_IGNORE(aContext.Notifier().NotifySubscriberL(EVccCsToPsHoSuccessful,
                KErrNone) );
	    }
	//-> Set Next State
	aContext.SetState(aState);
	return err;
	}
    
// -----------------------------------------------------------------------------
// From MCCPCallObserver
// -----------------------------------------------------------------------------
//
void TVccState::ErrorOccurred(CVccPerformer& /*aContext*/, 
                            const TCCPError /*aError*/,
                            MCCPCall* /*aCall*/ )
	{
	RUBY_DEBUG_BLOCK( "TVccState::ErrorOccurred" );	
	}

// -----------------------------------------------------------------------------
// From MCCPCallObserver
// -----------------------------------------------------------------------------
//
void TVccState::CallStateChanged(CVccPerformer& /*aContext*/, 
                            const MCCPCallObserver::TCCPCallState /*aState*/,
                            MCCPCall* /*aCall*/ )
	{
	RUBY_DEBUG_BLOCK( "TVccState::CallStateChanged" );
	}

// -----------------------------------------------------------------------------
// From MCCPCallObserver
// -----------------------------------------------------------------------------
//
void TVccState::CallStateChangedWithInband(CVccPerformer& /*aContext*/, 
                            const MCCPCallObserver::TCCPCallState /*aState*/,
                            MCCPCall* /*aCall*/  )
	{
	RUBY_DEBUG_BLOCK( "TVccState::CallStateChangedWithInband" );
		
	}

// -----------------------------------------------------------------------------
// From MCCPCallObserver
// -----------------------------------------------------------------------------
//
void TVccState::CallEventOccurred(CVccPerformer& /*aContext*/, 
                            const MCCPCallObserver::TCCPCallEvent /*aEvent*/,
                            MCCPCall* /*aCall*/ )
	{
	RUBY_DEBUG_BLOCK( "TVccState::CallEventOccurred" );	
	}
// -----------------------------------------------------------------------------
// From MCCPCallObserver
// -----------------------------------------------------------------------------
//
void TVccState::CallCapsChanged(CVccPerformer& aContext, 
                            const TUint32 aCapsFlags,
                            MCCPCall* aCall )
	{
	RUBY_DEBUG_BLOCK( "TVccState::CallCapsChanged" );	
	aContext.CallObserver()->CallCapsChanged( aCapsFlags, aCall );
	}
    
// -----------------------------------------------------------------------------
// SwitchL()
// -----------------------------------------------------------------------------
//
void TVccState::SwitchL(CVccPerformer& /*aContext*/)
	{
	RUBY_DEBUG_BLOCK( "TVccState::SwitchL" );
	User::Leave(KErrCompletion);
	}