mmsharing/livecommsui/lcui/tsrc/mustester/Stubs/mceclientstub/src/mcesession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:12:07 +0300
branchRCL_3
changeset 22 73a1feb507fb
permissions -rw-r--r--
Revision: 201032 Kit: 201035

/*
* 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 "mcesession.h"
//#include "mceinsession.h"
#include "mcemanager.h"
#include "mcestreambundle.h"
#include "mcemediastream.h"
#include "mceinsessionobserver.h"
#include "mcesessionobserver.h"
#include "mcestreamobserver.h"
#include "mcertpobserver.h"
#include "mcetransactiondatacontainer.h"
#include "mussessionsimulator.h"


// ============================ MEMBER FUNCTIONS ===============================


// -----------------------------------------------------------------------------
// CMceSession::~CMceSession
// -----------------------------------------------------------------------------
//
EXPORT_C CMceSession::~CMceSession()
    {
    delete iHeaders;
    delete iSessionSDPLines;
    
    delete iOriginator;
    delete iRecipient;
    iMediaStreams.ResetAndDestroy();
    iBundles.ResetAndDestroy();
    
    }


// -----------------------------------------------------------------------------
// CMceSession::State
// -----------------------------------------------------------------------------
//
EXPORT_C CMceSession::TState CMceSession::State() const
    {
    return iState;
    }


// -----------------------------------------------------------------------------
// CMceSession::ConnectionActive
// -----------------------------------------------------------------------------
//
EXPORT_C TBool CMceSession::ConnectionActive() const
    {
    return iIsConnectionActive;
    }


// -----------------------------------------------------------------------------
// CMceSession::RemoveStreamL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::RemoveStreamL( CMceMediaStream& aMediaStream )
    {
    for ( TInt i = 0; i < iMediaStreams.Count(); ++i )
        {
        if ( &aMediaStream == iMediaStreams[i] )
            {
            delete iMediaStreams[i];
            iMediaStreams.Remove( i );
            return;
            }
        }
    
    User::Leave( KErrNotFound );
    }
    

// -----------------------------------------------------------------------------
// CMceSession::AddStreamL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::AddStreamL( CMceMediaStream* aMediaStream )
    {
    User::LeaveIfError( iMediaStreams.Find( aMediaStream ) != KErrNotFound ? 
                                            KErrArgument : KErrNone );
    
    aMediaStream->InitializeL( *this ); // Initialize before taking ownership
    
    iMediaStreams.AppendL( aMediaStream );
    
    }


// -----------------------------------------------------------------------------
// CMceSession::UpdateL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::UpdateL(
             TUint32 aTimeout,
             CDesC8Array* aHeaders, 
             HBufC8* aContentType,
             HBufC8* aContent,
             CDesC8Array* aContentHeaders ) 
    {
    User::LeaveIfError( iState != EIdle ? KErrNone : KErrNotReady );
    User::LeaveIfError( 
        ( aContentType && aContent ) || 
       !( aContentType || aContent || aContentHeaders ) ? 
        KErrNone : KErrArgument );
    
    // Leave if in incoming state givem too small timeout value
    User::LeaveIfError( !( aTimeout > 0 && State() == CMceSession::EIncoming ) ||
        aTimeout <= SessionTimer() ? KErrNone : KErrArgument );
    
    InitializeL(); 
    
    iTimeout = aTimeout;
    
    delete iHeaders; 
    iHeaders = aHeaders;
    delete aContentType;
    delete aContentHeaders;
    
    if ( iState == EIncoming )
        {
        iState = EReserving;
        RestartSimulator();
        }
    else
        {
        iState = EOffering;
        }
    }

// -----------------------------------------------------------------------------
// CMceSession::InitializeL
// -----------------------------------------------------------------------------
//
/*
void CMceSession::InitializeL()
    {
    for(int i=0; i<iMediaStreams.Count();i++)
        {
        iMediaStreams[i]->InitializeL( *this );
        }
    }
  */  


// -----------------------------------------------------------------------------
// CMceSession::TerminateL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::TerminateL( CDesC8Array* aHeaders,
					                   HBufC8* aContentType,
					                   HBufC8* aContent ) 
    {
    __ASSERT_ALWAYS( iState != CMceSession::EIdle, User::Leave( KErrNotReady ) );
    
    delete iHeaders;
    iHeaders = aHeaders;
    delete aContentType;
    delete aContent;
    
   	iState = CMceSession::ETerminating;
   	RestartSimulator();
   
   	
    }


// -----------------------------------------------------------------------------
// CMceSession::Streams
// -----------------------------------------------------------------------------
//
EXPORT_C const RPointerArray<CMceMediaStream>& CMceSession::Streams() const
    {
    return iMediaStreams;
    }


// -----------------------------------------------------------------------------
// CMceSession::Recipient
// -----------------------------------------------------------------------------
//
EXPORT_C const TDesC8& CMceSession::Recipient() const
    {
    return *iRecipient;
    }

