imaging/imagingfws/ImageProcessor/src/imageprocessorcallback.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/ImageProcessor/src/imageprocessorcallback.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,133 @@
+// Copyright (c) 2008-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:
+//
+
+#include "imageprocessorcallback.h"
+#include <imageprocessor/imageprocessor.h>
+#include <imageprocessor/imageprocessorobserver.h>
+
+using namespace ImageProcessor;
+	
+//Free slots allocated to ensure there is enough memory for future callbacks
+const TInt KCallbackReserveSlots = 20;
+
+CImageProcessorCallback* CImageProcessorCallback::NewL(CImgProcessor& aImageProcessor,MImgProcessorObserver& aObserver)
+	{
+	CImageProcessorCallback* self = new (ELeave) CImageProcessorCallback(aImageProcessor,aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CImageProcessorCallback::CImageProcessorCallback(CImgProcessor& aImageProcessor,MImgProcessorObserver& aObserver):
+   CActive(EPriorityNormal),iProcessor(aImageProcessor),iObserver(aObserver)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CImageProcessorCallback::ConstructL()
+	{
+	iCallbackInfo.ReserveL(KCallbackReserveSlots);
+	}
+
+CImageProcessorCallback::~CImageProcessorCallback()
+	{
+	__ASSERT_ALWAYS(!IsActive(),Cancel());
+	iCallbackInfo.Close();
+	}
+
+void CImageProcessorCallback::AddCallback(TInt aEventId, TUid aUid, TInt aId, TInt aError)
+	{
+	TInt err = iCallbackInfo.Append(TCallbackInfo(aEventId, aUid, aId, aError));
+	if (err == KErrNoMemory) 
+		{
+		iCallbackInfo.Reset();
+		// try to reserve few slots
+		iCallbackInfo.Reserve(KCallbackReserveSlots);
+		iCallbackInfo.Append(TCallbackInfo(aEventId, aUid, aId, KErrNoMemory));
+		iProcessor.Cancel();
+		}
+	SelfComplete();
+	}
+
+void CImageProcessorCallback::SelfComplete()
+	{
+	//Only activate if a request is not already outstanding,
+	//else it will be activated from RunL()
+	if(!IsActive())
+		{
+		TRequestStatus* request = &iStatus;
+		User::RequestComplete(request,KErrNone);
+		SetActive();
+		}
+	}
+   
+void CImageProcessorCallback::RunL()
+	{
+	if(iCallbackInfo.Count())
+		{
+		//Any properies that need to be modified has to be done before the
+		//callbacks. The client may delete the Image Processor in the callback
+		const TCallbackInfo info(iCallbackInfo[0]);
+		iCallbackInfo.Remove(0);
+		EnsureSpace();
+
+		//More requests in the queue
+		__ASSERT_ALWAYS(!iCallbackInfo.Count(),SelfComplete());
+
+		switch(info.iEventId)
+			{
+			case CImgProcessor::EEventInitializingComplete:
+		   		iObserver.ImageProcessorInitializingComplete(iProcessor, info.iError);
+		   		break;
+
+			case CImgProcessor::EEventPreviewInitializingComplete:
+				iObserver.ImageProcessorPreviewInitializingComplete(iProcessor, info.iId, info.iError);
+		   		break;
+		   
+			case CImgProcessor::EEventProcessingComplete:
+		   		iObserver.ImageProcessingComplete(iProcessor, info.iError);
+		   		break;
+		   	
+			case CImgProcessor::EEventPreviewRenderingComplete:
+		   		iObserver.ImageProcessorPreviewRenderingComplete(iProcessor, info.iId, info.iError);
+		   		break;
+		   	
+			default:
+		   		iObserver.ImageProcessorEvent(iProcessor, info.iEventId, info.iUid, info.iId);
+			}
+		}
+	}
+   
+void CImageProcessorCallback::DoCancel()
+	{
+	}
+
+void CImageProcessorCallback::EnsureSpace()
+	{
+	const TInt cnt(iCallbackInfo.Count());
+   //Ignore error. Just a best effort attempt to ensure enough memory in future
+   //Still have some space from granularity	
+	iCallbackInfo.Reserve(cnt+KCallbackReserveSlots);
+	}
+
+CImageProcessorCallback::TCallbackInfo::TCallbackInfo(TInt aEventId, TUid aUid, TInt aId, TInt aError):
+	iEventId(aEventId),
+	iUid(aUid),
+	iId(aId),
+	iError(aError)
+	{
+	}
+//EOF