multimediacommscontroller/mmcccontroller/src/mccresourcecontainer.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmcccontroller/src/mccresourcecontainer.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,354 @@
+/*
+* Copyright (c) 2006 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 FILES
+#include "mccresourcecontainer.h"
+#include "mccresourceitem.h"
+#include "mcccontrollerlogs.h"
+#include "mccinternaldef.h"
+#include "mccresourceiterators.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::NewLC
+// -----------------------------------------------------------------------------
+//
+CMccResourceContainer* CMccResourceContainer::NewLC(
+    const TMccResourceParams& aParams,
+    RPointerArray<CMccResourceItem>& aAllEndpoints )
+    {
+    CMccResourceContainer* self = 
+        new ( ELeave ) CMccResourceContainer( aParams, aAllEndpoints );
+    CleanupStack::PushL( self );
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::NewL
+// -----------------------------------------------------------------------------
+//
+CMccResourceContainer* CMccResourceContainer::NewL(
+    const TMccResourceParams& aParams,
+    RPointerArray<CMccResourceItem>& aAllEndpoints )
+    {
+    CMccResourceContainer* self = 
+        CMccResourceContainer::NewLC( aParams, aAllEndpoints );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::~CMccResourceContainer
+// -----------------------------------------------------------------------------
+//       
+CMccResourceContainer::~CMccResourceContainer()
+    {
+    HandleEndpointRemoval();
+        
+    iOwnEndpoints.Reset();
+    iOwnEndpoints.Close();
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::AddResourceItemL
+// -----------------------------------------------------------------------------
+//
+void CMccResourceContainer::AddResourceItemL( 
+    const TMccResourceParams& aUser,
+    CMccResourceItem* aItem )
+    {
+    __ASSERT_ALWAYS( aItem, User::Leave( KErrArgument ) );
+    iOwnEndpoints.AppendL( aItem );
+    TInt err = aItem->IncreaseRefCount( aUser );
+    if ( err )
+        {
+        // Couldn't increase reference count, cannot use the resource
+        iOwnEndpoints.Remove( iOwnEndpoints.Count() - 1 );
+        User::Leave( err );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::FindResourceItem
+// -----------------------------------------------------------------------------
+//   
+CMccResourceItem* CMccResourceContainer::FindResourceItem( TUint32 aEndpointId )
+    {
+    TMccResourceItemIterator iterator( iOwnEndpoints, aEndpointId );
+    CMccResourceItem* item = NULL;
+    
+    iterator.Next( item );
+    
+    return item;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::LinkId
+// -----------------------------------------------------------------------------
+//
+TUint32 CMccResourceContainer::LinkId() const
+    {
+    return iParams.iLinkId;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::StreamId
+// -----------------------------------------------------------------------------
+//
+TUint32 CMccResourceContainer::StreamId() const
+    {
+    return iParams.iStreamId;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::SetResourceStateL
+// -----------------------------------------------------------------------------
+//    
+void CMccResourceContainer::SetResourceStateL( 
+    TUint32 aEndpointId, 
+    MMccResources::TResourceState aState,
+    TBool& aControlNetworkResources,
+    RArray<TUint32>& aControlledEndpoints,
+    RArray<TUint32>& aUncontrolledEndpoints )
+    { 
+    __CONTROLLER_INT1( "CMccResourceContainer::SetResourceStateL endpoint:", 
+                       aEndpointId ) 
+    __CONTROLLER_INT1( "CMccResourceContainer::SetResourceStateL state:", 
+                       aState )
+                       
+    aControlNetworkResources = EFalse;
+    
+    if ( MCC_CONTROL_ALL_ENDPOINTS( aEndpointId ) )
+        {
+        aControlNetworkResources = ETrue;
+        
+        TMccResourceItemIterator iterator( iOwnEndpoints );
+        CMccResourceItem* item = NULL;
+        while ( iterator.Next( item ) )
+            {
+            if ( item->SetResourceStateL( iParams.iStreamId, 
+                                          aState, 
+                                          StandbyControl(),
+                                          DtmfControl() ) )
+                {
+                aControlledEndpoints.AppendL( item->EndpointId() );
+                }
+            else
+                {
+                aUncontrolledEndpoints.AppendL( item->EndpointId() );
+                }
+            }
+        }
+    else
+        {
+        CMccResourceItem* item = FindResourceItem( aEndpointId );
+        __ASSERT_ALWAYS( item, User::Leave( KErrNotFound ) );
+    
+        // Network resources must be always prepared first
+        //
+        aControlNetworkResources = item->IsNetworkResource();
+      
+        TMccResourceItemIterator iterator( iOwnEndpoints );
+        CMccResourceItem* comparedItem = NULL;
+        while ( iterator.Next( comparedItem ) )
+            {
+            if ( comparedItem != item && 
+                 aState == MMccResources::EPrepared && 
+                 !aControlNetworkResources )
+                {
+                if ( comparedItem->IsNetworkResource() &&
+                     !comparedItem->IsResourceActive() )
+                    {
+                    // Network resources are not yet active
+                    User::Leave( KErrNotReady );
+                    }
+                }
+            }
+        
+        if ( item->SetResourceStateL( iParams.iStreamId, 
+                                      aState, 
+                                      StandbyControl(),
+                                      DtmfControl() ) )
+            {
+            aControlledEndpoints.AppendL( item->EndpointId() );
+            }
+        else
+            {
+            aUncontrolledEndpoints.AppendL( item->EndpointId() );
+            }
+        }
+        
+    __CONTROLLER( "CMccResourceContainer::SetResourceStateL, exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::SetEnableRtcp
+// -----------------------------------------------------------------------------
+//   
+void CMccResourceContainer::SetEnableRtcp( TBool aEnableRtcp )
+    {
+    iEnableRtcp = aEnableRtcp;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::EnableRtcp
+// -----------------------------------------------------------------------------
+//   
+TBool CMccResourceContainer::EnableRtcp() const
+    {
+    return iEnableRtcp;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::HandleEndpointRemoval
+// -----------------------------------------------------------------------------
+//
+void CMccResourceContainer::HandleEndpointRemoval( TUint32 aEndpointId )
+    { 
+    __CONTROLLER( "CMccResourceContainer::HandleEndpointRemoval" )
+    
+    // If called with zero endpoint, all owned endpoints are "removed"
+    TInt lastIndex( iOwnEndpoints.Count() - 1 );
+    for ( TInt i = lastIndex; i >= 0; i-- )
+        {
+        if ( !aEndpointId || iOwnEndpoints[ i ]->EndpointId() == aEndpointId )
+            {
+            if ( iOwnEndpoints[ i ]->DecreaseRefCount( iParams ) )
+                {
+                DeleteEndpoint( iOwnEndpoints[ i ]->EndpointId() );
+                }
+                
+            iOwnEndpoints.Remove( i );
+            }
+        }
+        
+    __CONTROLLER( "CMccResourceContainer::HandleEndpointRemoval, exit" )
+    }
+          
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::DeleteEndpoint
+// -----------------------------------------------------------------------------
+// 
+void CMccResourceContainer::DeleteEndpoint( TUint32 aEndpointId )
+    {
+    __CONTROLLER( "CMccResourceContainer::DeleteEndpoint" )
+    
+    TInt lastIndex( iAllEndpoints.Count() - 1 );
+    for ( TInt i = lastIndex; i >= 0; i-- )
+        {
+        if ( iAllEndpoints[ i ]->EndpointId() == aEndpointId )
+            {
+            delete iAllEndpoints[ i ];
+            iAllEndpoints.Remove( i );
+            return;
+            }
+        } 
+        
+    __CONTROLLER( "CMccResourceContainer::DeleteEndpoint, exit" )
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::CMccResourceContainer
+// -----------------------------------------------------------------------------
+//      
+CMccResourceContainer::CMccResourceContainer(
+    const TMccResourceParams& aParams,
+    RPointerArray<CMccResourceItem>& aAllEndpoints ) :
+    iParams( aParams ),
+    iAllEndpoints( aAllEndpoints )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::IsStandBy
+// -----------------------------------------------------------------------------
+//  
+TBool CMccResourceContainer::IsStandBy()
+	{
+	// Do not considered resource as standby resource if there's no
+	// standby resource item present
+	TMccResourceItemIterator iterator( iOwnEndpoints, KUidMmfAudioOutput );
+    CMccResourceItem* standbyEndpoint = NULL;
+    iterator.Next( standbyEndpoint );
+	return ( standbyEndpoint && iParams.iIsStandby );	
+	}
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::SetStandbyControl
+// -----------------------------------------------------------------------------
+//
+void CMccResourceContainer::SetStandbyControl( TBool aStandbyControl )
+	{
+	iStandbyControl = aStandbyControl;
+	}
+        
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::StandbyControl
+// -----------------------------------------------------------------------------
+//      
+TBool CMccResourceContainer::StandbyControl() const
+	{
+	return iStandbyControl;	
+	}
+
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::DtmfControl
+// -----------------------------------------------------------------------------
+//
+TBool CMccResourceContainer::DtmfControl() const
+    {
+    return ( iParams.iStreamType == KMccDtmfStream );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccResourceContainer::FetchStandbyEndpointL
+// -----------------------------------------------------------------------------
+//  
+CMccResourceItem& CMccResourceContainer::FetchStandbyEndpointL()
+	{
+	TMccResourceItemIterator iterator( iOwnEndpoints, KUidMmfAudioOutput );
+    CMccResourceItem* standbyEndpoint = NULL;
+    iterator.Next( standbyEndpoint );
+        
+    __ASSERT_ALWAYS( standbyEndpoint, User::Leave( KErrNotFound ) );
+
+    return *standbyEndpoint;
+	}
+
+