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