--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/src/mcesrvstreamiterator.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,444 @@
+/*
+* 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 "mcesrvstreamiterator.h"
+#include "mcecommediastream.h"
+#include "mcecommediasource.h"
+#include "mcecommediasink.h"
+#include "mcesrvendpoint.h"
+#include "mceevents.h"
+#include "mcecomendpointproxy.h"
+#include "mcecomcodec.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::TMceSrvStreamIterator
+// -----------------------------------------------------------------------------
+//
+TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams )
+ : iStreams( aStreams ),
+ iDirection( EZero ),
+ iStream( NULL ),
+ iEndpoint( NULL ),
+ iCodec( NULL ),
+ iCurrentIndex( 0 ),
+ iUseProxyMatch( EFalse )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::TMceSrvStreamIterator
+// -----------------------------------------------------------------------------
+//
+TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
+ TDirection aDirection )
+ : iStreams( aStreams ),
+ iDirection( aDirection ),
+ iStream( NULL ),
+ iEndpoint( NULL ),
+ iCodec( NULL ),
+ iCurrentIndex( 0 ),
+ iUseProxyMatch( EFalse )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::TMceSrvStreamIterator
+// -----------------------------------------------------------------------------
+//
+TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
+ const CMceComMediaStream& aStream )
+ : iStreams( aStreams ),
+ iDirection( EZero ),
+ iStream( &aStream ),
+ iEndpoint( NULL ),
+ iCodec( NULL ),
+ iCurrentIndex( 0 ),
+ iUseProxyMatch( EFalse )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::TMceSrvStreamIterator
+// -----------------------------------------------------------------------------
+//
+TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
+ const CMceComEndpoint& aEndpoint,
+ TBool aUseProxyMatch,
+ TDirection aDirection,
+ const CMceComCodec* aCodec )
+ : iStreams( aStreams ),
+ iDirection( aDirection ),
+ iStream( NULL ),
+ iEndpoint( &aEndpoint ),
+ iCodec( aCodec ),
+ iCurrentIndex( 0 ),
+ iUseProxyMatch( aUseProxyMatch )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::TMceSrvStreamIterator
+// -----------------------------------------------------------------------------
+//
+TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
+ const CMceComCodec& aCodec )
+ : iStreams( aStreams ),
+ iDirection( EZero ),
+ iStream( NULL ),
+ iEndpoint( NULL ),
+ iCodec( &aCodec ),
+ iCurrentIndex( 0 ),
+ iUseProxyMatch( EFalse )
+ {
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Next
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::Next( CMceSrvStream*& aCandidate,
+ TMceMccComEvent& aRecipient,
+ TStreamStateMatchType aMatchType )
+
+ {
+ CMceSrvStream* next = NULL;
+ TBool eof = EFalse;
+ while ( !eof && Next( next, aMatchType ) )
+ {
+ eof = next->Consumes( aRecipient );
+ next = eof ? next : NULL;
+ }
+
+ aCandidate = next;
+ return aCandidate ? ETrue : EFalse;
+
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Next
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::Next( CMceSrvStream*& aCandidate,
+ CMceSrvStream& aClone,
+ TStreamStateMatchType aMatchType )
+ {
+ CMceSrvStream* next = NULL;
+ TBool eof = EFalse;
+ while ( !eof && Next( next, aMatchType ) )
+ {
+ eof = next->IsEqual( aClone );
+ next = eof ? next : NULL;
+ }
+
+ aCandidate = next;
+ return aCandidate ? ETrue : EFalse;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::NextIntersect
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::NextIntersect( CMceSrvStream*& aCandidate,
+ TMceSrvStreamIterator& aSet,
+ CMceSrvStream*& aSetIntersect )
+ {
+
+ CMceSrvStream* intersect = NULL;
+ aSetIntersect = NULL;
+
+ while( !aSetIntersect && Next( intersect ) )
+ {
+ aSet.Reset();
+ aSet.Next( aSetIntersect, *intersect );
+ }
+
+ intersect = aSetIntersect ? intersect : NULL;
+
+ aCandidate = intersect;
+ return aCandidate ? ETrue : EFalse;
+
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::NextComplement
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::NextComplement( CMceSrvStream*& aCandidate,
+ TMceSrvStreamIterator& aSet )
+ {
+ TBool found = EFalse;
+
+ CMceSrvStream* complement = NULL;
+
+ while( !found && Next( complement ) )
+ {
+ aSet.Reset();
+ CMceSrvStream* c = NULL;
+ found = !aSet.Next( c, *complement );
+ }
+
+ aCandidate = complement;
+ return aCandidate ? ETrue : EFalse;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Next
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::Next(
+ CMceSrvStream*& aCandidate,
+ CMceSrvStream::TState aState,
+ TMceSrvStreamIterator::TStreamStateMatchType aMatchType )
+ {
+ CMceSrvStream* next = NULL;
+ TBool eof = EFalse;
+
+ while ( !eof && Next( next ) )
+ {
+ TBool condition = ETrue;
+ TBool negation = ETrue;
+ switch( aMatchType )
+ {
+ case ExactMatch:
+ {
+ condition = next->State() == aState;
+ negation = EFalse;
+ break;
+ }
+ case ExactReverseMatch:
+ {
+ condition = next->State() == aState;
+ negation = ETrue;
+ break;
+ }
+ case GreaterOrEqualMatch:
+ {
+ condition = next->State() >= aState;
+ negation = EFalse;
+ break;
+ }
+ case GreaterOrEqualReverseMatch:
+ {
+ condition = next->State() >= aState;
+ negation = ETrue;
+ break;
+ }
+ }
+ eof = ( ( negation && !condition ) ||
+ ( !negation && condition ) );
+ next = eof ? next : NULL;
+ }
+
+ aCandidate = next;
+ return aCandidate ? ETrue : EFalse;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Current
+// -----------------------------------------------------------------------------
+//
+TInt TMceSrvStreamIterator::Current()
+ {
+ TInt current = KErrNotFound;
+
+ if ( iStreams.Count() > 0 )
+ {
+ current = iCurrentIndex-1;
+ current = current < 0 ? 0 : current;
+ }
+ return current;
+
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Remove
+// -----------------------------------------------------------------------------
+//
+TInt TMceSrvStreamIterator::Remove( RPointerArray<CMceSrvStream>& aStreams )
+ {
+ TInt current = Current();
+
+ if ( current != KErrNotFound )
+ {
+ aStreams.Remove( current );
+ iCurrentIndex = current;
+ }
+
+ return current;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::IsEof
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::IsEof()
+ {
+ return iStreams.Count() == 0 || iCurrentIndex >= iStreams.Count();
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Direction
+// -----------------------------------------------------------------------------
+//
+TMceSrvStreamIterator::TDirection TMceSrvStreamIterator::Direction()
+ {
+ return iDirection;
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Next
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::Next(
+ CMceSrvStream*& aCandidate,
+ TMceSrvStreamIterator::TStreamStateMatchType aMatchType )
+
+ {
+ CMceSrvStream* next = NULL;
+ TBool negation = aMatchType == ExactMatch ? EFalse : ETrue;
+
+ while( !next && !IsEof() )
+ {
+ CMceSrvStream* srvStream = iStreams[ iCurrentIndex ];
+ TBool condition = EFalse;
+
+ if ( iEndpoint )
+ {
+ condition = srvStream->EndpointMatch( *iEndpoint, iUseProxyMatch );
+ if ( condition && iCodec )
+ {
+ condition = srvStream->Codec().Decodes(
+ iCodec->iSdpName, iCodec->FmtpAttr() );
+ }
+
+ if ( condition && ( iDirection != EZero || iCodec ) )
+ {
+ condition = DoDirectionMatch( *srvStream );
+ }
+ }
+ else if ( iDirection != EZero )
+ {
+ condition = DoDirectionMatch( *srvStream );
+ }
+ else if ( iStream )
+ {
+ condition = srvStream->Data().Id() == iStream->Id();
+ }
+ else if ( iCodec )
+ {
+ condition = &srvStream->Codec() == iCodec;
+ }
+ else
+ {
+ condition = ETrue;
+ }
+ next = ( ( negation && !condition ) ||
+ ( !negation && condition ) ) ? srvStream : NULL;
+
+ iCurrentIndex++;
+ }
+
+ aCandidate = next;
+ return aCandidate ? ETrue : EFalse;
+
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::Reset
+// -----------------------------------------------------------------------------
+//
+void TMceSrvStreamIterator::Reset()
+ {
+ iCurrentIndex = 0;
+ }
+
+// -----------------------------------------------------------------------------
+// TMceSrvStreamIterator::DoDirectionMatch
+// -----------------------------------------------------------------------------
+//
+TBool TMceSrvStreamIterator::DoDirectionMatch( CMceSrvStream& aSrvStream )
+ {
+ TBool condition( ETrue );
+ CMceComMediaStream::TStreamType type = aSrvStream.Data().iStreamType;
+ switch( iDirection )
+ {
+ case ELocal:
+ {
+ condition = type == CMceComMediaStream::ELocalStream;
+ break;
+ }
+ case ESendOrReceive:
+ {
+ condition = type != CMceComMediaStream::ELocalStream;
+ break;
+ }
+ case ESend:
+ {
+ condition = ( type == CMceComMediaStream::ESendOnlyStream ||
+ type == CMceComMediaStream::ESendStream );
+ break;
+ }
+ case EReceive:
+ {
+ condition = ( type == CMceComMediaStream::EReceiveOnlyStream ||
+ type == CMceComMediaStream::EReceiveStream );
+ break;
+ }
+ case EReceiveOrLocal:
+ {
+ condition = ( type == CMceComMediaStream::EReceiveOnlyStream ||
+ type == CMceComMediaStream::EReceiveStream ||
+ type == CMceComMediaStream::ELocalStream );
+ break;
+ }
+ case ESendOrLocal:
+ {
+ condition = ( type == CMceComMediaStream::ESendOnlyStream ||
+ type == CMceComMediaStream::ESendStream ||
+ type == CMceComMediaStream::ELocalStream );
+ break;
+ }
+ default://EAny
+ {
+ condition = ETrue;
+ break;
+ }
+ }
+ return condition;
+ }
+