diff -r 000000000000 -r a4daefaec16c sipvoipprovider/inc/svpemergencysession.h --- /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 +#include + +#include +#include +#include // error definitions +#include + +#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& 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