multimediacommsengine/mmcecli/src/mcefactory.cpp
changeset 0 1bce908db942
child 49 64c62431ac08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mcefactory.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,600 @@
+/*
+* Copyright (c) 2008 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 "mceinsession.h"
+#include "mceoutsession.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 "mceamrcodec.h"
+#include "mceamrwbcodec.h"
+#include "mceg711codec.h"
+#include "mceg729codec.h"
+#include "mceilbccodec.h"
+#include "mcedtmfcodec.h"
+#include "mcecncodec.h"
+#include "mceredcodec.h"
+#include "mceh263codec.h"
+#include "mcefactory.h"
+#include "mceserial.h"
+#include "mcedefs.h"
+#include "mcevideocodec.h"
+#include "mcestreambundle.h"
+#include "mceavsink.h"
+#include "mceavccodec.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// TMceFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceSession* TMceFactory::CreateLC( CMceComSession::TType aType )
+	{
+    CMceSession* session = NULL;
+    switch ( aType )
+        {
+        case CMceComSession::EInSession:
+            {
+            session = CMceInSession::NewL();
+            CleanupStack::PushL( session );
+            break;
+            }
+        case CMceComSession::EOutSession:
+            {
+            session = CMceOutSession::NewL();
+            CleanupStack::PushL( session );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( !session )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return session;    
+	}
+
+// -----------------------------------------------------------------------------
+// TMceFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceSession* TMceFactory::CreateLC( MMceComSerializationContext& aSerCtx )
+    {
+    RReadStream& readStream = aSerCtx.ReadStream();
+    
+    MStreamBuf* streamBuf = readStream.Source();
+    TStreamPos pos = streamBuf->TellL( MStreamBuf::ERead );
+    CMceComSession::TType type =
+    	static_cast<CMceComSession::TType>( readStream.ReadUint8L() );
+    streamBuf->SeekL( MStreamBuf::ERead, pos );
+    
+    CMceSession* session = CreateLC( type );
+    session->InternalizeL( aSerCtx );
+    return session;    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceMsgBase* TMceFactory::CreateL( TMceItcDataType aType,
+                                   RReadStream& aReadStream )
+    {
+    MMceComSerializationContext serCtx( aReadStream );
+    CleanupClosePushL( serCtx );
+    
+    CMceMsgBase* object = CreateL( aType, serCtx );
+    
+    CleanupStack::PopAndDestroy();//serCtx
+    
+    return object;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceMsgBase* TMceFactory::CreateL( TMceItcDataType aType,
+                                   MMceComSerializationContext& aSerCtx )
+    {
+    
+    CMceMsgBase* message = NULL;
+    switch ( aType )
+        {
+        case EMceItcMsgTypeSession:
+            {
+            message = new (ELeave) CMceMsgObject<CMceSession>();
+        	break;
+            }
+        case EMceItcMsgTypeStream:
+            {
+            message = new (ELeave) CMceMsgObject<CMceMediaStream>();
+        	break;
+            }
+        case EMceItcMsgTypeCodec:
+            {
+            message = new (ELeave) CMceMsgObject<CMceAudioCodec>();
+        	break;
+            }
+        case EMceItcMsgTypeSink:
+            {
+            message = new (ELeave) CMceMsgObject<CMceMediaSink>();
+        	break;
+            }
+        case EMceItcMsgTypeSource:
+            {
+            message = new (ELeave) CMceMsgObject<CMceMediaSource>();
+        	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<TMceFactory>( *this );
+        	break;
+            }
+	    default:
+	        {
+	        }
+        }
+        
+    if ( message )
+        {
+    	CleanupStack::PushL( message );
+    	message->PushL();
+        message->DoDecodeL( aSerCtx );
+        message->Pop();
+        CleanupStack::Pop( message );
+        }
+
+    return message;
+            
+    }
+
+// -----------------------------------------------------------------------------
+// TMceFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceStreamBundle* TMceFactory::CreateBundleLC( CMceSession& 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 );
+    
+    CMceStreamBundle* bundle = CMceStreamBundle::NewLC( type );
+    bundle->InitializeL( aSession );
+    bundle->InternalizeL( aSerCtx );
+    
+    return bundle;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceMediaStreamFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceMediaStream* TMceMediaStreamFactory::CreateLC( TMceMediaType aType )
+	{
+	
+    CMceMediaStream* stream = NULL;
+    switch ( aType )
+        {
+        case KMceAudio:
+            {
+            stream = CMceAudioStream::NewLC();
+            break;
+            }
+        case KMceVideo:
+            {
+            stream = CMceVideoStream::NewLC();
+            break;
+            }            
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( !stream )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return stream;
+    
+	}
+	
+
+// -----------------------------------------------------------------------------
+// TMceMediaStreamFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceMediaStream* TMceMediaStreamFactory::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 );
+    
+    CMceMediaStream* stream = CreateLC( type );
+    stream->InternalizeL( aSerCtx );
+    return stream;
+    
+    }
+
+
+
+	
+// -----------------------------------------------------------------------------
+// TMceSourceFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceMediaSource* TMceSourceFactory::CreateLC( TMceSourceType aType )
+    {
+    CMceMediaSource* source = NULL;
+
+    switch ( aType )
+        {
+        case KMceRTPSource:
+            {
+            source = CMceRtpSource::NewLC();
+            break;
+            }
+        case KMceMicSource:
+            {
+            source = CMceMicSource::NewLC();
+            break;
+            }
+        case KMceCameraSource:
+            {
+            source = CMceCameraSource::NewLC();
+            break;
+            }
+        case KMceFileSource:
+            {
+            source = CMceFileSource::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( !source )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return source;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceSourceFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceMediaSource* TMceSourceFactory::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 );
+
+    CMceMediaSource* source = CreateLC( type );
+    source->InternalizeL( aSerCtx );
+    return source;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceSinkFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceMediaSink* TMceSinkFactory::CreateLC( TMceSinkType aType )
+    {
+    CMceMediaSink* sink = NULL;
+    switch ( aType )
+        {
+        case KMceRTPSink:
+            {
+            sink = CMceRtpSink::NewLC();
+            break;
+            }
+        case KMceSpeakerSink:
+            {
+            sink = CMceSpeakerSink::NewLC();
+            break;
+            }
+        case KMceDisplaySink:
+            {
+            sink = CMceDisplaySink::NewLC();
+            break;
+            }
+        case KMceFileSink:
+            {
+            sink = CMceFileSink::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( !sink )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return sink;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// TMceSinkFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceMediaSink* TMceSinkFactory::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 );
+    
+    CMceMediaSink* sink = CreateLC( type );
+    sink->InternalizeL( aSerCtx );
+    return sink;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// TMceSinkFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+void TMceSinkFactory::CreateLC( MMceComSerializable*& aSink, 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 );
+    
+    switch ( type )
+        {
+        case KMceAvSink:
+            {
+            aSink = CMceAvSink::NewLC();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    
+    if ( !aSink )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    aSink->InternalizeL( aSerCtx );
+    
+    }
+
+    
+
+// -----------------------------------------------------------------------------
+// TMceAudioCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceAudioCodec* TMceAudioCodecFactory::CreateLC( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceAudioCodec* codec = CreateL( aSdpName );
+    CleanupStack::PushL( codec );
+	return codec;     
+    }
+    
+// -----------------------------------------------------------------------------
+// TMceAudioCodecFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceAudioCodec* TMceAudioCodecFactory::CreateL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceAudioCodec* codec = NULL;
+    if( !aSdpName.CompareF( KMceSDPNameAMR ) )
+        {
+        codec = CMceAmrCodec::NewL( aSdpName );
+        }
+    else if ( !aSdpName.CompareF( KMceSDPNameAMRWB ) )
+    	{
+		codec = CMceAmrWbCodec::NewL( aSdpName );
+    	}
+    else if ( !aSdpName.CompareF( KMceSDPNamePCMU ) ||
+              !aSdpName.CompareF( KMceSDPNamePCMA ) )
+        {
+        codec = CMceG711Codec::NewL( aSdpName );
+        }
+    else if ( !aSdpName.CompareF( KMceSDPNameG729 ) )        
+        {
+        codec = CMceG729Codec::NewL( aSdpName );   
+        }     
+    else if ( !aSdpName.CompareF( KMceSDPNameiLBC ) )        
+        {
+        codec = CMceiLBCCodec::NewL( aSdpName );
+        }
+    else if ( !aSdpName.CompareF( KMceSDPNameDtmf ) )
+        {
+        codec = CMceDtmfCodec::NewL( aSdpName );
+        }
+    else if ( !aSdpName.CompareF( KMceSDPNameCn ) )
+        {
+        codec = CMceCnCodec::NewL( aSdpName );
+        }
+    else if ( !aSdpName.CompareF( KMceSDPNameRed ) )
+        {
+        codec = CMceRedCodec::NewL( aSdpName );
+        }
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+	return codec;
+    }
+
+// -----------------------------------------------------------------------------
+// TMceAudioCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceAudioCodec* TMceAudioCodecFactory::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 );
+    
+    CMceAudioCodec* codec = CreateL( sdpName );
+    CleanupStack::PushL( codec );
+    codec->InternalizeL( aSerCtx );
+    return codec;    
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMceVideoCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceVideoCodec* TMceVideoCodecFactory::CreateLC( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceVideoCodec* codec = CreateL( aSdpName );
+    CleanupStack::PushL( codec );
+    return codec;       
+    }
+    
+// -----------------------------------------------------------------------------
+// TMceVideoCodecFactory::CreateL
+// -----------------------------------------------------------------------------
+//
+CMceVideoCodec* TMceVideoCodecFactory::CreateL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceVideoCodec* codec = NULL;
+    
+    if( aSdpName.CompareF(KMceSDPNameH263) == 0 || 
+        aSdpName.CompareF(KMceSDPNameH2632000) == 0 ||
+        aSdpName.CompareF(KMceSDPNameH2631998) == 0)
+        {
+        codec = CMceH263Codec::NewL( aSdpName );
+        }
+    else if ( aSdpName.CompareF(KMceSDPNameH264) == 0 )
+        {
+        codec = CMceAvcCodec::NewL( aSdpName );
+        }
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+	return codec;
+	        
+    }
+
+// -----------------------------------------------------------------------------
+// TMceVideoCodecFactory::CreateLC
+// -----------------------------------------------------------------------------
+//
+CMceVideoCodec* TMceVideoCodecFactory::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 );
+    
+    CMceVideoCodec* codec = CreateL( sdpName );
+    CleanupStack::PushL( codec );
+    codec->InternalizeL( aSerCtx );
+    return codec;    
+    }
+