multimediacommsengine/mmcesrv/mmcemediamanager/src/mcesrvstreamiterator.cpp
changeset 0 1bce908db942
--- /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;
+    }
+