// -----------------------------------------------------------------------------
// CMceSession::Originator
// -----------------------------------------------------------------------------
//
EXPORT_C const TDesC8& CMceSession::Originator() const
    {
    return *iOriginator;
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::SetSessionSDPLinesL( CDesC8Array* aSessionSDPLines )
    {
    delete iSessionSDPLines;
    iSessionSDPLines = aSessionSDPLines;
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
EXPORT_C MDesC8Array* CMceSession::SessionSDPLinesL()
    {
    if ( iSessionSDPLines )
        {
        CDesC8Array* array = new ( ELeave ) CDesC8ArrayFlat( 1 );
        CleanupStack::PushL( array );
        for ( TInt i = 0; i < iSessionSDPLines->Count(); ++i )
            {
            array->AppendL( iSessionSDPLines->MdcaPoint(i) );
            }
        CleanupStack::Pop( array );
        return array;
        }
        
    return NULL;
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
EXPORT_C TUint32 CMceSession::SessionTimer() const
    {
    return iTimeout;
    }

// -----------------------------------------------------------------------------
// CMceSession::AddBundleL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::AddBundleL( CMceStreamBundle* aBundle )
    {
    iBundles.AppendL( aBundle );
    }

// -----------------------------------------------------------------------------
// CMceSession::RemoveBundleL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::RemoveBundleL( CMceStreamBundle& aBundle )
    {
    TInt index = iBundles.Find( &aBundle );
    User::LeaveIfError( index );
    iBundles.Remove( index );
    }

// -----------------------------------------------------------------------------
// CMceSession::Bundles
// -----------------------------------------------------------------------------
//
EXPORT_C const RPointerArray< CMceStreamBundle >& CMceSession::Bundles() const
    {
    return iBundles;
    }

// -----------------------------------------------------------------------------
// CMceSession::GetModifierL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::GetModifierL( TMceSessionModifier aModifier,
                                         TUint& aValue ) const
    {
    if ( aModifier == KMcePreconditions )
        {
        if ( iForceInternetSignaling )
            {
            aValue = KMcePreconditionsNotUsed;
            }
        else
            {
            aValue = KMcePreconditionsSupported;
            }
        return;
        }
    User::Leave( KErrNotFound );
    }
    
// -----------------------------------------------------------------------------
// CMceSession::SetModifierL
// -----------------------------------------------------------------------------
//
EXPORT_C void CMceSession::SetModifierL( TMceSessionModifier aModifier, 
                                         TUint aValue )        
    {
    if ( aModifier == KMcePreconditions )
        {
        if ( aValue == KMcePreconditionsNotUsed )
            {
            iForceInternetSignaling = ETrue;
            }
        else
            {
            iForceInternetSignaling = EFalse;
            }
        return;
        }
    else if ( aModifier == KMce100Rel )
        {
        if ( aValue >= 0 && aValue <= 2 )
            {
            i100RelUsage = aValue;
            return;
            }
        }
    User::LeaveIfError( KErrNotSupported );
    }

// -----------------------------------------------------------------------------
// CMceSession::Profile
// -----------------------------------------------------------------------------
//
EXPORT_C TUint32 CMceSession::Profile() const
    {
    return iProfileId;
    }

// -----------------------------------------------------------------------------
// CMceSession::CMceSession
// -----------------------------------------------------------------------------
//
CMceSession::CMceSession( CMceManager* aManager, TUint32 aProfileId )
 : iProfileId( aProfileId ),
   iManager( aManager ),
   iState( CMceSession::EIdle),
   iIsConnectionActive( ETrue ),
   iForceInternetSignaling( EFalse ),
   i100RelUsage( 1 ), // MCE default
   iFailWithCode( KErrNone ),
   iReasonPhrase( KNullDesC8() ),
   iReasonCode( 0 )
    {
    }


// -----------------------------------------------------------------------------
// CMceSession::Manager
// -----------------------------------------------------------------------------
//
CMceManager& CMceSession::Manager() const
    {
    return *iManager;
    }
    

// -----------------------------------------------------------------------------
// CMceSession::ConstructL
// -----------------------------------------------------------------------------
//
void CMceSession::ConstructL()
    {
    
    }

// -----------------------------------------------------------------------------
// CMceSession::InitializeL
// -----------------------------------------------------------------------------
//
void CMceSession::InitializeL()
    {
    for (int i=0; i<iMediaStreams.Count();i++)
        {
        iMediaStreams[i]->InitializeL( *this );
        }
    
    /*    
    for(int i=0; i<iBundles.Count();i++)
        {
        iBundles[i]->InitializeL( *this );
        }
    */
    }
    

// -----------------------------------------------------------------------------
// CMceSession::RestartSimulator
// -----------------------------------------------------------------------------
//
void CMceSession::RestartSimulator()
    {
    if( iManager->iSessionSimulator->IsRunning())
        {
        iManager->iSessionSimulator->Stop();
        }
    iManager->iSessionSimulator->StartL();    
    }