mmfenh/enhancedmediaclient/Plugins/DataBufferSource/src/DataCopyEngineAO.cpp
changeset 0 71ca22bcf22a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/enhancedmediaclient/Plugins/DataBufferSource/src/DataCopyEngineAO.cpp	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,299 @@
+/*
+* 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:  Definition of the databuffer source reader active object class
+*
+*/
+
+
+// INCLUDES
+#include "DataCopyEngineAO.h"
+#include "DataBufferDataSource.h"
+#include "SourceQueueItem.h"
+#include "SinkQueueItem.h"
+#include <e32cmn.h>
+
+#ifdef _DEBUG
+#define DEBPRN1(str) \
+    RDebug::Print(str);
+#define DEBPRN2(str, val1) \
+    RDebug::Print(str, val1);
+#define DEBPRN3(str, val1, val2) \
+    RDebug::Print(str, val1, val2);
+#define DEBPRN4(str, val1, val2, val3) \
+    RDebug::Print(str, val1, val2, val3);
+#define DEBPRN5(str, val1, val2, val3, val4) \
+    RDebug::Print(str, val1, val2, val3, val4);
+#else
+#define DEBPRN1(str)
+#define DEBPRN2(str, val1)
+#define DEBPRN3(str, val1, val2)
+#define DEBPRN4(str, val1, val2, val3)
+#define DEBPRN5(str, val1, val2, val3, val4)
+#endif // _DEBUG
+
+
+CDataCopyEngineAO::CDataCopyEngineAO( TSglQue<CSourceQueueItem>* aSourceQueue,
+                                     TSglQue<CSinkQueueItem>* aSinkQueue,
+                                     MDataCopyEngineObserver& aObserver )
+                                     : CActive( CActive::EPriorityStandard ),
+                                     iSourceQueue( aSourceQueue ),
+                                     iSinkQueue( aSinkQueue ),
+                                     iObserver( &aObserver )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+CDataCopyEngineAO::~CDataCopyEngineAO()
+    {
+    Cancel();
+    delete iSrcDataDes;
+    }
+
+CDataCopyEngineAO* CDataCopyEngineAO::NewL( TSglQue<CSourceQueueItem>* aSourceQueue,
+                                           TSglQue<CSinkQueueItem>* aSinkQueue,
+                                           MDataCopyEngineObserver& aObserver )
+    {
+    CDataCopyEngineAO* self = new (ELeave) CDataCopyEngineAO( aSourceQueue, aSinkQueue, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+void CDataCopyEngineAO::ConstructL()
+    {
+    // No impl yet
+    }
+
+void CDataCopyEngineAO::SourceQueueChanged()
+    {
+    if (iState == EWaitingForSourceQueueSignal)
+        {
+        iState = EExecuting;
+        KickSignal();
+        }
+    }
+
+void CDataCopyEngineAO::SinkQueueChanged()
+    {
+    DEBPRN2(_L("CDataCopyEngineAO::SinkQueueChanged:State[%d]"), iState);
+    if ( iState == EWaitingForSinkQueueSignal )
+        {
+        iState = EExecuting;
+        KickSignal();
+        }
+    }
+
+void CDataCopyEngineAO::KickSignal()
+    {
+    if ( ( iState != EStopped ) && ( iState != EPaused ) && ( !IsActive() ) )
+        {
+        TRequestStatus* s = &iStatus;
+        SetActive();
+        User::RequestComplete( s, KErrNone );
+        }
+    }
+
+void CDataCopyEngineAO::Start()
+    {
+    if ( iState == EStopped )
+        {
+        iState = EExecuting;
+        iSinkQueueItemProcessed = EFalse;
+        iSourceQueueItemProcessed = EFalse;
+        KickSignal();
+        }
+    else if ( iState == EPaused )
+        {
+        iState = EExecuting;
+        KickSignal();
+        }
+    }
+
+void CDataCopyEngineAO::Stop()
+    {
+    Cancel();
+    iState = EStopped;
+    delete iSrcDataDes;
+    iSrcDataDes = NULL;
+    iSrcDataPos = 0;
+    }
+
+void CDataCopyEngineAO::Pause()
+    {
+    Cancel();
+    iState = EPaused;
+    }
+
+void CDataCopyEngineAO::RunL()
+    {
+    DEBPRN2(_L("CDataCopyEngineAO::RunL() State[%d]"),iState);
+    
+    if ( iState != EExecuting )
+        return;
+    
+    // If we are waiting for signalling sink queue item processed event,
+    // notify the observer
+    if ( iSourceQueueItemProcessed )
+        {
+        iSourceQueueItemProcessed = EFalse;
+        delete iSrcDataDes;
+        iSrcDataDes = NULL;
+        iSrcDataPos = 0;
+        iObserver->SourceQueueItemProcessed();
+        KickSignal();
+        return;
+        }
+    
+    // If we are waiting for signalling source queue item processed event,
+    // notify the observer
+    if ( iSinkQueueItemProcessed )
+        {
+        iSinkQueueItemProcessed = EFalse;
+        iObserver->SinkQueueItemProcessed();
+        KickSignal();
+        return;
+        }
+    
+    // No request in the source queue
+    if ( iSourceQueue->IsEmpty() )
+        {
+        iState = EWaitingForSourceQueueSignal;
+        return;
+        }
+    
+    // No request in the sink queue
+    if ( iSinkQueue->IsEmpty() )
+        {
+        iState = EWaitingForSinkQueueSignal;
+        return;
+        }
+    
+    CSourceQueueItem* srcItem = iSourceQueue->First();
+    CSinkQueueItem* snkItem = iSinkQueue->First();
+    // If there is no data copied into local buffer
+    if ( !iSrcDataDes )
+        {
+        // If data from source item can fit into dest buffer
+        // copy directly
+              
+        if ( srcItem->DataSize() <= ( snkItem->Buffer()->Data().MaxLength() - snkItem->Buffer()->Data().Length() )  )
+            {
+            // Create a temp ptr pointing to buffer in the sink queue
+            TPtr8 ptr( ( const_cast<TUint8*>( ( snkItem->Buffer()->Data().Ptr() ) ) + snkItem->Buffer()->Data().Length() ),
+                0,
+                ( snkItem->Buffer()->Data().MaxLength() - snkItem->Buffer()->Data().Length() ) );
+            // Read data into the buffer
+            srcItem->ReadData( ptr );
+            
+            // Update descriptor attribute and position attribute
+            snkItem->Buffer()->Data().SetLength( snkItem->Buffer()->Data().Length() + srcItem->DataSize() );
+            
+            // Now that data is copied from source queue item, signal it is done
+            iSourceQueueItemProcessed = ETrue;
+            // If src queue item is last buffer signal sink buffer
+            if ( srcItem->IsLastBuffer() )
+                {
+                snkItem->Buffer()->SetLastBuffer( ETrue );
+                iSinkQueueItemProcessed = ETrue;
+                }
+            else if ( snkItem->Buffer()->Data().Length() == snkItem->Buffer()->Data().MaxLength() )
+                {                    
+                snkItem->Buffer()->SetLastBuffer( EFalse );
+                iSinkQueueItemProcessed = ETrue;
+                }
+                
+/*
+            if ( iSinkQueueItemProcessed )
+                {
+            	TUint8* bufPtr = const_cast<TUint8*>(snkItem->Buffer()->Data().Ptr());
+            	if ( snkItem->Buffer()->Data().Length() > 5 )
+                	{
+                	RDebug::Print(_L("CDataCopyEngineAO::RunL 1 data[0x%x][0x%x][0x%x][0x%x][0x%x]"), \
+                	*bufPtr,*(bufPtr+1),*(bufPtr+2),*(bufPtr+3),*(bufPtr+4));
+                    }
+                }
+*/
+
+            
+            // Continue
+            KickSignal();
+            return;
+            }
+        else // if (srcItem->DataSize() <=
+            {
+            // The data in the source queue item is larger than what
+            // destination can hold. So copy data to local buffer
+            iSrcDataDes = HBufC8::NewL(srcItem->DataSize());
+            TPtr8 ptr = iSrcDataDes->Des();
+            srcItem->ReadData(ptr);
+            iSrcDataPos = 0;
+            }
+        }
+    // Now we have data copied over to temp buffer
+    TInt copySize = Min( ( iSrcDataDes->Des().Length() - iSrcDataPos),
+        ( snkItem->Buffer()->Data().MaxLength() - snkItem->Buffer()->Data().Length() ) );
+    // Copy data from source to destination queue item
+    snkItem->Buffer()->Data().Append( ( iSrcDataDes->Des().Ptr() + iSrcDataPos ),
+        copySize );
+    // Update the source position.
+    iSrcDataPos += copySize;
+    // Update the position in destination queue item.
+    //snkItem->Buffer()->SetPosition( snkItem->Buffer()->Position() + copySize );
+    
+    if ( iSrcDataPos == iSrcDataDes->Des().Length() )
+        {
+        iSourceQueueItemProcessed = ETrue;
+        }
+    // If src queue item is last buffer signal sink buffer
+    if ( srcItem->IsLastBuffer() && (iSrcDataPos == iSrcDataDes->Des().Length()) )
+        {
+        snkItem->Buffer()->SetLastBuffer( ETrue );
+        iSinkQueueItemProcessed = ETrue;
+        }
+    else if ( snkItem->Buffer()->Data().Length() == snkItem->Buffer()->Data().MaxLength() )
+        {
+        snkItem->Buffer()->SetLastBuffer( EFalse );
+        iSinkQueueItemProcessed = ETrue;
+        }
+    
+/*
+    if ( iSinkQueueItemProcessed )
+        {
+    	TUint8* bufPtr = const_cast<TUint8*>(snkItem->Buffer()->Data().Ptr());
+    	if ( snkItem->Buffer()->Data().Length() > 5 )
+        	{
+        	RDebug::Print(_L("CDataCopyEngineAO::RunL 2 data[0x%x][0x%x][0x%x][0x%x][0x%x]"), \
+        	*bufPtr,*(bufPtr+1),*(bufPtr+2),*(bufPtr+3),*(bufPtr+4));
+            }
+        }
+*/
+
+    // Continue
+    KickSignal();
+    return;
+    
+    }
+    
+    void CDataCopyEngineAO::DoCancel()
+        {
+        }
+    
+    TInt CDataCopyEngineAO::RunError(TInt /*aError*/)
+        {
+        // FIX LATER Panic client
+        return KErrNone;
+        }
+    
+    //  End of File