multimediacommsengine/mmceshared/src/mcecomfactory.cpp
changeset 0 1bce908db942
child 49 64c62431ac08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmceshared/src/mcecomfactory.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,637 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    
+*
+*/
+
+
+
+
+#include <s32buf.h>
+
+#include "mceaudiostream.h"
+#include "mcevideostream.h"
+#include "mcertpsource.h"
+#include "mcemicsource.h"
+#include "mcecamerasource.h"
+#include "mcefilesource.h"
+#include "mcefilesink.h"
+#include "mcertpsink.h"
+#include "mcespeakersink.h"
+#include "mcedisplaysink.h"
+#include "mceavsink.h"
+#include "mcecomfactory.h"
+#include "mcecomsession.h"
+#include "mcecomaudiostream.h"
+#include "mcecomvideostream.h"
+#include "mcecomrtpsource.h"
+#include "mcecommicsource.h"
+#include "mcecomcamerasource.h"
+#include "mcecomfilesource.h"
+#include "mcecomfilesink.h"
+#include "mcecomrtpsink.h"
+#include "mcecomspeakersink.h"
+#include "mcecomdisplaysink.h"
+#include "mcecomavsink.h"
+#include "mcecomaudiocodec.h"
+#include "mcecomamrcodec.h"
+#include "mcecomg711codec.h"
+#include "mceg711codec.h"
+#include "mcecomg729codec.h"
+#include "mceg729codec.h"
+#include "mcecncodec.h"
+#include "mcecomilbccodec.h"   
+#include "mcecomdtmfcodec.h"
+#include "mcecomcncodec.h"
+#include "mcecomredcodec.h"
+#include "mcecomvideocodec.h"
+#include "mcecomh263codec.h"
+#include "mcecomstreambundle.h"
+#include "mcecomavccodec.h"
+#include "mcecomamrwbcodec.h"
+#include "mceserial.h"
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// TMceComFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComSession* TMceComFactory::CreateLC( MMceComSerializationContext& aSerCtx )
+    {
+    return CMceComSession::NewLC( aSerCtx );
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceComFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceComStreamBundle* TMceComFactory::CreateBundleLC( CMceComSession& aSession, 
+                                                     MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    CMceStreamBundle::TMceStreamBundleType type =
+    	static_cast<CMceStreamBundle::TMceStreamBundleType>( readStream.ReadUint8L() );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    CMceComStreamBundle* bundle = CMceComStreamBundle::NewLC( type );
+    bundle->InitializeL( aSession );
+    bundle->InternalizeL( aSerCtx );
+    
+    return bundle;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceMsgBase* TMceComFactory::CreateL( TMceItcDataType aType,
+                                      RReadStream& aReadStream )
+    {
+    MMceComSerializationContext serCtx( aReadStream );
+    CleanupClosePushL( serCtx );
+    
+    CMceMsgBase* object = CreateL( aType, serCtx );
+    
+    CleanupStack::PopAndDestroy();//serCtx
+    
+    return object;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// TMceComFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceMsgBase* TMceComFactory::CreateL( TMceItcDataType aType,
+                                      MMceComSerializationContext& aSerCtx )
+    {
+    
+    CMceMsgBase* message = NULL;
+    switch ( aType )
+        {
+        case EMceItcMsgTypeSession:
+            {
+            message = new (ELeave) CMceMsgObject<CMceComSession>();
+        	break;
+            }
+        case EMceItcMsgTypeStream:
+            {
+            message = new (ELeave) CMceMsgObject<CMceComMediaStream>();
+        	break;
+            }
+        case EMceItcMsgTypeCodec:
+            {
+            message = new (ELeave) CMceMsgObject<CMceComAudioCodec>();
+        	break;
+            }
+        case EMceItcMsgTypeSink:
+            {
+            message = new (ELeave) CMceMsgObject<CMceComMediaSink>();
+        	break;
+            }
+        case EMceItcMsgTypeSource:
+            {
+            message = new (ELeave) CMceMsgObject<CMceComMediaSource>();
+        	break;
+            }
+        case EMceItcMsgTypeSIPData:
+            {
+            message = new (ELeave) CMceMsgSIPData();
+        	break;
+            }
+        case EMceItcMsgTypeSIPReply:
+            {
+            message = new (ELeave) CMceMsgSIPReply();
+        	break;
+            }
+       	case EMceItcMsgTypeSIPRequest:
+            {
+            message = new (ELeave) CMceMsgSIPRequest();
+        	break;
+            }    
+            
+        case EMceItcMsgTypeEvent:
+            {
+            message = new (ELeave) CMceMsgSIPEvent();
+        	break;
+            }
+        case EMceItcMsgTypeTextArray:
+            {
+            message = new (ELeave) CMceMsgTextArray();
+        	break;
+            }
+        case EMceItcMsgTypeMessageArray:
+            {
+            message = new (ELeave) CMceMsgArray<TMceComFactory>( *this );
+        	break;
+            }
+	    default:
+	        {
+	        }
+        }
+        
+    if ( message )
+        {
+    	CleanupStack::PushL( message );
+    	message->PushL();
+        message->DoDecodeL( aSerCtx );
+    	message->Pop();
+        CleanupStack::Pop( message );
+        }
+
+    return message;
+            
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+void TMceComFactory::CreateLC( MMceComSerializable*& aObject, MMceComSerializationContext& aSerCtx )
+    {
+
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    TUint type = readStream.ReadUint8L();
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    switch ( type )
+        {
+        case KMceAvSink:
+            {
+            aObject = CMceComAvSink::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    
+    if ( !aObject )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    aObject->InternalizeL( aSerCtx );
+    
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// TMceComMediaStreamFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComMediaStream* TMceComMediaStreamFactory::CreateLC( TMceMediaType aType )
+	{
+    
+    CMceComMediaStream* stream = NULL;
+    switch ( aType )
+        {
+        case KMceAudio:
+            {
+            stream = CMceComAudioStream::NewLC();
+            break;
+            }
+        case KMceVideo:
+            {
+            stream = CMceComVideoStream::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    
+    if ( !stream )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return stream;
+    
+	}
+	
+	
+
+// -----------------------------------------------------------------------------
+// TMceComMediaStreamFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComMediaStream* TMceComMediaStreamFactory::CreateLC( 
+                                        MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    TMceMediaType type = static_cast<TMceMediaType>( readStream.ReadUint8L() );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    CMceComMediaStream* stream = CreateLC( type );
+    stream->InternalizeL( aSerCtx );
+    return stream;
+    
+    }
+
+	
+// -----------------------------------------------------------------------------
+// TMceComSourceFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComMediaSource* TMceComSourceFactory::CreateLC( TMceSourceType aType )
+    {
+    CMceComMediaSource* source = NULL;
+
+    switch ( aType )
+        {
+        case KMceRTPSource:
+            {
+            source = CMceComRtpSource::NewLC();
+            break;
+            }
+        case KMceMicSource:
+            {
+            source = CMceComMicSource::NewLC();
+            break;
+            }
+        case KMceCameraSource:
+            {
+            source = CMceComCameraSource::NewLC();
+            break;
+            }
+        case KMceFileSource:
+            {
+            source = CMceComFileSource::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( !source )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return source;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceComSourceFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComMediaSource* TMceComSourceFactory::CreateLC( MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    TMceSourceType type = static_cast<TMceSourceType>( readStream.ReadUint8L() );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+
+    CMceComMediaSource* source = CreateLC( type );
+    source->InternalizeL( aSerCtx );
+    return source;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComSinkFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComMediaSink* TMceComSinkFactory::CreateLC( TMceSinkType aType )
+    {
+    CMceComMediaSink* sink = NULL;
+    
+    switch ( aType )
+        {
+        case KMceRTPSink:
+            {
+            sink = CMceComRtpSink::NewLC();
+            break;
+            }
+        case KMceSpeakerSink:
+            {
+            sink = CMceComSpeakerSink::NewLC();
+            break;
+            }
+        case KMceDisplaySink:
+            {
+            sink = CMceComDisplaySink::NewLC();
+            break;
+            }
+        case KMceFileSink:
+            {
+            sink = CMceComFileSink::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( !sink )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return sink;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComSinkFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComMediaSink* TMceComSinkFactory::CreateLC( MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    TMceSinkType type = static_cast<TMceSinkType>( readStream.ReadUint8L() );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    CMceComMediaSink* sink = CreateLC( type );
+    sink->InternalizeL( aSerCtx );
+    return sink;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComAudioCodecFactory::CreateLC 
+// -----------------------------------------------------------------------------
+//
+CMceComAudioCodec* TMceComAudioCodecFactory::CreateLC( const TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComAudioCodec* codec = CreateCodecLC( aSdpName );
+    __ASSERT_ALWAYS( codec, User::Leave( KErrNotSupported ) );
+    
+    return codec;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComAudioCodecFactory::CreateCodecLC 
+// -----------------------------------------------------------------------------
+//
+CMceComAudioCodec* TMceComAudioCodecFactory::CreateCodecLC( const TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComAudioCodec* codec = NULL;
+    
+    if ( !aSdpName.CompareF(KMceSDPNameAMR) )
+        {
+        codec = CMceComAMRCodec::NewLC( aSdpName );
+        }
+    else if ( !aSdpName.CompareF(KMceSDPNamePCMU) ||
+              !aSdpName.CompareF(KMceSDPNamePCMA) )
+        {
+        codec = CMceComG711Codec::NewLC( aSdpName );
+        }
+    else if ( !aSdpName.CompareF(KMceSDPNameG729) )    
+        {
+        codec = CMceComG729Codec::NewLC( aSdpName );
+        }
+    else if ( !aSdpName.CompareF(KMceSDPNameiLBC) )
+        {
+        codec = CMceComiLBCCodec::NewLC( aSdpName );    
+        }
+    else if ( !aSdpName.CompareF(KMceSDPNameDtmf) )
+        {
+        codec = CMceComDtmfCodec::NewLC( aSdpName );    
+        }
+    else if ( !aSdpName.CompareF(KMceSDPNameRed) )
+        {
+        codec = CMceComRedCodec::NewLC( aSdpName );    
+        }
+    else if ( !aSdpName.CompareF(KMceSDPNameCn) )
+        {
+        codec = CMceComCnCodec::NewLC( aSdpName );    
+        }
+        
+    else if ( !aSdpName.CompareF(KMceSDPNameAMRWB) )
+        {
+        codec = CMceComAMRWbCodec::NewLC( aSdpName );    
+        }
+        
+    else
+        {
+        codec = NULL;
+        }
+    
+    return codec;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComAudioCodecFactory::CreateCodecLC 
+// -----------------------------------------------------------------------------
+//
+CMceComAudioCodec* TMceComAudioCodecFactory::CreateCodecLC( TUint aPayload )
+    {
+    CMceComAudioCodec* codec = NULL;
+    
+    switch( aPayload )
+        {
+        case KMcePCMUPayloadType:
+            {
+            codec = CMceComG711Codec::NewLC( KMceSDPNamePCMU() );
+            break;
+            }
+        case KMcePCMAPayloadType:
+            {
+            codec = CMceComG711Codec::NewLC( KMceSDPNamePCMA() );
+            break;
+            }
+        case KMceDefaultG729PayloadType:
+            {
+            codec = CMceComG729Codec::NewLC( KMceSDPNameG729() );
+            break;
+            }
+        case KMceDefaultCnPayloadType:
+        case KMceDefaultCnPayloadType2:
+            {
+            codec = CMceComCnCodec::NewLC( KMceSDPNameCn() );
+            break;
+            }
+        default:
+            {
+            //NOP
+            break;
+            }
+        }
+    
+    if ( codec )
+        {
+        codec->iPayloadType = aPayload;
+        }
+        
+    return codec;
+    
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// TMceComAudioCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComAudioCodec* TMceComAudioCodecFactory::CreateLC( MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    TBuf8<KMceMaxSdpNameLength> sdpName;
+    MceSerial::DecodeL( sdpName, readStream );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    CMceComAudioCodec* codec = CreateLC( sdpName );
+    codec->InternalizeL( aSerCtx );
+    return codec;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceComVideoCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec* TMceComVideoCodecFactory::CreateLC( const TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComVideoCodec* codec = CreateCodecLC( aSdpName );
+    __ASSERT_ALWAYS( codec, User::Leave( KErrNotSupported ) );
+    
+    return codec;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceComVideoCodecFactory::CreateCodecLC
+// -----------------------------------------------------------------------------
+//
+
+CMceComVideoCodec* TMceComVideoCodecFactory::CreateCodecLC( const TBuf8<KMceMaxSdpNameLength> aSdpName )
+
+    {
+    CMceComVideoCodec* codec = NULL;
+    
+    if ( aSdpName.CompareF(KMceSDPNameH263) == 0 
+         || aSdpName.CompareF(KMceSDPNameH2632000) == 0
+         || aSdpName.CompareF(KMceSDPNameH2631998) == 0 )
+        {
+        codec = CMceComH263Codec::NewLC( aSdpName );
+        }
+    else if ( aSdpName.CompareF( KMceSDPNameH264 ) == 0 )
+        {
+        codec = CMceComAvcCodec::NewLC( aSdpName );
+        }
+    else
+        {
+        codec = NULL;
+        }
+    
+    return codec;    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceComVideoCodecFactory::CreateCodecLC 
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec* TMceComVideoCodecFactory::CreateCodecLC( TUint /*aPayload*/ )
+    {
+    CMceComVideoCodec* codec = NULL;
+    return codec;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceComVideoCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec* TMceComVideoCodecFactory::CreateLC( MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    TBuf8<KMceMaxSdpNameLength> sdpName;
+    MceSerial::DecodeL( sdpName, readStream );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    CMceComVideoCodec* codec = CreateLC( sdpName );
+    codec->InternalizeL( aSerCtx );
+    return codec;
+    
+    }