imageeditor/ImageEditorManager/src/ImageEditorImageHandler.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorManager/src/ImageEditorImageHandler.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,329 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* Ixonos Plc
+*
+* Description:  
+*
+*/
+
+
+
+#include <imageconversion.h>
+#include <eikenv.h>
+#include <bautils.h>
+
+#include "imageeditordebugutils.h"
+#include "commondefs.h"
+#include "ImageEditorError.h"
+#include "ImageEditorImageHandler.h"
+
+//=============================================================================
+EXPORT_C CImageEditorImageHandler * CImageEditorImageHandler::NewL ()
+{
+	CImageEditorImageHandler * self = new (ELeave) CImageEditorImageHandler;
+	CleanupStack::PushL(self);
+	self->ConstructL ();
+	CleanupStack::Pop(); // self
+	return self;
+}
+
+//=============================================================================
+EXPORT_C CImageEditorImageHandler::~CImageEditorImageHandler ()
+{
+	CleanupConverters();
+}	
+
+//=============================================================================
+EXPORT_C void CImageEditorImageHandler::LoadImageAsyncL (
+	const TDesC &		aFileName,
+	CFbsBitmap *&		aBitmap,
+	TRequestStatus *	aStatus
+	)
+{
+    LOG(KImageEditorLogFile, "CImageEditorImageHandler::LoadImageAsyncL()");
+
+	//	Clean up old converters
+	CleanupConverters();
+
+	//	Create a new image decoder
+	iImageDecoder = CImageDecoder::FileNewL (
+		CEikonEnv::Static()->FsSession(), 
+		aFileName
+		);
+
+	//	Create the bitmap for containing the decoded image
+    TFrameInfo frame_info = iImageDecoder->FrameInfo();
+    CFbsBitmap * bitmap = new (ELeave) CFbsBitmap;
+    CleanupStack::PushL (bitmap);
+    TInt err = bitmap->Create (frame_info.iOverallSizeInPixels, EColor16M) ;
+    if (err != KErrNone)
+        {
+        LOG(KImageEditorLogFile, "CImageEditorImageHandler: Failed to create CFbsBitmap");
+        User::Leave(KSIEEInternalNonRecoverable);
+        }
+    CleanupStack::Pop(); // bitmap
+    aBitmap = bitmap;
+
+	//	Start decoding
+	iImageDecoder->Convert (aStatus, *aBitmap);
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorImageHandler::ContinueLoading (TRequestStatus * aStatus)
+{
+    iImageDecoder->ContinueConvert (aStatus);
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorImageHandler::SaveImageAsyncL (
+	const TDesC	&		aFileName,
+	const CFbsBitmap &		aBitmap,
+	const TInt			aImageQuality,
+	TRequestStatus *	aStatus
+	)
+{
+    LOG(KImageEditorLogFile, "CImageEditorImageHandler::SaveImageAsyncL()");
+	//	Clean up old converters
+	CleanupConverters();
+
+	//	Get MIME type based in file extension
+	CFileExtensionMIMEType * mime = GetMIMETypeL (aFileName);
+
+	//	Create a new image decoder for MIME type mime
+	iImageEncoder = CImageEncoder::FileNewL (
+		CEikonEnv::Static()->FsSession(), 
+		aFileName,
+		mime->MIMEType()
+		);
+	
+	CFrameImageData * frame = GetFrameImageDataL (
+		mime->FileExtension(),
+		aImageQuality
+		);
+
+	//	Start encoding
+	iImageEncoder->Convert (aStatus, aBitmap, frame);
+
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorImageHandler::GetJpegQualityFactorL (
+    const TDesC & aFileName
+	)
+{
+    LOG(KImageEditorLogFile, "CImageEditorImageHandler::GetJpegQualityFactorL()");
+
+	//	Clean up old converters
+	CleanupConverters();
+
+	//	Create a new image decoder
+	iImageDecoder = CImageDecoder::FileNewL (
+		CEikonEnv::Static()->FsSession(), 
+		aFileName
+		);
+
+    //  Get reference to frame image data
+    const CFrameImageData & image_data = iImageDecoder->FrameData();
+
+    //  Get JPEG quality factor
+    TInt qualityfactor = 100;
+    if ( image_data.ImageDataCount() > 0 )
+    {
+        qualityfactor = ((const TJpegImageData*)image_data.GetImageData(0))->iQualityFactor;
+    }
+
+	//	Clean up old converters
+	CleanupConverters();
+
+    return qualityfactor;
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorImageHandler::RenameImage (
+	const TDesC	&		aFileNameSrc,
+	const TDesC	&		aFileNameDst
+	) const
+{
+	return BaflUtils::RenameFile (
+		CEikonEnv::Static()->FsSession(),
+		aFileNameSrc, 
+		aFileNameDst, 
+		0
+		);
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorImageHandler::DeleteImage (const TDesC & aFileName) const
+{
+	return BaflUtils::DeleteFile (
+		CEikonEnv::Static()->FsSession(),
+		aFileName,
+		0
+		);
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorImageHandler::CleanupConverters()
+{
+    LOG(KImageEditorLogFile, "CImageEditorImageHandler::CleanupConverters()");
+
+	if (iImageDecoder)
+	{
+        LOG(KImageEditorLogFile, "CImageEditorImageHandler::CleanupConverters(): cancelling iImageDecoder");
+
+		iImageDecoder->Cancel();
+		delete iImageDecoder;
+		iImageDecoder = NULL;
+	}
+	if (iImageEncoder)
+	{
+        LOG(KImageEditorLogFile, "CImageEditorImageHandler::CleanupConverters(): cancelling iImageEncoder");
+
+		iImageEncoder->Cancel();
+		delete iImageEncoder;
+		iImageEncoder = NULL;
+	}
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorImageHandler::IsRajpegImageL (const TDesC & aFileName) const
+{
+    _LIT8 (KMimeJpeg, "image/jpeg");
+
+    TBuf8<256> mime;
+    
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs);
+    
+    CImageDecoder::GetMimeTypeFileL (fs, aFileName, mime);
+
+	CleanupStack::PopAndDestroy();
+	
+#ifdef ENABLE_DEBUGLOG
+    TBuf16 <100> mime16;
+    mime16.Copy(mime);
+    LOGFMT(KImageEditorLogFile, "CImageEditorImageHandler::IsRajpegImageL: MIME type: %S", &mime16);
+#endif
+
+    // Images with the mime type image/jpeg can be rajpeg images.
+    return ( mime.CompareF (KMimeJpeg) == 0 );
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorImageHandler::IsJpegIntact (const TDesC & aFileName)
+{
+    //	Clean up old converters
+    CleanupConverters();
+
+    TRAPD (err,
+        //	Create a new image decoder
+        iImageDecoder = CImageDecoder::FileNewL (
+        CEikonEnv::Static()->FsSession(), 
+        aFileName
+        );
+    );
+    CleanupConverters();
+    if (err != KErrNone)
+    {
+        return EFalse;
+    }
+    else
+    {
+        return ETrue;
+    }
+}
+
+//=============================================================================
+CImageEditorImageHandler::CImageEditorImageHandler ()
+{
+
+}
+
+//=============================================================================
+void CImageEditorImageHandler::ConstructL ()
+{
+
+}
+
+
+//=============================================================================
+CFileExtensionMIMEType * CImageEditorImageHandler::GetMIMETypeL (
+	const TDesC &	aFileName
+	)
+{	
+
+	//	Extract the file extension from aFullFileName
+	TParsePtrC fileparser (aFileName);
+	TBuf<12> ext;
+	if (fileparser.ExtPresent())
+	{
+		ext.Append (fileparser.Ext());
+	}
+
+	//	Get all supported mime types with file extensions
+	RFileExtensionMIMETypeArray mimes;
+	iImageEncoder->GetFileTypesL (mimes);
+
+	//	Get correct mime type based on file extension
+	CFileExtensionMIMEType * ret = 0;
+	for (TInt i = 0; i < mimes.Count(); ++i)
+	{
+		if (ext == mimes[i]->FileExtension())
+		{
+			ret = mimes[i];
+			mimes.Remove(i);
+			break;
+		}
+	}
+
+	//	Delete pointer array
+	mimes.ResetAndDestroy();
+	
+	return ret;
+}
+
+//=============================================================================
+CFrameImageData * CImageEditorImageHandler::GetFrameImageDataL (
+	const TDesC &		aExt,
+	const TInt			aQuality
+	) const
+{
+    LOG(KImageEditorLogFile, "CImageEditorImageHandler::GetFrameImageDataL()");
+    
+	CFrameImageData * frameData = CFrameImageData::NewL();
+	CleanupStack::PushL (frameData);
+
+	if (aExt.CompareF (KJpegExtension))
+	{
+		TJpegImageData * data = new (ELeave) TJpegImageData();
+		data->iQualityFactor = (100 - aQuality);
+		data->iSampleScheme = TJpegImageData::EColor422;
+		frameData->AppendImageData (data);	// ownership transferred
+	}
+	else if (aExt.CompareF (KBmpExtension))
+	{
+		TBmpImageData * data = new (ELeave) TBmpImageData();
+		data->iBitsPerPixel = 24;
+		frameData->AppendImageData (data);	// ownership transferred
+	}
+	else
+	{
+
+	}
+
+	CleanupStack::Pop(); //	frameData
+	return frameData;
+}
+
+// End of File