multimediacommsengine/mmcesrv/mmceserver/src/mcecssessionimplementation.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcecssessionimplementation.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,768 @@
+/*
+* 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 <badesca.h>
+#include <pathinfo.h>
+
+#include "mcecssessionimplementation.h"
+#include "mcecssession.h"
+#include "mcecssessionreceiver.h"
+#include "mcecomaudiocodec.h"
+#include "mcecomvideocodec.h"
+#include "mcecssubsession.h"
+#include "mcesipmanager.h"
+#include "mcemediamanager.h"
+#include "mcesipdefaults.h"
+#include "mcesrvlogs.h"
+#include "mceserial.h"
+#include "mcecommediasink.h"
+#include "mcefilesource.h"
+#include "mcecomcamerasource.h"
+
+
+ 
+#define MCE_WRITE( aType, aData )\
+    aType writeBuf( aData );\
+    aInfo.Copy( writeBuf );
+    
+    
+#define MCE_READ( aCastType, aType, aData )\
+    aCastType readBuf;\
+    readBuf.Copy( aInfo );\
+    aType aData = readBuf();
+
+
+_LIT(KMceApplPrivatePath, "%3Sprivate\\%x\\");
+_LIT(KMceRootPath, "%3S");
+ 
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::NewL
+// -----------------------------------------------------------------------------
+//
+CMceCsSessionImplementation* CMceCsSessionImplementation::NewL(
+                                                CMceSipManager& aManager,
+                                                CMceCsSession* aITCProvider )
+	{
+    CMceCsSessionImplementation* self = 
+       CMceCsSessionImplementation::NewLC( aManager, aITCProvider );
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceCsSessionImplementation* CMceCsSessionImplementation::NewLC(
+                                               CMceSipManager& aManager,
+                                               CMceCsSession* aITCProvider )
+	{
+    CMceCsSessionImplementation* self = 
+            new (ELeave) CMceCsSessionImplementation( aManager, *aITCProvider );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::CMceCsSessionImplementation
+// -----------------------------------------------------------------------------
+//
+CMceCsSessionImplementation::CMceCsSessionImplementation(
+                                                CMceSipManager& aManager,
+                                                CMceCsSession& aITCProvider )
+: iManager( aManager ),
+  iITCProvider( &aITCProvider )
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::ConstructL ()
+	{
+    MCESRV_DEBUG("CMceCsSessionImplementation::ConstructL, Entry");
+    iDefaults = CMceSipDefaults::NewL();
+    MCESRV_DEBUG("CMceCsSessionImplementation::ConstructL, Exit");
+	}
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::~CMceCsSessionImplementation
+// -----------------------------------------------------------------------------
+//
+CMceCsSessionImplementation::~CMceCsSessionImplementation()
+	{
+	delete iDefaults;
+    iSubSessions.ResetAndDestroy();
+    iSubSessions.Close();
+	}
+
+    
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::ServerCore
+// -----------------------------------------------------------------------------
+//
+RPointerArray<CMceCsSubSession>& CMceCsSessionImplementation::SubSessions()
+    {
+    return iSubSessions;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::SupportedAudioCodecsL
+// -----------------------------------------------------------------------------
+//
+HBufC8* CMceCsSessionImplementation::SupportedAudioCodecsL()
+	{
+	
+    MCESRV_DEBUG("CMceCsSessionImplementation::SupportedAudioCodecsL, Entry");
+    CDesC8ArrayFlat* codecs = NULL;
+    HBufC8* codecsAsString = NULL;
+    
+	RPointerArray<CMceComAudioCodec> supportedCodecs;
+	CleanupStack::PushL( TCleanupItem( ArrayCleanup, &supportedCodecs ) );
+		
+	iManager.MediaManager().GetCapabilitiesL( supportedCodecs );
+
+    codecs = new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity );
+    CleanupStack::PushL( codecs );
+    
+	for ( int i=0;i<supportedCodecs.Count();i++ )
+		{
+		CMceComAudioCodec* codec = supportedCodecs[i];
+		
+		CMceMsgObject<CMceComAudioCodec>* codecMsg = 
+                    new (ELeave) CMceMsgObject<CMceComAudioCodec>
+                    ( *codec, EMceItcMsgTypeCodec );
+		CleanupStack::PushL( codecMsg );
+
+		codecMsg->EncodeL();
+		codecs->AppendL( codecMsg->EncodeBuffer().Ptr(0) );
+		CleanupStack::PopAndDestroy( codecMsg );
+		}
+    CMceMsgTextArray* msgCodecs = new (ELeave) CMceMsgTextArray( *codecs );
+    CleanupStack::PushL( msgCodecs );
+    msgCodecs->EncodeL();
+    
+    codecsAsString = msgCodecs->EncodeBufferCloneL();
+    
+    CleanupStack::PopAndDestroy( msgCodecs );
+    CleanupStack::PopAndDestroy( codecs );
+	CleanupStack::PopAndDestroy( &supportedCodecs ); //TCleanupItem
+    	
+    MCESRV_DEBUG("CMceCsSessionImplementation::SupportedAudioCodecsL, Exit");
+	
+	return codecsAsString;
+        	
+	}
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::SupportedVideoCodecsL
+// -----------------------------------------------------------------------------
+//
+HBufC8* CMceCsSessionImplementation::SupportedVideoCodecsL()
+	{
+	
+    MCESRV_DEBUG("CMceCsSessionImplementation::SupportedVideoCodecsL, Entry");
+    CDesC8ArrayFlat* codecs = NULL;
+    HBufC8* codecsAsString = NULL;
+    
+	RPointerArray<CMceComVideoCodec> supportedCodecs;
+	CleanupStack::PushL( TCleanupItem( ArrayCleanup, &supportedCodecs ) );
+		
+	iManager.MediaManager().GetCapabilitiesL( supportedCodecs );
+
+    codecs = new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity );
+    CleanupStack::PushL( codecs );
+    
+	for ( int i=0;i<supportedCodecs.Count();i++ )
+		{
+		CMceComVideoCodec* codec = supportedCodecs[i];
+		
+		CMceMsgObject<CMceComVideoCodec>* codecMsg = 
+                    new (ELeave) CMceMsgObject<CMceComVideoCodec>
+                    ( *codec, EMceItcMsgTypeCodec );
+		CleanupStack::PushL( codecMsg );
+
+		codecMsg->EncodeL();
+		codecs->AppendL( codecMsg->EncodeBuffer().Ptr(0) );
+		CleanupStack::PopAndDestroy( codecMsg );
+		}
+    CMceMsgTextArray* msgCodecs = new (ELeave) CMceMsgTextArray( *codecs );
+    CleanupStack::PushL( msgCodecs );
+    msgCodecs->EncodeL();
+    
+    codecsAsString = msgCodecs->EncodeBufferCloneL();
+    
+    CleanupStack::PopAndDestroy( msgCodecs );
+    CleanupStack::PopAndDestroy( codecs );
+	CleanupStack::PopAndDestroy( &supportedCodecs ); //TCleanupItem
+    	
+    MCESRV_DEBUG("CMceCsSessionImplementation::SupportedVideoCodecsL, Exit");
+	
+	return codecsAsString;
+        	
+	}
+
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSession::DoServiceL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::DoServiceL( TMceIds& aIds, TInt aFunction, TPtr8& aInfo )
+    {
+
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL( read ), Entry");
+
+    switch( aFunction )
+        {
+        case EMceItcCameraInfo:
+            {
+    		MCESRV_DEBUG("getting camera info");
+            MCE_READ( TMceItcArgTCameraInfo, TMceCameraInfo, cameraInfo );
+            iManager.MediaManager().GetCameraInfoL( cameraInfo.iIndex,
+                                                    cameraInfo.iInfo );
+            MCE_WRITE( TMceItcArgTCameraInfo, cameraInfo ); 
+            break;
+            }
+        case EMceItcCamerasAvailable:
+            {
+            TInt camerasAvailable = KErrNotFound;
+            iManager.MediaManager().GetCamerasAvailableL( camerasAvailable );
+    		MCESRV_DEBUG_DVALUE("getting available cameras. #", camerasAvailable );
+            MCE_WRITE( TMceItcArgTInt, camerasAvailable ); 
+            break;
+            }
+        case EMceItcDisplaysAvailable:
+            {
+            TInt displaysAvailable = KErrNotFound;
+            iManager.MediaManager().GetDisplaysAvailableL( displaysAvailable );
+    		MCESRV_DEBUG_DVALUE("getting displays available. value", displaysAvailable );
+            MCE_WRITE( TMceItcArgTInt, displaysAvailable ); 
+            break;
+            }
+        case EMceItcFileInfo:
+            {
+    		MCESRV_DEBUG("getting file info");
+            TMceItcArgTFileInfo readBuf;
+            readBuf.Copy( aInfo );
+            TMceFileInfo& fileInfo = readBuf();
+            GetFileInfoL( aIds, fileInfo );
+            MCE_WRITE( TMceItcArgTFileInfo, fileInfo ); 
+            break;
+            }
+        case EMceItcMaxVolume:
+            {
+            TInt maxVolume = KErrNotFound;
+            iManager.MediaManager().GetMaxVolumeL( maxVolume );
+    		MCESRV_DEBUG_DVALUE("getting max volume. value", maxVolume );
+            MCE_WRITE( TMceItcArgTInt, maxVolume );  
+            break;
+            }
+        case EMceItcMaxGain:
+            {
+            TInt maxGain = KErrNotFound;
+            iManager.MediaManager().GetMaxGainL( maxGain );
+    		MCESRV_DEBUG_DVALUE("getting max volume. value", maxGain );
+            MCE_WRITE( TMceItcArgTInt, maxGain );  
+            break;
+            }
+        default:
+            {
+        	#ifndef ALLOW_NOT_SUPPORTED_ITC
+        	User::Leave(KErrNotSupported);
+        	#endif
+            }
+        }
+    
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL( read ), Exit");
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::DoServiceL
+// -----------------------------------------------------------------------------
+//
+HBufC8* CMceCsSessionImplementation::DoServiceL( TMceIds& /*aIds*/, TInt /*aFunction*/ )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL(no data), Entry");
+    HBufC8* returnMessage = NULL;
+    #ifndef ALLOW_NOT_SUPPORTED_ITC
+    User::Leave(KErrNotSupported);
+    #endif
+    
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL(no data), Exit");
+    
+    return returnMessage;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::DoServiceL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::DoServiceL( TMceIds& /*aIds*/, TInt aFunction, const TDesC8& aInfo )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL( write ), Entry");
+    
+    switch( aFunction )
+        {
+        case EMceItcCancelTranscode:
+            {
+    		MCESRV_DEBUG("cancelling transcode");
+            MCE_READ( TMceItcArgTUint32, TUint32, sessionId );
+            iManager.MediaManager().CancelTranscodeFileL( sessionId );
+            break;
+            }
+        default:
+            {
+        	#ifndef ALLOW_NOT_SUPPORTED_ITC
+        	User::Leave(KErrNotSupported);
+        	#endif
+            }
+        }
+    
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL( write ), Exit");
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::DoServiceL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::DoServiceL( TMceIds& aIds, TInt aFunction, 
+                                              CMceMsgBase& aMessage )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL( message ), Entry");
+    switch( aFunction )
+        {
+        case EMceItcTranscode:
+            {
+    		MCESRV_DEBUG("transcoding");
+            CMceMsgObject<CMceComFileSource>* msg = 
+                static_cast<CMceMsgObject<CMceComFileSource>*>( &aMessage );
+            
+            CMceComFileSource* file = msg->Object();
+            CleanupStack::PushL( file );
+            file->iClient = this;
+            TUint32 sessionId = iManager.MediaManager().TranscodeFileL( file );
+            aIds.Set( KMceIdsIndexTCId, sessionId );
+            CleanupStack::Pop( file );
+            break;
+            }
+        case EMceItcTranscodeWithSession:
+            {
+           	MCESRV_DEBUG("transcoding with session");
+           	
+           	// Session structure is needed temporarily by mediamanager
+           	// in order to find out output codec types. 
+           	//
+            CMceMsgObject<CMceComSession>* msg = 
+                static_cast<CMceMsgObject<CMceComSession>*>( &aMessage );
+            
+            CMceComSession* session = msg->Object();
+            CleanupStack::PushL( session );
+            
+            CMceComFileSource* file = NULL;
+            for( TInt i = 0; session && ( i < session->Streams().Count() ) && !file; i++ )
+                {
+                if ( session->Streams()[ i ]->Source() &&
+                     session->Streams()[ i ]->Source()->Type() == KMceFileSource )
+                    {
+                    file = static_cast<CMceComFileSource*>( 
+                            session->Streams()[ i ]->Source() );
+                    file->iClient = this;
+                    }
+                }
+            __ASSERT_ALWAYS( file, User::Leave( KErrArgument ) );
+            TUint32 sessionId = iManager.MediaManager().TranscodeFileL( file );
+            aIds.Set( KMceIdsIndexTCId, sessionId );
+            
+            // Filesource was taken in use from session by mediamanager
+            // (took ownership) and rest can be discarded. File is not deleted
+            // while deleting session because of ref count increase.
+            //
+            file->ReferenceCount()++;
+            CleanupStack::PopAndDestroy( session );
+            break;
+            }
+        default:
+            {
+        	#ifndef ALLOW_NOT_SUPPORTED_ITC
+        	User::Leave(KErrNotSupported);
+        	#endif
+            }
+        }
+    
+    MCESRV_DEBUG("CMceCsSessionImplementation::DoServiceL( message ), Exit");
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::GetFileInfoL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::GetFileInfoL( TMceIds& aIds, 
+                                                TMceFileInfo& aFileInfo )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Entry");
+    
+    // Save some stack
+    {
+    const RMessage2* itcContext = MCE_IDS_ITC_CONTEXT( aIds );
+    const TDesC& fileName = aFileInfo.iFileName;
+	const TDesC& rootPath = PathInfo::PhoneMemoryRootPath(); 
+    TFileName privatePath;
+    TFileName realRootPath;
+
+    __ASSERT_ALWAYS( MCE_NOT_NULL_PTR( itcContext ) , User::Leave( KErrArgument ) );
+    	
+    
+    TUid clientUId = itcContext->SecureId();
+	privatePath.Format(KMceApplPrivatePath, &rootPath, clientUId.iUid );
+	realRootPath.Format(KMceRootPath, &rootPath );
+    
+    MCESRV_DEBUG_SVALUE16("CMceCsSessionImplementation::GetFileInfoL, file", fileName );
+    MCESRV_DEBUG_SVALUE16("CMceCsSessionImplementation::GetFileInfoL, root", rootPath );    
+    MCESRV_DEBUG_SVALUE16("CMceCsSessionImplementation::GetFileInfoL, private", privatePath );
+
+	if( itcContext->HasCapability( ECapabilityAllFiles ) )
+		{
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Client has AllFiles capability");
+	    aFileInfo.iAccessRights = TMceFileInfo::EReadWrite;		
+		}
+	else if( fileName.FindF( rootPath ) == 0 )
+		{
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Client accessing phone root(data)");
+	    aFileInfo.iAccessRights = TMceFileInfo::EReadWrite;		
+		}
+	else if( fileName.FindF( privatePath ) == 0 )
+		{
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Client accessing private path");
+	    aFileInfo.iAccessRights = TMceFileInfo::EReadWrite;		
+		}
+	else if( fileName.FindF( privatePath ) == 0 )
+		{
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Client accessing private path");
+	    aFileInfo.iAccessRights = TMceFileInfo::EReadWrite;		
+		}
+	else if( fileName.FindF( realRootPath ) == KErrNotFound )
+		{
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Client accessing another drive");
+	    aFileInfo.iAccessRights = TMceFileInfo::EReadWrite;		
+		}
+	else
+		{
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Permission denied");
+	    aFileInfo.iAccessRights = TMceFileInfo::EZero;				
+		}	
+    }
+    
+    if ( aFileInfo.iDirection >= TMceFileInfo::ERead && 
+    	 aFileInfo.iAccessRights > TMceFileInfo::EZero )
+        {
+    	MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Getting file info");
+        iManager.MediaManager().GetFileInfoL( aFileInfo );
+        }			
+
+    MCESRV_DEBUG("CMceCsSessionImplementation::GetFileInfoL, Exit");
+    }
+
+            
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::StoreClientContent
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::StoreClientContent( HBufC8* aClientContent )
+    {
+    delete aClientContent;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::EventReceived
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::EventReceived( TMceMccComEvent& aEvent )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::EventReceived, Entry");
+
+    TMceIds ids;
+    ids.iManagerType = KMceCSSIPSession;
+    ids.iCallbackID = aEvent.iItcEvent;
+	ids.iMediaID = aEvent.iStream ? aEvent.iStream->Id() : KMceMediaIdNotAssigned;
+	ids.iSinkID = aEvent.iSink ? aEvent.iSink->Id() : KMceMediaIdNotAssigned;
+	ids.iSourceID = aEvent.iSource ? aEvent.iSource->Id() : KMceMediaIdNotAssigned;
+	ids.iState = aEvent.iItcData;
+	ids.iStatus = aEvent.iError;
+
+    TRAP_IGNORE( SendToClientL( ids, NULL, NULL ) );
+        
+    MCESRV_DEBUG("CMceCsSessionImplementation::EventReceived, Exit");
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::ArrayCleanup
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::ArrayCleanup(TAny* aArray)
+	{
+    RPointerArray<CMceComAudioCodec>* array = 
+        reinterpret_cast<RPointerArray<CMceComAudioCodec>*>(aArray);
+    if (array)
+        {
+        array->ResetAndDestroy();
+        }
+	}
+
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::SubSessionL
+// -----------------------------------------------------------------------------
+//
+CMceCsSubSession* CMceCsSessionImplementation::SubSessionL( TUint32 aSessionId )
+    {
+	CMceCsSubSession* subSession = 
+	    reinterpret_cast<CMceCsSubSession*>( aSessionId );
+    User::LeaveIfError( iSubSessions.Find( subSession ) );
+    return subSession;
+	
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::FindSubSession
+// -----------------------------------------------------------------------------
+//
+const CMceCsSubSession* 
+    CMceCsSessionImplementation::FindSubSession( TUint32 aDialogId )
+    {
+    CMceCsSubSession* subSession = NULL;
+    TInt i = 0;
+    
+    while ( !subSession && i < iSubSessions.Count() )
+        {
+        subSession = iSubSessions[i++];
+        if ( subSession->DialogId() != aDialogId )
+            {
+            subSession = NULL;
+            }
+        }
+    return subSession;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::CreateSubSessionL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::CreateSubSessionL( TMceIds& aIds,
+                                                     CDesC8Array& aParams )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::CreateSubSessionL, Entry");
+	User::LeaveIfNull( iITCProvider );
+        
+    CMceCsSubSession *subSession = 
+        iManager.CreateSubSessionL( ClientSession(), aIds, aParams );
+        
+    CleanupStack::PushL( subSession );
+    iSubSessions.AppendL(subSession);
+    CleanupStack::Pop(subSession);
+    
+    aIds.iSessionID = MCE_SESSION_ID( subSession );
+    aIds.iDialogID = subSession->DialogId();
+    
+    MCESRV_DEBUG("CMceCsSessionImplementation::CreateSubSessionL, Exit");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::RemoveSubSessionL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::RemoveSubSessionL( TUint32 aSessionId )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::RemoveSubSessionL, Entry");
+    MCESRV_DEBUG_DVALUE("id", aSessionId );
+    
+    
+	CMceCsSubSession* subSession = SubSessionL( aSessionId );
+    TInt index = iSubSessions.Find( subSession );
+    iSubSessions.Remove( index );
+    
+    if ( !subSession->CanDispose() && 
+         !subSession->Terminate() )
+        {
+        MCESRV_DEBUG("RemoveSubSessionL: could not terminate -> to orphans");
+        CleanupStack::PushL( subSession );
+        iManager.AddOrphanSubSessionL( subSession );
+        CleanupStack::Pop( subSession );
+        }
+    else
+        {
+        delete subSession;
+        }
+
+    MCESRV_DEBUG("CMceCsSessionImplementation::RemoveSubSessionL, Exit");
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::RemoveAllSubSessions
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::RemoveAllSubSessions( TBool aMakeOrphan )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::RemoveAllSubSessions, Entry");
+    
+    while( iSubSessions.Count() > 0 )
+        {
+        TBool deleteSS = ETrue;
+        
+    	CMceCsSubSession* subSession = iSubSessions[ 0 ];
+        iSubSessions.Remove( 0 );
+    
+        if ( !subSession->CanDispose() && 
+             !subSession->Terminate() )
+            {
+            if ( aMakeOrphan )
+                {
+                TRAPD( error, iManager.AddOrphanSubSessionL( subSession ) );
+                deleteSS = error == KErrNone ? EFalse : ETrue;
+                }
+            }
+            
+        if ( deleteSS )
+            {
+            delete subSession;
+            }
+        }
+    MCESRV_DEBUG("CMceCsSessionImplementation::RemoveAllSubSessions, Exit");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::SendToClientL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::SendToClientL( TMceIds& aIds, 
+                                                 HBufC8* aContext, 
+                                                 HBufC8* aContent )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::SendToClientL, Entry");
+    
+    if ( !IsOrphan() )
+        {
+        CMceCsSessionReceiver* receiver = ClientSession().ReceiverL( aIds );
+        TMceIds ids = receiver->Ids();
+        ids.Copy( aIds );
+
+        MCESRV_DEBUG_IDS("IDS", ids );
+                        
+        if ( aContent )
+            {
+            receiver->SendToClientL( ids, aContext, aContent );
+            }
+        else if( aContext )
+            {
+            receiver->SendToClientL( ids, aContext );
+            }
+        else
+            {
+            receiver->SendToClientL( ids );
+            }
+        }
+    else
+        {
+        MCESRV_DEBUG("SendToClientL: orphan -> no recipient to send");
+        delete aContext;
+        delete aContent;
+        }
+        
+    MCESRV_DEBUG("CMceCsSessionImplementation::SendToClientL, Exit");
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::IsOrphan
+// -----------------------------------------------------------------------------
+//
+TBool CMceCsSessionImplementation::IsOrphan()
+    {
+    return MCE_IS_NULL_PTR( iITCProvider );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::ClientSession
+// -----------------------------------------------------------------------------
+//
+CMceCsSession& CMceCsSessionImplementation::ClientSession()
+    {
+    return *iITCProvider;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::StoreDefaultHeadersL
+// -----------------------------------------------------------------------------
+//
+void CMceCsSessionImplementation::StoreDefaultHeadersL( CDesC8Array& aMethods, 
+                                                        CDesC8Array* aHeaders )
+    {
+    iDefaults->StoreDefaultHeadersL( aMethods, aHeaders );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::DefaultHeaders
+// -----------------------------------------------------------------------------
+//
+CDesC8Array& CMceCsSessionImplementation::DefaultHeaders( TInt aMethodInd )
+    {
+    return iDefaults->DefaultHeaders( aMethodInd );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceCsSessionImplementation::DefaultHeaders
+// -----------------------------------------------------------------------------
+//	
+HBufC8* CMceCsSessionImplementation::DefaultHeadersL( TDesC8& aMethod )
+    {
+    MCESRV_DEBUG("CMceCsSessionImplementation::DefaultHeadersL, Entry");
+	
+	CDesC8Array& headers = iDefaults->DefaultHeaders( aMethod );
+    
+	CMceMsgTextArray* headersMsg = new (ELeave) CMceMsgTextArray( headers );
+    CleanupStack::PushL( headersMsg );
+    headersMsg->EncodeL();
+    
+    HBufC8* headersStr = headersMsg->EncodeBufferCloneL();
+    
+    CleanupStack::PopAndDestroy( headersMsg );
+    
+    MCESRV_DEBUG("CMceCsSessionImplementation::DefaultHeadersL, Exit");
+	
+	return headersStr;
+    
+	
+    }
+
+//  End of File