/*
* 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: Base class for hold contexts. Contains methods
* for creating the state array and controlling current state.
*
*/
#ifndef SVPHOLDCONTEXT_H
#define SVPHOLDCONTEXT_H
#include <e32base.h>
#include <mccpcallobserver.h>
#include "svputdefs.h"
// Constants
const TInt KSVPHoldDirectionAttributeCount = 4; // "sendonly" etc.
const TInt KSVPMaxDirectionAttributeLength = 10; // "a=sendonly"
const TInt KSVPHoldStateArraySize = 5;
const TInt KSVPHoldMaxLengthOfSDPMessage = 1000;
const TInt KSVPHoldMaxLengthOfInetAddr = 32;
// SDP Connection field content for oldway hold
_LIT8( KSVPHoldZeroAddr, "0.0.0.0" );
// SDP Direction attributes
_LIT8( KSVPHoldAttributeSendrecv, "a=sendrecv" );
_LIT8( KSVPHoldAttributeSendonly, "a=sendonly" );
_LIT8( KSVPHoldAttributeRecvonly, "a=recvonly" );
_LIT8( KSVPHoldAttributeInactive, "a=inactive" );
// Indexes for direction attributes
typedef TInt KSVPHoldAttributeIndex;
const KSVPHoldAttributeIndex KSVPHoldSendrecvIndex = 0;
const KSVPHoldAttributeIndex KSVPHoldSendonlyIndex = 1;
const KSVPHoldAttributeIndex KSVPHoldRecvonlyIndex = 2;
const KSVPHoldAttributeIndex KSVPHoldInactiveIndex = 3;
// State indices
typedef TInt TSVPHoldStateIndex;
const TSVPHoldStateIndex KSVPHoldConnectedStateIndex = 0;
const TSVPHoldStateIndex KSVPHoldEstablishingStateIndex = 1;
const TSVPHoldStateIndex KSVPHoldOutStateIndex = 2;
const TSVPHoldStateIndex KSVPHoldInStateIndex = 3;
const TSVPHoldStateIndex KSVPHoldDHStateIndex = 4;
/**
* Hold transition
*/
// session hold state, needed for dtmf for determining active session
enum TSVPSessionHoldState
{
ESVPConnected = 0,
ESVPEstablishing,
ESVPOnHold
};
/**
* Hold desired state change
*/
enum TSVPHoldDesiredTransition
{
ESVPHoldNoRequest = 0,
ESVPHoldToHold = 1,
ESVPHoldToResume = 2,
ESVPHoldIncoming = 3
};
/**
* Hold request type
*/
enum TSVPHoldRequestType
{
ESVPNoType = 0,
ESVPLocalHold = 1,
ESVPLocalResume = 2,
ESVPLocalDoubleHold = 3,
ESVPLocalDoubleHoldResume = 4,
ESVPRemoteHold = 5,
ESVPRemoteResume = 6,
ESVPRemoteDoubleHold = 7,
ESVPRemoteDoubleHoldResume = 8,
ESVPRequestError = 9 // causes state to resume previous
};
/**
* Hold state
*/
enum TSVPHoldState
{
ESVPHoldConnected = 0,
ESVPHoldLocallyHolded = 1,
ESVPHoldRemoteHolded = 2,
ESVPHoldLocallyDoubleHolded = 3,
ESVPHoldRemoteDoubleHolded = 4
};
class CSdpConnectionField;
class TInetAddr;
class CDesC8Array;
class MDesC8Array;
class CMceSession;
class TMceTransactionDataContainer;
class CSVPHoldStateBase;
class MSVPHoldObserver;
class CSVPHoldAttributeHandler;
class CSVPHoldMediaHandler;
/**
* Base class for session contexts.
*
* @lib svp.dll
* @since Series 60 3.2
*/
class CSVPHoldContext : public CBase
{
public: // Constructors and destructor
/**
* Two-phased constructor.
*/
static CSVPHoldContext* NewL(
CMceSession& aSession,
TMceTransactionDataContainer& aContainer,
MSVPHoldObserver* iObserver,
TBool aIsMobileOriginated );
/**
* Destructor.
*/
virtual ~CSVPHoldContext();
public: // New functions
/**
* Sets the current state for the context.
* Leaves with Error code if state transition is not acceptable.
* @since Series 60 3.2
* @param aContext Hold context
* @param aNewState New current state
*/
void SetCurrentStateL( CSVPHoldContext& aContext,
TSVPHoldStateIndex aNewState );
/**
* Returns the current state of the context
* @since Series 60 3.2
* @return TSVPHoldStateIndex the current state, index to it.
*/
TSVPHoldStateIndex CurrentState() const;
/**
* Applies the current state of the contex. This causes a
* state transition to next state of the state machine. The
* current state sets the next state. Leaves on error
* @since Series 60 3.2
* @param aSession Session to be modified
* @param aTransition Desired operation
*/
void ApplyCurrentStateL( CMceSession* aSession,
TSVPHoldDesiredTransition aTransition );
/**
* Applies the current state of the contex. This causes a
* state transition to next state of the state machine. The
* current state sets the next state. Leaves on error
* @since Series 60 3.2
*/
void ApplyCurrentStateL();
/**
* Sets the reference to session object
* state leaves.
* @since Series 60 3.2
* @param aSession The session object
*/
void SetSessionObject( CMceSession* aSession );
/**
* Returns reference to session object
* state leaves.
* @since Series 60 3.2
* @return Pointer to session object
*/
CMceSession* SessionObject();
/**
* Returns type of hold request. This is valid during the complete
* state transition process, until next stable state is reached.
* @since Series 60 3.2
* @return Hold request type
*/
TSVPHoldRequestType HoldRequest();
/**
* Returns ETrue if hold/resume remote request.
* @since Series 60 3.2
* @return Boolean value
*/
TBool IsRemoteRequest();
/**
* After completed & succesful IN / OUT Request, returns occurred event.
* @since Series 60 3.2
* @return Occurred event to be informed to client application
*/
MCCPCallObserver::TCCPCallEvent HoldEvent();
/**
* Sets first attempt flag
* @since Series 60 3.2
* @param aValue Boolean value for -flag
*/
void SetFirstAttempt( TBool aValue );
/**
* Returns value of first attempt -flag
* @since Series 60 3.2
* @return Boolean value of first attempt -flag
*/
TBool FirstAttempt();
/**
* Sets remote request not processed -flag
* @since Series 60 3.2
* @param aValue Boolean value for flag
*/
void SetRemoteRequestNotProcessed( TBool aValue );
/**
* Returns value of the remote request not processed -flag
* @since Series 60 3.2
* @return Boolean value of the remote request not processed -flag
*/
TBool RemoteRequestNotProcessed();
/**
* Sets audio handling allowed -flag
* @since Series 60 3.2
* @param aValue Boolean value for flag
*/
void SetAudioHandlingAllowed( TBool aValue );
/**
* Returns value of the audio handling allowed -flag
* @since Series 60 3.2
* @return Boolean value of the audio handling allowed -flag
*/
TBool AudioHandlingAllowed();
/**
* Returns reference to hold observer.
* @since Series 60 3.2
* @return Reference to hold observer.
*/
MSVPHoldObserver& HoldObserver();
/**
* Returns reference to attribute handler.
* @since Series 60 3.2
* @return Reference to attribute handler.
*/
CSVPHoldAttributeHandler& AttributeHandler();
/**
* Returns reference to media handler.
* @since Series 60 3.2
* @return Reference to media handler.
*/
CSVPHoldMediaHandler& MediaHandler();
/**
* Solves type of incoming request and returns next state of state machine.
* @since Series 60 3.2
* @param aSession Incoming updated MCE session
* @param aAttributeLines Attribute lines from incoming request.
* @param aCheckOldwayHold ETrue if oldwayhold need to be taken into account
* @return TSVPHoldRequestType Request type
*/
TSVPHoldRequestType SolveRequestL( CMceSession& aSession,
MDesC8Array* aAttributeLines,
TBool aCheckOldwayHold = EFalse );
/**
* Sets response status code
* @since Series 60 3.2
* @param aStatusCode Status code of response received
*/
void SetResponseStatusCode( TInt aStatusCode );
/**
* Gets response status code
* @since Series 60 3.2
* @return Status code
*/
TInt ResponseStatusCode();
/**
* Sets force hold flag value
* @since Series 60 3.2
* @param aForceHold Boolean value
*/
void SetForceHold( TBool aForceHold );
/**
* Gets force hold flag value
* @since Series 60 3.2
* @return Boolean value
*/
TBool ForceHoldOccured();
/**
* Handles and controls hold operation based on response status
* @since Series 60 3.2
* @param aNextState Valid hold state machine state after function call
* @return Boolean value ETrue if response needed special handling
*/
TBool SpecialResponseHandling( TSVPHoldStateIndex& aNextState );
/**
* Sets hold/resume request timed out -flag,
* called when hold/resume request has expired.
* @since Series 60 3.2
*/
void TimedOut();
/**
* Returns RollBack -boolean value
* @since Series 60 3.2
* @return Boolean value
*/
TBool HoldRolledBack();
/**
* Sets crossover situation on/off
* @since Series 60 3.2
* @param ETrue if CrossOver situation, EFalse otherways
* @return
*/
void CrossOver( TBool aActive );
/**
* Returns Hold failed -boolean value. After this function call
* flag is cleared.
* @since Series 60 3.2
* @return ETrue if hold failed, EFalse otherways
*/
TBool HoldFailed();
/**
* Returns Resume failed -boolean value
* @since Series 60 3.2
* @return ETrue if resume failed, EFalse otherways
*/
TBool ResumeFailed();
/**
* Returns IsMobileOriginated -boolean value
* @since Series 60 3.2
* @return ETrue if MobileOriginated, EFalse otherways
*/
TBool IsMobileOriginated();
/**
* Sets mute state to Hold Controller
* @since Series 60 3.2
* @param aMuted Boolean value for mute value
*/
void Muted( TBool aMuted );
/**
* Returns mute state
* @since Series 60 3.2
* @return Boolean value for mute value
*/
TBool Muted();
/**
* Sets CallRequestFailed status ETrue/EFalse
* @since Series 60 3.2
* @param aCallRequest Boolean value for call on hold request failed
*/
void SetCallRequestFailed( TBool aCallRequest );
/**
* Returns CallRequestFailed -boolean value
* @since Series 60 3.2
* @return ETrue if call on hold request failed, EFalse otherways
*/
TBool CallRequestFailed();
protected: // New functions
/**
* Creates the states belonging to this context
* @since Series 60 3.2
*/
void InitializeStateArrayL();
/**
* Checkes if a state transition to a given state is accepted.
* @since Series 60 3.2
* @param TSVPHoldStateIndex aStateIndex
* @return TBool, boolean value, is the transition valid.
*/
TBool IsStateTransitionAccepted(
const TSVPHoldStateIndex aStateIndex );
/**
* C++ default constructor.
*/
CSVPHoldContext( TMceTransactionDataContainer& aContainer,
TBool aIsMobileOriginated );
/**
* By default Symbian 2nd phase constructor is private.
* Now it is protected.
*/
void ConstructL( CMceSession& aSession,
MSVPHoldObserver* iObserver );
private: // New functions
/**
* Returns ETrue if establishing state is next, EFalse otherways
*/
TBool ToEstablishing();
/**
* Returns hold request type
*/
TSVPHoldRequestType RequestType(
TSVPHoldDesiredTransition aTransition );
/**
* Returns hold request type
*/
TSVPHoldRequestType RequestToHold();
/**
* Returns hold request type
*/
TSVPHoldRequestType RequestToResume();
/**
* Returns hold request type
*/
TSVPHoldRequestType RequestIncoming();
/**
* Updates right establishing state based on the direction of the request
*/
void UpdateEstablishingStateL();
/**
*
*/
TSVPHoldRequestType SolveRequestType(
TInt aAttributeIndex,
TSVPHoldRequestType aPresumedRequest );
/**
* This method is used in mobile terminating(MT) calls, to check SDP
* body for Connection field, and to check the content of that field.
*
* @since Series60 3.2
* @param aSession Incoming updated MCE session
* @param aPresumedRequest Enumeration for hold request type,
* assumed hold type passed as parameter.
* @return Enumerated value of hold request, after
* oldway hold is checked from the content.
*/
TSVPHoldRequestType
CheckOldwayHoldL( CMceSession& session,
TSVPHoldRequestType aPresumedRequest );
/**
* Rolls hold session state back to previous state
*/
void RollBack( TSVPHoldStateIndex& aNextState );
protected: // Data
// State array
RPointerArray< CSVPHoldStateBase >* iStates;
// Observer
MSVPHoldObserver* iObserver;
private: // Data
// Current state
CSVPHoldStateBase* iCurrentState;
// Current hold request type. Changed by SolveRequestType() and
// in special cases, e.g. when 2-phased hold needed (MO oldway)
TSVPHoldRequestType iHoldRequest;
// Pointer to session object (not owned)
CMceSession* iSession;
// Boolean value of request direction
TBool iOutgoing;
// Instance of attribute handler
CSVPHoldAttributeHandler* iAttributeHandler;
// Instance of media handler
CSVPHoldMediaHandler* iMediaHandler;
// First attempt (not MO oldway hold)
TBool iFirstAttempt;
// Flag for remote request in process
TBool iRemoteRequestNotProcessed;
// Data container for mce session
TMceTransactionDataContainer& iContainer;
// Hold event
MCCPCallObserver::TCCPCallEvent iHoldEvent;
// Indicates that audio handling is allowed
TBool iAllowAudioHandling;
// Status code of the response
TInt iResponseStatusCode;
// Force hold occured flag;
TBool iForceHoldOccured;
// Flag for timed out hold/resume request
TBool iTimedOut;
// Flag for preventing audio enable/disable
TBool iRollBack;
// Flag for failed hold
TBool iHoldFail;
// Flag for failed resume (causes session to be terminated)
TBool iResumeFail;
// Flag for SVP session direction
TBool iIsMobileOriginated;
// Flag for mute
TBool iMuted;
// Flag for cross over (simultaneous requests)
TBool iCrossOver;
// Flag for callbackrequest
TBool iCallRequest;
private:
// For testing
SVP_UT_DEFS
};
#endif // SVPHOLDCONTEXT_H