--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingunittest/testcodec/src/TestAsyncConvert.cpp Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,422 @@
+// Copyright (c) 2003-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 <barsc.h>
+#include <barsread.h>
+#include <bautils.h>
+#include <imageconversion.h>
+#include <101F7BF5_extra.rsg>
+
+#include "TestAsyncCodec.h"
+#include "TestAsyncConvert.h"
+
+#include "TestPanic.h"
+#include "TestDecs.h"
+#include "TestUids.hrh"
+
+//_LIT(KTestPanicCategory, "TestAsyncConvertPlugin"); // EABI warning removal
+
+const TInt KDummyFileSize = 100;
+const TInt KDummyHeaderSize = 10;
+const TInt KDummyDataSize = KDummyFileSize - KDummyHeaderSize;
+
+
+//********************************************
+// CTestAsyncDecoder.
+//********************************************
+CTestAsyncDecoder* CTestAsyncDecoder::NewL()
+ {
+ CTestAsyncDecoder* self = new(ELeave) CTestAsyncDecoder();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestAsyncDecoder::CTestAsyncDecoder()
+ {
+ }
+
+void CTestAsyncDecoder::ConstructL()
+ {
+ }
+
+CTestAsyncDecoder::~CTestAsyncDecoder()
+ {
+ delete iScheduler;
+
+ CImageDecoderPlugin::Cleanup();
+ }
+
+void CTestAsyncDecoder::ImageType(TInt aFrameNumber, TUid& aImageType, TUid& aImageSubType) const
+ {
+ __ASSERT_ALWAYS(aFrameNumber == 0, Panic(EFrameNumberOutOfRange));
+ aImageType = KImageTypeTestUid;
+ aImageSubType = KImageSubTypeTestUid;
+ }
+
+void CTestAsyncDecoder::ScanDataL()
+ {
+
+ SetDataLength(10);
+
+
+ if (!iReadHeaders)
+ {
+ TPtrC8 bufferDes;
+ ReadDataL(0, bufferDes, (KDummyHeaderSize));
+ if (bufferDes.Length() < KDummyHeaderSize)
+ User::Leave(KErrUnderflow);
+
+ iReadHeaders = ETrue;
+ SetDataLength(KDummyDataSize);
+
+
+ iDecodeIterations = 0;
+
+ // create the codec
+ delete iImageReadCodec;
+ iImageReadCodec = NULL;
+ iImageReadCodec = CTestAsyncReadCodec::NewL(*this);
+ SetImageReadCodec(iImageReadCodec);
+
+ // create the async decoder
+ delete iScheduler;
+ iScheduler = NULL;
+ iScheduler = new (ELeave) CAsyncScheduler(*this);
+
+ // create a dummy TFrameInfo
+ TFrameInfo imageInfo;
+ imageInfo = ImageInfo();
+ imageInfo.iFrameSizeInTwips.iWidth = 0;
+ imageInfo.iFrameSizeInTwips.iHeight = 0;
+ imageInfo.iFrameCoordsInPixels.SetRect(TPoint(0, 0), TPoint(256, 256));
+ imageInfo.iOverallSizeInPixels = TSize(256, 256);
+ imageInfo.iBitsPerPixel = 24;
+ imageInfo.iDelay = 0;
+ imageInfo.iFlags = TFrameInfo::ECanDither;
+ imageInfo.iFrameDisplayMode = EColor16M;
+ SetImageInfo(imageInfo);
+
+ SetStartPosition(KDummyHeaderSize);
+
+ ReadFrameHeadersL();
+ }
+
+ }
+
+CFrameInfoStrings* CTestAsyncDecoder::FrameInfoStringsL(RFs& aFs, TInt aFrameNumber)
+ {
+ if (aFrameNumber!=0)
+ User::Leave(KErrArgument);
+
+ const TUid testCodecDllUid = {KTestDecoderDllUidValue};
+
+ RResourceFile resourceFile;
+ OpenExtraResourceFileLC(aFs,testCodecDllUid,resourceFile);
+
+ HBufC8* resourceInfo = resourceFile.AllocReadLC(THEDECODERINFO);
+ TResourceReader resourceReader;
+ resourceReader.SetBuffer(resourceInfo);
+
+ TBuf<128> info;
+ TBuf<128> templte;
+
+ CFrameInfoStrings* frameInfoStrings = CFrameInfoStrings::NewLC();
+
+ info = resourceReader.ReadTPtrC();
+ frameInfoStrings->SetDecoderL(info);
+
+ info = resourceReader.ReadTPtrC();
+ frameInfoStrings->SetFormatL(info);
+
+ templte = resourceReader.ReadTPtrC();
+ const TFrameInfo& frameInfo = FrameInfo(aFrameNumber);
+ const TSize& size = frameInfo.iOverallSizeInPixels;
+ info.Format(templte, size.iWidth, size.iHeight);
+ frameInfoStrings->SetDimensionsL(info);
+
+ templte = resourceReader.ReadTPtrC();
+ iMaxValue = 10;
+ info.Format(templte, iMaxValue);
+ frameInfoStrings->SetDepthL(info);
+
+ // leave details blank
+
+ CleanupStack::Pop(frameInfoStrings);
+ CleanupStack::PopAndDestroy(2); // resourceInfo + resourceFile
+ return frameInfoStrings;
+ }
+
+void CTestAsyncDecoder::DoConvert()
+ {
+ const TInt KDecodeIterations = 10;
+
+ TRAPD(errCode, PrepareForProcessFrameL());
+
+ if (errCode!=KErrNone)
+ {
+ RequestComplete(errCode);
+ return;
+ }
+
+ if (iError != KErrNone)
+ {
+ RequestComplete(iError);
+ }
+ // need to get more data from client app ?
+ else if (SourceData().Length() < KDummyDataSize)
+ {
+ RequestComplete(KErrUnderflow);
+ }
+ else if (iDecodeIterations++ > KDecodeIterations)
+ {
+ RequestComplete(iError);
+ }
+ else
+ {
+ iDecodeState = EDecodeInit;
+ iScheduler->Start();
+ SetSelfPending();
+ }
+ }
+
+TInt CTestAsyncDecoder::NumberOfImageComments() const
+ {
+ return 1;
+ }
+
+HBufC* CTestAsyncDecoder::ImageCommentL(TInt /*aCommentNumber*/) const
+ {
+ HBufC* imageComment = HBufC::NewL(20);
+ TPtr ptr(imageComment->Des());
+ ptr.Copy(_L("Test Image Comment 1"));
+ return imageComment;
+ }
+
+TInt CTestAsyncDecoder::NumberOfFrameComments(TInt /*aFrameNumber*/) const
+ {
+ return 1;
+ }
+
+HBufC* CTestAsyncDecoder::FrameCommentL(TInt /*aFrameNumber*/, TInt /*aCommentNumber*/) const
+ {
+ HBufC* frameComment = HBufC::NewL(20);
+ TPtr ptr(frameComment->Des());
+ ptr.Copy(_L("Test Frame Comment 1"));
+ return frameComment;
+ }
+
+void CTestAsyncDecoder::ProcessFrameComplete(TInt aError)
+ {
+ iError = aError;
+ iDecodeState = EDecodeFinished;
+ iScheduler->Start();
+ }
+
+void CTestAsyncDecoder::MasoProcessL(TInt aError)
+ {
+ iError = aError;
+
+ if (aError != KErrNone)
+ {
+ SelfComplete(iError);
+ return;
+ }
+
+ switch(iDecodeState)
+ {
+ case EDecodeInit:
+ iDecodeState = EDecodeInProgress;
+ iScheduler->Start();
+ break;
+
+ case EDecodeInProgress:
+ TRAP(iError, iImageReadCodec->ProcessFrameL(SourceData()));
+ if (iError != KErrNone)
+ {
+ SelfComplete(iError);
+ break;
+ }
+ // now wait for async callback to ProcessFrameComplete...
+ break;
+
+ case EDecodeFinished:
+ SelfComplete(iError);
+ break;
+ }
+
+ }
+
+void CTestAsyncDecoder::Cleanup()
+ {
+ // cancel the state machine
+ if (iScheduler)
+ iScheduler->Cancel();
+
+ CImageDecoderPlugin::Cleanup();
+ }
+
+
+//********************************************
+// CTestAsyncEncoder.
+//********************************************
+CTestAsyncEncoder* CTestAsyncEncoder::NewL()
+ {
+ CTestAsyncEncoder* self = new(ELeave) CTestAsyncEncoder();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestAsyncEncoder::CTestAsyncEncoder()
+ {
+ }
+
+void CTestAsyncEncoder::ConstructL()
+ {
+ }
+
+CTestAsyncEncoder::~CTestAsyncEncoder()
+ {
+ delete iScheduler;
+
+ CImageEncoderPlugin::Cleanup();
+ }
+
+void CTestAsyncEncoder::DoConvert()
+ {
+ const TInt KEncodeIterations = 10;
+
+/*
+ TRAPD(errCode, PrepareForProcessFrameL());
+
+ if (errCode!=KErrNone)
+ {
+ RequestComplete(errCode);
+ return;
+ }
+*/
+ if (iError != KErrNone)
+ {
+ RequestComplete(iError);
+ }
+
+ if (iEncodeIterations++ > KEncodeIterations)
+ {
+ RequestComplete(iError);
+ }
+ else
+ {
+ iEncodeState = EEncodeInit;
+ iScheduler->Start();
+ SetSelfPending();
+ }
+ }
+
+void CTestAsyncEncoder::PrepareEncoderL(const CFrameImageData* /*aFrameImageData*/)
+ {
+ // create the codec
+ delete iImageWriteCodec;
+ iImageWriteCodec = NULL;
+ iImageWriteCodec = CTestAsyncWriteCodec::NewL(*this);
+ SetImageWriteCodec(iImageWriteCodec);
+
+ // create the scheduler
+ delete iScheduler;
+ iScheduler = NULL;
+ iScheduler = new (ELeave) CAsyncScheduler(*this);
+
+ }
+
+void CTestAsyncEncoder::UpdateHeaderL()
+ {
+ }
+
+void CTestAsyncEncoder::ProcessFrameComplete(TInt aError)
+ {
+ iError = aError;
+ iEncodeState = EEncodeFinished;
+ iScheduler->Start();
+ }
+
+void CTestAsyncEncoder::MasoProcessL(TInt aError)
+ {
+ iError = aError;
+
+ if (aError != KErrNone)
+ {
+ SelfComplete(iError);
+ return;
+ }
+
+ switch(iEncodeState)
+ {
+ case EEncodeInit:
+ iEncodeState = EEncodeInProgress;
+ iScheduler->Start();
+ break;
+
+ case EEncodeInProgress:
+ TRAP(iError, iImageWriteCodec->ProcessFrameL(DestinationData()));
+ if (iError != KErrNone)
+ {
+ SelfComplete(iError);
+ break;
+ }
+ // now wait for async callback to ProcessFrameComplete...
+ break;
+
+ case EEncodeFinished:
+ SelfComplete(iError);
+ break;
+ }
+
+ }
+
+void CTestAsyncEncoder::Cleanup()
+ {
+ // cancel the state machine
+ if (iScheduler)
+ iScheduler->Cancel();
+
+ CImageEncoderPlugin::Cleanup();
+ }
+
+
+// CAsyncScheduler
+CAsyncScheduler::CAsyncScheduler(MAsyncSchedulerObserver& aSchedulerObserver) :
+ CActive(CActive::EPriorityIdle), iSchedulerObserver(aSchedulerObserver)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+
+void CAsyncScheduler::Start()
+ {
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete(status, KErrNone);
+ }
+
+void CAsyncScheduler::RunL()
+ {
+ TInt error = iStatus.Int();
+
+ iSchedulerObserver.MasoProcessL(error);
+ }
+
+