diff -r f742655b05bf -r d38647835c2e sipvoipprovider/svptransfer/inc/svptransferstatecontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipvoipprovider/svptransfer/inc/svptransferstatecontext.h Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,566 @@ +/* +* Copyright (c) 2006 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: Transfer state context class for state machine logic +* +*/ + + +#ifndef SVPTRANSFERSTATECONTEXT_H +#define SVPTRANSFERSTATECONTEXT_H + +#include +#include // CDesC8ArrayFlat +#include "svputdefs.h" + +class CSVPController; +class CSVPSessionBase; +class CSVPTransferStateBase; // iCurrentState +class MSVPTransferObserver; // iTransferObserver +class CMceSession; +class TMceTransactionDataContainer; // iContainer +class CMceRefer; // iMceRefer +class CMceEvent; // iMceEvent + +typedef TInt TSVPTransferStateIndex; + +const TInt KSVPTransferStateArraySize = 5; +const TInt KSVPHeaderArrayGranularity = 2; + +// State indices. +const TSVPTransferStateIndex KSVPTransferIdleStateIndex = 0; +const TSVPTransferStateIndex KSVPTransferPendingStateIndex = 1; +const TSVPTransferStateIndex KSVPTransferAcceptedStateIndex = 2; +const TSVPTransferStateIndex KSVPTransferTerminatingStateIndex = 3; +const TSVPTransferStateIndex KSVPTransferTerminatedStateIndex = 4; + +// Error codes +const TInt KSVPErrTransferErrorBase = -2300; +const TInt KSVPErrTransferStateError = KSVPErrTransferErrorBase - 1; +const TInt KSVPErrTransferInProgress = KSVPErrTransferErrorBase - 2; +const TInt KSVPErrTransferReferCreate = KSVPErrTransferErrorBase - 3; +const TInt KSVPErrTransferApplyState = KSVPErrTransferErrorBase - 4; +const TInt KSVPErrTransferReferStatusCodeNotHandled = + KSVPErrTransferErrorBase - 5; +const TInt KSVPErrTransferParamRefer = KSVPErrTransferErrorBase - 6; +const TInt KSVPErrTransferReferTo = KSVPErrTransferErrorBase - 7; + + + +/** + * Transfer state contexts. + * + * + * @lib svp.dll + * @since S60 3.2 + */ +class CSVPTransferStateContext : public CBase + { + +public: + + /** + * Two-phased constructor. + */ + static CSVPTransferStateContext* NewL( + CMceSession* aMceSession, + CSVPSessionBase* aSVPSession, + TMceTransactionDataContainer& aContainer, + MSVPTransferObserver& aObserver ); + + /** + * Destructor. + */ + virtual ~CSVPTransferStateContext(); + + /** + * Sets the current state for the context. + * @since S60 3.2 + * @param aNewState New current state + * @return Leaves with Error code if state transition is not + * acceptable. + */ + void SetCurrentStateL( TSVPTransferStateIndex aNewState ); + + /** + * Returns the current state of the context + * @since S60 3.2 + * @return TSVPTransferStateIndex Index to the current state. + */ + TSVPTransferStateIndex 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 S60 3.2 + */ + void ApplyCurrentStateL(); + + /** + * Returns reference to the transfer observer. + * @since S60 3.2 + * @return Reference to the transfer observer + */ + MSVPTransferObserver& TransferObserver(); + + /** + * Sets the reference to the sip (mce) session object + * @param aSession The session object + * @return None + */ + void SetMceSessionObject( CMceSession* aSession ); + + /** + * Returns the sip (mce) session object. + * @since S60 3.2 + * @return The sip (mce) session object + */ + CMceSession* MceSessionObject(); + + /** + * Sets the MCE refer object. + * @since Series 60 3.2 + * @param aRefer New received refer + */ + void SetMceRefer( CMceRefer* aRefer ); + + /** + * Returns pointer to the MCE refer object. + * @since S60 3.2 + * @return Pointer to the MCE refer object + */ + CMceRefer* MceRefer(); + + /** + * Check if attended or unattended transfer. + * @since S60 3.2 + * @return Boolean true (=attended) or false + */ + TBool IsAttended(); + + /** + * Check if session is on remote hold. If yes, this is Snom or EyeBeam + * as unattended transferer case and we send OK notify + * to proceed unattended transfer. + * @since S60 3.2 + * @return TBool true if session is remote hold + */ + TBool CheckIsSessionRemoteHold(); + + /** + * Set transfer data. Add Replaces and Referred-By headers. + * Update transfer target url to sips: if secure status 1 or 2, + * otherwise url updated to sip: + * @since S60 3.2 + * @param aUserAgentHeaders On completion contains collected transfer headers. + * @param aSecureStatus secure status + */ + void SetTransferDataL( CDesC8Array* aUserAgentHeaders, TInt aSecureStatus ); + + /** + * Set attended/unattended. + * @since S60 3.2 + * @param aAttended boolean true (=attended) or false + */ + void SetAttended( const TBool aAttended ); + + /** + * Check if incoming transfer. + * @since S60 3.2 + * @return Boolean true (=incoming) or false + */ + TBool IsIncoming(); + + /** + * Set incoming "refer to" -string. + * @since S60 3.2 + * @param aReferTo Reference to the string + */ + void SetIncomingReferToL( const TDesC8& aReferTo ); + + /** + * Sets the Referred-By data + * @since S60 3.2 + * @param aReferredBy reference to the Referred-By data to store + */ + void SetIncomingReferredByL( const TDesC8& aReferredBy ); + + /** + * Return incoming "Referred By" -string. + * @since S60 3.2 + * @return Reference to the string + */ + const TDesC& IncomingReferredBy(); + + /** + * Return incoming "refer to" -string. + * @since S60 3.2 + * @return Reference to the string + */ + const TDesC& IncomingReferTo(); + + /** + * Reset/clear incoming "refer to" -string. + * @since S60 3.2 + */ + void ResetIncomingReferTo(); + + /** + * Reset/clear incoming "Referred-By" -string. + * @since S60 3.2 + */ + void ResetIncomingReferredBy(); + + /** + * Set incoming "Replaces" -string. + * @since S60 3.2 + * @param aString Reference to the string + */ + void SetIncomingReplacesL( const TDesC8& aString ); + + /** + * Return incoming "Replaces" -string. + * @since S60 3.2 + * @return Reference to the string + */ + const TDesC& IncomingReplaces(); + + /** + * Reset/clear incoming "Replaces" -string. + * @since S60 3.2 + */ + void ResetIncomingReplaces(); + + /** + * Store the parameters for the mce out refer. + * @since S60 3.2 + * @param aTargetSession target receiver of the transferred call, + * null if address is given. + * @param aTarget transfer target address, KNullDesC if call is given. + * @param aAttendedTransfer boolean true if attended transfer. + */ + void SetTransferParmsL( CSVPSessionBase* aTargetSession, + const TDesC& aTarget, + const TBool aAttendedTransfer ); + + /** + * Execute the refer, creates mce out event. + * @since S60 3.2 + * @return KErrNone if ok, SVP transfer error on failure + */ + void ExecuteReferL(); + + /** + * Sets the MCE event object. + * @since Series 60 3.2 + * @param aEvent New received event + */ + void SetMceEvent( CMceEvent* aEvent ); + + /** + * Returns pointer to the MCE event object. + * @since S60 3.2 + * @return Pointer to the MCE event object + */ + CMceEvent* MceEvent(); + + /** + * Stop the refer timer. + * @since Series 60 3.2 + */ + void StopReferTimer(); + + +protected: // New functions + + /** + * Creates the states belonging to this context + * @since S60 3.2 + */ + void InitializeStateArrayL(); + + /** + * Check if state transition to a new state is acceptable. + * @since S60 3.2 + * @param aStateIndex New state to enter + * @return Boolean value, is the transition valid. + */ + TBool IsStateTransitionAccepted( + const TSVPTransferStateIndex aStateIndex ); + + /** + * C++ default constructor. + */ + CSVPTransferStateContext( CMceSession* aMceSession, + CSVPSessionBase* aSVPSession, + TMceTransactionDataContainer& aContainer, + MSVPTransferObserver& aObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + * Now it is protected. + */ + void ConstructL(); + + +private: // New Functions + + /** + * Set up headers for refer call. + * @since S60 3.2 + * @return Pointer to the new created headers data + */ + CDesC8Array* SetupHeadersL(); + + /** + * Create mce out refer using target address. + * @since S60 3.2 + * @param aTarget Address of the target. + */ + void CreateMceOutReferL( const TDesC& aTarget ); + + /** + * Create mce out refer using session. + * @since S60 3.2 + * @param aTargetSession Pointer to the target session. + */ + void CreateMceOutReferL( CSVPSessionBase* aTargetSession ); + + /** + * Method for completing referTo + * @since Series 60 3.2 + * @param aReferTo referto + * @return HBufC8* constructed aReferTo + */ + HBufC8* CompleteReferToL( const TDesC8& aReferTo ); + + /** + * Method for completing referred by + * @since Series 60 3.2 + * @param aReferredBy Referred By + * @return HBufC8* constructed aReferredBy + */ + HBufC8* CompleteReferredByL( const TDesC8& aReferredBy ); + + /** + * Method for completing Replaces + * @since Series 60 3.2 + * @param aString Replaces string + * @return HBufC8* constructed Replaces string + */ + HBufC8* CompleteReplacesL( const TDesC8& aString ); + + /** + * Checks, if the URI given as parameter has + * the "<" character. + * @since S60 3.2 + * @param aUri The URI to be checked, non-modifiable descriptor. + * @return TInt, position of the character, + * KErrNotFound, if not found. + */ + TInt CheckLeftBracket( const TDesC8& aUri ) const; + + /** + * Removes the "<" character and all characters + * before the position from the URI given as parameter. + * @since S60 3.2 + * @param aUri The URI to be altered, modifiable descriptor. + * @param aPosition, position of string. + * @return None + */ + void RemoveLeftBracket( HBufC8*& aUri, TInt aPosition ) const; + + /** + * Checks, if the URI given as parameter has + * the ">" character. + * @since S60 3.2 + * @param aUri The URI to be checked, non-modifiable descriptor. + * @return TInt, position of the character, + * KErrNotFound, if not found. + */ + TInt CheckRightBracket( const TDesC8& aUri ) const; + + /** + * Removes the all characters from the URI after the position. + * @since S60 3.2 + * @param aUri, the URI to be altered, modifiable descriptor. + * @param aPosition, position where removing starts. + * @return None + */ + void CutStringFromPosition( HBufC8*& aUri, TInt aPosition ) const; + + /** + * Checks, if the URI given as parameter has + * the "?X-Sipx-Authidentity=" string. + * Some server might add that to Refer-To header. + * @since S60 3.2 + * @param aUri The URI to be checked, non-modifiable descriptor. + * @return TInt, position of the character, + * KErrNotFound, if not found. + */ + TInt CheckAuthidentity( const TDesC8& aUri ) const; + + /** + * Checks, if the URI given as parameter has the "?Replaces=" text. + * @since S60 3.2 + * @param aUri The URI to be checked, non-modifiable descriptor. + * @return TInt, position of the chareacter, + * KErrNotFound, if not found. + */ + TInt CheckReplacesTxt( const TDesC8& aUri ) const; + + /** + * Checks, if the URI given as parameter has the "Referred-By:" text. + * @since S60 3.2 + * @param aReferredBy The URI to be checked, non-modifiable descriptor. + * @return TInt, position of the chareacter, + * KErrNotFound, if not found. + */ + TInt CheckReferredByTxt( const TDesC8& aReferredBy ) const; + + /** + * Removes the "Referred-By:" text + * @since S60 3.2 + * @param aReferredBy The text to be altered, modifiable descriptor. + * @param aPosition, position of string. + * @return None + */ + void RemoveReferredByTxt( HBufC8*& aReferredBy, TInt aPosition ) const; + + /** + * Take the "?Replaces=" text and text after it. + * @since S60 3.2 + * @param aUri The URI to be altered, modifiable descriptor. + * @param aPosition, position of string. + * @return None + */ + void TakeReplacesTxt( HBufC8*& aString, TInt aPosition ) const; + + /** + * Checks, if the URI given as parameter has + * the ";user=phone" text. + * @since S60 3.2 + * @param aUri The URI to be checked, non-modifiable descriptor. + * @return TInt, position of the chareacter, + * KErrNotFound, if not found. + */ + TInt CheckUserEqualsPhone( const TDesC8& aUri ) const; + + /** + * Removes the ";user=phone" text and text after it. + * @since S60 3.2 + * @param aUri The URI to be altered, modifiable descriptor. + * @param aPosition, position of string. + * @return None + */ + void RemoveUserEqualsPhone( HBufC8*& aUri, TInt aPosition ) const; + + /** + * Removes all extra parameters from given address + * @since S60 3.2 + * @param aUri The URI to be altered, modifiable descriptor. + * @return None + */ + void RemoveExtraParameters( HBufC8*& aUri ) const; + + /** + * Update transfer target url to sips: if secure status 1 or 2. + * Otherwise url updated to sip: + * @since S60 3.2 + * @param aSecureStatus secure status + */ + void UpdateTransferTargetL( TInt aSecureStatus ); + +private: // data + + /** + * Pointer to the mce session object. + * Not own. + */ + CMceSession* iMceSession; + + /** + * Pointer to the SVP session object. + * Not own. + */ + CSVPSessionBase* iSVPSession; + + /** + * Pointer to the target of attended transfer. + * Not own. + */ + CSVPSessionBase* iTargetSession; + + /** + * Data container for mce session. + */ + TMceTransactionDataContainer& iContainer; + + /** + * Reference to the transfer observer. + */ + MSVPTransferObserver& iTransferObserver; + + /** + * Transfer state array. + * Own. + */ + RPointerArray< CSVPTransferStateBase >* iStates; + + /** + * State object pointer to indicate current state. + */ + CSVPTransferStateBase* iCurrentState; + + /** + * Mce refer, either in (MT) or out (MO) type. + * Own. + */ + CMceRefer* iMceRefer; + + /** + * Mce event, either in (MT) or out (MO) type. + * Own. + */ + CMceEvent* iMceEvent; + + /** + * Attended (consultative) / unattended (blind) transfer. + */ + TBool iAttended; + + /** + * Incoming "refer to" parameter string + * Indicates also the incoming refer handling. + */ + HBufC* iIncomingReferTo; + + /** + * Incoming "Referred By" parameter string + */ + HBufC* iIncomingReferredBy; + + /** + * Incoming "Replaces" parameter string + */ + HBufC* iIncomingReplaces; + +private: + + // For testing + SVP_UT_DEFS + + }; + +#endif // SVPTRANSFERSTATECONTEXT_H