--- /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 <e32base.h>
+#include <e32cmn.h>
+#include <e32std.h>
+#include <in_sock.h>
+#include <stringpool.h>
+
+#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 <session name>. 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 <session name>
+ * @since
+ * @param None.
+ * @return Session name
+ */
+ const TDesC8& SessionName() const;
+
+ /**
+ * Set SDP <username>. 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 <username>
+ * @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<CSdpMediaField>& aMediaLines,
+ RPointerArray<CMceComMediaStream>& aStreams );
+
+ CMceComMediaStream* MediaSlotInUse( TInt aMediaLine,
+ RPointerArray<CMceComMediaStream>& 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<CSdpMediaField>& aFieldsSrc,
+ RPointerArray<CSdpMediaField>& 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<CSdpMediaField> 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<CMceSdpSession>& 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<CMceSdpSession>& iSessions;
+ TInt iCurrentIndex;
+
+ };
+
+
+
+ };
+
+#endif // CMCESDPPARAMETERS_H
+
+// End of File