videoconnutility/connutility/src/vcxconnutilwaitsch.cpp
branchRCL_3
changeset 48 13a33d82ad98
parent 0 822a42b6c3f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnutilwaitsch.cpp	Wed Sep 01 12:20:37 2010 +0100
@@ -0,0 +1,225 @@
+/*
+* 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 the License "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:    CCVcxConnUtilWaitSch class definition file*
+*/
+
+
+
+
+
+#include "vcxconnutilwaitsch.h"
+
+
+ /**
+ * CVcxConnUtilWait is used to wrap CActiveScheduler objects to be used
+ * as "wait-type" context within videoconnutility.
+ * Each CVcxConnUtilWait object has a wait type -id for whose
+ * object maintans an array of CActiveScheduler objects' wait state.
+ */
+NONSHARABLE_CLASS( CVcxConnUtilWait ) : public CBase
+    {
+    public: 
+        
+        /**
+         * Destructor.
+         */
+        ~CVcxConnUtilWait()
+            {
+            iWaitArray.ResetAndDestroy();
+            };
+        
+        /**
+         * Default constructor
+         */
+        CVcxConnUtilWait( ) {};
+        
+        /**
+         * Wait type id
+         */
+        TUint32 iType;
+        
+        /**
+         * Flag to indicate wether CActiveScheduler maintained
+         * by this object can really be released. In case flag is 
+         * false, CActiveScheduler -objects need to be put to wait
+         * again right after their release.  
+         */
+        TBool   iCanStop;
+        
+        /**
+         * Array containing CActiveScheduler maintained
+         * by this object  
+         */
+        RPointerArray < CActiveSchedulerWait > iWaitArray;
+    };
+
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::CVcxConnUtilWaitSch()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch::CVcxConnUtilWaitSch()
+    {
+    // No implementation required
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::~CVcxConnUtilWaitSch()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch::~CVcxConnUtilWaitSch()
+    {
+    iWaits.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch* CVcxConnUtilWaitSch::NewLC()
+    {
+    CVcxConnUtilWaitSch* self = new (ELeave)CVcxConnUtilWaitSch();
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch* CVcxConnUtilWaitSch::NewL()
+    {
+    CVcxConnUtilWaitSch* self = CVcxConnUtilWaitSch::NewLC();
+    CleanupStack::Pop( self ); // self;
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::WaitL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilWaitSch::WaitL( TUint32 aWaitId )
+    {
+    CVcxConnUtilWait* wait = GetWaitL( aWaitId );
+    CActiveSchedulerWait* activeWait = GetActiveSWaitL( wait ); 
+        
+    while( !wait->iCanStop )
+        {
+        activeWait->Start();        
+        }
+    
+    TInt index = wait->iWaitArray.FindL( activeWait );
+    if( index != KErrNotFound )
+        {       
+        wait->iWaitArray.Remove( index );
+        }
+    delete activeWait;
+    
+    if( !wait->iWaitArray.Count() )
+        {
+        index = iWaits.FindL( wait );
+        if( index != KErrNotFound )
+            {            
+            iWaits.Remove( index );
+            }
+        delete wait;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::EndWait()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilWaitSch::EndWait( TUint32 aWaitId )
+    {
+    TInt waitCount( 0 );
+    TInt asWaitCount( 0 );
+    
+    waitCount = iWaits.Count();
+    
+    for( TInt i( 0 ); i < waitCount; ++i )
+        {
+        iWaits[ i ]->iCanStop = ( aWaitId == iWaits[ i ]->iType );
+        
+        asWaitCount = iWaits[ i ]->iWaitArray.Count();
+        
+        for( TInt j( 0 ); j < asWaitCount; ++j )
+            {
+            if( iWaits[ i ]->iWaitArray[ j ]->IsStarted() )
+                {
+                iWaits[ i ]->iWaitArray[ j ]->AsyncStop();
+                }
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::GetWaitL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWait* CVcxConnUtilWaitSch::GetWaitL( TUint32 aID )
+    {
+    CVcxConnUtilWait* wait( 0 );
+    TInt count( 0 );
+    count = iWaits.Count();
+    
+    for( TInt i( 0 ); i < count; ++i )
+        {
+        if( iWaits[ i ]->iType == aID )
+            {
+            wait = iWaits[ i ];
+            break;
+            }
+        }
+    if( !wait )
+        {
+        wait = new (ELeave) CVcxConnUtilWait();
+        CleanupStack::PushL( wait );
+        wait->iType = aID;
+        iWaits.AppendL( wait );
+        CleanupStack::Pop( wait );
+        }
+    return wait;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::GetActiveSWaitL()
+// -----------------------------------------------------------------------------
+//
+CActiveSchedulerWait* CVcxConnUtilWaitSch::GetActiveSWaitL( CVcxConnUtilWait* aWait )
+    {  
+    CActiveSchedulerWait* item( 0 );
+    if( aWait )
+        {
+        TInt count( aWait->iWaitArray.Count() );
+        for( TInt i( 0 ); i < count; i++ )
+            {
+            if( !( aWait->iWaitArray[i]->IsStarted() ) )
+                {
+                item = aWait->iWaitArray[i];
+                break;
+                }
+            }
+        }
+    if( !item )
+        {
+        item = new ( ELeave) CActiveSchedulerWait;
+        CleanupStack::PushL( item );
+        aWait->iWaitArray.AppendL( item );
+        CleanupStack::Pop( item );
+        }
+    return item;
+    }
+// End of file
+