diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmcemediamanager/inc/mcesdpsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmcemediamanager/inc/mcesdpsession.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,457 @@ +/* +* Copyright (c) 2004 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: +* +*/ + + + + + +#ifndef CMCESDPSESSION_H +#define CMCESDPSESSION_H + +// INCLUDES +#include +#include +#include +#include +#include + +#include "mcecommediastream.h" +#include "mcemediadefs.h" +#include "mcesrv.h" +#include "mcesip.h" + +// FORWARD DECLARATIONS +class CSdpDocument; +class CMceComSession; +class CMceComAudioStream; +class CSdpMediaField; +class CSdpOriginField; +class CMceMediaManager; +class CMceSdpCodec; +class CSIPDialogAssocBase; + +/** +* Class for storing session specific SDP parameters +*/ +class CMceSdpSession : public CBase + { + + public: // enums + + enum TOfferType + { + EFirst, + EUpdate, + ERefresh + }; + + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CMceSdpSession* NewL( CMceComSession& aSession, + CMceMediaManager& aManager ); + + /** + * Two-phased constructor. + */ + static CMceSdpSession* NewLC( CMceComSession& aSession, + CMceMediaManager& aManager ); + + + /** + * Destructor. + */ + ~CMceSdpSession(); + + public: + + + CMceMediaManager& Manager() const; + + /** + * Createas a SDPDocument based on the streams in iSession. For each stream + * a media line is created in the sdp document. Fails if one of the streams + * is not supported / failed + * @since + * @param None. + * @return CSdpDocument, containing the offer + */ + CSdpDocument* CreateOfferL( CMceComSession& aSession, TOfferType aType = EFirst ); + + /** + * Goes through the answer and removes all the not supported codecs from + * iSession streams so that for each stream one codec is left. Otherwise + * fail. + * @since + * @param None. + * @return KErrNone, if successful, error if answer is not accepted + */ + TInt DecodeAnswerL( CSdpDocument& aSdpDocument, CMceComSession& aSession ); + + /** + * Decodes the incoming offer. For each media line in the offer, create corresponding + * stream in aSession. If one of the streams failes, then fail the whole offer. + * NOTE! if KErrNotSupported is returned, offer is rejected and next time CreateAnswerL() + * is called it creates a rejected answer. + * @return KErrNone, if successful, KErrNotSupported if failed + */ + TInt DecodeOfferL( CSdpDocument& aSdpDocument, CMceComSession& aSession ); + + /** + * Creates an answer based on the OFFER received and the application's + * updated preferences. In successful case SdpDocument will have one selected rtpmap + * field for each media line and updated port number. And all session level parameters. + * NOTE! if any of the media lines fail, SdpDocument will have rejected media lines. + * @since + * @param None. + * @return KErrNone, if successful, KErrNotSupported if offer was rejected, + */ + CSdpDocument& CreateAnswerL( CMceComSession& aSession, TBool aInvalid = EFalse ); + + + + public: // New functions + + /** + * Set SDP . Default is -. + * Leaves with system wide error code if setting fails. + * @since + * @param aUserName User name. + * @return None. + */ + void SetSessionNameL( const TDesC8& aUserName ); + + /** + * Get SDP + * @since + * @param None. + * @return Session name + */ + const TDesC8& SessionName() const; + + /** + * Set SDP . Default is MediaManager. + * Leaves with system wide error code if setting fails. + * @since + * @param aUserName User name. + * @return None. + */ + void SetUserNameL( const TDesC8& aUserName ); + + /** + * Get SDP + * @since + * @param None. + * @return User name. + */ + const TDesC8& UserName() const; + + /** + * Stores the remote o= field + * @param None. + * @return None. + */ + void StoreRemoteOriginL(); + + /** + * Checks if the SDP is refresh or re-invite + * @param aSdpDocument, SDP document + * @return None. + */ + TBool IsSessionRefresh( CSdpDocument* aSdpDocument = NULL ); + + /** + * Cleans session level parameters + * @since + * @param aSessionVersion Session version. + * @return None. + */ + void CleanSessionParams( CSdpDocument& aDocument ) const; + + TBool DetachMedia( CMceComSession& aSession ); + + void StockMediaSessionL(); + + CMceSdpSession& ForkL(); + + CMceComSession* Consumes( TUint32 aSessionId ); + + void ContextSwitch( CMceSdpSession* aForkedSession = NULL ); + + TBool IsMaster(); + + void AttachContext( CSIPDialogAssocBase* aContext ); + + CSIPDialogAssocBase* Context(); + + TBool ContextSwitchRequested(); + + +public: //update handling + + /** + * Set the current media session + * @param aSession the current media session + */ + void SetMediaSession( CMceComSession* aSession ); + + /** + * Get the current media session + * @return the current media session + */ + CMceComSession* MediaSession(); + + /** + * Store backup session for current media session + * @param aSession the backup media session + */ + void SetBackup( CMceComSession* aSession ); + + /** + * backup session + * @param None. + * @return server session + */ + CMceComSession* Backup(); + + /** + * Return indication wheater signalling is required + * @return reference to value indication wheater signalling is required + */ + TInt& SignallingRequired(); + + /** + * Return indication wheater network resource reservation is ready + * @return flag indication wheater network resource reservation is ready + */ + TBool NeedToNegotiate( CMceComSession& aSession ); + + TBool ReservationNeeded( CMceComSession& aSession ); + + TMceReturnStatus ReserveL( CMceComSession& aSession ); + + /** + * prepares session refresh + * @param aSession the media session + */ + void PrepareSessionRefreshL( CMceComSession& aSession ); + + void SdpCleanup( CSdpDocument* aPrevious, CSdpDocument* aReplacement ); + + + private: // for internal use only + + /** + * Encodes session level parameters + * @param aSession the media session + * @param aDocument the sdp document + * @param aType the type of offer + * @return None. + */ + void EncodeSessionParamsL( CMceComSession& aSession, + CSdpDocument& aDocument, + TOfferType aType = EFirst ); + + /** + * Encodes session level attributes client is willing to insert + * @param aSession the media session + * @param aDocument the sdp document + */ + void EncodeClientAttributesL( CMceComSession& aSession, + CSdpDocument& aDocument ) const; + + /** + * Decodes session level attributes to be sent to client + * @param aDocument the sdp document + * @param aSession the media session + */ + void DecodeClientAttributesL( CSdpDocument& aDocument, + CMceComSession& aSession ) const; + + /** + * Gets a random number for version and session id + * @since + * @param aSessionVersion Session version. + * @return None. + */ + TInt64 GetRandomNumber(); + + TMceSipWarningCode SetRemoteIpAddressL( CMceComSession& aSession, + CSdpDocument& aSdpDocument ); + + + void PrepareForAnswerEncodeL( CSdpMediaField& aMediaLine ); + + CSdpMediaField* CreateMediaLineLC( CMceComMediaStream& aStream ) const; + + TBool MediaLineLC( CSdpMediaField*& aMediaLine, + CMceSdpCodec*& sdpCodec, + CMceComMediaStream* aStream, + RPointerArray& aMediaLines, + RPointerArray& aStreams ); + + CMceComMediaStream* MediaSlotInUse( TInt aMediaLine, + RPointerArray& aStreams ); + + + + void DecodeConnectionFieldL( CSdpDocument& aSdpDocument, CMceComSession& aSession ); + void EncodeConnectionFieldL( CMceComSession& aSession, CSdpDocument& aSdpDocument ); + + void MatchingStreamsToMLinesL( + CSdpDocument& aSdpDocument, CMceComSession& aSession ); + + void DecodePullModeUpdateMediaLineL( CSdpDocument& aSdpDocument, + CMceComSession& aSession, + CSdpMediaField& aMediaLine, + TInt aIndex, + CMceSdpCodec& aSdpCodec ); + + /** + * Stores the remote a= field + * @param None. + * @return None. + */ + void StoreRemoteMediaFieldsL(); + + /** + * Compares media lines + * @param aFieldsSrc for media lines being compared + * @param aFieldsDst for media lines being compared + * @return ETrue if media lines are equal, EFalse otherwise + */ + TBool CompareMediaLines( + RPointerArray& aFieldsSrc, + RPointerArray& aFieldsDst ) const; + + private: + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * C++ default constructor + */ + CMceSdpSession( CMceComSession& aSession, CMceMediaManager& aManager ); + + public: // Owned Data + + CMceComSession* iInitialSession; + + public: // Data + + CMceMediaManager& iManager; + + // User name in SDP origin field + HBufC8* iUserName; + + // Session name in SDP session name field + HBufC8* iSessionName; + + // Session ID in SDP origin field + TInt64 iSessionId; + + // Session version in SDP origin field + TInt64 iSessionVersion; + + // reference to corresponding server stream + CMceComSession* iSession; + + // pointer to backup stream + CMceComSession* iBackup; + + // SDP document, not owned + CSdpDocument* iSdpDocument; + + // the origin field received last from the remote end + CSdpOriginField* iRemoteOrigin; + + // the "a:-" field received last from the remote end + RPointerArray iSdpRemoteMediaFields; + + TInt iIsSignallingRequired; + + RStringPool iStringPool; + const TStringTable* iStringTable; + + // OldSchool Flag Outgoing Session + TUint iOOldSchool; + + // OldSchool Flag for Incomming Session + TUint iIOldSchool; + + TUint iOOldSchoolProceeding; + + TUint iOOldSchoolCompleted; + + TBool iIsMaster; + CSIPDialogAssocBase* iContext; + CSIPDialogAssocBase* iRequestedContext; + + // old local port, used for refresh + TUint iOldLocalMediaPort; + + //definitions for unit testing + MCEMM_UT_DEFINITIONS + +public: //inner classes + + class TIterator + { + + public: + + enum TFilter + { + EFilterNone = 0, + EFilterMaster + }; + + public: + + TIterator( RPointerArray& aSessions, TFilter aFilter = EFilterNone ); + + TBool IsEof(); + TBool Next( CMceSdpSession*& aCandidate ); + + void Reset(); + TInt Count(); + TInt Remove(); + TInt Current(); + + + void SetFilter( TFilter aFilter ); + + private: + + TFilter iFilter; + RPointerArray& iSessions; + TInt iCurrentIndex; + + }; + + + + }; + +#endif // CMCESDPPARAMETERS_H + +// End of File