multimediacommsengine/mmcesrv/mmcemediamanager/src/mcemediamanager.cpp
branchrcs
changeset 49 64c62431ac08
parent 12 966b25fd74b5
equal deleted inserted replaced
44:fb024d5e35fa 49:64c62431ac08
    26 #include <mmccinterface.h>
    26 #include <mmccinterface.h>
    27 
    27 
    28 #include <sdpdocument.h>
    28 #include <sdpdocument.h>
    29 #include <sdpcodecstringpool.h>
    29 #include <sdpcodecstringpool.h>
    30 
    30 
       
    31 #include "mcemsrpsource.h"
       
    32 #include "mcemsrpsink.h"
    31 #include "mcemediasource.h"
    33 #include "mcemediasource.h"
    32 #include "mcemediastream.h"
    34 #include "mcemediastream.h"
    33 #include "mceaudiostream.h"
    35 #include "mceaudiostream.h"
    34 #include "mcemicsource.h"
    36 #include "mcemicsource.h"
    35 #include "mcertpsource.h"
    37 #include "mcertpsource.h"
    69 #include "mceevents.h"
    71 #include "mceevents.h"
    70 #include "mcemediastate.h"
    72 #include "mcemediastate.h"
    71 
    73 
    72 #include "mceaudiosdpcodec.h"
    74 #include "mceaudiosdpcodec.h"
    73 #include "mcevideosdpcodec.h"
    75 #include "mcevideosdpcodec.h"
       
    76 #include "mcemessagesdpcodec.h"
    74 #include "cleanupresetanddestroy.h"
    77 #include "cleanupresetanddestroy.h"
    75 #include "mcedtmfhandler.h"
    78 #include "mcedtmfhandler.h"
    76 #include "mcecomendpointproxy.h"
    79 #include "mcecomendpointproxy.h"
    77 
    80 
    78 #define MCE_HEAP_CONSTRUCT_LC( type, variable ) \
    81 #define MCE_HEAP_CONSTRUCT_LC( type, variable ) \
    91 // ---------------------------------------------------------
    94 // ---------------------------------------------------------
    92 // CMceMediaManager::CMceMediaManager
    95 // CMceMediaManager::CMceMediaManager
    93 // ---------------------------------------------------------
    96 // ---------------------------------------------------------
    94 CMceMediaManager::CMceMediaManager() 
    97 CMceMediaManager::CMceMediaManager() 
    95     {
    98     {
       
    99     iMsrpSessionCreated = EFalse;
    96     }
   100     }
    97 
   101 
    98 // ---------------------------------------------------------
   102 // ---------------------------------------------------------
    99 // CMceMediaManager::ConstructL
   103 // CMceMediaManager::ConstructL
   100 // ---------------------------------------------------------
   104 // ---------------------------------------------------------
   121     sdpCodec = CMceVideoSdpCodec::NewL();
   125     sdpCodec = CMceVideoSdpCodec::NewL();
   122     CleanupStack::PushL( sdpCodec );
   126     CleanupStack::PushL( sdpCodec );
   123     iSdpCodecs.AppendL( sdpCodec );
   127     iSdpCodecs.AppendL( sdpCodec );
   124     CleanupStack::Pop( sdpCodec );
   128     CleanupStack::Pop( sdpCodec );
   125     
   129     
       
   130     //MEssage SDP Codec
       
   131     sdpCodec = CMceMessageSdpCodec::NewL();
       
   132     CleanupStack::PushL( sdpCodec );
       
   133     iSdpCodecs.AppendL( sdpCodec );
       
   134     CleanupStack::Pop( sdpCodec );
   126     }
   135     }
   127 
   136 
   128 
   137 
   129 // ---------------------------------------------------------
   138 // ---------------------------------------------------------
   130 // CMceMediaManager::SdpCodec
   139 // CMceMediaManager::SdpCodec
  2261     TMccNetSettings netSettings;
  2270     TMccNetSettings netSettings;
  2262     netSettings.iIapId = aStream.IapId();
  2271     netSettings.iIapId = aStream.IapId();
  2263     netSettings.iLocalAddress.SetPort( aStream.LocalMediaPort() );
  2272     netSettings.iLocalAddress.SetPort( aStream.LocalMediaPort() );
  2264     netSettings.iMediaQosValue = aStream.Data().Session()->iServiceType;
  2273     netSettings.iMediaQosValue = aStream.Data().Session()->iServiceType;
  2265     TUint32 linkId = aStream.LinkId();
  2274     TUint32 linkId = aStream.LinkId();
       
  2275     TMccMsrpSettings msrpSettings(netSettings);
  2266     
  2276     
  2267     if ( linkId == KMceNotAssigned && 
  2277     if ( linkId == KMceNotAssigned && 
  2268          !ReuseLink( aStream ) )
  2278          !ReuseLink( aStream ) )
  2269         {
  2279         {
  2270         MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(): no link. creating link");
  2280         MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(): no link. creating link");
  2271         User::LeaveIfError( 
  2281         if(aStream.LinkType() == KMccLinkMessage)
  2272             iMccInterface->CreateLink( aStream.SessionId(),
  2282             {
  2273                                        aStream.LinkType(), 
  2283             CMceComMsrpSource* msrpSource = NULL;
  2274                                        linkId,
  2284             CMceComMsrpSink* msrpSink = NULL;
  2275                                        netSettings ) );
  2285             // Pass on the file sharing parameters if exist
       
  2286             if (IS_SENDSTREAM(&aStream.Data()) )
       
  2287                 {
       
  2288                 for(TInt i=0; i<aStream.Data().Sinks().Count(); i++)
       
  2289                     {
       
  2290                     if ( (aStream.Data().Sinks())[i]->iType == KMceMSRPSink)
       
  2291                         {
       
  2292                         msrpSink = dynamic_cast<CMceComMsrpSink*>( aStream.Data().Sinks()[i]);
       
  2293                         break;
       
  2294                         }
       
  2295                     }
       
  2296                 }else
       
  2297                     {
       
  2298                     __ASSERT_ALWAYS( aStream.Data().Source()->iType == KMceMSRPSource, User::Leave(KErrArgument));
       
  2299                     msrpSource = dynamic_cast<CMceComMsrpSource*>( aStream.Data().Source());
       
  2300                     }
       
  2301             
       
  2302             __ASSERT_ALWAYS( (msrpSource || msrpSink), User::Leave( KErrArgument ) );
       
  2303             
       
  2304             if ( (NULL!=msrpSource && msrpSource->iFileShare)  ||
       
  2305                     (NULL!=msrpSink && msrpSink->iFileShare)  )
       
  2306                 {
       
  2307                 // File sharing attrbs are exist. Extracts them and pass to MCC to start the file transfer
       
  2308                 if (NULL!=msrpSource && NULL!= msrpSource->iFileName )
       
  2309                     msrpSettings.iFileName =  msrpSource->iFileName->Des().Alloc();
       
  2310                 else if (NULL!=msrpSink && NULL!= msrpSink->iFileName  )
       
  2311                     msrpSettings.iFileName = msrpSink->iFileName->Des().Alloc();
       
  2312                     
       
  2313                 NULL!=msrpSource ? (msrpSettings.iFileSize = msrpSource->iFileSize):(msrpSettings.iFileSize = msrpSink->iFileSize);
       
  2314                 //NULL!=msrpSource ? (msrpSettings.iFileType = msrpSource->iFileType):(msrpSettings.iFileType = msrpSink->iFileType);
       
  2315                 if (NULL!=msrpSource && NULL!= msrpSource->iFileType )
       
  2316                     msrpSettings.iFileType = msrpSource->iFileType->Des().Alloc();
       
  2317                 else if (NULL!=msrpSink && NULL!= msrpSink->iFileType  )
       
  2318                     msrpSettings.iFileType = msrpSink->iFileType->Des().Alloc();
       
  2319                 msrpSettings.iFileShare = ETrue;
       
  2320                 
       
  2321                 if (NULL!=msrpSource)
       
  2322                     {
       
  2323                     msrpSettings.iFTProgressNotification = msrpSource->iFTProgressNotification;
       
  2324                     }
       
  2325                 else
       
  2326                     {
       
  2327                     msrpSettings.iFTProgressNotification = msrpSink->iFTProgressNotification;
       
  2328                     }
       
  2329                         
       
  2330                 }
       
  2331             
       
  2332             User::LeaveIfError( iMccInterface->CreateLink( aStream.SessionId(),
       
  2333                                                            aStream.LinkType(), 
       
  2334                                                            linkId, 
       
  2335                                                            msrpSettings ));
       
  2336             // aStream.SetMsrpPath(localMsrpPath);
       
  2337             if (NULL != msrpSettings.iLocalMsrpPath )
       
  2338                 {
       
  2339                 aStream.SetMsrpPath(*msrpSettings.iLocalMsrpPath);
       
  2340                 }
       
  2341             delete msrpSettings.iLocalMsrpPath;
       
  2342             delete msrpSettings.iFileName;
       
  2343             delete msrpSettings.iFileType;
       
  2344             }
       
  2345         else  // for non-message typed links
       
  2346             {
       
  2347             User::LeaveIfError( iMccInterface->CreateLink( aStream.SessionId(),
       
  2348                                                             aStream.LinkType(), 
       
  2349                                                             linkId,
       
  2350                                                             netSettings ) );
       
  2351             }   
  2276         
  2352         
  2277         aStream.SetLinkId( linkId );
  2353         aStream.SetLinkId( linkId );
  2278         
  2354         
  2279         SetPendingState( aStream, 0, CMceSrvStream::ECreatingLink );
  2355         SetPendingState( aStream, 0, CMceSrvStream::ECreatingLink );
  2280         
  2356         
  2385     MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(), Entry ");
  2461     MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(), Entry ");
  2386 
  2462 
  2387     __ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
  2463     __ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
  2388                      User::Leave( KErrArgument ) );
  2464                      User::Leave( KErrArgument ) );
  2389     
  2465     
  2390     // Create mcc codec even if mcc prepare is not needed in order to
  2466     if ( !aStream.PrepareL() ) 
  2391     // construct fmtp info also for local codecs. That information might
  2467         {
  2392     // be needed in some stream matching cases later on.
  2468         
  2393     CMccCodecInformation* mccCodec = CreateMccCodecLC( aStream, aRole );
  2469         // Create mcc codec even if mcc prepare is not needed in order to
  2394         
  2470         // construct fmtp info also for local codecs. That information might
  2395     if ( !aStream.PrepareL() )
  2471         // be needed in some stream matching cases later on.
  2396         {
  2472         CMccCodecInformation* mccCodec = CreateMccCodecLC( aStream, aRole );
       
  2473         
  2397         CMceComCodec& codec = aStream.Codec();
  2474         CMceComCodec& codec = aStream.Codec();
  2398 
  2475 
  2399         if ( ReuseSource( aStream ) )
  2476         if ( ReuseSource( aStream ) )
  2400             {
  2477             {
  2401             MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(): resuing source ");
  2478             MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(): resuing source ");
  2442                                     aStream.MccStreamType(),
  2519                                     aStream.MccStreamType(),
  2443                                     *mccCodec ) );
  2520                                     *mccCodec ) );
  2444         
  2521         
  2445         aStream.Source().Data().InitializedL();
  2522         aStream.Source().Data().InitializedL();
  2446         aStream.Sink().Data().InitializedL();
  2523         aStream.Sink().Data().InitializedL();
  2447 
  2524         
  2448         }
  2525         CleanupStack::PopAndDestroy( mccCodec );
  2449 
  2526 
  2450     CleanupStack::PopAndDestroy( mccCodec );
  2527         }
       
  2528 
  2451     
  2529     
  2452     MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(), Exit ");
  2530     MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(), Exit ");
  2453     }
  2531     }
  2454 
  2532 
  2455     
  2533     
  2504     //for rtp
  2582     //for rtp
  2505     if ( !remoteIpAddress.IsUnspecified() &&
  2583     if ( !remoteIpAddress.IsUnspecified() &&
  2506     	 remoteIpAddress.Port() != 0 &&
  2584     	 remoteIpAddress.Port() != 0 &&
  2507          aStream.IsMccPrepared() )
  2585          aStream.IsMccPrepared() )
  2508         {
  2586         {
       
  2587         
       
  2588         //MSRP    
       
  2589         if (aStream.LinkType() == KMccLinkMessage )  
       
  2590             {
       
  2591             if( aStream.Data().iRemoteMsrpPath.Length())
       
  2592                 {
       
  2593                     // Create MSRP Session with remote terminal
       
  2594                     User::LeaveIfError( 
       
  2595                             iMccInterface->SetRemoteMsrpPath( 
       
  2596                                 aStream.SessionId(),
       
  2597                                 aStream.LinkId(),
       
  2598                                 aStream.RemMsrpPath(),
       
  2599                                 aStream.ConnStatus() )); 
       
  2600                 }
       
  2601             else
       
  2602                 {
       
  2603                 // NOP
       
  2604                 }
       
  2605             return;
       
  2606             }
       
  2607         
  2509         User::LeaveIfError( 
  2608         User::LeaveIfError( 
  2510             iMccInterface->SetRemoteAddress( 
  2609             iMccInterface->SetRemoteAddress( 
  2511                     aStream.SessionId(),
  2610                     aStream.SessionId(),
  2512                     aStream.LinkId(),
  2611                     aStream.LinkId(),
  2513                     remoteIpAddress ) );
  2612                     remoteIpAddress ) );
  2535         }
  2634         }
  2536     }
  2635     }
  2537 
  2636 
  2538 
  2637 
  2539 // ---------------------------------------------------------
  2638 // ---------------------------------------------------------
       
  2639 // CMceMediaManager::SetRemoteMsrpPathL
       
  2640 // ---------------------------------------------------------   
       
  2641 //
       
  2642 void CMceMediaManager::SetRemoteMsrpPathL( CMceSrvStream& aStream )
       
  2643     {
       
  2644     
       
  2645     MCEMM_DEBUG("CMceMediaManager::SetRemoteMsrpPathL(), Entry ");   
       
  2646 
       
  2647    if (aStream.LinkType() == KMccLinkMessage)
       
  2648         {
       
  2649         User::LeaveIfError( 
       
  2650                 iMccInterface->SetRemoteMsrpPath( 
       
  2651                     aStream.SessionId(),
       
  2652                     aStream.LinkId(),
       
  2653                     aStream.RemMsrpPath(),
       
  2654                     aStream.ConnStatus() ));            
       
  2655         }
       
  2656 
       
  2657     }
       
  2658 
       
  2659 
       
  2660 // ---------------------------------------------------------
  2540 // CMceMediaManager::StartMccStreamL
  2661 // CMceMediaManager::StartMccStreamL
  2541 // ---------------------------------------------------------   
  2662 // ---------------------------------------------------------   
  2542 //
  2663 //
  2543 void CMceMediaManager::StartMccStreamL( CMceSrvStream& aStream )
  2664 void CMceMediaManager::StartMccStreamL( CMceSrvStream& aStream )
  2544     {
  2665     {
  3164                           KMceComUseProxyMatch );
  3285                           KMceComUseProxyMatch );
  3165                                    
  3286                                    
  3166     while( !inUse && sourceMatchStreams.Next( stream ) )
  3287     while( !inUse && sourceMatchStreams.Next( stream ) )
  3167         {
  3288         {
  3168         if ( ( aStream.Data().iStreamType == CMceComMediaStream::ELocalStream || 
  3289         if ( ( aStream.Data().iStreamType == CMceComMediaStream::ELocalStream || 
  3169                aStream.Source().Data().Type() == KMceRTPSource ) &&
  3290                aStream.Source().Data().Type() == KMceRTPSource ||
       
  3291                aStream.Source().Data().Type() == KMceMSRPSource ) &&
  3170                stream->Data().iLinkId != KMceNotAssigned )
  3292                stream->Data().iLinkId != KMceNotAssigned )
  3171             {
  3293             {
  3172             inUse = ETrue;
  3294             inUse = ETrue;
  3173             aStream.Data().iLinkId = stream->Data().iLinkId;
  3295             aStream.Data().iLinkId = stream->Data().iLinkId;
  3174             }
  3296             }
  3175         }
  3297         }
  3176 
  3298 
  3177     while( !inUse && sinkMatchStreams.Next( stream ) )
  3299     while( !inUse && sinkMatchStreams.Next( stream ) )
  3178         {
  3300         {
  3179         if ( ( aStream.Data().iStreamType == CMceComMediaStream::ELocalStream || 
  3301         if ( ( aStream.Data().iStreamType == CMceComMediaStream::ELocalStream || 
  3180                aStream.Sink().Data().Type() == KMceRTPSink ) &&
  3302                aStream.Sink().Data().Type() == KMceRTPSink ||
       
  3303                aStream.Sink().Data().Type() == KMceMSRPSink ) &&
  3181                stream->Data().iLinkId != KMceNotAssigned )
  3304                stream->Data().iLinkId != KMceNotAssigned )
  3182             {
  3305             {
  3183             inUse = ETrue;
  3306             inUse = ETrue;
  3184             aStream.Data().iLinkId = stream->Data().iLinkId;
  3307             aStream.Data().iLinkId = stream->Data().iLinkId;
  3185             }
  3308             }
  3934                 }
  4057                 }
  3935             else
  4058             else
  3936                 {
  4059                 {
  3937                 // NOP
  4060                 // NOP
  3938                 }
  4061                 }
       
  4062             
       
  4063             if (aEvent.iEventType == KMccFileSendCompleted || 
       
  4064                     aEvent.iEventType == KMccFileReceiveCompleted )
       
  4065                 {
       
  4066             //  aEvent.iErrorCode cpontains the file tranfer completion info
       
  4067                 event.iError = aEvent.iErrorCode ; 
       
  4068                 }else if( aEvent.iEventType == KMccFileSendProgressNotification ||
       
  4069                         aEvent.iEventType == KMccFileReceiveProgressNotification)
       
  4070                     {
       
  4071                     event.iEventData1 = aEvent.iErrorCode ; //contains the tranferred data
       
  4072                     event.iEventData2 = aEvent.iEventNumData ; // contains the total file size
       
  4073                     }
       
  4074                     
  3939             
  4075             
  3940             // Event might contain only link id (e.g. rtcp rr) but
  4076             // Event might contain only link id (e.g. rtcp rr) but
  3941             // we do not want to propagate it to all streams of that link.                               
  4077             // we do not want to propagate it to all streams of that link.                               
  3942             CMceSrvStream::EventReceived( session->MccStreams(), event, ETrue );
  4078             CMceSrvStream::EventReceived( session->MccStreams(), event, ETrue );
  3943             }
  4079             }