--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sipvoipprovider/inc/svpemergencysession.h Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,730 @@
+/*
+* 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: Class representing the emergency session
+*
+*/
+
+
+
+#ifndef SVPEMERGENCYSESSION_H
+#define SVPEMERGENCYSESSION_H
+
+#include <sipprofileregistryobserver.h>
+#include <sipobserver.h>
+
+#include <mccpemergencycall.h>
+#include <mccpcallobserver.h>
+#include <ccpdefs.h> // error definitions
+#include <mceoutsession.h>
+
+#include "svplogger.h"
+#include "svptimer.h"
+#include "svptimerobserver.h"
+#include "svppositioningproviderobserver.h"
+#include "svpemergencyconnectionobserver.h"
+#include "svpholdobserver.h"
+#include "svpdtmfeventobserver.h"
+#include "svputdefs.h"
+
+class MCCPCallObserver;
+class CSVPUtility;
+class CSIP;
+class CSIPProfileRegistry;
+class CRCSEProfileEntry;
+class CSVPPositioningProvider;
+class CSVPEmergencyConnection;
+class TMceTransactionDataContainer;
+class CSVPHoldController;
+class MCCPDTMFObserver;
+class CSVPDTMFEventGenerator;
+
+
+/**
+ * Class that handles emergency sessions
+ *
+ * @lib svp.dll
+ * @since S60 3.2
+ */
+class CSVPEmergencySession : public CBase,
+ public MCCPEmergencyCall,
+ public MSIPObserver,
+ public MSIPProfileRegistryObserver,
+ public MSVPTimerObserver,
+ public MSVPPositioningProviderObserver,
+ public MSVPEmergencyConnectionObserver,
+ public MSVPHoldObserver,
+ public MSVPDTMFEventObserver
+ {
+
+public:
+
+ /**
+ * Two-phased constructor.
+ */
+ static CSVPEmergencySession* NewL( CMceManager& aMceManager,
+ TUint32 aVoipProfileId,
+ const TDesC& aAddress,
+ const MCCPCallObserver& aObserver,
+ CSVPUtility& aSVPUtility,
+ TBool aIsLastProfile,
+ TBool aIsDummy = EFalse );
+
+ /**
+ * Two-phased constructor for creating IAP session.
+ */
+ static CSVPEmergencySession* NewL( CMceManager& aMceManager,
+ const TDesC& aAddress,
+ const MCCPCallObserver& aObserver,
+ CSVPUtility& aSVPUtility,
+ TUint32 aIapId,
+ TBool aIsLastProfile,
+ TBool aIsDummy = EFalse );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CSVPEmergencySession();
+
+ /**
+ * Returns CCP call state
+ * @since S60 3.2
+ * @return CCP call state
+ */
+ MCCPCallObserver::TCCPCallState State() const;
+
+ /**
+ * Traps SessionStateChangedL
+ * @since S60 3.2
+ * @param aStatusCode Status code to be handled
+ */
+ void SessionStateChanged( TInt aStatusCode );
+
+ /**
+ * Session connection state changed
+ * @since S60 3.2
+ * @param aSession SIP session
+ * @param aActive SIP connection state, ETrue if up, EFalse otherwise
+ */
+ void SessionConnectionStateChanged(
+ CMceSession& aSession, TBool aActive );
+
+ /**
+ * Handles stream state changes
+ * @since S60 3.2
+ * @param aStream Stream that has changed
+ */
+ void StreamStateChanged( CMceMediaStream& aStream );
+
+ /**
+ * Handles remote action after session is established, i.e. hold
+ * @since Series60 3.2
+ * @param aUpdatedSession
+ * @param aContainer MCE transaction container
+ */
+ void IncomingRequestL( CMceInSession* aUpdatedSession,
+ TMceTransactionDataContainer aContainer );
+
+ /**
+ * Returns ETrue, if hold controller exists
+ * @since Series60 3.2
+ * @return ETrue if hold controller exists
+ */
+ TBool HasHoldController() const;
+
+ /**
+ * Returns reference to hold controller
+ * @since Series60 3.2
+ * @return ETrue Refenrence to hold controller
+ */
+ CSVPHoldController& CSVPEmergencySession::HoldController() const;
+
+ /**
+ * Handles hold session state changes
+ * @since Series60 3.2
+ * @param aSession MCE session
+ */
+ void HoldSessionStateChangedL( CMceSession& aSession );
+
+ /**
+ * Gets CCP DTMF observer
+ * @since Series 60 3.2
+ * @return MCCPDTMFObserver CCP DTMF observer
+ */
+ const MCCPDTMFObserver& DtmfObserver();
+
+ /**
+ * Sets CCP DTMF observer to session
+ * @since Series 60 3.2
+ * @param aObserver Observer
+ */
+ void SetDtmfObserver( const MCCPDTMFObserver& aObserver );
+
+ /**
+ * Starts the transmission of a single DTMF tone across a
+ * connected and active call.
+ * @since S60 3.2
+ * @param aTone Tone to be played.
+ * @return Error code
+ */
+ TInt StartDtmfTone( const TChar aTone );
+
+ /**
+ * Stops playing current DTMF tone.
+ * @since S60 3.2
+ * @return Error code
+ */
+ TInt StopDtmfTone();
+
+ /**
+ * Plays DTMF string.
+ * @since S60 3.2
+ * @param aString String to be played.
+ * @return Error code
+ */
+ TInt SendDtmfToneString( const TDesC& aString );
+
+ /**
+ * Cancels asynchronous DTMF string sending.
+ * @since Series 60 3.2
+ * @return Error code
+ */
+ TInt CancelDtmfStringSending();
+
+
+// from base class MCCPEmergencyCall
+
+ /**
+ * Creates an emergency call
+ * @since S60 3.2
+ * @param aRecipient, not used
+ * @return KErrNone or system wide error code
+ */
+ TInt Dial( const TDesC& aRecipient );
+
+ /**
+ * Cancels ongoing dial request
+ * @since S60 3.2
+ * @return KErrNone or system wide error code
+ */
+ TInt Cancel();
+
+ /**
+ * Ends an ongoing call
+ * @since S60 3.2
+ * @return KErrNone or system wide error code
+ */
+ TInt HangUp();
+
+ /**
+ * Answers to an incoming call.
+ * @since S60 3.2
+ * @return KErrNone or system wide error code
+ */
+ TInt Answer();
+
+
+// from base class MSVPTimerObserver
+
+ /**
+ * Notifies, that the previously set timer has now expired.
+ * Implemented by the class using the timer.
+ * @since Series 60 3.2
+ * @param aTimerId The ID of the timer. Observer can identify
+ * timers from each other with this ID.
+ */
+ void TimedOut( TInt aTimerId );
+
+
+// from base class MSIPObserver
+
+ /**
+ * From MSIPObserver A SIP request has been received from the network.
+ * @since Series 60 3.0
+ * @param aIapId The IapId from which the SIP request was received.
+ * @param aTransaction Contains local address, remote address of a sip
+ * message, as well as optional SIP message method, headers and
+ * body. The ownership is transferred.
+ */
+ void IncomingRequest( TUint32 aIapId,
+ CSIPServerTransaction* aTransaction );
+
+ /**
+ * From MSIPObserver The received SIP request time-outed and it has been
+ * destroyed.
+ * @since Series 60 3.0
+ * @param aSIPServerTransaction The time-outed transaction. Ownership is
+ * not transferred.
+ */
+ void TimedOut( CSIPServerTransaction& aSIPServerTransaction );
+
+
+// from base class MSIPProfileRegistryObserver
+
+ /**
+ * From MSIPProfileRegistryObserver An asynchronous error has occurred
+ * related to SIP profile Event is send to those observers, who have the
+ * corresponding profile instantiated.
+ * @since Series 60 3.0
+ * @param aSIPProfileId SIP Profile ID.
+ * @param aError Error code.
+ */
+ void ProfileRegistryErrorOccurred( TUint32 aSIPProfileId,
+ TInt aError );
+
+ /**
+ * From MSIPProfileRegistryObserver An event related to SIP Profile has
+ * occurred.
+ * @since Series 60 3.0
+ * @param aProfileId SIP Profile ID.
+ * @param aEvent An occurred event.
+ */
+ void ProfileRegistryEventOccurred( TUint32 aProfileId,
+ TEvent aEvent );
+
+
+// from base class MSVPPositioningProviderObserver
+
+ /**
+ * Handles successful positioning requests
+ *
+ * @since S60 3.2
+ * @param aPosition Acquired position information
+ */
+ void PositioningRequestComplete( const TDesC8& aPosition );
+
+ /**
+ * Handles failed positioning requests
+ *
+ * @since S60 3.2
+ * @param aError Symbian error code
+ */
+ void PositioningErrorOccurred( TInt aError );
+
+
+// from base class MSVPEmergencyConnectionObserver
+
+ /**
+ * SNAP connection is established
+ *
+ * @since S60 3.2
+ */
+ void SnapConnected();
+
+ /**
+ * IAP connection is established
+ *
+ * @since S60 3.2
+ */
+ void Connected();
+
+ /**
+ * SIP proxy address is ready
+ *
+ * @since S60 3.2
+ * @param aAddress SIP proxy address
+ */
+ void SipProxyAddressReady( const TDesC16& aAddress );
+
+ /**
+ * Connection error has occurred
+ *
+ * @since S60 3.2
+ * @param aError Symbian error code
+ */
+ void ConnectionError( TInt aError );
+
+
+// from base class MSVPHoldObserver
+
+ /**
+ * Notifies, that session has been holded.
+ * @since Series 60 3.2
+ */
+ void SessionLocallyHeld();
+
+ /**
+ * Notifies, that session has been resumed.
+ * @since Series 60 3.2
+ */
+ void SessionLocallyResumed();
+
+ /**
+ * Notifies, that session has been remotely held.
+ * @since Series 60 3.2
+ */
+ void SessionRemoteHeld();
+
+ /**
+ * Notifies, that session has been remotely resumed.
+ * @since Series 60 3.2
+ */
+ void SessionRemoteResumed();
+
+ /**
+ * Notifies, that hold request failed.
+ * @since Series 60 3.2
+ */
+ void HoldRequestFailed();
+
+ /**
+ * Notifies, that resume request failed.
+ * @since Series 60 3.2
+ */
+ void ResumeRequestFailed();
+
+
+// from base class MSVPDTMFEventObserver
+
+ /**
+ * Sends DTMF events to CCE
+ * @since S60 v3.2
+ * @param aEvent DTMF event
+ */
+ void InbandDtmfEventOccurred( TSVPDtmfEvent aEvent );
+
+
+private:
+
+ /**
+ * C++ default constructor.
+ */
+ CSVPEmergencySession( CSVPUtility& aSVPUtility,
+ CMceManager& aMceManager,
+ TBool aIsLastProfile,
+ TBool aIsDummy );
+
+ /**
+ * second-phase constructor
+ */
+ void ConstructL( TUint32 aVoipProfileId,
+ const TDesC& aAddress,
+ const MCCPCallObserver& aObserver,
+ TBool aIsDummy );
+
+ /**
+ * Second-phase constructor for IAP session
+ */
+ void ConstructWithIapIdL( TUint32 aIapId,
+ const TDesC& aAddress,
+ const MCCPCallObserver& aObserver,
+ TBool aIsDummy );
+
+ /**
+ * Continues IAP EC construction
+ * @since S60 3.2
+ * @param aSipProxyAddress SIP proxy address
+ */
+ void ContinueConstructWithIapIdL( const TDesC16& aSipProxyAddress );
+
+ /**
+ * Deletes failed MCE session and creates a new one without LI. Used when
+ * 415 Unsupported Media Type received.
+ * @since S60 3.2
+ */
+ void CreateNonLISessionL();
+
+ /**
+ * Creates unregistered MCE session
+ * @since S60 3.2
+ */
+ void CreateUnregistedSessionL();
+
+ /**
+ * Handles emergency session state change
+ * @since S60 3.2
+ * @param aStatusCode Status code to be handled
+ */
+ void SessionStateChangedL( TInt aMceStatusCode );
+
+ /**
+ * Determines if dialing can be proceeded
+ * @since S60 3.2
+ */
+ void ProceedDial();
+
+ /**
+ * Establishes an emergency call
+ * @since S60 3.2
+ */
+ void DialL();
+
+ /**
+ * Constructs audiostreams for emergency session
+ * @since Series 60 3.2
+ */
+ void ConstructAudioStreamsL();
+
+ /**
+ * Sets keep-alive value
+ * @since Series 60 3.2
+ */
+ void SetKeepAlive();
+
+ /**
+ * Updates keepalive parameters for MCE session
+ * @since Series 60 3.2
+ */
+ void UpdateKeepAliveL();
+
+ /**
+ * Method for checking audio priorities in audio streams. Method checks
+ * that correct audio priorities are used in inband/outband DTMF cases and
+ * sets them accordingly to uplink side codecs.
+ * @since S60 3.2
+ * @param aAudioStreams Media streams of MCE session
+ */
+ void CheckMmfPrioritiesForDtmfL(
+ const RPointerArray<CMceMediaStream>& aAudioStreams ) const;
+
+ /**
+ * Starts SVP timer
+ * @since Series 60 3.2
+ * @param aMilliSeconds Timeout
+ * @param aTimerId Timer ID
+ */
+ void StartTimerL( TInt aMilliSeconds, TInt aTimerId );
+
+ /**
+ * Stop timer
+ * @since Series 60 3.2
+ * @param aTimerId Timer ID
+ */
+ void StopTimer( TInt aTimerId );
+
+ /**
+ * Stops started timers
+ * @since Series 60 3.2
+ */
+ void StopTimers();
+
+ /**
+ * Notify client about an error. ECCPEmergencyFailed if it is the last try
+ * of this plugin, normal CCP error otherwise.
+ * @since Series 60 3.2
+ * @param aError CCP error
+ */
+ void ErrorOccurred( TCCPError aError );
+
+ /**
+ * Initializes position provider and requests for position information.
+ * Traps leaves of RequestPositionL because emergency call must not fail
+ * due to this feature.
+ *
+ * @since S60 3.2
+ * @param aIapId IAP ID
+ */
+ void RequestPosition( TUint32 aIapId );
+
+ /**
+ * Initializes position provider and requests for position information.
+ *
+ * @since S60 3.2
+ * @param aIapId IAP ID
+ */
+ void RequestPositionL( TUint32 aIapId );
+
+ /**
+ * Requests for SIP proxy address
+ *
+ * @since S60 3.2
+ */
+ void RequestSipProxyAddressL();
+
+ /**
+ * Parses content ID from URI: removes "sip(s):" prefix, if one exists.
+ * @since S60 3.2
+ * @param aUri URI to be parsed
+ * @return Parsed content ID
+ */
+ HBufC8* ParseContentIdL( const TDesC8& aUri );
+
+ /**
+ * Parses cid: adds "cid:" prefix and brackets.
+ * @since S60 3.2
+ * @param aContentId Content ID to be parsed
+ * @return Parsed cid
+ */
+ HBufC8* ParseCidL( const TDesC8& aContentId );
+
+
+private: // data
+
+ /**
+ * reference to SVP utility class
+ */
+ CSVPUtility& iSVPUtility;
+
+ /**
+ * Reference to MCE manager
+ */
+ CMceManager& iMceManager;
+
+ /**
+ * Contains current session state
+ */
+ MCCPCallObserver::TCCPCallState iSessionState;
+
+ /**
+ * VoIP profile ID, KErrNotFound if creating an IAP session
+ */
+ TInt iVoipProfileId;
+
+ /**
+ * Id of SIP profile
+ */
+ TUint32 iSipProfileId;
+
+ /**
+ * IAP ID
+ */
+ TUint32 iIapId;
+
+ /**
+ * Session Expires value
+ */
+ TUint32 iSessionExpires;
+
+ /**
+ * Keep-alive value
+ */
+ TInt iKeepAlive;
+
+ /**
+ * Indicates that this the last profile to be tried with this plugin. If it
+ * fails, ECCPEmergencyFailed must be sent instead of normal error codes.
+ */
+ TBool iIsLastProfile;
+
+ /**
+ * Indicates that this session is dummy. ErrorOccurred is called on the
+ * next CCP API operation.
+ */
+ TBool iIsDummy;
+
+ /**
+ * Indicates that Dial() has been called
+ */
+ TBool iIsDialed;
+
+ /**
+ * Indicates that LI request is ready
+ */
+ TBool iIsLIRequestReady;
+
+ /**
+ * Session timers, need an array since there migh be more than one.
+ */
+ RPointerArray< CSVPTimer > iTimers;
+
+ /**
+ * Pointer to CCP call observer
+ * Not own.
+ */
+ MCCPCallObserver* iEmergencyObserver;
+
+ /**
+ * Pointer to created emergency session
+ * Own.
+ */
+ CMceSession* iEmergencySession;
+
+ /**
+ * Pointer to failed emergency session after received 415
+ * Own.
+ */
+ CMceSession* iFailedEmergencySession;
+
+ /**
+ * User AOR. Member data because it is needed for creating location
+ * related SIP headers.
+ */
+ HBufC8* iUserAor;
+
+ /**
+ * Recipient address.
+ * Own.
+ */
+ HBufC8* iAddress;
+
+ /**
+ * Recipient URI. Member data because it is needed for creating location
+ * related SIP headers.
+ * Own.
+ */
+ HBufC8* iRecipientUri;
+
+ /**
+ * Positioning provider
+ * Own.
+ */
+ CSVPPositioningProvider* iPositioningProvider;
+
+ /**
+ * Position information
+ * Own.
+ */
+ HBufC8* iPositionInformation;
+
+ /**
+ * Emergency connection.
+ * Own.
+ */
+ CSVPEmergencyConnection* iEmergencyConnection;
+
+ /**
+ * Hold Controller.
+ * Own.
+ */
+ CSVPHoldController* iHoldController;
+
+ /**
+ * Reference to DTMF observer.
+ * Not own.
+ */
+ MCCPDTMFObserver* iDtmfObserver;
+
+ /*
+ * DTMF event generator, used in inband dtmf case.
+ * Own.
+ */
+ CSVPDTMFEventGenerator* iDTMFEventGenerator;
+
+ /**
+ * Tone information. Updated everytime session state changes.
+ */
+ TCCPTone iTone;
+
+ /**
+ * Contains DTMF tone sent. Used with inband DTMF.
+ */
+ TChar iDtmfTone;
+
+ /**
+ * Contains DTMF string sent. Used with inband DTMF.
+ */
+ HBufC* iDtmfString;
+
+ /*
+ * Keeps count of the current tone sent. Used with inband DTMF
+ */
+ TLex iDtmfLex;
+
+private:
+
+ // For testing
+ SVP_UT_DEFS
+
+ };
+
+#endif // SVPEMERGENCYSESSION_H