omxilvideocomps/omxilvideoscheduler/src/buffercopierstatemonitor.cpp
changeset 0 5d29cba61097
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxilvideocomps/omxilvideoscheduler/src/buffercopierstatemonitor.cpp	Fri Oct 08 22:09:17 2010 +0100
@@ -0,0 +1,161 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+/**
+@file
+@internalComponent
+*/
+#include "buffercopier.h"
+#include "comxilvideoscheduler.h"
+#include "buffercopierstatemonitor.h"
+#include "log.h"
+
+CBufferCopierStateMonitor* CBufferCopierStateMonitor::NewL(MBufferCopierIf& aCallback, COmxILVideoScheduler& aComponent)
+    {
+    CBufferCopierStateMonitor* self = new (ELeave) CBufferCopierStateMonitor(aCallback, aComponent);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CBufferCopierStateMonitor::CBufferCopierStateMonitor(MBufferCopierIf& aCallback, COmxILVideoScheduler& aComponent) :
+CActive(EPriorityNormal),
+iCallback(aCallback),
+iComponent(aComponent),
+iState(ENull)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+CBufferCopierStateMonitor::~CBufferCopierStateMonitor()
+    {
+    Cancel();
+    delete iBufferCopier;
+    }
+
+void CBufferCopierStateMonitor::ConstructL()
+    {
+    RThread me;
+    iConstructionThreadId = me.Id();
+    
+    iStatus = KRequestPending;
+    SetActive();
+    }
+
+void CBufferCopierStateMonitor::RunL()
+    {
+    iStatus = KRequestPending;
+    SetActive();
+
+    TInt err = DoSetState();
+
+    TRequestStatus *status = iCallingStatus;
+    RThread callingThread;
+    callingThread.Open(iCallingThreadId);
+    callingThread.RequestComplete(status, err);
+    callingThread.Close();
+    }
+
+void CBufferCopierStateMonitor::DoCancel()
+    {
+    TRequestStatus* pStat = &iStatus;
+    User::RequestComplete(pStat, KErrCancel);
+    }
+
+TInt CBufferCopierStateMonitor::RunError(TInt aError)
+    {
+    DEBUG_PRINTF2(_L8("CBufferCopierStateMonitor::RunError %d"), aError);
+    aError=KErrNone; //Do not want to panic the server!
+    return aError; 
+    }
+
+TInt CBufferCopierStateMonitor::SetState(TPFState aState)
+    {
+    DEBUG_PRINTF(_L8("CBufferCopierStateMonitor::SetState"));
+
+    TInt err = KErrNone;
+    iState = aState;
+    
+    RThread me;
+    if(me.Id() != iConstructionThreadId)
+        {
+        // in different thread to that which 'this' was constructed
+        err = DoRequest();
+        }
+    else
+        {
+        // in same thread to that which 'this' was constructed therefore
+        // active scheduler must exist and following call is safe
+        err = DoSetState();
+        }
+
+    return err;
+    }
+
+TInt CBufferCopierStateMonitor::DoSetState()
+    {
+    DEBUG_PRINTF(_L8("CBufferCopierStateMonitor::DoSetState"));
+
+    TInt err = KErrNone;
+
+    switch(iState)
+        {
+        case ESubLoadedToIdle:
+            iMaxBuffers = iComponent.BufferCount();
+            delete iBufferCopier;
+            iBufferCopier = NULL;
+            TRAP(err, iBufferCopier = CBufferCopier::NewL(iCallback, iMaxBuffers));
+            break;
+        case ESubIdleToLoaded:
+            delete iBufferCopier;
+            iBufferCopier = NULL;
+            break;
+        default:
+            break;
+        };
+
+    return err;
+    }
+
+TInt CBufferCopierStateMonitor::DoRequest()
+    {
+    DEBUG_PRINTF(_L8("CBufferCopierStateMonitor::DoRequest"));
+
+    RThread me;
+    iCallingThreadId = me.Id();
+    TRequestStatus requestStatus = KRequestPending;
+    iCallingStatus = &requestStatus;
+
+    // send request to active scheduler thread
+    RThread schedulerThread;
+    TInt error = schedulerThread.Open(iConstructionThreadId);
+    if(error != KErrNone)
+        {
+        return error;
+        }
+
+    TRequestStatus* schedulerRequest = &iStatus;
+    schedulerThread.RequestComplete(schedulerRequest, KErrNone);
+    schedulerThread.Close();
+
+    // block until request completes
+    User::WaitForRequest(requestStatus);
+
+    return requestStatus.Int();
+    }