sipvoipprovider/svptransfer/inc/svptransferstatecontext.h
changeset 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sipvoipprovider/svptransfer/inc/svptransferstatecontext.h	Mon Jan 18 20:12:36 2010 +0200
@@ -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 <e32base.h>
+#include <badesca.h>                // 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