imaging/imagingfws/src/ImagePlugin.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/src/ImagePlugin.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,1387 @@
+// 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:
+//
+
+#include <bitdev.h>
+#include <bautils.h>
+#include <barsc.h>
+#include "ImageConversion.h"
+#include "ImageClientMain.h"
+#include "ImageConversionPriv.h"
+#include "icl/ImagePlugin.h"
+#include "icl/ImageConstruct.h"
+#include "EnDecoderUtils.h"
+
+/**
+Constructor for this class.
+*/
+EXPORT_C CImageDecoderPlugin::CImageDecoderPlugin()
+	{
+	}
+
+/**
+Destructor for this class.
+*/
+EXPORT_C CImageDecoderPlugin::~CImageDecoderPlugin()
+	{
+	}
+
+/**
+Called when the plugin is destroyed or a decode is cancelled. This may be
+overriden in derived classes.
+
+Note:
+Derived classes must call this version after performing any plugin
+specific cleanup.
+*/
+EXPORT_C void CImageDecoderPlugin::Cleanup()
+	{
+	if(ValidProperties())
+		iProperties->Cleanup();
+	}
+
+/**
+Initialises data structures prior to decoding a frame.
+
+This function may be overriden in derived classes. Any override should also
+call this version after performing any plugin initialistion.
+*/
+EXPORT_C void CImageDecoderPlugin::InitConvertL()
+	{
+	ASSERT(ValidProperties());
+	iProperties->InitConvertL();
+	}
+/**
+Forces initialization of data structures prior to decoding a frame.
+
+@param	aFrameNumber
+        The frame in a multi-frame image to decode.
+*/
+EXPORT_C void CImageDecoderPlugin::RequestInitL(TInt aFrameNumber)
+	{
+	ASSERT(ValidProperties());
+	iProperties->RequestInitL(aFrameNumber);
+	}
+
+/**
+Performs a decode step. This effectively forms the RunL() call of the decoder.
+
+This call may be overriden in derived classes. However, if this
+the case, then if the custom decode is not performed and the derived class should
+either ensure that this base class's version is called or should completely replace
+the base class's version calling PrepareForProcessFrameL(), ProcessFrameL() and
+HandleProcessFrameResult() as appropriate. Unlike the standard version, an override
+instance may choose to spread these calls over several RunL() instances.
+*/
+EXPORT_C void CImageDecoderPlugin::DoConvert()
+	{
+	ASSERT(ValidProperties());
+	iProperties->DoConvert();
+	}
+
+/**
+Initialises system for ProcessFrameL(). This reads in a new buffer for ProcessFrameL().
+*/
+EXPORT_C void CImageDecoderPlugin::PrepareForProcessFrameL()
+	{
+	ASSERT(ValidProperties());
+	iProperties->PrepareForProcessFrameL();
+	}
+
+/**
+Deals with result from ProcessFrameL(). This function processes the results of the standard
+ProcessFrameL() call, feeding in the resultant error code from its TRAP and the status result.
+It will call RequestComplete() or SelfComplete() as appropriate.
+
+Note that if no data was consumed by ProcessFrameL(), HandleProcessFrameResult() assumes that
+it requires more data and calls RequestComplete(KErrUnderflow). If this is not appropriate, an
+overloaded DoConvert() should be made to handle it.
+
+@param  aErrCode
+        The error result of TRAP arround ProcessFrameL().
+@param  aCodecState
+        The result of ProcessFrameL() itself.
+*/
+
+EXPORT_C void CImageDecoderPlugin::HandleProcessFrameResult(TInt aErrCode, TFrameState aCodecState)
+	{
+	ASSERT(ValidProperties());
+	iProperties->HandleProcessFrameResult(aErrCode, aCodecState);
+	}
+
+/**
+Value to be fed to CImageReadCodec::ProcessFrameL().
+
+This value is setup by PrepareForProcessFrameL() - it returns the value that will be
+fed to CImageReadCodec::ProcessFrameL(), and will be used by codecs that fully override
+DoConvert().
+*/
+EXPORT_C TBufPtr8& CImageDecoderPlugin::SourceData()
+	{
+	ASSERT(ValidProperties());
+	return iProperties->SourceData();
+	}
+
+
+
+/**
+Returns the plugin's read codec.
+
+@return Pointer to the plugin's read codec.
+*/
+EXPORT_C CImageReadCodec* CImageDecoderPlugin::ImageReadCodec() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ImageReadCodec();
+	}
+
+/**
+Sets the plugin's read codec. Ownership of the codec is transferred to the plugin.
+
+@param  aImageReadCodec
+        Pointer to the codec.
+*/
+EXPORT_C void CImageDecoderPlugin::SetImageReadCodec(CImageReadCodec* aImageReadCodec)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetImageReadCodec(aImageReadCodec);
+	}
+
+/**
+Returns the maximum number of bytes of data that can be decoded.
+
+@return The maximum number of bytes of data.
+*/
+EXPORT_C TInt CImageDecoderPlugin::DataLength() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->DataLength();
+	}
+
+/**
+Sets the maximum number of bytes of data that can be decoded.
+
+@param  aDataLength
+        The maximum number of bytes of data.
+*/
+EXPORT_C void CImageDecoderPlugin::SetDataLength(TInt aDataLength)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetDataLength(aDataLength);
+	}
+
+/**
+Returns the starting position of the frame to be decoded.
+
+@return The starting position.
+*/
+EXPORT_C TInt CImageDecoderPlugin::StartPosition() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->StartPosition();
+	}
+
+/**
+Sets the starting position of the frame to be decoded.
+
+@param  aStartPosition
+        The starting position in the data.
+*/
+EXPORT_C void CImageDecoderPlugin::SetStartPosition(TInt aStartPosition)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetStartPosition(aStartPosition);
+	}
+
+/**
+Returns the image data block for the specified index.
+
+@param	aIndex
+        The index of the image data block to return.
+
+@return The image data block.
+*/
+EXPORT_C const TImageDataBlock* CImageDecoderPlugin::ImageData(TInt aIndex) const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ImageData(aIndex);
+	}
+
+/**
+Inserts an image data block into the internally held array at the specified position.
+
+@param  aEntry
+        Pointer to the image data block to be inserted.
+@param  aPos
+        The position within the arrary to insert the data block.
+
+@return KErrNone if the insertion was successful, otherwise a system
+        wide error code.
+*/
+EXPORT_C TInt CImageDecoderPlugin::InsertImageData(const TImageDataBlock* aEntry, TInt aPos)
+	{
+	ASSERT(ValidProperties());
+	return iProperties->InsertImageData(aEntry, aPos);
+	}
+
+/**
+Removes a specified image data block from the internally held array.
+
+@param  aPos
+        The index of the image data block to be removed.
+*/
+EXPORT_C void CImageDecoderPlugin::RemoveImageData(TInt aPos)
+	{
+	ASSERT(ValidProperties());
+	iProperties->RemoveImageData(aPos);
+	}
+
+/**
+Appends a new image data data block to the end of the internally held array.
+
+@param  aEntry
+        The image data block to be appended.
+
+@return An error code indicating if the function call was successful. KErrNone on success, otherwise
+        another of the system-wide error codes.
+*/
+EXPORT_C TInt CImageDecoderPlugin::AppendImageData(const TImageDataBlock* aEntry)
+	{
+	ASSERT(ValidProperties());
+	return iProperties->AppendImageData(aEntry);
+	}
+
+/**
+Returns the number of image data blocks present in the image data.
+
+@return The number of blocks.
+*/
+EXPORT_C TInt CImageDecoderPlugin::ImageDataCount() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ImageDataCount();
+	}
+
+/**
+Appends a new image data buffer to the end of the internally held array
+
+@param  aImageBuffer
+        The data buffer to append.
+
+@return An error code indicating if the function call was successful. KErrNone on success, otherwise
+        another of the system-wide error codes.
+*/
+EXPORT_C TInt CImageDecoderPlugin::AppendImageDataBuffer(const HBufC8* aImageBuffer)
+	{
+	ASSERT(ValidProperties());
+	return iProperties->AppendImageDataBuffer(aImageBuffer);
+	}
+
+/**
+Returns the number of frames to be decoded.
+
+@return The number of frames.
+*/
+EXPORT_C TInt CImageDecoderPlugin::NumberOfFrames() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->NumberOfFrames();
+	}
+
+/**
+Returns the current position within the data.
+
+@return The current position.
+*/
+EXPORT_C TInt CImageDecoderPlugin::Position() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->Position();
+	}
+
+/**
+Sets the current position in the data.
+
+@param  aPosition
+        The current position in the data.
+*/
+EXPORT_C void CImageDecoderPlugin::SetPosition(const TInt aPosition)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetPosition(aPosition);
+	}
+
+/**
+Must be called on completion of decoding the image data.
+
+@param  aReason
+        KErrNone should be returned if the decoding completes successfully. If the
+		request fails an appropriate error code should be returned.
+
+@see    CImageDecoderPlugin::SelfComplete(TInt aReason)
+*/
+EXPORT_C void CImageDecoderPlugin::RequestComplete(TInt aReason)
+	{
+	ASSERT(ValidProperties());
+	iProperties->RequestComplete(aReason);
+	}
+
+/**
+Must be called at the end of a slice of decoding.
+
+If successful specify KErrNone that results in a repeat call to DoConvert().
+
+@param  aReason
+        The error code giving the reason for completion, or KErrNone
+        if no error occurred.
+
+@see    CImageDecoderPlugin::RequestComplete(TInt aReason)
+*/
+EXPORT_C void CImageDecoderPlugin::SelfComplete(TInt aReason)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SelfComplete(aReason);
+	}
+
+/**
+May be called at the start of a slice of decoding if the decoding
+is expected to complete asynchronously. This sets the AO in CImageDecoderPriv
+to active, but does not complete the request.
+
+When decoding of the slice is complete, there must be a call to SelfComplete().
+
+@see    CImageDecoderPlugin::SelfComplete(TInt aReason)
+*/
+EXPORT_C void CImageDecoderPlugin::SetSelfPending(void)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetSelfPending();
+	}
+
+_LIT(KResourcePath,"\\Resource\\ICL\\");
+
+_LIT(KExtraResourceExtension,"_extra.rsc");
+
+/**
+Locates the extra resource file for the decoder aUid_extra.rsc, opens
+the resource file and pushes it on the cleanup stack.
+
+If the resource file is not found the method leaves with KErrNotFound.
+If more than one resource file is found, only the first one is opened.
+
+@param	aFs
+      	A reference to the file server.
+@param	aUid
+      	The decoder's UID.
+@param	aResourceFile
+      	A reference to the opened resource file.
+*/
+EXPORT_C void CImageDecoderPlugin::OpenExtraResourceFileLC(RFs& aFs, const TUid aUid, RResourceFile& aResourceFile) const
+	{
+	// Build the extra resource file name from the uid
+	TFileName fileName;
+
+	TUid implementationUid = iProperties->ImplementationUid();
+	CImplementationInformationType* implementationInformation = CImplementationInformationType::NewLC();
+	ImageEnDecoderUtils::DoGetImplementationInformationL(KImageDecoderInterfaceUid, *implementationInformation, implementationUid);
+
+	fileName.Copy(implementationInformation->Drive().Name());
+	CleanupStack::PopAndDestroy(implementationInformation);
+	
+
+	fileName.Append(KResourcePath);
+	fileName.AppendNum(aUid.iUid,EHex);
+	fileName.Append(KExtraResourceExtension);
+
+	// Get the locale specific file
+	BaflUtils::NearestLanguageFile(aFs,fileName);
+
+	aResourceFile.OpenL(aFs,fileName);
+
+	CleanupClosePushL(aResourceFile);
+	}
+
+/**
+Reads a block of data into an internal buffer.
+
+A block of data of size aLength is read from the position specified by aPosition
+to an internal data buffer. After a successful read, aReadBuffer is set to point to
+the internal buffer.
+
+If an attempt is made to read past the end of data, all available data is read and the
+descriptors length will indicate the actual number of bytes read.
+
+@param  aPosition
+        The start position from where data will be read.
+@param  aReadBuffer
+        Upon completion of a successful call, points to the internal buffer containing
+        the data read from the source.
+@param  aLength
+        The size in bytes of the block of data to be read.
+*/
+EXPORT_C void CImageDecoderPlugin::ReadDataL(TInt aPosition, TPtrC8& aReadBuffer, TInt aLength)
+	{
+	ASSERT(ValidProperties());
+	iProperties->ReadDataL(aPosition, aReadBuffer, aLength);
+	}
+
+/**
+Returns image information such as colour depth, scaling support etc.
+
+@return Image information.
+*/
+EXPORT_C const TFrameInfo& CImageDecoderPlugin::ImageInfo() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ImageInfo();
+	}
+
+/**
+Sets the image information.
+
+@param  aImageInfo
+        The image information.
+*/
+EXPORT_C void CImageDecoderPlugin::SetImageInfo(const TFrameInfo& aImageInfo)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetImageInfo(aImageInfo);
+	}
+
+/**
+Returns the number of comments attatched to the image.
+
+Some image formats allow comments to be attached to the entire image, others allow
+comments to be attached to individual frames within the image. Use this function to
+retrieve the number of comments in the image. Use NumberOfFrameComments() for the
+frame equivalent.
+
+@return The number of comments attatched to the image.
+*/
+EXPORT_C TInt CImageDecoderPlugin::NumberOfImageComments() const
+	{
+	__ASSERT_ALWAYS(IsImageHeaderProcessingComplete(), Panic(EHeaderProcessingNotComplete));
+	return 0;
+	}
+
+/**
+Returns a particular comment attatched to the image.
+Ownership of the returned buffer is transferred to the caller.
+
+@param  aCommentNumber
+        The comment number.
+
+@return A buffer containing the specified comment.
+*/
+EXPORT_C HBufC* CImageDecoderPlugin::ImageCommentL(TInt /* aCommentNumber */) const
+	{
+	__ASSERT_ALWAYS(IsImageHeaderProcessingComplete(), Panic(EHeaderProcessingNotComplete));
+	Panic(ECommentsNotSupported);
+	return NULL;
+	}
+
+/**
+Returns the number of comments attatched to a given frame of the image.
+
+Use NumberOfImageComments() for the image equivalent.
+
+@param  aFrameNumber
+        The frame number.
+
+@return The number of comments attatched to a given frame of the image.
+*/
+EXPORT_C TInt CImageDecoderPlugin::NumberOfFrameComments(TInt aFrameNumber) const
+	{
+	ASSERT(ValidProperties());
+	__ASSERT_ALWAYS(IsImageHeaderProcessingComplete(), Panic(EHeaderProcessingNotComplete));
+	__ASSERT_ALWAYS((aFrameNumber >= 0) && (aFrameNumber < iProperties->FrameCount()), Panic(EFrameNumberOutOfRange));
+	return 0;
+	}
+
+/**
+Returns a particular comment attatched to a given frame of the image.
+
+Ownership of the returned buffer is transferred to the caller.
+
+@param  aFrameNumber
+        The index of the frame containing the comments.
+@param  aCommentNumber
+        The index of the comment to retrieve from the specified frame.
+
+@return A buffer containing the specified comment.
+*/
+EXPORT_C HBufC* CImageDecoderPlugin::FrameCommentL(TInt aFrameNumber, TInt /*aCommentNumber*/) const
+	{
+	ASSERT(ValidProperties());
+	__ASSERT_ALWAYS(IsImageHeaderProcessingComplete(), Panic(EHeaderProcessingNotComplete));
+	__ASSERT_ALWAYS((aFrameNumber >= 0) && (aFrameNumber < iProperties->FrameCount()), Panic(EFrameNumberOutOfRange));
+	Panic(ECommentsNotSupported);
+	return NULL;
+	}
+
+/**
+Invokes the ReadFrameHeadersL method of the supplied plugin which
+should process the frame headers contained within the image.
+*/
+EXPORT_C void CImageDecoderPlugin::ReadFrameHeadersL()
+	{
+	ASSERT(ValidProperties());
+	iProperties->ReadFrameHeadersL();
+	}
+
+/**
+Returns the block size used in the specified frame's header.
+Always returns 4096 regardless of the frame number specified.
+Should be overriden by codecs that use larger blocks.
+
+@param  aFrameNumber
+        The frame to which the header block size information applies.
+
+@return The returned frame header block size (always 4096).
+*/
+EXPORT_C TInt CImageDecoderPlugin::FrameHeaderBlockSize(TInt /*aFrameNumber*/) const
+	{
+	return 4096;
+	}
+
+/**
+Returns the block size used in the specified frame.
+Always returns 4096 regardless of the frame number specified.
+Should be overriden by codecs that use larger blocks.
+
+@param  aFrameNumber
+        The frame to which the block size information applies.
+
+@return The returned frame block size (always 4096).
+*/
+EXPORT_C TInt CImageDecoderPlugin::FrameBlockSize(TInt /*aFrameNumber*/) const
+	{
+	return 4096;
+	}
+
+/**
+Returns the destination bitmap.
+
+@return A reference to the destination bitmap.
+*/
+EXPORT_C const CFbsBitmap& CImageDecoderPlugin::Destination() const
+	{
+	ASSERT(ValidProperties());
+	ASSERT(ValidDestination());
+	return iProperties->Destination();
+	}
+
+/**
+Returns the validity of the destination bitmap.
+
+@return A boolean indicating if the destination bitmap is valid. ETrue if the destination bitmap 
+        is valid, EFalse otherwise.
+*/
+EXPORT_C TBool CImageDecoderPlugin::ValidDestination() const
+	{
+	return iProperties->ValidDestination();
+	}
+
+/**
+Returns the destination bitmap mask.
+
+@return A reference to the destination bitmap mask.
+*/
+EXPORT_C const CFbsBitmap& CImageDecoderPlugin::DestinationMask() const
+	{
+	ASSERT(ValidProperties());
+	ASSERT(ValidDestinationMask());
+	return iProperties->DestinationMask();
+	}
+
+/**
+Indicates if the destination bitmap mask is valid.
+
+@return A boolean indicating if the destination bitmap is valid. ETrue if the destination bitmap 
+        mask is valid, otherwise EFalse.
+*/
+EXPORT_C TBool CImageDecoderPlugin::ValidDestinationMask() const
+	{
+	return iProperties->ValidDestinationMask();
+	}
+
+
+/**
+Paints the entire bitmap aBitmap with the color supplied as aColor.
+
+@param     aBitmap
+           A reference to a fully constructed bitmap.
+@param     aColor
+           The color to use for painting.
+*/
+EXPORT_C void CImageReadCodec::ClearBitmapL(CFbsBitmap& aBitmap, TRgb aColor)
+	{
+	if (aBitmap.Handle())
+		{
+		if(aBitmap.ExtendedBitmapType()!=KNullUid)
+		    {
+		    User::Leave(KErrNotSupported);
+		    }
+		CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(&aBitmap);
+		CleanupStack::PushL(device);
+		CFbsBitGc* gc = NULL;
+		User::LeaveIfError(device->CreateContext(gc));
+		
+		// with alpha channel addition, the best way to paint an entire 
+		// bitmap is to set the draw mode to WriteAlpha
+		TDisplayMode mode = aBitmap.DisplayMode();
+		if( mode == EColor16MA || mode == EColor16MAP )
+			{
+			gc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);	
+			}
+
+		gc->SetBrushColor(aColor);
+		gc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+		gc->Clear();
+		delete gc;
+		CleanupStack::PopAndDestroy(); // device
+		}
+	}
+
+/**
+Checks that the constructed decoder is valid.
+
+This function is internal and not intended for use.
+
+@return A boolean indicating if the decoders construction is valid. ETrue if valid, EFalse otherwise.
+*/
+TBool CImageDecoderPlugin::ValidProperties() const
+	{
+	return iProperties != NULL;
+	}
+
+/**
+Returns the status of header processing. If the processing is incomplete or not
+terminated correctly EFalse will be returned
+
+@return The header processing status.
+*/
+EXPORT_C TBool CImageDecoderPlugin::IsImageHeaderProcessingComplete() const
+	{
+	return iProperties->IsImageHeaderProcessingComplete();
+	}
+
+/**
+Returns the frame info for a specified frame of the image.
+
+This function can be called immediately after the call to create the decoder,
+thus enabling the caller to know about each frame in advance of decoding it.
+
+@param  aFrameNumber
+        The frame number for which information is requested (Optional, defaults to 0).
+
+@return The information for the specified frame.
+*/
+EXPORT_C const TFrameInfo& CImageDecoderPlugin::FrameInfo(TInt aFrameNumber) const
+	{
+	// Return the frame info for a particular frame
+	ASSERT(ValidProperties());
+	return iProperties->FrameInfo(aFrameNumber);
+	}
+
+/**
+Returns the frame data for a specified frame of the image.
+
+@param  aFrameNumber
+        The frame number from which to retreive the frame data (Optional, defaults to 0).
+
+@return The data for the specified frame.
+ */
+EXPORT_C const CFrameImageData& CImageDecoderPlugin::FrameData(TInt aFrameNumber) const
+	{
+	// Return the frame image data for a particular frame.
+	ASSERT(ValidProperties());
+	return iProperties->FrameData(aFrameNumber);
+	}
+
+/**
+Returns the length of the source data in bytes.
+
+@return The length of the source data.
+*/
+EXPORT_C TInt CImageDecoderPlugin::SourceLength() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->SourceLength();
+	}
+
+/**
+This function must be called on completion of encoding the image data.
+
+@param  aReason
+        The error code giving the reason for completion, or KErrNone
+        if no error occurred.
+
+@see    CImageEncoderPlugin::SelfComplete(TInt aReason)
+*/
+EXPORT_C void CImageEncoderPlugin::RequestComplete(TInt aReason)
+	{
+	ASSERT(ValidProperties());
+	iProperties->RequestComplete(aReason);
+	}
+
+/**
+Must be called at the end of a slice of encoding. If called with
+KErrNone will cause a repeat call to DoConvert().
+
+@param aReason
+       The error code giving the reason for completion, or KErrNone
+       if no error occurred.
+
+@see   CImageEncoderPlugin::RequestComplete(TInt aReason)
+*/
+EXPORT_C void CImageEncoderPlugin::SelfComplete(TInt aReason)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SelfComplete(aReason);
+	}
+
+/**
+May be called at the start of a slice of encoding if the encoding
+is expected to complete asynchronously. This sets the AO in CImageEncoderPriv
+to active, but does not complete the request.
+
+When the encoding of the slice is complete, there must be a call to SelfComplete()
+
+@see   CImageEncoderPlugin::SelfComplete(TInt aReason)
+*/
+EXPORT_C void CImageEncoderPlugin::SetSelfPending(void)
+	{
+	ASSERT(ValidProperties());
+	iProperties->SetSelfPending();
+	}
+
+/**
+Called as a result of an associated CImageDecoder::CustomSyncL() function being called.
+Plugins may override this to provide extended commands in CImageDecoder. Default version
+leaves with KErrNotSupported.
+
+@param  aParam
+        Interpretation dependent on plugin.
+*/
+EXPORT_C void CImageDecoderPlugin::HandleCustomSyncL(TInt aParam)
+	{
+	ASSERT(ValidProperties());
+	iProperties->BodyHandleCustomSyncL(aParam);
+	}
+
+/**
+Called as a result of the associated CImageDecoder::CustomAsync() function being called.
+
+If this function finishes normally, then a convert cycle is started - so that DoConvert()
+will be subsequently started in the background - otherwise, if this function leaves then
+the error result is immediately signalled back to the caller of CustomAsync().
+
+Plugins may override this to provide extended commands in CImageDecoder.Users of
+CImageEncoder can then use the extended encoder functions by calling CustomAsync, rather
+than CImageEncoder::Convert().
+
+By default this function leaves with KErrNotSupported unless overriden.
+
+@param  aParam
+        Interpretation dependent on plugin.
+*/
+
+EXPORT_C void CImageDecoderPlugin::InitCustomAsyncL(TInt aParam)
+	{
+	ASSERT(ValidProperties());
+	iProperties->BodyInitCustomAsyncL(aParam);
+	}
+
+/**
+Plugin defined actions resulting from a call by RequestComplete().
+
+This function is called when a RequestComplete() is issued indicating that an
+asynchronous command has finished. Plugins can extend this function to,
+clear any custom command flags.
+*/
+EXPORT_C void CImageDecoderPlugin::NotifyComplete()
+	{
+	ASSERT(ValidProperties());
+	iProperties->BodyNotifyComplete();
+	}
+
+/**
+Indicates if this decoder is running in a separate thread.
+
+@return ETrue if running in separate thread, otherwise EFalse
+*/
+
+EXPORT_C TBool CImageDecoderPlugin::AmInThread() const
+	{
+	return iProperties->AmInThread();
+	}
+
+/**
+Passes a pointer to a descriptor containing the thumbnail from the 
+plugin to the framework. The framework then owns this descriptor.
+
+@param aThumbnailData
+	   A pointer to a HBufC8 containing the thumbnail data
+*/
+
+EXPORT_C void CImageDecoderPlugin::SetThumbnailData(HBufC8* aThumbnailData)
+	{
+	ASSERT(ValidProperties());	
+	iProperties->SetThumbnailData(aThumbnailData);
+	}
+
+
+/**
+Indicates if the decoder should abort early ie. following a call to
+Cancel().
+
+Note: This function always returns false unless the decoder is running
+in its own thread.
+
+@return ETrue if it should abort early, otherwise EFalse
+*/
+
+EXPORT_C TBool CImageDecoderPlugin::ShouldAbort() const
+	{
+	return iProperties->ShouldAbort();
+	}
+
+/**
+@internalComponent
+
+Enables generation of an image mask (to be implemented by the plugin
+if this feature is supported).
+*/
+EXPORT_C void CImageDecoderPlugin::EnableMaskGeneration()
+	{
+	}
+
+/**
+@internalComponent
+
+Notify the plugin that the client has changed the requested source 
+image type (e.g. Main to Thumb or vice-versa)
+*/
+EXPORT_C void CImageDecoderPlugin::NotifyImageTypeChangeL(TInt)
+	{
+	}
+
+/**
+@publishedAll
+@released
+
+Returns the decoding options specified by the client when it created the CImageDecoder object.
+
+@return The decoding options.
+*/
+EXPORT_C CImageDecoder::TOptions CImageDecoderPlugin::DecoderOptions() const
+	{
+	return iProperties->DecoderOptions();
+	}
+
+/**
+
+*/
+EXPORT_C void CImageDecoderPlugin::GetExtensionL(TUid /*aExtUid*/, MImageConvExtension*& /*aExtPtr*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+Gets the size of the destination CFbsBitmap needed prior to a call to Convert().
+Essential when using the ICL Framework Extensions such as SetClippingRectL() or
+codec extensions obtained through the OperationL(), ScalerL() and BlockStreamerL()
+calls.
+
+@param  aSize	A reference to a TSize that specifies the size
+				of the region that is to be decoded by a call to
+				Convert().
+@param 	aFrameNumber The number of the frame that is to be decoded.
+
+@see	CImageDecoder::OperationL()
+@see	CImageDecoder::ScalerL()
+@see	CImageDecoder::BlockStreamerL()
+@see	CImageDecoder::SetClippingRectL()
+@see	CImageDecoder::Convert()
+*/
+EXPORT_C TInt CImageDecoderPlugin::GetDestinationSize(TSize& /*aSize*/, TInt /*aFrameNumber*/)
+	{
+	return KErrNotSupported;
+	}
+
+/**
+Sets the area of interest of the image to be decoded.  This function can leave with
+any of the system-wide error codes.
+
+@param aClipRect	A pointer to a TRect that specifies the
+					location and size of the region to be decoded.  This
+					rectangle must have positive width and height values as
+					per TRect::IsNormalized() and TRect::Normalize().
+					Passing in a NULL value will clear the clipping rectangle.
+
+@leave KErrNotSupported		This function is not supported.
+@leave KErrArgument			Returned if the clipping rectangle:
+							a) is empty (i.e. IsEmpty() returns ETrue)
+							b) is not normalised (i.e. IsNormalized() returns EFalse)
+							c) has coordinates that are not located within, or on,
+							the coodinates of at least one frame of the original image.
+							d) has a width or a height of 0
+
+@see	TRect::IsEmpty()
+@see	TRect::IsNormalized()
+@see	TRect::Normalize()
+*/
+EXPORT_C void CImageDecoderPlugin::SetClippingRectL(const TRect* /*aClipRect*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+@internalComponent
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CImageDecoderPlugin::ReservedVirtual1()
+	{
+	Panic(EReservedCall);
+	}
+
+/* IMAGE ENCODER */
+
+/**
+Constructor for this class.
+*/
+EXPORT_C CImageEncoderPlugin::CImageEncoderPlugin()
+	{
+	}
+
+/**
+Destructor for this class.
+*/
+EXPORT_C CImageEncoderPlugin::~CImageEncoderPlugin()
+	{
+	}
+
+/**
+Called when the plugin is destroyed or an encode is cancelled to perform
+cleanup functions.
+
+This function may be overriden in derived classes in which case the derived
+class should ensure it calls this version after performing any plugin
+specific cleanup.
+*/
+EXPORT_C void CImageEncoderPlugin::Cleanup()
+	{
+	if(ValidProperties())
+		iProperties->Cleanup();
+	}
+
+/**
+Initialises data structures prior to encoding a frame.
+
+This may be overriden in derived classes in which case the derived class
+should ensure it calls this version after performing any plugin
+initialisation.
+*/
+EXPORT_C void CImageEncoderPlugin::InitConvertL()
+	{
+	ASSERT(ValidProperties());
+	iProperties->InitConvertL();
+	}
+
+/**
+Forces initialization of data structures prior to decoding a frame.
+*/
+EXPORT_C void CImageEncoderPlugin::RequestInitL()
+	{
+	ASSERT(ValidProperties());
+	iProperties->RequestInitL();
+	}
+	
+/**
+Performs the encoding process.
+
+This call may be overriden in derived classes. If this is not
+the case and a custom decode is not performed, the derived class should
+ensure that this base class's version is called.
+*/
+EXPORT_C void CImageEncoderPlugin::DoConvert()
+	{
+	ASSERT(ValidProperties());
+	iProperties->DoConvert();
+	}
+
+/**
+@internalComponent
+
+Tells the encoder to generate the thumbnail
+
+THis is used only for Exif format. If aDoGenerateThumbnail=EFalse, the 
+thumbnail is not generated. The default value is ETrue
+
+*/
+EXPORT_C void CImageEncoderPlugin::SetThumbnail(TBool /*aDoGenerateThumbnail*/)
+	{
+	}
+
+/**
+Deals with the result from ProcessFrameL().
+
+This processes the results of the standard ProcessFrameL() call, feeding in the resultant
+error code from its TRAP and the status result. It will call RequestComplete() or
+SelfComplete() as appropriate. Note that if no data was created by ProcessFrameL(),
+HandleProcessFrameResult() assumes that the encoding process is complete.
+If this is not appropriate, an overloaded DoConvert() should be used to handle it.
+
+@param  aErrCode
+        The error result of TRAP around ProcessFrameL().
+@param  aCodecState
+        The result of ProcessFrameL() itself.
+*/
+
+EXPORT_C void CImageEncoderPlugin::HandleProcessFrameResult(TInt aErrCode, TFrameState aCodecState)
+	{
+	ASSERT(ValidProperties());
+	iProperties->HandleProcessFrameResult(aErrCode, aCodecState);
+	}
+
+/**
+Returns the value to be fed to CImageWriteCodec::ProcessFrameL(),
+and will be used by codecs that fully override DoConvert().
+*/
+EXPORT_C TBufPtr8& CImageEncoderPlugin::DestinationData()
+	{
+	ASSERT(ValidProperties());
+	return iProperties->DestinationData();
+	}
+
+/**
+Writes a descriptor to the internal data buffer of the encoded image without 
+incrementing the position in the buffer, and therefore a call to Position()
+will return the same value before or after a call to this function.
+
+@param	aPosition
+		The start position in the internal data buffer of the encoded image from
+		which point the data in aDes is written.
+@param	aDes
+		The descriptor containing the data to be written to the internal data buffer
+		of the encoded image.
+@see	Position()
+*/
+EXPORT_C void CImageEncoderPlugin::WriteDataL(TInt aPosition,const TDesC8& aDes)
+	{
+	ASSERT(ValidProperties());
+	iProperties->WriteDataL(aPosition, aDes);
+	}
+	
+/**
+Writes a descriptor to the internal data buffer of the encoded image.  In addition,
+the position in the buffer that is written to (obtained with Position()) will be
+incremented returning aPosition + aDes.Length().
+
+@param	aPosition
+		The start position in the internal data buffer of the encoded image from
+		which point the data in aDes is written.
+@param	aDes
+		The descriptor containing the data to be written to the internal data buffer
+		of the encoded image.
+@see	Position()
+*/
+EXPORT_C void CImageEncoderPlugin::WriteDataPositionIncL(TInt aPosition,const TDesC8& aDes)
+	{
+	ASSERT(ValidProperties());
+	iProperties->WriteDataPositionIncL(aPosition, aDes);
+	}	
+
+/**
+Returns the plugin's write codec.
+
+@return A pointer to the plugin's write codec.
+*/
+EXPORT_C CImageWriteCodec* CImageEncoderPlugin::ImageWriteCodec() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ImageWriteCodec();
+	}
+
+/**
+Sets the plugin's write codec.
+
+Ownership of the codec is transferred to the plugin.
+
+@param  aImageWriteCodec
+        A pointer to the codec.
+*/
+EXPORT_C void CImageEncoderPlugin::SetImageWriteCodec(CImageWriteCodec* aImageWriteCodec) const
+	{
+	ASSERT(aImageWriteCodec != NULL);
+	ASSERT(ValidProperties());
+	iProperties->SetImageWriteCodec(aImageWriteCodec);
+	}
+
+/**
+Returns the bitmap which is being encoded.
+
+@return A reference to the source bitmap.
+*/
+EXPORT_C const CFbsBitmap& CImageEncoderPlugin::Source() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->Source();
+	}
+
+/**
+Checks the validity of the bitmap which is being encoded. Returns ETrue if the 
+bitmap is valid, otherwise EFalse.
+
+@return A boolean describing the validity of the bitamp.
+*/
+EXPORT_C TBool CImageEncoderPlugin::ValidSource() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ValidSource();
+	}
+
+/**
+Returns the starting position of the internal data buffer of the encoded image
+that is being written to.
+
+@return The starting position.
+*/
+EXPORT_C TInt& CImageEncoderPlugin::StartPosition() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->StartPosition();
+	}
+
+/**
+Returns the current position within the internal data buffer that is being written to.
+
+@return The current position.
+@see	WriteDataPositionIncL(TInt aPosition,const TDesC8& aDes)
+@see	WriteDataL(TInt aPosition,const TDesC8& aDes)
+*/
+EXPORT_C TInt& CImageEncoderPlugin::Position() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->Position();
+	}
+
+/**
+Returns the overall size of the image frame in pixels.
+
+@return The size of the image frame.
+*/
+EXPORT_C const TSize& CImageEncoderPlugin::FrameInfoOverallSizeInPixels() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->FrameInfoOverallSizeInPixels();
+	}
+
+/**
+Checks that the constructed encoder is valid.
+
+@return ETrue if valid, EFalse otherwise.
+*/
+TBool CImageEncoderPlugin::ValidProperties() const
+	{
+	return iProperties != NULL;
+	}
+
+/**
+Returns the current size of the encoded image in bytes.
+
+@return The current size of the encoded image in bytes.
+*/
+EXPORT_C TInt CImageEncoderPlugin::CurrentImageSizeL() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->CurrentImageSizeL();
+	}
+
+/**
+Called as a result of the associated CImageEncoder::CustomSyncL() function being called.
+Plugins may override this to provide extended commands in CImageEncoder. Default version
+leaves with KErrNotSupported.
+
+@param  aParam
+        Interpretation dependent on plugin.
+*/
+
+EXPORT_C void CImageEncoderPlugin::HandleCustomSyncL(TInt aParam)
+	{
+	ASSERT(ValidProperties());
+	iProperties->BodyHandleCustomSyncL(aParam);
+	}
+
+/**
+Called as a result of the associated CImageEncoder::CustomAsync() function being called.
+If this function finishes normally, then a convert cycle is started - so that DoConvert()
+will be subsequently started in the background - otherwise, if this function leaves then
+the error result is immediately signalled back to the caller of CustomAsync().
+
+The default version leaves with KErrNotSupported unless overridden to change this behaviour. Plugins may
+override this to provide extended commands in CImageEncoder.
+
+@param  aParam
+        Interpretation dependent on plugin.
+*/
+
+EXPORT_C void CImageEncoderPlugin::InitCustomAsyncL(TInt aParam)
+	{
+	ASSERT(ValidProperties());
+	iProperties->BodyInitCustomAsyncL(aParam);
+	}
+
+/**
+Plugin defined actions resulting from a call by RequestComplete().
+
+This function is called when a RequestComplete() is issued indicating that
+an asynchronous command has finished. Plugins can extend this function to
+clear any custom command flags.
+*/
+EXPORT_C void CImageEncoderPlugin::NotifyComplete()
+	{
+	ASSERT(ValidProperties());
+	iProperties->BodyNotifyComplete();
+	}
+
+/**
+Indicates if this encoder is running in a separate thread.
+
+@return	A boolean indicating if the encoder is running in a seperate thread. ETrue if running in 
+        separate thread, otherwise EFalse.
+*/
+EXPORT_C TBool CImageEncoderPlugin::AmInThread() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->AmInThread();
+	}
+
+/**
+Indicates if an encode should abort early (ie. following a Cancel).
+
+Note:
+This function always returns EFalse unless the encoder is running in its own thread.
+
+@return A boolean indicating if the encode should abort early. ETrue if should abort early, 
+        otherwise EFalse.
+*/
+
+EXPORT_C TBool CImageEncoderPlugin::ShouldAbort() const
+	{
+	ASSERT(ValidProperties());
+	return iProperties->ShouldAbort();
+	}
+
+/**
+Notifies the framework that the main frame encoding is complete, so it can tidy up. This
+results in a call to UpdateHeaderL() and then either the descriptor is copied across
+or the file is closed.
+
+Note:
+This function is only used if a decoder replaces the DoConvert() call - the default
+version does this as part of its processing.
+*/
+EXPORT_C void CImageEncoderPlugin::FinishConvertL()
+	{
+	ASSERT(ValidProperties());
+	iProperties->FinishConvertL();
+	}
+
+/**
+@internalComponent
+
+Sets the thumbnail in the encoded file
+
+@panic  EReservedCall
+*/
+EXPORT_C void CImageEncoderPlugin::WriteThumbnailL()
+	{
+	
+	}
+
+/**
+@internalComponent
+
+Intended for future proofing - will panic if called
+
+@param the status which will be notified once the scale operation on the thumbnail will be performed
+
+@panic  EReservedCall
+*/
+EXPORT_C void CImageEncoderPlugin::WriteExifDataL(TRequestStatus*& /*aScaleCompletionStatus*/)
+	{
+	SelfComplete(KErrNone);
+	}
+
+/**
+@publishedPartner
+@released
+
+Enables getting set of options which has been passed by client during encoder object creation.
+Plugins should ignore unknown options.
+
+@return Set of options which has been passed by client during encoder 
+		object creation
+*/
+EXPORT_C CImageEncoder::TOptions CImageEncoderPlugin::EncoderOptions() const
+	{
+	return iProperties->EncoderOptions();
+	}
+
+/**
+@internalComponent
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CImageEncoderPlugin::ReservedVirtual1()
+	{
+	Panic(EReservedCall);
+	}
+
+/**
+@internalComponent
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CImageEncoderPlugin::ReservedVirtual2()
+	{
+	Panic(EReservedCall);
+	}
+
+/**
+@internalComponent
+
+Intended for future proofing - will panic if called.
+
+@panic  EReservedCall
+*/
+EXPORT_C void CImageEncoderPlugin::ReservedVirtual3()
+	{
+	Panic(EReservedCall);
+	}
+
+EXPORT_C void CImageEncoderPlugin::GetExtensionL(TUid /*aExtUid*/, MImageConvExtension*& /*aExtPtr*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+