imaging/imagingfws/src/ThreadRelay.h
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/src/ThreadRelay.h	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,488 @@
+// Copyright (c) 2001-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:
+// Not for public use
+// Abstract threaded relay between Image{Decoder,Encoder} and Priv object
+// 
+//
+
+#ifndef __THREAD_RELAY_H__
+#define __THREAD_RELAY_H__
+
+#include "GenThreadRelay.h"
+#include "ImageRelay.h"
+#include "iclextproxystubutil.h"
+
+class TCustomSyncParams
+	{
+public:
+	TRequestStatus* iRequestStatus;
+	TInt iParam;
+	};
+
+class TDecodeSetFileParams
+	{
+public:
+	const TDesC* iSourceFilename;
+	CImageDecoder::TOptions iOptions;
+	};
+class TDecodeSetFileHandleParams
+	{
+public:
+	RFile* iFile;
+	CImageDecoder::TOptions iOptions;		
+	};
+
+class TDecodeSetDataParams
+	{
+public:
+	const TDesC8* iSourceData;
+	CImageDecoder::TOptions iOptions;	
+	};
+
+class TDecodeConvertParams
+	{
+public:
+	TRequestStatus* iRequestStatus;
+	TInt iDestinationHandle;
+	TInt iDestinationMaskHandle;
+	TInt iFrameNumber;
+	};
+
+class TEncodeSetFileParams
+	{
+public:
+	const TDesC* iDestinationFilename;
+	CImageEncoder::TOptions iOptions;
+	};
+
+class TEncodeSetFileHandleParams
+	{
+public:
+	RFile* iFile;
+	CImageEncoder::TOptions iOptions;		
+	};
+
+class TEncodeSetDataParams
+	{
+public:
+	HBufC8** iDestinationData;
+	CImageEncoder::TOptions iOptions;	
+	};
+
+class TEncodeConvertParams
+	{
+public:
+	TRequestStatus* iRequestStatus;
+	TInt iSourceHandle;
+	const CFrameImageData* iFrameImageData;
+	};
+
+class CBufferCopyListener; // declared here
+/**
+ *
+ * This class is not for public use
+ * To avoid simultaneous update problems on buffer copy on descriptors,
+ * this will be done in the main thread. This AO wait for buffer copy requests
+ * and do the copy in the main thread.
+ *
+ */
+NONSHARABLE_CLASS( CBufferCopyListener ): public CActive
+	{
+public:
+	static CBufferCopyListener* NewL(const RThread* aSubThread);
+	virtual ~CBufferCopyListener();
+
+	void CopyBufferToDescriptor(TRequestStatus& aCallerStatus, TDes8& aBuffer, const TDesC8& aSource, TInt aPosition, TInt aSize);
+
+protected:
+	//From CActive
+	void RunL();
+	void DoCancel();
+
+private:
+	CBufferCopyListener(const RThread* aSubThread);
+	void Prime();
+	void DoBufferCopy();
+
+private:
+	TRequestStatus* iCallerStatus; //not owned
+	TDes8* iBuffer; //not owned
+	const TDesC8* iSource; //not owned
+	TInt iPosition;
+	TInt iSize;
+	const RThread* iSubThread; //not owned
+	};
+
+/**
+ *
+ * This class is not for public use
+ * Implement client side thread interface for threaded De/Encoding
+ *
+ */
+class CImageConvOperationStub;
+class CImageConvScalerStub;
+class CImageConvStreamedDecodeStub;
+class CThreadDecoderRelay;
+class CSubThreadDecoderRelay; // declared here
+NONSHARABLE_CLASS( CSubThreadDecoderRelay ): public CSubThreadRelay,
+							                 public MImageDecoderPrivSupport
+	{
+public:
+	enum TFunctionCode
+		{
+		EFunctionTerminate = KTerminationFunction,
+		EFunctionCancel,
+		EFunctionSetFile,
+		EFunctionSetData,
+		EFunctionContinueHeader,
+		EFunctionConvert,
+		EFunctionConvertMask,
+		EFunctionContinueConvert,
+		EFunctionHandleNewImage,
+		EFunctionCustomSync,
+		EFunctionCustomAsync,
+		EFunctionSetFileHandle,
+		EFunctionGetExtension,
+		EFunctionExecuteCommandL,
+		EFunctionExecuteAsyncCommand
+		};
+
+public:
+	static CSubThreadRelay* NewL(TThreadId aMainThreadId, TAny* aDecoderParam);
+	virtual ~CSubThreadDecoderRelay();
+
+	void SetFunctionInProgress();
+	void ResetFunctionInProgress();
+
+	void AbortDecode();
+	void CancelBody();
+
+	TInt FrameCount() const;
+
+	void SetFileL(const TDesC& aSourceFilename, const CImageDecoder::TOptions aOptions);
+	void SetFileL(RFile& aFile, const CImageDecoder::TOptions aOptions);
+	void SetDataL(const TDesC8& aSourceData, const CImageDecoder::TOptions aOptions);
+
+	void ContinueProcessingHeaderL();
+
+	void Convert(TRequestStatus* aRequestStatus, TInt aDestinationHandle, TInt aFrameNumber);
+	void Convert(TRequestStatus* aRequestStatus, TInt aDestinationHandle, TInt aDestinationMaskHandle, TInt aFrameNumber);
+	void ContinueConvert(TRequestStatus* aRequestStatus);
+
+	void HandleNewlyOpenedImageL();
+
+	void CustomSyncL(TInt aParam);
+	void CustomAsync(TRequestStatus* aRequestStatus, TInt aParam);
+	
+	void GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr);
+	void HandleExecuteCommandL(TExecuteCommandParamsBase& aExecuteCommandBase);
+	void HandleExecuteAsyncCommand(TExecuteCommandParamsAsyncBase& aExecuteCommandBase);
+
+	//From MImageDecoderPrivSupport
+	TBool MustUseBufferWithDescriptor() const;
+	void CopyBufferToDescriptor(TDes8& aBuffer, const TDesC8& aSource, TInt aPosition, TInt aSize);
+	TBool AmInThread() const;
+	TBool ShouldAbort() const;
+	void Lock();
+	void Unlock();
+	void SaveFrameCount(TInt aFrameCount);
+
+	//From MImageDecoderPriv
+	void SetIntent(TIntent aIntent);
+	void SetUniqueIdL(const TDesC& aUniqueId);
+	TInt SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue);
+
+protected:
+	//From CThreadRelay
+	void RunFunctionL(TInt aFunctionCode, TAny* aParameters);
+
+private:
+	CSubThreadDecoderRelay(CBufferCopyListener* aBufferCopyListener);
+	void ConstructL(TThreadId aMainThreadId, CImageDecodeConstruct* aConstruct);
+
+private:
+	CImageDecoderPriv* iBody;
+
+	CFbsBitmap* iDestination; //Duplicate the client bitmap in this thread
+	CFbsBitmap* iDestinationMask; //Duplicate the client mask bitmap in this thread
+	RFs iFileSession; //This thread uses its own file session
+	TInt iFrameCount;
+	TBool iAbortDecode;
+	RMutex iFrameTableMutex;
+
+	RMutex iBufferCopyMutex;
+	TBool iFunctionCallInProgress; //ETrue if a function call to this thread is in progress
+
+	CBufferCopyListener* iBufferCopyListener; //not owned 
+
+	TRequestStatus* iCallerStatus; //not owned
+	TDes8* iBuffer; //not owned
+	const TDesC8* iSource; //not owned
+	TInt iPosition;
+	TInt iSize;
+	
+	// Framework Extension stubs
+	RPointerArray<CImageConvStubBase> iStubs;
+	
+friend class CThreadDecoderRelay;
+	};
+
+/**
+ *
+ * This class is not for public use
+ * Implement client side thread interface for threaded De/Encoding
+ *
+ */
+class CThreadEncoderRelay;
+class CSubThreadEncoderRelay;
+NONSHARABLE_CLASS( CSubThreadEncoderRelay ): public CSubThreadRelay,
+							                 public MImageEncoderPrivSupport
+	{
+public:
+	enum TFunctionCode
+		{
+		EFunctionTerminate = KTerminationFunction,
+		EFunctionCancel,
+		EFunctionSetFile,
+		EFunctionSetData,
+		EFunctionConvert,
+		EFunctionCustomSync,
+		EFunctionCustomAsync,
+		EFunctionSetFileHandle,
+		EFunctionGetExtension,
+		EFunctionExecuteCommandL,
+		EFunctionExecuteAsyncCommand
+		};
+
+public:
+	static CSubThreadRelay* NewL(TThreadId aMainThreadId, TAny* aEncoderParam);
+	virtual ~CSubThreadEncoderRelay();
+
+	void AbortEncode();
+	void CancelBody();
+
+	void SetFileL(const TDesC& aDestinationFilename, const CImageEncoder::TOptions aOptions);
+	void SetFileL(RFile& aFile, const CImageEncoder::TOptions aOptions);
+	void SetDataL(HBufC8*& aDestinationData, const CImageEncoder::TOptions aOptions);
+	void Convert(TRequestStatus* aRequestStatus, TInt aSourceHandle, const CFrameImageData* aFrameImageData);
+
+	void CustomSyncL(TInt aParam);
+	void CustomAsync(TRequestStatus* aRequestStatus, TInt aParam);
+	
+	void GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr);
+	void HandleExecuteCommandL(TExecuteCommandParamsBase& aExecuteCommandBase);
+	void HandleExecuteAsyncCommand(TExecuteCommandParamsAsyncBase& aExecuteCommandBase);
+
+	//From MImageEncoderPrivSupport
+	TBool AmInThread() const;
+	TBool ShouldAbort() const;
+
+protected:
+	virtual void RunFunctionL(TInt aFunctionCode, TAny* aParameters);
+
+private:
+	CSubThreadEncoderRelay();
+	void ConstructL(TThreadId aMainThreadId, CImageEncodeConstruct* aConstruct);
+
+private:
+	CImageEncoderPriv* iBody;
+
+	CFbsBitmap* iSource;
+	RFs iFileSession; //This thread use its own file session
+	TBool iAbortEncode;
+	
+	// Framework Extension stubs
+	RPointerArray<CImageConvStubBase> iStubs;
+
+friend class CThreadEncoderRelay;
+	};
+
+class CThreadDecoderRelay;
+/**
+ *
+ * This class is not for public use
+ * Implement client side thread interface for threaded Decoding
+ *
+ */
+NONSHARABLE_CLASS( CThreadDecoderRelay ): public CThreadRelay,
+							              public MImageDecoderRelay,
+							              public MImageConvExtensionThreadedSupport
+	{
+public:
+	static CThreadDecoderRelay* NewL(CImageDecodeConstruct* aConstruct);
+	virtual ~CThreadDecoderRelay();
+
+	//From MImageDecoderRelay
+	void Cancel();
+
+	void SetFileL(RFs& aFs, const TDesC& aSourceFilename, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone);
+	void SetFileL(RFile& name, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone);
+	void SetDataL(RFs& aFs, const TDesC8& aSourceData, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone);
+
+	CImageDecoderPlugin* Plugin() const;
+
+	void HandleNewlyOpenedImageL();
+
+	void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, TInt aFrameNumber);
+	void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, CFbsBitmap& aDestinationMask, TInt aFrameNumber = 0);
+	void ContinueConvert(TRequestStatus* aRequestStatus);
+
+	void ContinueProcessingHeaderL();
+
+	const TFrameInfo& FrameInfo(TInt aFrameNumber) const;
+	CFrameInfoStrings* FrameInfoStringsLC(TInt aFrameNumber);
+
+	TUid ImplementationUid() const;
+
+	TInt FrameCount() const;
+	TBool IsImageHeaderProcessingComplete() const;
+	const CFrameImageData& FrameData(TInt aFrameNumber) const;
+
+	TInt NumberOfImageComments() const;
+	HBufC* ImageCommentL(TInt aCommentNumber) const;
+	TInt NumberOfFrameComments(TInt aFrameNumber) const;
+	HBufC* FrameCommentL(TInt aFrameNumber, TInt aCommentNumber) const;
+
+	// custom command support
+	void CustomSyncL(TInt aParam);
+	void CustomAsync(TRequestStatus* aRequestStatus, TInt aParam);
+
+	void TransferConstructOwnership();
+
+	void SetIntent(TIntent aIntent);
+	void SetUniqueIdL(const TDesC& aUniqueId);
+	TInt SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue);
+	
+	void SetImageTypeL(TInt aImageType);
+
+	TInt ReductionFactor(const TSize& aOriginalSize, const TSize& aReducedSize) const;
+	TInt ReducedSize(const TSize& aOriginalSize, TInt aReductionFactor, TSize& aReducedSize) const;
+	
+	TInt SetDecoderThreadPriority(TThreadPriority aPriority);
+	
+	// from MImageDecoderRelay
+	void GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr);
+	void SetClippingRectL(const TRect* aClipRect);
+	TInt GetDestinationSize(TSize& aSize, TInt aFrameNumber = 0);
+	CImageConvExtensionCache& ExtensionCache();
+	
+	// from MImageConvExtensionThreadedSupport
+	void ExecuteCommand(TExecuteCommandParamsBase& aExecuteCommandBase);
+	void ExecuteCommandL(TExecuteCommandParamsBase& aExecuteCommandBase);
+	void ExecuteAsyncCommand(TExecuteCommandParamsBase& aExecuteCommandBase);
+
+	
+private:
+	CThreadDecoderRelay(CImageDecodeConstruct* aConstruct);
+	void ConstructL();
+
+	void RunFunction(TInt aFunctionCode, TAny* aParameters);
+	void RunFunctionL(TInt aFunctionCode, TAny* aParameters);
+
+private:
+	CSubThreadDecoderRelay* iSubThreadDecoderRelay; //not owned
+	CImageDecoderPriv* iBody; //not owned (for straight calls)
+	TInt iOwnConstruct;
+	CImageDecodeConstruct* iConstruct;
+	CBufferCopyListener* iBufferCopyListener; //AO in main thread that listen for requests from sub thread
+	CImageConvExtensionCache* iExtensionCache;
+	};
+
+class CThreadEncoderRelay;
+/**
+ *
+ * This class is not for public use
+ * Implement client side thread interface for threaded Encoding
+ *
+ */
+NONSHARABLE_CLASS( CThreadEncoderRelay ): public CThreadRelay,
+							              public MImageEncoderRelay,
+							              public MImageConvExtensionThreadedSupport
+	{
+public:
+	static CThreadEncoderRelay* NewL(CImageEncodeConstruct* aConstruct);
+	virtual ~CThreadEncoderRelay();
+
+	//From MImageEncoderRelay
+	void Cancel();
+
+	void SetFileL(RFs& aFs, const TDesC& aDestinationFilename, const CImageEncoder::TOptions aOptions);
+	void SetFileL(RFile& name, const CImageEncoder::TOptions aOptions);
+	void SetDataL(HBufC8*& aDestinationData, const CImageEncoder::TOptions aOptions);
+
+	CImageEncoderPlugin* Plugin() const;
+
+	void Convert(TRequestStatus* aRequestStatus, const CFbsBitmap& aSource, const CFrameImageData* aFrameImageData);
+
+	TUid ImplementationUid() const;
+	
+	// Framework extension
+	void GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr);
+	CImageConvExtensionCache& ExtensionCache();
+
+	// custom command support
+	void CustomSyncL(TInt aParam);
+	void CustomAsync(TRequestStatus* aRequestStatus, TInt aParam);
+
+	void TransferConstructOwnership();
+
+	void SetThumbnail(TBool aDoGenerateThumbnail);
+
+	TInt SetEncoderThreadPriority(TThreadPriority aPriority);
+	
+	// from MImageConvExtensionThreadedSupport
+	void ExecuteCommand(TExecuteCommandParamsBase& aExecuteCommandBase);
+	void ExecuteCommandL(TExecuteCommandParamsBase& aExecuteCommandBase);
+	void ExecuteAsyncCommand(TExecuteCommandParamsBase& aExecuteCommandBase);
+	
+private:
+	CThreadEncoderRelay(CImageEncodeConstruct* aConstruct);
+	void ConstructL();
+
+	void RunFunction(TInt aFunctionCode, TAny* aParameters);
+	void RunFunctionL(TInt aFunctionCode, TAny* aParameters);
+
+private:
+	TInt iOwnConstruct;
+	CImageEncodeConstruct* iConstruct;
+	CSubThreadEncoderRelay* iSubThreadEncoderRelay; //Not owned
+	CImageEncoderPriv* iBody; //not owned (for straight calls)
+	CImageConvExtensionCache* iExtensionCache;
+	};
+
+/**
+ *
+ * This class is not for public use
+ *
+ */
+class TThreadDecoderRelayParam
+	{
+public:
+	CImageDecodeConstruct* iConstruct;
+	CBufferCopyListener* iBufferCopyListener;
+	};
+
+/**
+ *
+ * This class is not for public use
+ *
+ */
+class TThreadEncoderRelayParam
+	{
+public:
+	CImageEncodeConstruct* iConstruct;
+	};
+
+#endif // __THREAD_RELAY_H__
+