diff -r f742655b05bf -r d38647835c2e sipvoipprovider/svphold/inc/svpholdcontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipvoipprovider/svphold/inc/svpholdcontext.h Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,584 @@ +/* +* 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 +#include +#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 +