multimediacommsengine/mmcesrv/mmcemediamanager/src/mcesrvstreamiterator.cpp
changeset 0 1bce908db942
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 #include "mcesrvstreamiterator.h"
       
    22 #include "mcecommediastream.h"
       
    23 #include "mcecommediasource.h"
       
    24 #include "mcecommediasink.h"
       
    25 #include "mcesrvendpoint.h"
       
    26 #include "mceevents.h"
       
    27 #include "mcecomendpointproxy.h"
       
    28 #include "mcecomcodec.h"
       
    29 
       
    30 
       
    31 // ============================ MEMBER FUNCTIONS ===============================
       
    32 
       
    33 
       
    34 // -----------------------------------------------------------------------------
       
    35 // TMceSrvStreamIterator::TMceSrvStreamIterator
       
    36 // -----------------------------------------------------------------------------
       
    37 //
       
    38 TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams )
       
    39     : iStreams( aStreams ),
       
    40       iDirection( EZero ),
       
    41       iStream( NULL ),
       
    42       iEndpoint( NULL ),
       
    43       iCodec( NULL ),
       
    44       iCurrentIndex( 0 ),
       
    45       iUseProxyMatch( EFalse )
       
    46     {
       
    47     }
       
    48     
       
    49 
       
    50 // -----------------------------------------------------------------------------
       
    51 // TMceSrvStreamIterator::TMceSrvStreamIterator
       
    52 // -----------------------------------------------------------------------------
       
    53 //
       
    54 TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
       
    55                                               TDirection aDirection )
       
    56     : iStreams( aStreams ),
       
    57       iDirection( aDirection ),
       
    58       iStream( NULL ),
       
    59       iEndpoint( NULL ),
       
    60       iCodec( NULL ),
       
    61       iCurrentIndex( 0 ),
       
    62       iUseProxyMatch( EFalse )
       
    63     {
       
    64     }
       
    65     
       
    66 
       
    67 // -----------------------------------------------------------------------------
       
    68 // TMceSrvStreamIterator::TMceSrvStreamIterator
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
       
    72                                               const CMceComMediaStream& aStream )
       
    73     : iStreams( aStreams ),
       
    74       iDirection( EZero ),
       
    75       iStream( &aStream ),
       
    76       iEndpoint( NULL ),
       
    77       iCodec( NULL ),
       
    78       iCurrentIndex( 0 ),
       
    79       iUseProxyMatch( EFalse )
       
    80     {
       
    81     }
       
    82 
       
    83 // -----------------------------------------------------------------------------
       
    84 // TMceSrvStreamIterator::TMceSrvStreamIterator
       
    85 // -----------------------------------------------------------------------------
       
    86 //
       
    87 TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
       
    88                                               const CMceComEndpoint& aEndpoint,
       
    89                                               TBool aUseProxyMatch,
       
    90                                               TDirection aDirection,
       
    91                                               const CMceComCodec* aCodec )
       
    92     : iStreams( aStreams ),
       
    93       iDirection( aDirection ),
       
    94       iStream( NULL ),
       
    95       iEndpoint( &aEndpoint ),
       
    96       iCodec( aCodec ),
       
    97       iCurrentIndex( 0 ),
       
    98       iUseProxyMatch( aUseProxyMatch )
       
    99     {
       
   100     }
       
   101 
       
   102 // -----------------------------------------------------------------------------
       
   103 // TMceSrvStreamIterator::TMceSrvStreamIterator
       
   104 // -----------------------------------------------------------------------------
       
   105 //
       
   106 TMceSrvStreamIterator::TMceSrvStreamIterator( const RPointerArray<CMceSrvStream>& aStreams,
       
   107                                               const CMceComCodec& aCodec )
       
   108     : iStreams( aStreams ),
       
   109       iDirection( EZero ),
       
   110       iStream( NULL ),
       
   111       iEndpoint( NULL ),
       
   112       iCodec( &aCodec ),
       
   113       iCurrentIndex( 0 ),
       
   114       iUseProxyMatch( EFalse )
       
   115     {
       
   116     }
       
   117 
       
   118 
       
   119 
       
   120 // -----------------------------------------------------------------------------
       
   121 // TMceSrvStreamIterator::Next
       
   122 // -----------------------------------------------------------------------------
       
   123 //
       
   124 TBool TMceSrvStreamIterator::Next( CMceSrvStream*& aCandidate,
       
   125                                    TMceMccComEvent& aRecipient,
       
   126                                    TStreamStateMatchType aMatchType )
       
   127 
       
   128     {
       
   129     CMceSrvStream* next = NULL;
       
   130     TBool eof = EFalse;
       
   131     while ( !eof && Next( next, aMatchType ) )
       
   132         {
       
   133         eof = next->Consumes( aRecipient );
       
   134         next = eof ? next : NULL;
       
   135         }
       
   136         
       
   137     aCandidate = next;
       
   138     return aCandidate ? ETrue : EFalse;
       
   139     
       
   140     }
       
   141 
       
   142 // -----------------------------------------------------------------------------
       
   143 // TMceSrvStreamIterator::Next
       
   144 // -----------------------------------------------------------------------------
       
   145 //
       
   146 TBool TMceSrvStreamIterator::Next( CMceSrvStream*& aCandidate,
       
   147                                    CMceSrvStream& aClone,
       
   148                                    TStreamStateMatchType aMatchType )
       
   149     {
       
   150     CMceSrvStream* next = NULL;
       
   151     TBool eof = EFalse;
       
   152     while ( !eof && Next( next, aMatchType ) )
       
   153         {
       
   154         eof = next->IsEqual( aClone );
       
   155         next = eof ? next : NULL;
       
   156         }
       
   157         
       
   158     aCandidate = next;
       
   159     return aCandidate ? ETrue : EFalse;
       
   160     
       
   161     }
       
   162     
       
   163 
       
   164 // -----------------------------------------------------------------------------
       
   165 // TMceSrvStreamIterator::NextIntersect
       
   166 // -----------------------------------------------------------------------------
       
   167 //
       
   168 TBool TMceSrvStreamIterator::NextIntersect( CMceSrvStream*& aCandidate,
       
   169                                             TMceSrvStreamIterator& aSet, 
       
   170                                             CMceSrvStream*& aSetIntersect )
       
   171     {
       
   172 
       
   173     CMceSrvStream* intersect = NULL;
       
   174     aSetIntersect = NULL;
       
   175     
       
   176     while( !aSetIntersect && Next( intersect ) )
       
   177         {
       
   178         aSet.Reset();
       
   179         aSet.Next( aSetIntersect, *intersect );
       
   180         }
       
   181 
       
   182     intersect = aSetIntersect ? intersect : NULL;
       
   183     
       
   184     aCandidate = intersect;
       
   185     return aCandidate ? ETrue : EFalse;
       
   186     
       
   187     }
       
   188     
       
   189 // -----------------------------------------------------------------------------
       
   190 // TMceSrvStreamIterator::NextComplement
       
   191 // -----------------------------------------------------------------------------
       
   192 //
       
   193 TBool TMceSrvStreamIterator::NextComplement( CMceSrvStream*& aCandidate,
       
   194                                              TMceSrvStreamIterator& aSet )
       
   195     {
       
   196     TBool found = EFalse;
       
   197     
       
   198     CMceSrvStream* complement = NULL;
       
   199     
       
   200     while( !found && Next( complement ) )
       
   201         {
       
   202         aSet.Reset();
       
   203         CMceSrvStream* c = NULL;
       
   204         found = !aSet.Next( c, *complement );
       
   205         }
       
   206     
       
   207     aCandidate = complement;
       
   208     return aCandidate ? ETrue : EFalse;
       
   209     
       
   210     }
       
   211     
       
   212 
       
   213 // -----------------------------------------------------------------------------
       
   214 // TMceSrvStreamIterator::Next
       
   215 // -----------------------------------------------------------------------------
       
   216 //
       
   217 TBool TMceSrvStreamIterator::Next( 
       
   218                 CMceSrvStream*& aCandidate,
       
   219                 CMceSrvStream::TState aState, 
       
   220                 TMceSrvStreamIterator::TStreamStateMatchType aMatchType )
       
   221     {    
       
   222     CMceSrvStream* next = NULL;
       
   223     TBool eof = EFalse;
       
   224     
       
   225     while ( !eof && Next( next ) )
       
   226         {
       
   227         TBool condition = ETrue;
       
   228         TBool negation = ETrue;
       
   229         switch( aMatchType )
       
   230             {
       
   231              case ExactMatch:
       
   232                 {
       
   233                 condition = next->State() == aState;
       
   234                 negation = EFalse;
       
   235                 break;
       
   236                 }
       
   237             case ExactReverseMatch:
       
   238                 {
       
   239                 condition = next->State() == aState;
       
   240                 negation = ETrue;
       
   241                 break;
       
   242                 }
       
   243             case GreaterOrEqualMatch:
       
   244                 {
       
   245                 condition = next->State() >= aState;
       
   246                 negation = EFalse;
       
   247                 break;
       
   248                 }
       
   249             case GreaterOrEqualReverseMatch:
       
   250                 {
       
   251                 condition = next->State() >= aState;
       
   252                 negation = ETrue;
       
   253                 break;
       
   254                 }
       
   255             }
       
   256         eof = ( ( negation && !condition ) ||
       
   257                 ( !negation && condition ) );
       
   258         next = eof ? next : NULL;
       
   259         }
       
   260 
       
   261     aCandidate = next;
       
   262     return aCandidate ? ETrue : EFalse;
       
   263     
       
   264     }
       
   265 
       
   266 
       
   267 // -----------------------------------------------------------------------------
       
   268 // TMceSrvStreamIterator::Current
       
   269 // -----------------------------------------------------------------------------
       
   270 //
       
   271 TInt TMceSrvStreamIterator::Current()
       
   272     {
       
   273     TInt current = KErrNotFound;
       
   274     
       
   275     if ( iStreams.Count() > 0 )
       
   276         {
       
   277         current = iCurrentIndex-1;
       
   278         current = current < 0 ? 0 : current;
       
   279         }
       
   280     return current;
       
   281     
       
   282     }
       
   283 
       
   284 // -----------------------------------------------------------------------------
       
   285 // TMceSrvStreamIterator::Remove
       
   286 // -----------------------------------------------------------------------------
       
   287 //
       
   288 TInt TMceSrvStreamIterator::Remove( RPointerArray<CMceSrvStream>& aStreams )
       
   289     {
       
   290     TInt current = Current();
       
   291     
       
   292     if ( current != KErrNotFound )
       
   293         {
       
   294         aStreams.Remove( current );
       
   295         iCurrentIndex = current;
       
   296         }
       
   297     
       
   298     return current;
       
   299     
       
   300     }
       
   301 
       
   302 
       
   303 // -----------------------------------------------------------------------------
       
   304 // TMceSrvStreamIterator::IsEof
       
   305 // -----------------------------------------------------------------------------
       
   306 //
       
   307 TBool TMceSrvStreamIterator::IsEof()
       
   308     {
       
   309     return iStreams.Count() == 0 || iCurrentIndex >= iStreams.Count();
       
   310     }
       
   311 
       
   312 // -----------------------------------------------------------------------------
       
   313 // TMceSrvStreamIterator::Direction
       
   314 // -----------------------------------------------------------------------------
       
   315 //
       
   316 TMceSrvStreamIterator::TDirection TMceSrvStreamIterator::Direction()
       
   317     {
       
   318     return iDirection;
       
   319     }
       
   320 
       
   321 // -----------------------------------------------------------------------------
       
   322 // TMceSrvStreamIterator::Next
       
   323 // -----------------------------------------------------------------------------
       
   324 //
       
   325 TBool TMceSrvStreamIterator::Next( 
       
   326                     CMceSrvStream*& aCandidate,
       
   327                     TMceSrvStreamIterator::TStreamStateMatchType aMatchType )
       
   328 
       
   329     {
       
   330     CMceSrvStream* next = NULL;
       
   331     TBool negation = aMatchType == ExactMatch ? EFalse : ETrue;
       
   332     
       
   333     while( !next && !IsEof() )
       
   334         {
       
   335         CMceSrvStream* srvStream = iStreams[ iCurrentIndex ];
       
   336         TBool condition = EFalse;
       
   337         
       
   338         if ( iEndpoint )
       
   339             {
       
   340             condition = srvStream->EndpointMatch( *iEndpoint, iUseProxyMatch );
       
   341             if ( condition && iCodec )
       
   342                 {
       
   343                 condition = srvStream->Codec().Decodes( 
       
   344                                 iCodec->iSdpName, iCodec->FmtpAttr() );
       
   345                 }
       
   346                  
       
   347             if ( condition && ( iDirection != EZero || iCodec ) )
       
   348                 {
       
   349                 condition = DoDirectionMatch( *srvStream );
       
   350                 }   
       
   351             }
       
   352         else if ( iDirection != EZero )
       
   353             {
       
   354             condition = DoDirectionMatch( *srvStream );
       
   355             }
       
   356         else if ( iStream )
       
   357             {
       
   358             condition = srvStream->Data().Id() == iStream->Id();
       
   359             }
       
   360         else if ( iCodec )
       
   361             {
       
   362             condition = &srvStream->Codec() == iCodec;
       
   363             }
       
   364         else
       
   365             {
       
   366             condition = ETrue;
       
   367             }
       
   368         next = ( ( negation && !condition ) ||
       
   369                ( !negation && condition ) ) ? srvStream : NULL;
       
   370                
       
   371         iCurrentIndex++;                            
       
   372         }
       
   373     
       
   374     aCandidate = next;
       
   375     return aCandidate ? ETrue : EFalse;
       
   376     
       
   377     }
       
   378     
       
   379 
       
   380 
       
   381 // -----------------------------------------------------------------------------
       
   382 // TMceSrvStreamIterator::Reset
       
   383 // -----------------------------------------------------------------------------
       
   384 //
       
   385 void TMceSrvStreamIterator::Reset()
       
   386     {
       
   387     iCurrentIndex = 0;
       
   388     }
       
   389 
       
   390 // -----------------------------------------------------------------------------
       
   391 // TMceSrvStreamIterator::DoDirectionMatch
       
   392 // -----------------------------------------------------------------------------
       
   393 //    
       
   394 TBool TMceSrvStreamIterator::DoDirectionMatch( CMceSrvStream& aSrvStream )
       
   395     {
       
   396     TBool condition( ETrue );
       
   397     CMceComMediaStream::TStreamType type = aSrvStream.Data().iStreamType;
       
   398     switch( iDirection )
       
   399         {
       
   400         case ELocal:
       
   401             {
       
   402             condition = type == CMceComMediaStream::ELocalStream;
       
   403             break;
       
   404             }
       
   405         case ESendOrReceive:
       
   406             {
       
   407             condition = type != CMceComMediaStream::ELocalStream;
       
   408             break;
       
   409             }
       
   410         case ESend:
       
   411             {
       
   412             condition = ( type == CMceComMediaStream::ESendOnlyStream ||
       
   413                           type == CMceComMediaStream::ESendStream );
       
   414             break;
       
   415             }
       
   416         case EReceive:
       
   417             {
       
   418             condition = ( type == CMceComMediaStream::EReceiveOnlyStream ||
       
   419                           type == CMceComMediaStream::EReceiveStream );
       
   420             break;
       
   421             }
       
   422         case EReceiveOrLocal:
       
   423             {
       
   424             condition = ( type == CMceComMediaStream::EReceiveOnlyStream ||
       
   425                           type == CMceComMediaStream::EReceiveStream ||
       
   426                           type == CMceComMediaStream::ELocalStream );
       
   427             break;
       
   428             }
       
   429         case ESendOrLocal:
       
   430             {
       
   431             condition = ( type == CMceComMediaStream::ESendOnlyStream ||
       
   432                           type == CMceComMediaStream::ESendStream || 
       
   433                           type == CMceComMediaStream::ELocalStream );
       
   434             break;
       
   435             }
       
   436         default://EAny
       
   437             {
       
   438             condition = ETrue;
       
   439             break;
       
   440             }
       
   441         }
       
   442     return condition;
       
   443     }
       
   444