multimediacommsengine/mmcesrv/mmcemediamanager/inc/mcesdpcodec.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/inc/mcesdpcodec.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,331 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+
+#ifndef CMESDPCODEC_H
+#define CMESDPCODEC_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <stringpool.h>
+#include <sdpattributefield.h>
+#include <sdpbandwidthfield.h>
+#include "mcesip.h"
+#include "mcemmlogs.h"
+
+// FORWARD DECLARATIONS
+class CSdpDocument;
+class CSdpMediaField;
+class CMceComSession;
+class CMceComMediaStream;
+class CSdpMediaField;
+class CSdpFmtAttributeField;
+
+
+
+#define SDP_STRING( stringIndex )\
+    iStringPool.StringF( stringIndex, *iStringTable )
+
+
+
+/**
+*  Class for encoding and decoding media lines and creating server streams
+*  
+*/
+class CMceSdpCodec : public CBase
+    {
+
+    public:
+        
+        /**
+        * destructor
+        */
+        ~CMceSdpCodec();
+
+        /**
+        * returns media(line) which is supported by this SDP codec
+        * @return media(line) which is supported by this SDP codec
+        */
+        RStringF Media();
+        
+        /**
+        * returns ETrue, if media is decoded by this codec
+        * @return ETrue, if media is decoded by this codec
+        */
+        virtual TBool Decodes( const CSdpMediaField& aMedia ) const;
+
+        /**
+        * Adds capability
+        * @param aCapability capability
+        */
+        void AddCapabilityL( const TDesC8& aCapability );
+
+        /**
+        * Adds capability payload type
+        * @param aPayloadType capability payload type
+        */
+        void AddCapabilityPayloadTypeL( const TUint aPayloadType );
+        
+        /**
+        * Returns ETrue, if capability is supported
+        * @param aCapability capability
+        * @return ETrue, if capability is supported
+        */
+        TBool IsSupported( const TDesC8& aCapability ) const;
+        
+        /**
+        * Returns ETrue, if payload is supported
+        * @param aSdpName SDP name
+        * @param aPayload payload of codec
+        * @return ETrue, if payload is supported
+        */
+        TBool IsPayloadTypeSupported( const TDesC8& aCapability, const TUint aPayloadType ) const;
+
+public: //abstract interface 
+
+        /**
+        * Returns ETrue, if media is encoded by this codec
+        * @return ETrue, if media is encoded by this codec
+        */
+        virtual TBool Encodes( const CMceComMediaStream& aStream ) const = 0;
+        
+        /**
+        * Encodes a media line. 
+        * @param aStream media stream
+        * @param aMediaLine media line
+        * @param aSdpDocument sdp document
+        * @leave system wide error
+        */ 
+        virtual void EncodeMediaOfferL( CMceComMediaStream& aStream,
+                                        CSdpMediaField& aMediaLine, 
+                                        CSdpDocument& aSdpDocument ) = 0;
+        
+        /**
+        * Decodes the media answer.
+        * @param aStream media stream
+        * @param aSdpDocument sdp document
+        * @return warning if any 
+        * @leave system wide error
+        */
+        virtual TMceSipWarningCode DecodeMediaAnswerL( CSdpMediaField& aMediaLine, 
+                                         CMceComMediaStream& aStream,
+                                         CSdpDocument& aSdpDocument ) = 0;
+        
+        /**
+        * Decodes media offer and creates media stream. The stream is appended
+        * into the media session, if aStream is NULL
+        * @param aMediaLine media line
+        * @param aStream stream added to session
+        * @param aSession media session
+        * @param aSdpDocument sdp document
+        * @param aStream stream to updated, if any
+        * @return warning if any 
+        * @leave system wide error
+        */
+        virtual TMceSipWarningCode DecodeMediaOfferL( CSdpMediaField& aMediaLine,
+                                                      CMceComMediaStream*& aStream,
+                                                      CMceComSession& aSession,
+                                                      CSdpDocument& aSdpDocument ) = 0;
+                                                      
+        /**
+        * Decodes media update by updating media stream
+        * @param aMediaLine media line
+        * @param aStream stream to be updated
+        * @param aSdpDocument sdp document
+        * @return warning if any 
+        * @leave system wide error
+        */
+        virtual TMceSipWarningCode DecodeMediaUpdateL( CSdpMediaField& aMediaLine, 
+                                                       CMceComMediaStream& aStream,
+                                                       CSdpDocument& aSdpDocument ) = 0;
+                                                      
+
+        /**
+        * Creates a encoded media line based on the offer received earlier.
+        * @param aStream media stream
+        * @param aMediaLine media line
+        * @param aSdpDocument sdp document
+        * @leave system wide error
+        */
+        virtual void EncodeMediaAnswerL( CMceComMediaStream& aStream,
+                                          CSdpMediaField& aMediaLine,
+                                          CSdpDocument& aSdpDocument ) = 0;
+                                          
+        /**
+        * Prepares media line before offer/answer will be decoded
+        * @param aMediaLine media line
+        * @param aStream media stream
+        * @leave system wide error
+        */
+        virtual void PrepareForDecodeL( CSdpMediaField& aMediaLine,
+                                        CMceComMediaStream* aStream ) = 0;
+                                      
+        /**
+        * Clean attributes
+        * @param aMedia Media line
+        */
+        virtual void CleanAttributes( CSdpMediaField& aMedia ) = 0;
+        
+
+public: //interface cont
+                                                     
+
+        /**
+        * Prepares media line before offer/re-offer will be encoded
+        * @param aStream media stream
+        * @param aMediaLine media line
+        * @leave system wide error
+        */
+        virtual void PrepareForEncodeL( CMceComMediaStream& aStream,
+                                        CSdpMediaField& aMediaLine );
+
+
+
+    public: //common static like API
+                                                     
+        /**
+        * Encodes rtpmap field
+        * @param aPayloadType payload type
+        * @param aEncodingName encoding name
+        * @param aClockRate clock rate
+        * @param aEncodingParam optional encoding paramteter
+        * @return rtpmap
+        * @leave system wide error
+        */
+        CSdpFmtAttributeField* EncodeRtpMapFieldsL( const TUint8 aPayloadType,
+                                                    const TDesC8& aEncodingName,
+                                                    const TUint aClockRate,
+                                                    const TDesC8& aEncodingParam ) const;
+
+        /**
+        * Gets the direction attribute
+        * @param aMedia media line
+        * @param aSessionAttributes session attributes
+        * @return Direction attribute.
+        */
+        TInt Direction( CSdpMediaField& aMedia, 
+                        RPointerArray<CSdpAttributeField>& aSessionAttributes ) const;
+                        
+
+        
+        /**
+        * Finds attribute from media line
+        * @param aAttribute the attribute as string pool index
+        * @param aMediaLine sdp document
+        * @return attribute or NULL
+        */
+        CSdpAttributeField* FindAttribute( TInt aAttribute, 
+                                           CSdpMediaField& aMediaLine ) const;
+                                              
+        /**
+        * Converts Descriptor into TUint
+        * @param aConv descriptor
+        * @return converted value.
+        */                                          
+        static TUint ConvertDesToUintL( const TDesC8& aConv );
+        
+        /**
+        * Converts Descriptor into TInt
+        * @param aConv descriptor
+        * @return converted value.
+        */                                          
+        static TInt ConvertDesToIntL( const TDesC8& aConv );
+
+        /**
+        * Converts TReal to HBuf
+        * @param aConv descriptor
+        * @return converted value.
+        */                                          
+        static HBufC8* ConvertTRealToDesLC( const TReal& aConv );
+        
+        /**
+        * Converts Descriptor into TReal
+        * @param aConv descriptor
+        * @return converted value.
+        */                                          
+        static TReal ConvertDesToRealL( const TDesC8& aConv );
+                                
+
+        /**
+        * Encodes media sdp fields client is willing to insert
+        * @param aClientSdp sdp fields
+        * @param aContainer media line / sdp document
+        */
+        template <class T>
+        static void EncodeClientSdpFieldsL( const CDesC8Array& aClientSdp,
+                                            T& aContainer )
+            {
+            MCEMM_DEBUG("CMceSdpCodec::EncodeClientSdpFieldsL, Entry" );
+
+           for ( TInt i = 0; i < aClientSdp.Count(); i++ )
+                {
+                MCEMM_DEBUG_SVALUE("adding", aClientSdp.MdcaPoint( i ) );
+                TPtrC8 sdpFieldLine = aClientSdp.MdcaPoint( i );
+                if ( sdpFieldLine.Find( KMceSdpAttributeLineMarker ) == 0 )
+                    {
+                    CSdpAttributeField* attribute = 
+                        CSdpAttributeField::DecodeLC( sdpFieldLine );
+                    aContainer.AttributeFields().AppendL( attribute );
+                    CleanupStack::Pop( attribute );            
+                    }
+                else if ( sdpFieldLine.Find( KMceSdpBandwidthLineMarker ) == 0 )
+                    {
+                    CSdpBandwidthField* bandwidth =
+                        CSdpBandwidthField::DecodeLC( sdpFieldLine );
+                    aContainer.BandwidthFields().AppendL( bandwidth );
+                    CleanupStack::Pop( bandwidth );            
+                    }
+                else
+                    {
+                    User::Leave( KErrNotSupported );
+                    }
+                }
+            MCEMM_DEBUG("CMceSdpCodec::EncodeClientSdpFieldsL, Exit" );
+            }
+                                            
+         
+    protected:
+
+    
+        CMceSdpCodec( RStringF aMedia );
+        void ConstructL();
+
+    protected://data
+    
+        RStringPool iStringPool;
+        const TStringTable* iStringTable;
+
+    private:
+
+        RStringF iMedia;
+        CDesC8Array* iCapabilities;
+        RArray<TUint> iCapabilitiesPT;
+        
+    
+    friend class UT_CMceSdpCodec;
+    friend class UT_CMceMediaManager;       
+    friend class UT_CMceSdpSession;
+
+
+    };
+
+#endif      // CMESDPCODEC_H   
+            
+// End of File