--- /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;
+ }
+
+