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 "); |
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 } |