multimediacommsengine/mmcesrv/mmcemediamanager/src/mcemediasdpcodec.cpp
changeset 0 1bce908db942
child 14 5bf83dc720b3
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDE FILES
       
    22 
       
    23 #include "mcemediadefs.h"
       
    24 #include "mcemediasdpcodec.h"
       
    25 #include "mcecomcodec.h"
       
    26 #include "mcemmlogs.h"
       
    27 #include "mcepreconditions.h"
       
    28 #include "mcesdpsession.h"
       
    29 #include "mcesip.h"
       
    30 #include "mcemediamanager.h"
       
    31 #include "mcenatpluginmanager.h"
       
    32 
       
    33 #include <sdpconnectionfield.h>
       
    34 #include <sdpdocument.h>
       
    35 #include <sdpcodecstringconstants.h>
       
    36 #include <sdpcodecstringpool.h>
       
    37 #include <sdpmediafield.h>
       
    38 #include <sdpattributefield.h>
       
    39 #include <sdprtpmapvalue.h>
       
    40 #include <sdpfmtattributefield.h>
       
    41 #include <sdporiginfield.h>
       
    42 #include <sdpbandwidthfield.h>
       
    43 #include <mmcccodecinformation.h>
       
    44 #include <sdpcodecstringpool.h>
       
    45 #include <delimitedpathsegment8.h>
       
    46 
       
    47 
       
    48 // ================= MEMBER FUNCTIONS =======================
       
    49 
       
    50 // -----------------------------------------------------------------------------
       
    51 // CMceMediaSdpCodec::CMceMediaSdpCodec
       
    52 // -----------------------------------------------------------------------------
       
    53 CMceMediaSdpCodec::CMceMediaSdpCodec( RStringF aMedia )
       
    54     : CMceSdpCodec( aMedia )
       
    55     {
       
    56     }
       
    57 
       
    58 
       
    59 // -----------------------------------------------------------------------------
       
    60 // CMceMediaSdpCodec::~CMceMediaSdpCodec
       
    61 // -----------------------------------------------------------------------------
       
    62 CMceMediaSdpCodec::~CMceMediaSdpCodec()
       
    63     {
       
    64     }
       
    65 
       
    66 
       
    67 
       
    68 // -----------------------------------------------------------------------------
       
    69 // CMceMediaSdpCodec::EncodeMediaOfferL
       
    70 // -----------------------------------------------------------------------------
       
    71 //
       
    72 void CMceMediaSdpCodec::EncodeMediaOfferL( 
       
    73     CMceComMediaStream& aStream, 
       
    74     CSdpMediaField& aMediaLine, 
       
    75     CSdpDocument& aSdpDocument )
       
    76     { 
       
    77     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeMediaOfferL(), Entry ")
       
    78     
       
    79     // get all the codecs to be offered for this media stream.
       
    80     const RPointerArray<CMceComCodec>& allCodecs = CodecsL( aStream );
       
    81 
       
    82     CMceComCodec* codec = NULL;
       
    83     CMceComCodec::TIterator codecs( allCodecs, CMceComCodec::TIterator::EFilterIsNegotiated );
       
    84     
       
    85     // Set the fmt list containing all supported payload 
       
    86     // types supported by this media
       
    87     // i.e. all the rtpmap fields in the pointer array
       
    88     HBufC8* fmtlist = CreateFormatListL( codecs );
       
    89     CleanupStack::PushL( fmtlist ); 
       
    90     codecs.Reset();
       
    91 
       
    92     aMediaLine.SetFormatListL( *fmtlist );
       
    93     CleanupStack::PopAndDestroy( fmtlist ); 
       
    94     
       
    95     MCEMM_DEBUG_SVALUE("encoded formatlist", aMediaLine.FormatList() )
       
    96     
       
    97     // For each codec supported by this stream create a rtpmap field
       
    98     // e.g. a=rtpmap: 97 AMR/8000
       
    99     // and ptime and maxptime
       
   100     // e.g. a=ptime:20 a=maxptime:40
       
   101     while( codecs.Next( codec ) )
       
   102         {
       
   103         CSdpFmtAttributeField* rtpmap = EncodeRtpmapAttributeLC( *codec );
       
   104 
       
   105         EncodeMediaAttributesL( *codec, aMediaLine, *rtpmap );
       
   106 
       
   107         aMediaLine.FormatAttributeFields().AppendL( rtpmap );
       
   108         CleanupStack::Pop( rtpmap );
       
   109         
       
   110         EncodeFmtpAttributeL( *codec, aMediaLine );
       
   111         
       
   112         }  
       
   113     
       
   114     //encode direction
       
   115     EncodeDirectionL( aStream, aMediaLine, aSdpDocument, EMceRoleOfferer );
       
   116     
       
   117     //encode client attributes if any
       
   118     EncodeClientAttributesL( aStream, aMediaLine );
       
   119         
       
   120     //encode secure session if any
       
   121     EncodeSecureSessionL( aStream, aMediaLine, EMceRoleOfferer );
       
   122     
       
   123     //encode preconditions if any
       
   124     EncodePreconditionsL( aStream, aMediaLine, EMceRoleOfferer );
       
   125     
       
   126     //encode rtcp port 
       
   127     EncodelocalRtcpAttrL( aMediaLine, aStream );
       
   128     
       
   129     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeMediaOfferL(), Exit ")
       
   130     }
       
   131 
       
   132 
       
   133 // -----------------------------------------------------------------------------
       
   134 // CMceMediaSdpCodec::DecodeMediaAnswerL
       
   135 // -----------------------------------------------------------------------------
       
   136 //
       
   137 TMceSipWarningCode CMceMediaSdpCodec::DecodeMediaAnswerL( 
       
   138     CSdpMediaField& aMediaLine, 
       
   139     CMceComMediaStream& aStream,
       
   140     CSdpDocument& aSdpDocument )
       
   141     {
       
   142     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeMediaAnswerL(), Entry ")
       
   143     
       
   144     //should have secure session created
       
   145 
       
   146     const RPointerArray<CMceComCodec>& allCodecs = CodecsL( aStream );
       
   147     CMceComCodec::TIterator codecs( allCodecs );
       
   148     
       
   149     //decode direction or old school hold if necessary                                            
       
   150     DecodeDirectionL( aMediaLine, aStream, aSdpDocument, EMceRoleOfferer );
       
   151 	        
       
   152     __ASSERT_ALWAYS( codecs.Count() > 0, User::Leave( KErrNotReady ) );
       
   153     __ASSERT_ALWAYS( aMediaLine.Port() != 0 , User::Leave( KErrNotReady ) );
       
   154 
       
   155     //decode based on rtpmaps + their media attributes
       
   156     TInt decoded = DecodePayloadsL( aMediaLine, aStream, EMceRoleOfferer );
       
   157 
       
   158     if ( !decoded )
       
   159         {
       
   160         MCEMM_DEBUG("ERROR: No codecs decoded")
       
   161         User::Leave( KErrNotReady );
       
   162         }
       
   163 
       
   164 	 // check if remote RTCP port is set according to RFC 3605
       
   165     DecodeRemoteRtcpFieldL( aMediaLine, aStream );
       
   166     aStream.SetRemoteMediaPort( aMediaLine.Port() );
       
   167 
       
   168     MCEMM_DEBUG_DVALUE("decoded remote port", aStream.RemoteMediaPort() )
       
   169     //decode based on fmtps
       
   170     DecodeFmtpLinesL( aMediaLine, codecs, EMceRoleOfferer );
       
   171 
       
   172 	 //decode secure session if any
       
   173     DecodeSecureSessionL( aMediaLine, aStream, EMceRoleOfferer );
       
   174     
       
   175     //decode preconditions if any
       
   176     TMceSipWarningCode warnings = 
       
   177         DecodePreconditionsL( aMediaLine, aStream, EMceRoleOfferer );
       
   178     
       
   179     //decode client attributes if any
       
   180     DecodeClientAttributesL( aMediaLine, aStream );
       
   181 
       
   182     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeMediaAnswerL(), Exit ")
       
   183     return warnings;
       
   184     }    
       
   185     
       
   186 // -----------------------------------------------------------------------------
       
   187 // CMceMediaSdpCodec::DecodeMediaOfferL
       
   188 // -----------------------------------------------------------------------------
       
   189 //
       
   190 TMceSipWarningCode CMceMediaSdpCodec::DecodeMediaOfferL( 
       
   191     CSdpMediaField& aMediaLine,
       
   192     CMceComMediaStream*& aStream,
       
   193     CMceComSession& aSession,
       
   194     CSdpDocument& aSdpDocument )
       
   195     {
       
   196     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeMediaOfferL(), Entry ")
       
   197     
       
   198     TMceSipWarningCode warning = ValidateSdpL( aMediaLine, aSdpDocument );
       
   199     if ( warning != KErrNone )
       
   200         {
       
   201         return warning;
       
   202         }
       
   203     
       
   204     TInt type = Type( aMediaLine, aSdpDocument.AttributeFields() );
       
   205 
       
   206     // create server stream based on the media direction 
       
   207     // attribute (sendonly, sendrcv, rcvonly)
       
   208     aStream = CreateStreamLC( type );
       
   209     aStream->InitializeL( aSession );
       
   210     	
       
   211     //decode direction or old school hold if necessary                                            
       
   212     DecodeDirectionL( aMediaLine, *aStream, aSdpDocument, EMceRoleAnswerer );
       
   213     	
       
   214     const RPointerArray<CMceComCodec>& allCodecs = CodecsL( *aStream );
       
   215     CMceComCodec::TIterator codecs( allCodecs );
       
   216     
       
   217     //decode based on rtpmaps + their media attributes
       
   218     TInt decoded = DecodePayloadsL( aMediaLine, *aStream, EMceRoleAnswerer );
       
   219     
       
   220     if ( decoded )
       
   221         {
       
   222 
       
   223         // check if remote RTCP port is set according to RFC 3605
       
   224         DecodeRemoteRtcpFieldL( aMediaLine, *aStream );
       
   225         aStream->SetRemoteMediaPort( aMediaLine.Port() );
       
   226 
       
   227         MCEMM_DEBUG_DVALUE("decoded remote port", aStream->RemoteMediaPort() )
       
   228         
       
   229         //decode based on fmtps
       
   230         DecodeFmtpLinesL( aMediaLine, codecs, EMceRoleAnswerer );
       
   231         
       
   232         //decode session level media attributes        
       
   233         DecodeSessionMediaAttributesL( *aStream, aSdpDocument );
       
   234         
       
   235         
       
   236         //decode secure session if any
       
   237        	DecodeSecureSessionL( aMediaLine, *aStream, EMceRoleAnswerer );
       
   238        	//decode preconditions if any
       
   239         warning = DecodePreconditionsL( aMediaLine, *aStream, EMceRoleAnswerer );
       
   240 	
       
   241 		    
       
   242         //Decode client attributes if any
       
   243         DecodeClientAttributesL( aMediaLine, *aStream );
       
   244 		
       
   245         aSession.Streams().AppendL( aStream );
       
   246         CleanupStack::Pop( aStream );
       
   247         
       
   248         }
       
   249     else
       
   250         {
       
   251         MCEMM_DEBUG("No acceptable codecs found for current media line ")
       
   252             
       
   253         // we did not find any acceptable codecs for this stream, return warning
       
   254         
       
   255         CleanupStack::PopAndDestroy( aStream );
       
   256         aStream = NULL;
       
   257         warning = KMceSipWarnIncompatibleMediaFormat;
       
   258         }
       
   259     
       
   260     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeMediaOfferL(), Exit ")
       
   261     
       
   262     return warning;
       
   263     
       
   264     }
       
   265     
       
   266 // -----------------------------------------------------------------------------
       
   267 // CMceMediaSdpCodec::DecodeMediaUpdateL
       
   268 // -----------------------------------------------------------------------------
       
   269 //
       
   270 TMceSipWarningCode CMceMediaSdpCodec::DecodeMediaUpdateL( 
       
   271     CSdpMediaField& aMediaLine, 
       
   272     CMceComMediaStream& aStream,
       
   273     CSdpDocument& aSdpDocument )
       
   274     {
       
   275     
       
   276     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeMediaUpdateL(), Entry ")
       
   277     
       
   278     TMceSipWarningCode warning = ValidateSdpL( aMediaLine, aSdpDocument );
       
   279     if ( warning != KErrNone )
       
   280         {
       
   281         return warning;
       
   282         }
       
   283 
       
   284     const RPointerArray<CMceComCodec>& allCodecs = CodecsL( aStream );
       
   285     CMceComCodec::TIterator codecs( allCodecs );
       
   286     
       
   287     aStream.SetRemoteMediaPort( aMediaLine.Port() );
       
   288     MCEMM_DEBUG_DVALUE("decoded remote port", aStream.RemoteMediaPort() )
       
   289     
       
   290     //should have secure media session existed
       
   291     
       
   292     //decode based on rtpmaps + their media attributes
       
   293     TInt decoded = DecodePayloadsL( aMediaLine, aStream, EMceRoleAnswerer );
       
   294     
       
   295     if ( decoded )
       
   296         {
       
   297         // check if remote RTCP port is set according to RFC 3605
       
   298         DecodeRemoteRtcpFieldL( aMediaLine, aStream );
       
   299         
       
   300 
       
   301         //decode based on fmtps
       
   302         DecodeFmtpLinesL( aMediaLine, codecs, EMceRoleAnswerer );
       
   303 
       
   304         //decode direction or old school hold if necessary                                            
       
   305         UpdateDirectionL( aMediaLine, aStream, aSdpDocument );
       
   306 
       
   307         //decode secure session if any
       
   308        	DecodeSecureSessionL( aMediaLine, aStream, EMceRoleAnswerer, KMceMediaCodecUpdate );
       
   309 
       
   310 
       
   311 		//decode preconditions if any
       
   312         warning = DecodePreconditionsL( aMediaLine, aStream, EMceRoleAnswerer );
       
   313         
       
   314         //decode client attributes if any
       
   315         DecodeClientAttributesL( aMediaLine, aStream );
       
   316     
       
   317 	    }
       
   318     else
       
   319         {
       
   320         MCEMM_DEBUG("ERROR: No codecs decoded")
       
   321         warning = KMceSipWarnIncompatibleMediaFormat;
       
   322         }
       
   323     
       
   324     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeMediaUpdateL(), Exit ")
       
   325     return warning;
       
   326     }
       
   327 
       
   328 // -----------------------------------------------------------------------------
       
   329 // CMceAudioSdpCodec::EncodeMediaAnswerL
       
   330 // -----------------------------------------------------------------------------
       
   331 //
       
   332 void CMceMediaSdpCodec::EncodeMediaAnswerL( 
       
   333     CMceComMediaStream& aStream,
       
   334     CSdpMediaField& aMediaLine,
       
   335     CSdpDocument& aSdpDocument )
       
   336     {
       
   337     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeMediaAnswerL(), Entry ")
       
   338     
       
   339     const RPointerArray<CMceComCodec>& allCodecs = CodecsL( aStream );  
       
   340     CMceComCodec* codec = NULL;
       
   341     CMceComCodec::TIterator codecs( allCodecs, CMceComCodec::TIterator::EFilterIsNegotiated );
       
   342 
       
   343     if ( codecs.Count() > 0 ) 
       
   344         {
       
   345         
       
   346         // Set the fmt list containing all supported payload 
       
   347         // types supported by this media
       
   348         // i.e. all the rtpmap fields in the pointer array
       
   349         HBufC8* fmtlist = CreateFormatListL( codecs );
       
   350         CleanupStack::PushL( fmtlist ); 
       
   351         codecs.Reset();
       
   352 
       
   353         aMediaLine.SetFormatListL( *fmtlist );
       
   354         CleanupStack::PopAndDestroy( fmtlist ); 
       
   355         
       
   356         MCEMM_DEBUG_SVALUE("encoded formatlist", aMediaLine.FormatList() )
       
   357         
       
   358         aMediaLine.SetPortL( aStream.iLocalMediaPort );
       
   359         MCEMM_DEBUG_DVALUE("encoded local port", aMediaLine.Port() )
       
   360         
       
   361         // add the direction attribute
       
   362         EncodeDirectionL( aStream, aMediaLine, aSdpDocument, EMceRoleAnswerer );
       
   363 
       
   364         while( codecs.Next( codec ) )
       
   365             {
       
   366             CSdpFmtAttributeField* rtpmap = EncodeRtpmapAttributeLC( *codec );
       
   367 
       
   368             EncodeMediaAttributesL( *codec, aMediaLine, *rtpmap );
       
   369 
       
   370             aMediaLine.FormatAttributeFields().AppendL( rtpmap );
       
   371             CleanupStack::Pop( rtpmap );
       
   372             
       
   373             EncodeFmtpAttributeL( *codec, aMediaLine );
       
   374             
       
   375             }
       
   376 
       
   377         //encode secure session if any
       
   378         EncodeSecureSessionL( aStream, aMediaLine, EMceRoleAnswerer );
       
   379         
       
   380         //encode preconditions if any
       
   381         EncodePreconditionsL( aStream, aMediaLine, EMceRoleAnswerer );
       
   382         
       
   383         }
       
   384     else
       
   385         { // there was no selected codec for this stream
       
   386         MCEMM_DEBUG("ERROR: No selected codec found! Reject ")
       
   387         aMediaLine.RejectMedia();
       
   388         }
       
   389         
       
   390     // encode client attributes
       
   391     EncodeClientAttributesL( aStream, aMediaLine );
       
   392 
       
   393 	// encode rtcp attributes
       
   394 	EncodelocalRtcpAttrL( aMediaLine, aStream );
       
   395     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeMediaAnswerL(), Exit ")
       
   396     }
       
   397 
       
   398 // -----------------------------------------------------------------------------
       
   399 // CMceMediaSdpCodec::TypeL
       
   400 // -----------------------------------------------------------------------------
       
   401 //
       
   402 TInt CMceMediaSdpCodec::Type( 
       
   403     CSdpMediaField& aMedia, 
       
   404     RPointerArray<CSdpAttributeField>& aSessionAttributes ) const
       
   405     {
       
   406     TInt type = Direction( aMedia, aSessionAttributes );
       
   407     type = type == KErrNotFound ? SdpCodecStringConstants::EAttributeSendrecv : type; 
       
   408     return type;
       
   409     }
       
   410 
       
   411 // -----------------------------------------------------------------------------
       
   412 // CMceMediaSdpCodec::PrepareForDecodeL
       
   413 // -----------------------------------------------------------------------------
       
   414 //
       
   415 void CMceMediaSdpCodec::PrepareForDecodeL( 
       
   416     CSdpMediaField& /*aMediaLine*/,
       
   417     CMceComMediaStream* aStream )
       
   418     {
       
   419     MCEMM_DEBUG("CMceMediaSdpCodec::PrepareForDecodeL(), Entry ")
       
   420     
       
   421     if ( aStream )
       
   422         {
       
   423         const RPointerArray<CMceComCodec>& allCodecs = CodecsL( *aStream );
       
   424         CMceComCodec* codec = NULL;
       
   425         CMceComCodec::TIterator codecs( allCodecs );
       
   426         while( codecs.Next( codec ) )
       
   427             {
       
   428             codec->iIsNegotiated = EFalse;
       
   429             }
       
   430         }
       
   431         
       
   432     MCEMM_DEBUG("CMceMediaSdpCodec::PrepareForDecodeL(), Exit ")
       
   433     }
       
   434 
       
   435 // -----------------------------------------------------------------------------
       
   436 // CMceMediaSdpCodec::DecodeRtpmapLinesL
       
   437 // -----------------------------------------------------------------------------
       
   438 //
       
   439 TInt CMceMediaSdpCodec::DecodeRtpmapLinesL( 
       
   440     CSdpMediaField& aMediaLine,
       
   441     CMceComMediaStream& aStream,
       
   442     TMceNegotiationRole aRole ) const
       
   443     {
       
   444     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeRtpmapLinesL(), Entry ")
       
   445     TInt decoded = 0;
       
   446 	
       
   447     const RPointerArray<CMceComCodec>& allCodecs = CodecsL( aStream );
       
   448     CMceComCodec* codec = NULL;
       
   449     CMceComCodec::TIterator codecs( allCodecs );
       
   450     
       
   451     RArray<TUint> payloadTypesInMediaLine;
       
   452     CleanupClosePushL( payloadTypesInMediaLine );
       
   453    
       
   454     User::LeaveIfError( DecodeFormatList( aMediaLine, payloadTypesInMediaLine ) );
       
   455  
       
   456     RPointerArray< CSdpFmtAttributeField >& formatLines =  
       
   457                                             aMediaLine.FormatAttributeFields();
       
   458     
       
   459 	for ( TInt i = 0; i < formatLines.Count(); i++ )
       
   460 		{
       
   461 		CSdpFmtAttributeField* formatLine = formatLines[ i ];
       
   462         if ( formatLine->Attribute() == 
       
   463                     SDP_STRING( SdpCodecStringConstants::EAttributeRtpmap ) )
       
   464             //codec
       
   465             {
       
   466             TPtrC8 fmtpVal = GetCorrespondingFmtpLineL( aMediaLine, *formatLine );
       
   467             
       
   468             MCE_ITERATOR_FIND_NEXT( 
       
   469                 codecs, codec, 
       
   470                 codec->Decodes( formatLine->Value(), fmtpVal ) );
       
   471                 
       
   472             codecs.Reset();
       
   473             
       
   474             if ( !codec && aRole == EMceRoleOfferer )
       
   475                 {
       
   476                 // No exact match, do less strict matching for better interoperability
       
   477                 MCE_ITERATOR_FIND_NEXT( 
       
   478                 codecs, codec, 
       
   479                 codec->Decodes( formatLine->Value(), fmtpVal, EFalse ) );
       
   480                 codecs.Reset();
       
   481                 }
       
   482                 
       
   483             if ( codec )
       
   484                 {
       
   485                 MCEMM_DEBUG_SVALUE("decoding codec", codec->iSdpName )
       
   486                 
       
   487                 const TDesC8& payloadTypeInRtpMap = formatLine->Format();
       
   488                 TUint rtpMapPT = ConvertDesToUintL( payloadTypeInRtpMap );
       
   489                 
       
   490                 TInt val = payloadTypesInMediaLine.Find( rtpMapPT );
       
   491                 if ( val != KErrNotFound )
       
   492                     {
       
   493                     TUint payload = ConvertDesToUintL( formatLine->Format() );
       
   494                     if ( !IsPayloadTypeSupported( codec->iSdpName, payload ) ) 
       
   495                     	{
       
   496 						// not supported payload, ignore this codec
       
   497                     	continue;
       
   498                     	}
       
   499                     if ( !codec->iIsNegotiated )
       
   500                         {
       
   501                         codec->iPayloadType = payload;
       
   502                         }
       
   503                     codec->iIsNegotiated = ETrue;   
       
   504                     //decode media attributes
       
   505                     DecodeMediaAttributesL( aMediaLine, *codec, *formatLine );
       
   506                     decoded++;
       
   507                     }
       
   508                 else
       
   509                     {
       
   510                     // Discarding as there was no matching pt in medialine for
       
   511                     // this rtmpmap line
       
   512                     codec->iIsNegotiated = EFalse;
       
   513                     if ( aStream.BoundStream() )
       
   514                         {
       
   515                         CMceComCodec* sync = NULL;
       
   516                         sync = aStream.BoundStreamL().FindCodecL( *codec );
       
   517                         if ( sync )
       
   518                             {
       
   519                             sync->iIsNegotiated = EFalse; 
       
   520                             }
       
   521                         }
       
   522                     }
       
   523                 }
       
   524             else if ( aRole == EMceRoleAnswerer )
       
   525                 {
       
   526                 if ( DecodeRtpmapLineL( *formatLine, aMediaLine, aStream, fmtpVal ) )
       
   527                     {
       
   528                     decoded++;
       
   529                     }
       
   530                 }
       
   531             else
       
   532                 {
       
   533                 // NOP
       
   534                 }
       
   535                     
       
   536             }
       
   537 		}
       
   538 
       
   539     CleanupStack::PopAndDestroy( &payloadTypesInMediaLine );
       
   540         
       
   541     MCEMM_DEBUG_DVALUE("decoded codecs", decoded )
       
   542     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeRtpmapLinesL(), Exit ")
       
   543     return decoded;	
       
   544     }
       
   545 
       
   546 // -----------------------------------------------------------------------------
       
   547 // CMceMediaSdpCodec::DecodeRtpmapLinesL
       
   548 // -----------------------------------------------------------------------------
       
   549 //
       
   550 TInt CMceMediaSdpCodec::DecodeRtpmapLinesL( 
       
   551     CSdpMediaField& aMediaLine,
       
   552     CMceComMediaStream& aStream ) const
       
   553     {
       
   554     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeRtpmapLinesL(), Entry ")
       
   555     TInt decoded = 0;
       
   556 
       
   557      // Read format level attributes
       
   558     RPointerArray< CSdpFmtAttributeField >& formatLines =  
       
   559                                             aMediaLine.FormatAttributeFields();
       
   560     
       
   561     // For all codec specific lines in the offer        
       
   562     for ( TInt i = 0; i < formatLines.Count(); i++ )
       
   563         {
       
   564         CSdpFmtAttributeField* formatLine = formatLines[i];
       
   565         if ( formatLine->Attribute() == SDP_STRING( SdpCodecStringConstants::EAttributeRtpmap ) &&
       
   566              DecodeRtpmapLineL( *formatLine, aMediaLine, aStream ) )
       
   567             {
       
   568             decoded++;
       
   569             }
       
   570         }
       
   571 
       
   572     MCEMM_DEBUG_DVALUE("decoded codecs", decoded )
       
   573     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeRtpmapLinesL(), Exit ")
       
   574     return decoded;
       
   575     }
       
   576 
       
   577 // -----------------------------------------------------------------------------
       
   578 // CMceMediaSdpCodec::DecodeStaticPayloadsL
       
   579 // -----------------------------------------------------------------------------
       
   580 //
       
   581 TInt CMceMediaSdpCodec::DecodeStaticPayloadsL( 
       
   582     CSdpMediaField& aMediaLine,
       
   583     CMceComMediaStream& aStream,
       
   584     RArray<TUint>& aPayloadTypes,
       
   585     TMceNegotiationRole aRole ) const
       
   586     {
       
   587     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeStaticPayloadsL(), Entry ")
       
   588     TInt decoded = 0;
       
   589 
       
   590     DecodeFormatListL( aMediaLine, aPayloadTypes );
       
   591     TInt index = 0;
       
   592     
       
   593     while( index < aPayloadTypes.Count() )
       
   594         {
       
   595         TUint payload = aPayloadTypes[ index++ ];
       
   596         if ( payload < KMinDynamicPT )
       
   597             {
       
   598             CMceComCodec* codec = FindCodec( payload, aStream );
       
   599             if ( aRole == EMceRoleAnswerer )
       
   600                 {
       
   601                 if ( !codec )
       
   602                     {
       
   603                     codec = CreateCodecLC( payload, aMediaLine );
       
   604                     if ( codec )
       
   605                         {
       
   606                         codec->InitializeL( aStream );
       
   607                         codec->iIsNegotiated = ETrue;
       
   608                         MCEMM_DEBUG_SVALUE("adding codec", codec->iSdpName )
       
   609                         aStream.AddCodecL( codec );
       
   610                         CleanupStack::Pop( codec );
       
   611                         decoded++;
       
   612                         }
       
   613                     }
       
   614                 else
       
   615                     {
       
   616                     codec->iIsNegotiated = ETrue;
       
   617                     decoded++;
       
   618                     }
       
   619                 }
       
   620             else if ( codec && aRole == EMceRoleOfferer )
       
   621                 {
       
   622                 codec->iIsNegotiated = ETrue;
       
   623                 decoded++;
       
   624                 }
       
   625             }
       
   626         }
       
   627         
       
   628     MCEMM_DEBUG_DVALUE("decoded codecs", decoded )
       
   629     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeStaticPayloadsL(), Exit ")
       
   630     return decoded;
       
   631     }
       
   632 
       
   633 // -----------------------------------------------------------------------------
       
   634 // CMceMediaSdpCodec::FindCodec
       
   635 // -----------------------------------------------------------------------------
       
   636 //
       
   637 CMceComCodec* CMceMediaSdpCodec::FindCodec( 
       
   638     TInt aPayloadType, 
       
   639     CMceComMediaStream& aStream ) const
       
   640     {
       
   641     TInt error = KErrNone;
       
   642     
       
   643     RPointerArray< CMceComCodec > allCodecs;
       
   644     
       
   645     TRAP( error, allCodecs = CodecsL( aStream ) );  
       
   646     CMceComCodec* codec = NULL;
       
   647     if( error == KErrNone )
       
   648     	{
       
   649     	CMceComCodec::TIterator codecs( allCodecs );
       
   650     
       
   651     	MCE_ITERATOR_FIND_NEXT( codecs, codec, codec->iPayloadType == aPayloadType );	
       
   652     	}
       
   653 
       
   654     return codec;
       
   655     }
       
   656 
       
   657 // -----------------------------------------------------------------------------
       
   658 // CMceMediaSdpCodec::DecodeRtpmapLineL
       
   659 // -----------------------------------------------------------------------------
       
   660 //
       
   661 CMceComCodec* CMceMediaSdpCodec::DecodeRtpmapLineL( 
       
   662     CSdpFmtAttributeField& aRtpMaptLine,
       
   663     CSdpMediaField& aMediaLine,
       
   664     CMceComMediaStream& aStream,
       
   665     const TDesC8& aFmtpValue ) const
       
   666     {
       
   667     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFmtpLineL(), Entry ")
       
   668     
       
   669     RArray<TUint> payloadTypesInMediaLine;
       
   670     CleanupClosePushL( payloadTypesInMediaLine );
       
   671    
       
   672     User::LeaveIfError( DecodeFormatList( aMediaLine, payloadTypesInMediaLine ) );
       
   673     	
       
   674     const TDesC8& payloadTypeInRtpMap = aRtpMaptLine.Format();
       
   675     
       
   676     TUint rtpMapPT = ConvertDesToUintL( payloadTypeInRtpMap );
       
   677     CMceComCodec* codec = NULL;
       
   678     
       
   679     // Ingoring if there is no matching pt in medialine for this rtmpmap line
       
   680     if ( payloadTypesInMediaLine.Find( rtpMapPT ) != KErrNotFound )
       
   681         {
       
   682         codec = CreateCodecLC( aRtpMaptLine );
       
   683         if ( codec )
       
   684             {
       
   685             codec->InitializeL( aStream );
       
   686             if ( !codec->SetFmtpProposalL( aFmtpValue ) )
       
   687                 {
       
   688                 // Fmtp not valid, ignore codec
       
   689                 CleanupStack::PopAndDestroy( codec );
       
   690                 codec = NULL;
       
   691                 }
       
   692             else
       
   693                 {
       
   694                 // check if ptime or maxptime attributes are present
       
   695                 DecodeMediaAttributesL( aMediaLine, *codec, aRtpMaptLine );
       
   696                 codec->iIsNegotiated = ETrue;
       
   697                 MCEMM_DEBUG_SVALUE("adding codec", codec->iSdpName )
       
   698                 aStream.AddCodecL( codec );
       
   699                 CleanupStack::Pop( codec );
       
   700                 }
       
   701             }    
       
   702         }
       
   703 
       
   704     CleanupStack::PopAndDestroy( &payloadTypesInMediaLine );
       
   705 
       
   706     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFmtpLineL(), Exit ")
       
   707     return codec;        
       
   708     }
       
   709     
       
   710 // -----------------------------------------------------------------------------
       
   711 // CMceMediaSdpCodec::DecodeFmtpLinesL
       
   712 // -----------------------------------------------------------------------------
       
   713 //
       
   714 void CMceMediaSdpCodec::DecodeFmtpLinesL( 
       
   715     CSdpMediaField& aMediaLine,
       
   716     CMceComCodec::TIterator& aCodecs,
       
   717     TMceNegotiationRole aRole ) const
       
   718     {
       
   719     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFmtpLinesL(), Entry ")
       
   720 
       
   721     RPointerArray< CSdpFmtAttributeField >& formatLines =  
       
   722         aMediaLine.FormatAttributeFields();
       
   723     
       
   724     CMceComCodec* codec = NULL;
       
   725     while( aCodecs.Next( codec ) )
       
   726         {
       
   727    	    TBool first = ETrue;
       
   728         // for all codec specific lines in the offer
       
   729         TBool found = EFalse;
       
   730     	for ( TInt j = 0; j < formatLines.Count(); j++ )
       
   731     		{
       
   732     		CSdpFmtAttributeField* formatLine = formatLines[ j ];
       
   733     		if ( formatLine->Attribute() == 
       
   734     		            SDP_STRING( SdpCodecStringConstants::EAttributeFmtp ) )
       
   735     			{
       
   736     			TUint payloadType = ConvertDesToUintL( formatLine->Format() );
       
   737 				if ( codec->iPayloadType == payloadType )
       
   738 				    {
       
   739                     MCEMM_DEBUG_SVALUE("decoding format", formatLine->Format() )
       
   740 					const TDesC8& fmtpValue = formatLine->Value();
       
   741                     MCEMM_DEBUG_SVALUE("decoding fmtp", fmtpValue )
       
   742                     found = ETrue;
       
   743                     TBool isAnswerer( aRole == EMceRoleAnswerer );
       
   744 					if ( first )
       
   745 					    {
       
   746 					    codec->SetFmtpFromIncomingSdpL( 
       
   747 					                fmtpValue, isAnswerer, KMceCodecFmtpReset );
       
   748 					    first = EFalse;
       
   749 					    }
       
   750                     else
       
   751                         {
       
   752         				codec->SetFmtpFromIncomingSdpL( 
       
   753         				            fmtpValue, isAnswerer, KMceCodecFmtpAppend );
       
   754                         }
       
   755 				    }
       
   756     			}
       
   757     		}
       
   758     	if ( !found )
       
   759         	{
       
   760             // No fmtp line found, use default values
       
   761             codec->SetDefaultFmtpAttributeL();
       
   762             }
       
   763         MCEMM_DEBUG_SVALUE("decoded fmtp", *codec->iFmtpAttr )         
       
   764         }
       
   765    	    
       
   766     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFmtpLinesL(), Exit ")
       
   767     }
       
   768 
       
   769 // -----------------------------------------------------------------------------
       
   770 // CMceMediaSdpCodec::EncodeFmtpAttributeL
       
   771 // -----------------------------------------------------------------------------
       
   772 //
       
   773 void CMceMediaSdpCodec::EncodeFmtpAttributeL( 
       
   774     CMceComCodec& aCodec,
       
   775     CSdpMediaField& aMedia ) const
       
   776     {
       
   777     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeFmtpAttributeL(), Entry ")
       
   778     
       
   779     RStringF attributeFmtp = 
       
   780         SDP_STRING( SdpCodecStringConstants::EAttributeFmtp );
       
   781     
       
   782     if( aCodec.iFmtpAttr && aCodec.iFmtpAttr->Size() != 0 )
       
   783         {
       
   784         MCE_DEFINE_DECSTR( payload, aCodec.iPayloadType )
       
   785 
       
   786         HBufC8* fmtpAttr = aCodec.FtmpForOutgoingSdpLC();
       
   787         CSdpFmtAttributeField* fmtpLine = 
       
   788             CSdpFmtAttributeField::NewL( attributeFmtp, payload, *fmtpAttr );
       
   789         CleanupStack::PopAndDestroy( fmtpAttr );
       
   790         CleanupStack::PushL( fmtpLine );                         
       
   791         aMedia.FormatAttributeFields().AppendL( fmtpLine );
       
   792         CleanupStack::Pop( fmtpLine );
       
   793         
       
   794         MCEMM_DEBUG_SVALUE( "encoded fmtp", fmtpLine->Value() )
       
   795         }
       
   796         
       
   797     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeFmtpAttributeL(), Exit ")
       
   798     }
       
   799         
       
   800 // -----------------------------------------------------------------------------
       
   801 // CMceMediaSdpCodec::CreateFormatListL
       
   802 // Creates fmtlist that can be used as media field fmt list -attribute
       
   803 // (other items were commented in a header).
       
   804 // Status : Draft 
       
   805 // -----------------------------------------------------------------------------
       
   806 //
       
   807 HBufC8* CMceMediaSdpCodec::CreateFormatListL( 
       
   808     CMceComCodec::TIterator& aCodecs ) const
       
   809     {
       
   810     MCEMM_DEBUG("CMceMediaSdpCodec::CreateFmtListL(), Entry ")
       
   811     
       
   812     HBufC8* fmtList = HBufC8::NewLC( KMceSdpFormatListLength );
       
   813     TPtr8 fmtListPtr( fmtList->Des() );
       
   814 
       
   815     CMceComCodec* codec = NULL;
       
   816     for ( TInt count = 0; count <= aCodecs.Count()-1; count++ )
       
   817     	{
       
   818     	aCodecs.Next( codec );
       
   819     	MCE_DEFINE_DECSTR( payload, codec->iPayloadType )
       
   820     	fmtListPtr.Append( payload );
       
   821        	if ( count != aCodecs.Count()-1)
       
   822        		{
       
   823        		fmtListPtr.Append( KMceSipBlank );
       
   824        		}
       
   825     	}
       
   826     
       
   827     CleanupStack::Pop( fmtList );
       
   828     
       
   829     MCEMM_DEBUG("CMceMediaSdpCodec::CreateFmtListL(), Exit ")
       
   830     
       
   831     return fmtList;
       
   832     }
       
   833 
       
   834 // -----------------------------------------------------------------------------
       
   835 // CMceMediaSdpCodec::DecodeFormatListL
       
   836 // -----------------------------------------------------------------------------
       
   837 //
       
   838 void CMceMediaSdpCodec::DecodeFormatListL( 
       
   839     CSdpMediaField& aMedia, 
       
   840     RArray<TUint>& aPayloadTypes ) const
       
   841     {
       
   842     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFormatListL(), Entry ")
       
   843     
       
   844     User::LeaveIfError( DecodeFormatList( aMedia, aPayloadTypes ) );
       
   845         
       
   846     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFormatListL(), Exit ")   
       
   847     }
       
   848 
       
   849 // -----------------------------------------------------------------------------
       
   850 // CMceMediaSdpCodec::DecodeFormatList
       
   851 // -----------------------------------------------------------------------------
       
   852 //
       
   853 TInt CMceMediaSdpCodec::DecodeFormatList( 
       
   854     CSdpMediaField& aMedia, 
       
   855     RArray<TUint>& aPayloadTypes ) const
       
   856     {
       
   857     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFormatList(), Entry ")
       
   858     
       
   859     TInt index = 0;
       
   860     const TDesC8& payloadlist = aMedia.FormatList();
       
   861     MCEMM_DEBUG_SVALUE( "decoded format list", payloadlist )
       
   862     TLex8 payloads( payloadlist );
       
   863     TInt error = KErrNone;
       
   864     
       
   865     while( error == KErrNone && !payloads.Eos() && index < KMceMaxPayloadTypes )
       
   866         {
       
   867         TPtrC8 payload = payloads.NextToken();
       
   868         TUint convertedUnit = 0;
       
   869         TLex8 lexConv( payload );
       
   870         TInt err = lexConv.Val( convertedUnit, EDecimal );
       
   871         if( err != KErrNone )
       
   872         	{
       
   873         	error = err;
       
   874         	break;
       
   875         	}
       
   876         error = aPayloadTypes.Append( convertedUnit );
       
   877         index++;
       
   878         }
       
   879 
       
   880     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeFormatList(), Exit ")
       
   881     
       
   882     return error;
       
   883     }
       
   884     
       
   885 // -----------------------------------------------------------------------------
       
   886 // CMceMediaSdpCodec::DecodeRemoteRtcpFieldL
       
   887 //
       
   888 // a=rtcp:53020 IN IP4 126.16.64.4
       
   889 // -----------------------------------------------------------------------------
       
   890 //
       
   891 void CMceMediaSdpCodec::DecodeRemoteRtcpFieldL( 
       
   892     CSdpMediaField& aMediaLine, 
       
   893     CMceComMediaStream& aStream ) const
       
   894     {   
       
   895     MCEMM_DEBUG( "CMceMediaSdpCodec::ParseRemoteRtcpFieldL(), Entry" )
       
   896 
       
   897     RStringF rtcpAttributeName = iStringPool.OpenFStringL( KMceSdpAttrRtcp );
       
   898     CleanupClosePushL( rtcpAttributeName );
       
   899     _LIT8( KMatchIN,"*IN*" );       
       
   900     _LIT8( KMatchIp,"*IP*" );
       
   901     
       
   902     RPointerArray<CSdpAttributeField>& attrfields = 
       
   903         aMediaLine.AttributeFields();
       
   904     
       
   905     for ( TInt i = 0; i < attrfields.Count(); i++ )
       
   906         {
       
   907         CSdpAttributeField* attribute = attrfields[i];        
       
   908         if ( attribute->Attribute() == rtcpAttributeName ) 
       
   909             {
       
   910             const TDesC8& value = attribute->Value();
       
   911             TUint rtcpPort( 0 );
       
   912             
       
   913             if ( value.Match( KMatchIN ) != KErrNotFound )
       
   914                 {
       
   915                 // found remote IP4 RTCP address
       
   916                 const TUint8 KAddrOffsetFromNetType = 4;
       
   917                 TInt addr_offset = 
       
   918                     value.Match( KMatchIp ) + KAddrOffsetFromNetType;
       
   919                 TPtrC8 remoteRtcpAddr = value.Mid( addr_offset );
       
   920                 
       
   921                 const TUint8 KPortOffsetFromIP = 1;
       
   922                 TInt port_offset = 
       
   923                     value.Match( KMatchIN ) - KPortOffsetFromIP;
       
   924                 TPtrC8 remoteRtcpPort = value.Left( port_offset );
       
   925                 
       
   926                 TLex8 lexPT( remoteRtcpPort );
       
   927                 User::LeaveIfError( lexPT.Val( rtcpPort, EDecimal ) );
       
   928                 // copy the address into correct format
       
   929                 TBuf16 <KMaxAddressLength> input;
       
   930                 input.Copy( remoteRtcpAddr );      
       
   931                 
       
   932                 MCEMM_DEBUG_SVALUE( "Found RTCP address", input )
       
   933                 
       
   934                 aStream.SetRemoteRtcpMediaAddrL( input );
       
   935                 }
       
   936             else
       
   937                 {
       
   938                 // only port present
       
   939                 TLex8 lexPT( value );
       
   940                 User::LeaveIfError ( lexPT.Val( rtcpPort, EDecimal ) );
       
   941                 }
       
   942 
       
   943 			aStream.SetRemoteRtcpMediaPort( rtcpPort );
       
   944             
       
   945             MCEMM_DEBUG_DVALUE( "RTCP Port", rtcpPort )
       
   946             }
       
   947         }
       
   948     
       
   949     CleanupStack::PopAndDestroy( &rtcpAttributeName );
       
   950       
       
   951     MCEMM_DEBUG( "CMceMediaSdpCodec::ParseRemoteRtcpFieldL(), Exit" )    
       
   952     }
       
   953     
       
   954 // -----------------------------------------------------------------------------
       
   955 // CMceMediaSdpCodec::EncodelocalRtcpAttrL
       
   956 //
       
   957 // a=rtcp:53020 IN IP4 126.16.64.4
       
   958 // -----------------------------------------------------------------------------
       
   959 //
       
   960 void CMceMediaSdpCodec::EncodelocalRtcpAttrL( 
       
   961     CSdpMediaField& aMediaLine, 
       
   962     CMceComMediaStream& aStream ) const
       
   963     {   
       
   964     MCEMM_DEBUG("CMceMediaSdpCodec::EncodelocalRtcpAttrL, Entry ")
       
   965     if ( aStream.Session() && aStream.Session()->UseRtcp() )
       
   966 		{
       
   967 		MCEMM_DEBUG("RTCP attribute to be added")
       
   968     	TBuf8<KMceSdpMaxMediaLineLength> rtcpAttrValue;
       
   969 		rtcpAttrValue.Num( aStream.iLocalMediaPort + 1, EDecimal );
       
   970 		 if ( !aStream.Session()->iLocalIpAddress.IsUnspecified() )
       
   971 			{
       
   972 			CSdpConnectionField* connectionField = 
       
   973 			    CSdpConnectionField::NewL( aStream.Session()->iLocalIpAddress );
       
   974 			CleanupStack::PushL( connectionField );
       
   975 			rtcpAttrValue.Append( KMceSdpSpace );   
       
   976 		    rtcpAttrValue.Append( connectionField->NetType().DesC() );  
       
   977 		    rtcpAttrValue.Append( KMceSdpSpace );        
       
   978 		 	rtcpAttrValue.Append( connectionField->AddressType().DesC() );
       
   979 		 	rtcpAttrValue.Append( KMceSdpSpace );      
       
   980 		 	rtcpAttrValue.Append( connectionField->Address() );
       
   981 		 	CleanupStack::PopAndDestroy( connectionField );
       
   982 			}
       
   983 		RStringF attributeRtcp = 
       
   984             SdpCodecStringPool::StringPoolL().OpenFStringL( KMceSdpAttrRtcp );
       
   985 		CleanupClosePushL( attributeRtcp );
       
   986 
       
   987 		CSdpAttributeField* rtcpLine = 
       
   988 		            CSdpAttributeField::NewLC( attributeRtcp, rtcpAttrValue );
       
   989 		        
       
   990 		MCEMM_DEBUG_SVALUE("encoded rtcpPort", aStream.iLocalMediaPort + 1 )
       
   991 
       
   992 		aMediaLine.AttributeFields().AppendL( rtcpLine );
       
   993 
       
   994 		CleanupStack::Pop( rtcpLine ); 
       
   995 		CleanupStack::PopAndDestroy( ); //attributeRtcp 
       
   996 		}
       
   997     MCEMM_DEBUG("CMceMediaSdpCodec::EncodelocalRtcpAttrL, Exit ")    
       
   998     }    
       
   999     
       
  1000 // -----------------------------------------------------------------------------
       
  1001 // CMceMediaSdpCodec::CleanAttributes
       
  1002 // -----------------------------------------------------------------------------
       
  1003 //
       
  1004 void CMceMediaSdpCodec::CleanAttributes( CSdpMediaField& aMedia )
       
  1005     {
       
  1006     MCEMM_DEBUG("CMceMediaSdpCodec::CleanAttributes(), Entry ")
       
  1007     
       
  1008     //clean attributes
       
  1009     aMedia.AttributeFields().ResetAndDestroy();
       
  1010         
       
  1011     //clean format attributes
       
  1012     aMedia.FormatAttributeFields().ResetAndDestroy();
       
  1013        
       
  1014     aMedia.BandwidthFields().ResetAndDestroy();
       
  1015     
       
  1016     MCEMM_DEBUG("CMceMediaSdpCodec::CleanAttributes(), Exit ")
       
  1017     }
       
  1018 
       
  1019 // -----------------------------------------------------------------------------
       
  1020 // CMceMediaSdpCodec::DecodeSecureSessionL
       
  1021 // -----------------------------------------------------------------------------
       
  1022 //
       
  1023 void CMceMediaSdpCodec::DecodeSecureSessionL( 
       
  1024     CSdpMediaField& aMediaLine,
       
  1025     CMceComMediaStream& aStream, 
       
  1026     TMceNegotiationRole aRole,
       
  1027     TBool aUpdate )
       
  1028     {
       
  1029     
       
  1030     CMceSecureMediaSession* secureSession = aStream.Session()->SecureSession();
       
  1031 
       
  1032     if ( aRole == EMceRoleAnswerer && !aUpdate )
       
  1033         {
       
  1034         aStream.Session()->SecureSessionL().DecodeSecureDesSdpOfferL( aStream, aMediaLine );
       
  1035         if ( !aStream.Session()->iIsSecureSession )
       
  1036             {
       
  1037             aStream.Session()->DeleteSecureSession();
       
  1038             }
       
  1039         }
       
  1040     else if ( secureSession && aRole == EMceRoleAnswerer && aUpdate )
       
  1041         {
       
  1042         // for long session
       
  1043         if ( secureSession->iKeyNeedUpdated )
       
  1044         	{
       
  1045         	secureSession->DecodeSecureDesSdpUpdateL( aStream, aMediaLine ) ;
       
  1046         	}
       
  1047         }
       
  1048     else if ( secureSession && aRole == EMceRoleOfferer )
       
  1049         {
       
  1050        	// for Long Session
       
  1051         	//sendonly receive only sendandreceive
       
  1052      	secureSession->DecodeSecureDesSdpAnswerL( aStream, aMediaLine ) ;
       
  1053        	}        
       
  1054     }
       
  1055 
       
  1056 // -----------------------------------------------------------------------------
       
  1057 // CMceMediaSdpCodec::EncodeSecureSessionL
       
  1058 // -----------------------------------------------------------------------------
       
  1059 //
       
  1060 void CMceMediaSdpCodec::EncodeSecureSessionL( 
       
  1061     CMceComMediaStream& aStream, 
       
  1062     CSdpMediaField& aMediaLine,
       
  1063     TMceNegotiationRole aRole )
       
  1064     {
       
  1065     CMceSecureMediaSession* secureSession = aStream.Session()->SecureSession();
       
  1066 
       
  1067     if ( secureSession )
       
  1068         {
       
  1069         if ( aRole == EMceRoleOfferer )
       
  1070             {
       
  1071             secureSession->EncodeSecureDesSdpOfferL( aStream, aMediaLine );
       
  1072             }
       
  1073         else
       
  1074             {
       
  1075             secureSession->EncodeSecureDesSdpAnswerL( aStream, aMediaLine );
       
  1076             }
       
  1077         }
       
  1078     }
       
  1079 
       
  1080 // -----------------------------------------------------------------------------
       
  1081 // CMceMediaSdpCodec::DecodeDirectionL
       
  1082 // -----------------------------------------------------------------------------
       
  1083 //
       
  1084 void CMceMediaSdpCodec::DecodeDirectionL( CSdpMediaField& aMediaLine,
       
  1085                                           CMceComMediaStream& aStream,
       
  1086                                           CSdpDocument& aSdpDocument,
       
  1087                                           TMceNegotiationRole aRole ) const
       
  1088 	{
       
  1089     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeDirectionL(), Entry ")
       
  1090 
       
  1091     TInt rmt_direction = 
       
  1092         Direction( aMediaLine, aSdpDocument.AttributeFields() );
       
  1093     TInt loc_direction = aStream.Direction();
       
  1094     
       
  1095     CSdpConnectionField* connectionField = aSdpDocument.ConnectionField();
       
  1096     
       
  1097     CMceSdpSession& sSession = aStream.Session()->SdpSession();
       
  1098         
       
  1099     CSdpConnectionField* nullAddress =
       
  1100         CSdpConnectionField::DecodeL( KMceSipNullAddressA );
       
  1101     				 
       
  1102     CleanupStack::PushL( nullAddress );
       
  1103 
       
  1104     TUint oldSchool = sSession.iOOldSchool;
       
  1105     TBool isNullAddress = EFalse;
       
  1106     if ( connectionField )
       
  1107         {
       
  1108         isNullAddress = (connectionField->Address() == nullAddress->Address());
       
  1109         }
       
  1110 
       
  1111     CleanupStack::PopAndDestroy( nullAddress );
       
  1112 
       
  1113     //trying to guess other party direction if have got no direction
       
  1114     if ( rmt_direction == KErrNotFound || 
       
  1115          ( rmt_direction == SdpCodecStringConstants::EAttributeSendonly && 
       
  1116            loc_direction == SdpCodecStringConstants::EAttributeSendonly ) )
       
  1117     
       
  1118 	    {
       
  1119 	    if ( aRole == EMceRoleOfferer )
       
  1120 	      	{
       
  1121 	   		// did we try old school hold?
       
  1122 	    	if ( oldSchool )           
       
  1123 	      	    {
       
  1124 	      	    if ( !isNullAddress )
       
  1125 	      	      	{
       
  1126 	      	  		// ignore that other party didn't understand us
       
  1127 	      	        // and full cancel of old school process
       
  1128 	         	    sSession.iOOldSchool = 0;
       
  1129 	            	sSession.iOOldSchoolProceeding = 0;
       
  1130 	                sSession.iOOldSchoolCompleted = 0;
       
  1131 	      	      	}
       
  1132 	       		
       
  1133 	       		rmt_direction = SdpCodecStringConstants::EAttributeRecvonly;
       
  1134 	       		oldSchool = 0;
       
  1135 	      	    }    
       
  1136             else  //  didn't try old school yet
       
  1137                 {
       
  1138                 if ( isNullAddress )
       
  1139                     {
       
  1140                     // assuming that other party wanna put us on hold
       
  1141 	                rmt_direction = SdpCodecStringConstants::EAttributeSendonly; 
       
  1142                     }
       
  1143 	            else if ( loc_direction == 
       
  1144 	                          SdpCodecStringConstants::EAttributeSendonly &&
       
  1145 	               		  aStream.Session()->Modifier( KMceMediaDirection ) ==
       
  1146 	              			  KMceMediaDirectionWithAddress )
       
  1147                     {
       
  1148                     // failed to put other party on hold, trying old school
       
  1149                     sSession.iOOldSchool = 1;    
       
  1150                     User::Leave( KMceErrOldSchool );
       
  1151                     }
       
  1152                 else
       
  1153                     {
       
  1154                     // NOP
       
  1155                     }
       
  1156                 }
       
  1157 	      	}
       
  1158         else // answerer
       
  1159             {
       
  1160             if ( isNullAddress )
       
  1161                 {
       
  1162                 // other party puts us on hold
       
  1163                 rmt_direction = SdpCodecStringConstants::EAttributeSendonly;
       
  1164                 sSession.iIOldSchool = 1;
       
  1165                 oldSchool = sSession.iIOldSchool;
       
  1166                 }
       
  1167 	        else
       
  1168 	            {
       
  1169 	            rmt_direction = SdpCodecStringConstants::EAttributeSendrecv;
       
  1170 	            }   	
       
  1171             }
       
  1172 	    }
       
  1173 
       
  1174     sSession.iIOldSchool = oldSchool;
       
  1175 
       
  1176 	// if unable to determine other party direction then just ignore that
       
  1177     if ( rmt_direction != KErrNotFound )
       
  1178         {
       
  1179     	// now checking for permitted directions
       
  1180     	// inverse direction
       
  1181         TInt inv_dir = rmt_direction;
       
  1182         switch (inv_dir)
       
  1183         	{
       
  1184           	case SdpCodecStringConstants::EAttributeRecvonly: 
       
  1185           		{
       
  1186           		inv_dir=SdpCodecStringConstants::EAttributeSendonly; 
       
  1187           		break;		
       
  1188           		}      
       
  1189           	case SdpCodecStringConstants::EAttributeSendonly: 
       
  1190           		{
       
  1191           		inv_dir=SdpCodecStringConstants::EAttributeRecvonly; 
       
  1192           		break;		
       
  1193           		}
       
  1194           	default:
       
  1195           		{
       
  1196           		break;		
       
  1197           		}
       
  1198         	}
       
  1199 
       
  1200 		// all directions are permitted for answerer and 
       
  1201 		// inactive is always accepted
       
  1202     	if ( aRole == EMceRoleOfferer && 
       
  1203     	     rmt_direction != SdpCodecStringConstants::EAttributeInactive )
       
  1204     		{
       
  1205     		// other party has incompatible direction. terminate session.
       
  1206            	if ( loc_direction != SdpCodecStringConstants::EAttributeSendrecv 
       
  1207            	     && 
       
  1208            	     loc_direction != inv_dir )
       
  1209            	    {
       
  1210            	    User::Leave( KErrArgument );
       
  1211            	    }
       
  1212     		}
       
  1213 
       
  1214     	if ( loc_direction != inv_dir )
       
  1215     	    {
       
  1216     	    aStream.SetDirection( rmt_direction, KMceNoEndpointAdjustment );
       
  1217     	    }
       
  1218     	}
       
  1219 
       
  1220     MCEMM_DEBUG_SVALUE("decoded direction", 
       
  1221     					SDP_STRING( aStream.Direction() ).DesC() )
       
  1222     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeDirectionL(), Exit ")
       
  1223  	}
       
  1224 
       
  1225 // -----------------------------------------------------------------------------
       
  1226 // CMceMediaSdpCodec::UpdateDirectionL
       
  1227 // -----------------------------------------------------------------------------
       
  1228 //
       
  1229     
       
  1230 void CMceMediaSdpCodec::UpdateDirectionL( 
       
  1231     CSdpMediaField& aMediaLine, 
       
  1232     CMceComMediaStream& aStream,
       
  1233     CSdpDocument& aSdpDocument ) const
       
  1234 	{
       
  1235     TInt direction = Direction( aMediaLine, aSdpDocument.AttributeFields() );
       
  1236     CSdpConnectionField* connectionField = aSdpDocument.ConnectionField();
       
  1237     if ( connectionField == NULL )
       
  1238         {
       
  1239     	connectionField = ( aMediaLine.ConnectionFields()[0] )	;
       
  1240     	}
       
  1241 
       
  1242     if ( connectionField->Address() == KMceSipNullAddress )	
       
  1243         {
       
  1244         direction = SdpCodecStringConstants::EAttributeSendonly;    
       
  1245         }
       
  1246     UpdateStreamL( aStream, direction );
       
  1247     aStream.SetDirection( direction, KMceNoEndpointAdjustment );
       
  1248 	}
       
  1249 
       
  1250 // -----------------------------------------------------------------------------
       
  1251 // CMceMediaSdpCodec::EncodeDirectionL
       
  1252 // -----------------------------------------------------------------------------
       
  1253 //
       
  1254 void CMceMediaSdpCodec::EncodeDirectionL( 
       
  1255     CMceComMediaStream& aStream, 
       
  1256     CSdpMediaField& aMedia,
       
  1257     CSdpDocument& aSdpDocument,
       
  1258     TMceNegotiationRole aRole ) const
       
  1259     {
       
  1260     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeDirectionL(), Entry ")
       
  1261         
       
  1262     CMceSdpSession& sSession = aStream.Session()->SdpSession();
       
  1263 
       
  1264     if ( aRole == EMceRoleOfferer && 
       
  1265     	 sSession.iOOldSchool &&  
       
  1266     	 aStream.Direction() != SdpCodecStringConstants::EAttributeSendrecv )
       
  1267     	     	 
       
  1268         {
       
  1269         CSdpConnectionField* connField = 
       
  1270             CSdpConnectionField::DecodeL( KMceSipNullAddressA );
       
  1271         aSdpDocument.SetConnectionField( connField );
       
  1272         MCEMM_DEBUG("using old school")
       
  1273         }
       
  1274     
       
  1275     else
       
  1276         {
       
  1277         RStringF direction = SDP_STRING( aStream.Direction() );
       
  1278 
       
  1279         CSdpAttributeField* mediaAttr = 
       
  1280             CSdpAttributeField::NewLC( direction, KNullDesC8 );
       
  1281             
       
  1282         MCEMM_DEBUG_SVALUE("encoded direction", mediaAttr->Attribute().DesC() )
       
  1283             
       
  1284         aMedia.AttributeFields().AppendL( mediaAttr );
       
  1285         CleanupStack::Pop( mediaAttr );
       
  1286         }
       
  1287     
       
  1288     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeDirectionL(), Exit ")
       
  1289     }
       
  1290     
       
  1291 // -----------------------------------------------------------------------------
       
  1292 // CMceMediaSdpCodec::EncodePreconditionsL
       
  1293 // -----------------------------------------------------------------------------
       
  1294 //
       
  1295 void CMceMediaSdpCodec::EncodePreconditionsL( 
       
  1296     CMceComMediaStream& aStream,
       
  1297     CSdpMediaField& aMediaLine,
       
  1298     TMceNegotiationRole aRole ) const
       
  1299     {
       
  1300     CMceSecureMediaSession* secureSession = aStream.Session()->SecureSession();
       
  1301 
       
  1302     if ( aStream.Session()->Modifier( KMcePreconditions ) == KMcePreconditionsSupported &&
       
  1303             !secureSession)
       
  1304         {
       
  1305         if ( ( aRole == EMceRoleOfferer && 
       
  1306                aStream.Session()->iUseLocalPreconditions ) ||
       
  1307              ( aRole == EMceRoleAnswerer && 
       
  1308                aStream.Session()->iUseRemotePreconditions ) )
       
  1309             {
       
  1310              TMcePreconditions* precondition = aStream.PreconditionsL( KMcePreconditions );
       
  1311              if ( precondition )
       
  1312 	        	{
       
  1313 	        	precondition->EncodeL( aMediaLine );
       
  1314 	        	}
       
  1315             }
       
  1316         }
       
  1317   	if ( aStream.Session()->Modifier( KMceSecPreconditions ) == KMcePreconditionsE2ESupported )
       
  1318         {
       
  1319         TMcePreconditions* precondition = aStream.PreconditionsL( KMceSecPreconditions );
       
  1320         if ( precondition )
       
  1321         	{
       
  1322         	precondition->EncodeL( aMediaLine );
       
  1323         	}
       
  1324         }    
       
  1325     }
       
  1326 
       
  1327 // -----------------------------------------------------------------------------
       
  1328 // CMceMediaSdpCodec::DecodePreconditionsL
       
  1329 // -----------------------------------------------------------------------------
       
  1330 //
       
  1331 TMceSipWarningCode CMceMediaSdpCodec::DecodePreconditionsL( 
       
  1332     CSdpMediaField& aMediaLine,
       
  1333     CMceComMediaStream& aStream,
       
  1334     TMceNegotiationRole aRole ) const
       
  1335     {
       
  1336 	MCEMM_DEBUG("CMceMediaSdpCodec::DecodePreconditionsL EntryL")
       
  1337 	TMceSipWarningCode warning = KErrNone;
       
  1338 	
       
  1339     if ( aStream.Session()->Modifier( KMcePreconditions ) == KMcePreconditionsSupported  )
       
  1340     	{
       
  1341     	if ( ( aRole == EMceRoleOfferer && 
       
  1342                aStream.Session()->iUseLocalPreconditions ) ||
       
  1343              ( aRole == EMceRoleAnswerer && 
       
  1344                aStream.Session()->iUseRemotePreconditions )  )
       
  1345     		{
       
  1346     		aStream.PreconditionsL( KMcePreconditions )->DecodeL( aMediaLine );	
       
  1347     		
       
  1348 	        }
       
  1349         }   
       
  1350 	if ((aRole == EMceRoleOfferer && 
       
  1351      	aStream.Session()->iClientCryptoSuites.Count()
       
  1352      	&& aStream.Session()->Modifier( KMceSecPreconditions ) 
       
  1353      	== KMcePreconditionsE2ESupported )
       
  1354      	|| ( aRole ==EMceRoleAnswerer && (
       
  1355      		aStream.Session()->iRemoteSecPreconditionsRequired ||
       
  1356      		 aStream.Session()->iClientCryptoSuites.Count() )))
       
  1357       
       
  1358      	{
       
  1359 		TMcePreconditions* precondition = 
       
  1360 			aStream.PreconditionsL( KMceSecPreconditions, &aMediaLine );
       
  1361 	
       
  1362     	if ( !precondition )
       
  1363     		{
       
  1364     		return KErrNone;
       
  1365     		}
       
  1366     	if ( warning && aStream.Preconditions().Count() )
       
  1367     		{
       
  1368     			//normal segmented precondition cases
       
  1369     		aStream.Session()->iRemoteSecPreconditionsRequired = EFalse;
       
  1370     		aStream.Session()->Modifier( KMceSecPreconditions ) = 
       
  1371     			KMcePreconditionsNotUsed;
       
  1372     		MCEMM_DEBUG("Secure preconds not used")	
       
  1373     		MCEMM_DEBUG("CMceMediaSdpCodec::DecodePreconditionsL Exit")	
       
  1374     		return KErrNone;
       
  1375     		}
       
  1376     
       
  1377     	if ( !precondition->IsMet() )
       
  1378     		{
       
  1379     		MCEMM_DEBUG("Decode Secure Precondition")	
       
  1380     		warning = precondition->DecodeL( aMediaLine );	
       
  1381     		}
       
  1382     	warning = warning == KMceSipPreconditionFailure ? 
       
  1383      			warning : KErrNone;
       
  1384      	MCEMM_DEBUG_DVALUE ("Decode Secure Precondition warning", warning ) 
       
  1385      	}        
       
  1386    	MCEMM_DEBUG("CMceMediaSdpCodec::DecodePreconditionsL Exit")	
       
  1387 	return warning;
       
  1388     }
       
  1389 
       
  1390 // -----------------------------------------------------------------------------
       
  1391 // CMceMediaSdpCodec::EncodeClientAttributesL
       
  1392 // -----------------------------------------------------------------------------
       
  1393 //
       
  1394 void CMceMediaSdpCodec::EncodeClientAttributesL( 
       
  1395     CMceComMediaStream& aStream,
       
  1396     CSdpMediaField& aMediaLine ) const
       
  1397     {
       
  1398     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeClientAttributesL, Entry" )
       
  1399     
       
  1400     CDesC8Array* clientAttributes = aStream.iLocalMediaSDPLines;
       
  1401     __ASSERT_ALWAYS( clientAttributes, User::Leave( KErrArgument ) );
       
  1402 
       
  1403     CMceSdpCodec::EncodeClientSdpFieldsL<CSdpMediaField>( *clientAttributes, aMediaLine );
       
  1404     
       
  1405         
       
  1406     MCEMM_DEBUG("CMceMediaSdpCodec::EncodeClientAttributesL, Exit" )
       
  1407     }    
       
  1408 
       
  1409 // -----------------------------------------------------------------------------
       
  1410 // CMceMediaSdpCodec::DecodeClientAttributesL
       
  1411 // -----------------------------------------------------------------------------
       
  1412 //
       
  1413 void CMceMediaSdpCodec::DecodeClientAttributesL( 
       
  1414     CSdpMediaField& aMediaLine, 
       
  1415     CMceComMediaStream& aStream ) const
       
  1416     {
       
  1417     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeClientAttributesL, Entry" )
       
  1418     CDesC8Array* remoteAttributes = 
       
  1419         new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity );
       
  1420     CleanupStack::PushL( remoteAttributes );
       
  1421     CBufFlat* encodeBuf = NULL;
       
  1422     
       
  1423     for ( TInt i = 0; i < aMediaLine.AttributeFields().Count(); i++ )
       
  1424         {
       
  1425     	encodeBuf = CBufFlat::NewL( KMceExternalizeBufferExpandSize );
       
  1426     	CleanupStack::PushL( encodeBuf );
       
  1427     	RBufWriteStream writeStream( *encodeBuf, 0 );
       
  1428 	    writeStream.PushL();
       
  1429         
       
  1430         aMediaLine.AttributeFields()[ i ]->EncodeL( writeStream );
       
  1431         MCEMM_DEBUG_SVALUE( "found attribute", encodeBuf->Ptr( 0 ) )
       
  1432         remoteAttributes->AppendL( encodeBuf->Ptr( 0 ) );
       
  1433     	
       
  1434     	CleanupStack::PopAndDestroy(); // writeStream
       
  1435         CleanupStack::PopAndDestroy( encodeBuf ); // encodeBuf
       
  1436         }
       
  1437     
       
  1438     for ( TInt i = 0; i < aMediaLine.BandwidthFields().Count(); i++ )
       
  1439         {
       
  1440         
       
  1441     	encodeBuf = CBufFlat::NewL( KMceExternalizeBufferExpandSize );
       
  1442     	CleanupStack::PushL( encodeBuf );
       
  1443     	RBufWriteStream writeStream( *encodeBuf, 0 );
       
  1444 	    writeStream.PushL();
       
  1445         
       
  1446         aMediaLine.BandwidthFields()[ i ]->EncodeL( writeStream );
       
  1447         MCEMM_DEBUG_SVALUE("found attribute", encodeBuf->Ptr( 0 ) )
       
  1448         remoteAttributes->AppendL( encodeBuf->Ptr( 0 ) );
       
  1449     	
       
  1450     	CleanupStack::PopAndDestroy(); // writeStream
       
  1451         CleanupStack::PopAndDestroy( encodeBuf ); // encodeBuf
       
  1452         }
       
  1453         
       
  1454     if ( aStream.BoundStream() )
       
  1455         {
       
  1456         MCEMM_DEBUG("copy attributes to bound stream" )
       
  1457         // copy attributes to bound stream
       
  1458         CMceComMediaStream& boundStream = aStream.BoundStreamL();
       
  1459         CDesC8Array* copyAttributes = 
       
  1460             new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity );
       
  1461         CleanupStack::PushL( copyAttributes );
       
  1462         for ( TInt i = 0; i < remoteAttributes->MdcaCount(); i++ )
       
  1463             {
       
  1464             copyAttributes->AppendL( remoteAttributes->MdcaPoint( i ) );
       
  1465             }
       
  1466         CleanupStack::Pop( copyAttributes );
       
  1467         MCE_DELETE( boundStream.iRemoteMediaSDPLines );
       
  1468         boundStream.iRemoteMediaSDPLines = copyAttributes;
       
  1469         }
       
  1470         
       
  1471     CleanupStack::Pop( remoteAttributes );
       
  1472     MCE_DELETE( aStream.iRemoteMediaSDPLines );
       
  1473     aStream.iRemoteMediaSDPLines = remoteAttributes;
       
  1474     MCEMM_DEBUG("CMceMediaSdpCodec::DecodeClientAttributesL, Exit" )
       
  1475     }
       
  1476 
       
  1477 // -----------------------------------------------------------------------------
       
  1478 // CMceMediaSdpCodec::ValidateSdp
       
  1479 // -----------------------------------------------------------------------------
       
  1480 //
       
  1481 TMceSipWarningCode CMceMediaSdpCodec::ValidateSdpL( 
       
  1482     CSdpMediaField& aMediaLine,
       
  1483     CSdpDocument& /*aSdpDocument*/ )
       
  1484     {
       
  1485     TMceSipWarningCode warning = KErrNone;
       
  1486     RArray<TUint> payloadTypes;
       
  1487     TInt error = KErrNone;
       
  1488     RPointerArray< CSdpFmtAttributeField >& formatLines =  
       
  1489                                             aMediaLine.FormatAttributeFields();
       
  1490 
       
  1491     TInt dynamicPayloadsCount = 0;
       
  1492     TInt rtpmapCount = 0;
       
  1493     
       
  1494     error = DecodeFormatList( aMediaLine, payloadTypes );
       
  1495     
       
  1496     User::LeaveIfError( error );
       
  1497     
       
  1498     if ( error == KErrNone )
       
  1499         {
       
  1500         TInt index = 0;
       
  1501         while( index < payloadTypes.Count() )
       
  1502             {
       
  1503             dynamicPayloadsCount = payloadTypes[ index++ ] >= KMinDynamicPT ?
       
  1504                                    dynamicPayloadsCount + 1 : dynamicPayloadsCount;
       
  1505             }
       
  1506         index = 0;
       
  1507         while( index < formatLines.Count() )
       
  1508             {
       
  1509             rtpmapCount = formatLines[ index++ ]->Attribute() == 
       
  1510                                 SDP_STRING( SdpCodecStringConstants::EAttributeRtpmap ) ?
       
  1511                           rtpmapCount + 1 : rtpmapCount;
       
  1512             }
       
  1513         
       
  1514         if ( dynamicPayloadsCount > 0 && rtpmapCount == 0 )
       
  1515             {
       
  1516             warning = KMceSipBadRequest;
       
  1517             }
       
  1518         }
       
  1519     else
       
  1520         {
       
  1521         warning = KMceSipServerInternalError;
       
  1522         }
       
  1523     
       
  1524     payloadTypes.Close();
       
  1525     
       
  1526     return warning;
       
  1527     }
       
  1528 
       
  1529 // -----------------------------------------------------------------------------
       
  1530 // CMceMediaSdpCodec::DecodePayloadsL
       
  1531 // -----------------------------------------------------------------------------
       
  1532 //
       
  1533 TInt CMceMediaSdpCodec::DecodePayloadsL( 
       
  1534     CSdpMediaField& aMediaLine,
       
  1535     CMceComMediaStream& aStream,
       
  1536     TMceNegotiationRole aRole ) const
       
  1537     {
       
  1538     TInt decoded( 0 );
       
  1539     
       
  1540     RArray<TUint> payloadTypes;
       
  1541     CleanupClosePushL( payloadTypes );
       
  1542     
       
  1543     if ( aRole == EMceRoleAnswerer )
       
  1544         {
       
  1545         decoded = DecodeRtpmapLinesL( aMediaLine, aStream, EMceRoleAnswerer );
       
  1546         decoded += DecodeStaticPayloadsL( aMediaLine, aStream, payloadTypes, EMceRoleAnswerer );
       
  1547         }
       
  1548     else
       
  1549         { 
       
  1550         // static payloads are decoded first if role is offerer
       
  1551         decoded = DecodeStaticPayloadsL( aMediaLine, aStream, payloadTypes, EMceRoleOfferer );
       
  1552         decoded += DecodeRtpmapLinesL( aMediaLine, aStream, EMceRoleOfferer );
       
  1553         }
       
  1554         
       
  1555     UpdateSdpCodecIndexesL( aStream, payloadTypes );
       
  1556     CleanupStack::PopAndDestroy( &payloadTypes );
       
  1557     
       
  1558     return decoded;
       
  1559     }
       
  1560     
       
  1561 // -----------------------------------------------------------------------------
       
  1562 // CMceMediaSdpCodec::UpdateSdpCodecIndexesL
       
  1563 // -----------------------------------------------------------------------------
       
  1564 //
       
  1565 void CMceMediaSdpCodec::UpdateSdpCodecIndexesL( 
       
  1566     CMceComMediaStream& aStream,
       
  1567     RArray<TUint>& aPayloadTypes ) const
       
  1568     {
       
  1569     TInt index( 0 );
       
  1570     TInt codecSdpIndex( 0 );
       
  1571     while( index < aPayloadTypes.Count() )
       
  1572         {
       
  1573         TUint payload = aPayloadTypes[ index++ ];
       
  1574         CMceComCodec* codec = FindCodec( payload, aStream );
       
  1575         if ( codec )
       
  1576             {
       
  1577             codec->iCodecSdpIndex = codecSdpIndex++;
       
  1578             }  
       
  1579         }
       
  1580     }
       
  1581 
       
  1582 // -----------------------------------------------------------------------------
       
  1583 // CMceMediaSdpCodec::GetCorrespondingFmtpLineL
       
  1584 // -----------------------------------------------------------------------------
       
  1585 //
       
  1586 TPtrC8 CMceMediaSdpCodec::GetCorrespondingFmtpLineL( 
       
  1587     CSdpMediaField& aMediaLine, 
       
  1588     CSdpFmtAttributeField& aRtpMapFormatLine ) const
       
  1589     {
       
  1590     const TDesC8& payloadTypeInRtpMap = aRtpMapFormatLine.Format();
       
  1591     TUint rtpMapPT = ConvertDesToUintL( payloadTypeInRtpMap );
       
  1592     
       
  1593     RPointerArray< CSdpFmtAttributeField >& formatLines =  
       
  1594         aMediaLine.FormatAttributeFields();
       
  1595     
       
  1596     TPtrC8 fmtp( KNullDesC8() );
       
  1597     TBool found( EFalse );
       
  1598     for ( TInt j = 0; j < formatLines.Count() && !found; j++ )
       
  1599     	{
       
  1600     	CSdpFmtAttributeField* formatLine = formatLines[ j ];
       
  1601     	if ( formatLine->Attribute() == 
       
  1602     	            SDP_STRING( SdpCodecStringConstants::EAttributeFmtp ) )
       
  1603     		{
       
  1604     		TUint fmtpPT = ConvertDesToUintL( formatLine->Format() );
       
  1605     		if ( rtpMapPT == fmtpPT )
       
  1606     		    {
       
  1607     		    fmtp.Set( formatLine->Value() );
       
  1608     		    found = ETrue;
       
  1609     		    }
       
  1610     		}
       
  1611     	}
       
  1612     return fmtp;
       
  1613     }
       
  1614     
       
  1615 // End of file