sipvoipprovider/svptransfer/inc/svptransfercontroller.h
branchRCL_3
changeset 22 d38647835c2e
parent 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sipvoipprovider/svptransfer/inc/svptransfercontroller.h	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,300 @@
+/*
+* 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 controller class for blind and attended transfers
+*
+*/
+
+
+
+#ifndef SVPTRANSFERCONTROLLER_H
+#define SVPTRANSFERCONTROLLER_H
+
+#include <e32base.h>
+#include <mccpcall.h>                       // MCCPCall
+#include <mccptransferprovider.h>           // MCCPTransferProvider
+#include <mccptransferobserver.h>           // MCCPTransferObserver
+#include "svputdefs.h"
+
+class CSVPController;
+class CSVPSessionBase;
+class CMceSession;
+class TMceTransactionDataContainer;
+class CMceRefer;
+class CMceInRefer;
+class CMceEvent;
+class CSVPTransferStateContext;
+class MSVPTransferObserver;
+
+/**
+ *  Transfer controller
+ *
+ *  Handles blind and attended transfers
+ *
+ *  @lib svp.dll
+ *  @since S60 3.2
+ */
+class CSVPTransferController : public CBase,
+                               public MCCPTransferProvider
+    {
+
+public: // New methods
+
+    /**
+     * Two-phased constructor.
+     */
+    static CSVPTransferController* NewL(
+                        CMceSession* aMceSession,
+                        CSVPSessionBase* aSVPSession,
+                        TMceTransactionDataContainer& aContainer, 
+                        MSVPTransferObserver& aObserver );
+
+    static CSVPTransferController* NewLC( 
+                        CMceSession* aMceSession,
+                        CSVPSessionBase* aSVPSession,
+                        TMceTransactionDataContainer& aContainer, 
+                        MSVPTransferObserver& aObserver );
+    
+    /**
+     * Destructor.
+     */
+    virtual ~CSVPTransferController();
+
+    /**
+     * Handle mce event state changes.
+     * The state of the event has changed.
+     * @since S60 3.2
+     * @param aEvent, event which state changed.
+     * @param aStatusCode, status code.
+     */
+    void HandleEventStateChangedL( CMceEvent& aEvent,
+				                  TInt aStatusCode );
+
+    /**
+     * Handle mce event observer notify events.
+     * The state of the event has changed.
+     * @since S60 3.2
+     * @param aEvent, event received notification.
+     * @param aContainer, if present, holds details of
+     *        transaction causing state change.
+     */
+    void NotifyReceivedL( CMceEvent& aEvent,
+                         TMceTransactionDataContainer* aContainer );
+
+    /**
+     * Handle the refer state change events.
+     * @since S60 3.2
+     * @param aRefer, the refer that has changed.
+     * @param aStatusCode, status code
+     */
+    void HandleReferStateChangeL( CMceRefer& aRefer,
+				                  TInt aStatusCode );
+
+    /**
+     * New incoming refer received.
+     * @since S60 3.2
+     * @param aRefer, the new inbound refer. Ownership is
+	 *        transferred.
+     * @param aReferTo SIP specific Refer-to header 
+     */
+    void IncomingReferL( CMceInRefer* aRefer, 
+                        const TDesC8& aReferTo,
+                        TMceTransactionDataContainer* aContainer );
+    
+				                  
+    /**
+     * Checks the MCE refer object.
+     * @since S60 3.2
+     * @param aRefer - refer to check
+     * @return TBool true if same MCE refer object
+     */
+    TBool IsMceRefer( CMceRefer& aRefer );
+    
+    /**
+     * Checks if transfer is attended or unattended.
+     * @since S60 3.2
+     * @return TBool true if attended case
+     */
+    TBool IsAttended( );
+
+    /**
+    * 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 );
+
+    /**
+    * Sets the reference to the sip (mce) session object
+    * @since S60 3.2
+    * @param aSession The session object
+    * @return None
+    */
+    void SetMceSessionObject( CMceSession* aSession );
+
+    /**
+    * Send notify using the MCE event object
+    * @since S60 3.2
+    * @param aStatusCode code came from mce
+    */
+    void SendNotifyL( TInt aStatusCode );
+    
+    /**
+    * Check if ingoming transfer is ongoing
+    * @since S60 3.2
+    * @return TBool true if incoming transfer case
+    */
+    TBool IsIncomingTransfer();
+    
+    /**
+    * Terminate transfer due refer timer timeout
+    * @since S60 3.2
+    */
+    void TerminateTransfer();
+
+    /**
+    * The Leaving version of TerminateTransfer
+    * @since S60 3.2
+    */
+    void TerminateTransferL();
+
+public: // From MCCPTransferProvider
+
+    /**
+    * Attended transfer to given call recipient.
+    * There exist a call between A-B and A-C. A wants to transfer the call to B-C. 
+    * A itself will not be inline in case the transfer is made succesfully. 
+    * In above case C will be the aTransferTargetCall. B is the recipient of the 
+    * current call between A-B - called on A's call object transfer provider. 
+    * The A-B call is on hold.
+    * @since S60 3.2
+    * @param aTransferTargetCall - target receiver of the transferred call. 
+    *        In this case there exist a call 
+    * @return In case of an immediate error returns system error code,
+    *       if request has been started returns KErrNone.
+    */
+    TInt AttendedTransfer( MCCPCall& aTransferTargetCall );
+
+    /**
+    * Attended transfer to given address. There does not need to be 
+    * a current call between the given transfer target.
+    * @since S60 3.2
+    * @param aTransferTarget - transfer target address
+    * @return In case of an immediate error returns system error code,
+    *       if request has been started returns KErrNone.
+    */
+    TInt AttendedTransfer( const TDesC& aTransferTarget );
+
+    /**
+	* Unattended transfer. Call is requested to be transferred to given address.
+    * @since S60 3.2
+    * @param aTarget Address of the target
+    * @return In case of an immediate error returns system error code,
+    *       if request has been started returns KErrNone.
+    */
+    TInt UnattendedTransfer( const TDesC& aTransferTarget );
+
+    /**
+    * Notifies call about transfer status.
+    * @since S60 3.2
+    * @param aAccept Boolean value is transfer accepted or not.
+    * @return In case of an immediate error returns system error code,
+    *       if request has been started returns KErrNone.
+    */
+    TInt AcceptTransfer( const TBool aAccept );
+
+    /**
+    * When the other end of the call has requested call transfer to third party it is notified to 
+    * CCPCallCall::EventOccurred(ECCPRemoteTransferring).
+    * The new recipient of the call can be fetched via this method.
+    * @since S60 3.2
+    * @param none
+    * @return New recipient for the call after transfer
+    */
+    const TDesC& TransferTarget() const;
+
+    /**
+    * Add an observer for transfer related events.
+    * Plug-in dependent feature if duplicates or more than one observers 
+    * are allowed or not. Currently CCE will set only one observer.
+    * @since S60 v3.2
+    * @param aObserver Observer
+    * @return none
+    * @leave system error if observer adding fails
+    */
+    void AddObserverL( const MCCPTransferObserver& aObserver );
+
+    /**
+    * Remove an observer.
+    * @since S60 v3.2
+    * @param aObserver Observer
+    * @return KErrNone if removed succesfully. KErrNotFound if observer was not found.
+    */
+    TInt RemoveObserver( const MCCPTransferObserver& aObserver );
+	  
+    
+private:
+
+    /**
+     * C++ default constructor.
+     */
+    CSVPTransferController();
+    
+    /**
+     * Second-phase constructor.
+     */
+    void ConstructL( CMceSession* aMceSession,
+                     CSVPSessionBase* aSVPSession,                     
+                     TMceTransactionDataContainer& aContainer,
+                     MSVPTransferObserver& aObserver );
+
+    /**
+    * Private transfer functionality.
+    * @since S60 3.2
+    * @param aAccept Boolean value is transfer accepted or not.
+    */
+    void TransferL( MCCPCall* aCall, 
+                    const TDesC& aTarget, 
+                    const TBool aAttendedTransfer );
+    
+
+private: // data
+
+    /**
+     * Transfer state context.
+     * Own.
+     */
+    CSVPTransferStateContext* iTransferContext;
+    
+    /**
+    * Transfer observer
+    */
+    MCCPTransferObserver* iCCPTransferObserver; 
+
+    /**
+     * 202 Accepted to the refer received, waiting still the notify
+     */
+    TBool iAccepted;      
+    
+
+private:
+
+    // For testing
+    SVP_UT_DEFS
+		
+    };
+
+#endif // CSVPTRANSFERCONTROLLER_H