--- /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__
+