phonebookui/Phonebook2/Presentation/src/CPbk2ImageWriterBase.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Presentation/src/CPbk2ImageWriterBase.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,468 @@
+/*
+* Copyright (c) 2005-2007 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: 
+*       Provides methods for CPbk2ImageManager implementation classes
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "CPbk2ImageWriterBase.h"
+
+// From Phonebook2
+#include "CPbk2ImageReader.h"
+#include "MPbk2ImageOperationObservers.h"
+#include "CPbk2ImageData.h"
+
+// From System
+#include <imageconversion.h>
+#include <bitmaptransforms.h>
+
+/// Unnamed namespace for local defintions
+namespace {
+
+// LOCAL CONSTANTS
+
+/// JPEG file mime type
+_LIT8(KJpegMimeType, "image/jpeg");
+
+// States for CPbk2ImageWriterBase
+enum TWriterState
+    {
+    EStateInitialize = 0,
+    EStateCheckFormatAndSize,
+    EStateScaleBitmap,
+    EStateCreateImage,
+    EStateConvertToJpeg,
+    EStateStoreImage,
+    EStateComplete,
+    EStateEnd
+    };
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_ConstructL,
+    EPanicPreCond_CheckFormatAndSizeL,
+    EPanicPreCond_ScaleBitmapL,
+    EPanicPreCond_CreateImageL,
+    EPanicPreCond_ConvertToJpegL,
+    EPanicPreCond_StoreImageL,
+    EPanicPreCond_DoCancel
+    };
+#endif // _DEBUG
+
+
+// ==================== LOCAL FUNCTIONS ====================
+
+/**
+ * Comparison operator for TSize objects. Compares width and height members.
+ *
+ * @param aLhs Reference to left hand side TSize
+ * @param aRhs Reference to right hand side TSize
+ * @return ETrue if lhs's width and height are less or equal to rhs's
+ *         width and height. Otherwise returns EFalse.
+ */
+ inline TBool operator<=(const TSize& aLhs, const TSize& aRhs)
+    {
+    return (aLhs.iWidth<=aRhs.iWidth && aLhs.iHeight<=aRhs.iHeight);
+    }
+
+#ifdef _DEBUG
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbk2ImageWriterBase");
+    User::Panic(KPanicText,aReason);
+    }
+#endif // _DEBUG
+}  // namespace
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::CPbk2ImageWriterBase
+// --------------------------------------------------------------------------
+//
+CPbk2ImageWriterBase::CPbk2ImageWriterBase
+        (MPbk2ImageSetObserver& aObserver) :
+    CActive(CActive::EPriorityStandard),
+    iObserver(aObserver)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::~CPbk2ImageWriterBase
+// --------------------------------------------------------------------------
+//
+CPbk2ImageWriterBase::~CPbk2ImageWriterBase()
+    {
+    Cancel();
+    delete iImageEncoder;
+    delete iBitmapScaler;
+    delete iBitmap;
+    delete iImageData;
+    delete iImageReader;
+    }
+    
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ConstructL()
+    {
+    __ASSERT_DEBUG(!iImageReader, Panic(EPanicPreCond_ConstructL));
+    iImageReader = CPbk2ImageReader::NewL(*this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::StartWriteL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::StartWriteL(const CFbsBitmap& aBitmap)
+    {
+    CancelWrite();
+    iBitmap = new(ELeave) CFbsBitmap;
+    User::LeaveIfError(iBitmap->Duplicate(aBitmap.Handle()));
+    ScaleBitmapL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::StartWriteL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::StartWriteL(const TDesC8& aBuffer)
+    {
+    CancelWrite();
+
+    if (iImageData)
+    	{
+        delete iImageData;
+        iImageData = NULL;
+    	}
+    iImageData = CPbk2ImageBufferData::NewL(aBuffer);
+
+    iImageReader->RecognizeFormatFromBufferL(aBuffer);
+
+    TPbk2ImageManagerParams readerParams;
+    SetupReaderParams(readerParams);
+    iImageReader->ReadFromBufferL(aBuffer,&readerParams);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::StartWriteL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::StartWriteL(const TDesC& aFileName)
+    {
+    CancelWrite();
+
+    if (iImageData)
+    	{
+        delete iImageData;
+        iImageData = NULL;
+    	}
+    iImageData = CPbk2ImageFileData::NewL(aFileName);
+
+    iImageReader->RecognizeFormatFromFileL(aFileName);
+
+    TPbk2ImageManagerParams readerParams;
+    SetupReaderParams(readerParams);
+    iImageReader->ReadFromFileL(aFileName, &readerParams);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::CancelWrite
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::CancelWrite()
+    {
+    Cancel();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ImageReadComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ImageReadComplete
+        (CPbk2ImageReader& /*aReader*/, CFbsBitmap* aBitmap)
+    {
+    delete iBitmap;
+    iBitmap = aBitmap;
+    NextState();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ImageReadFailed
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ImageReadFailed
+        (CPbk2ImageReader& /*aReader*/, TInt aError)
+    {
+    CancelWrite();
+    iObserver.Pbk2ImageSetFailed(*this,aError);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ImageOpenComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ImageOpenComplete(CPbk2ImageReader& /*aReader*/)
+    {
+    NextState();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::NextState
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::NextState()
+    {
+    ++iState;
+    TRAPD(err, ExecuteStateL());
+    if (err)
+        {
+        CancelWrite();
+        iObserver.Pbk2ImageSetFailed(*this,err);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ExecuteStateL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ExecuteStateL()
+    {
+    switch (iState)
+        {
+        case EStateCheckFormatAndSize:
+            {
+            CheckFormatAndSizeL();
+            break;
+            }
+        case EStateScaleBitmap:
+            {
+            ScaleBitmapL();
+            break;
+            }
+        case EStateCreateImage:
+            {
+            CreateImageL();
+            break;
+            }
+        case EStateConvertToJpeg:
+            {
+            ConvertToJpegL();
+            break;
+            }
+        case EStateStoreImage:
+            {
+            StoreImageL();
+            break;
+            }
+        case EStateComplete:
+            {
+            Complete();
+            break;
+            }
+        default:
+            {
+            // Media server objects might sometimes complete although they have
+            // been canceled. Catch those cases here.
+            CancelWrite();
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::CheckFormatAndSizeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::CheckFormatAndSizeL()
+    {
+    __ASSERT_DEBUG(iImageReader, Panic(EPanicPreCond_CheckFormatAndSizeL));
+    iState = EStateCheckFormatAndSize;
+    TFrameInfo frameInfo;
+    iImageReader->FrameInfo(0,frameInfo);
+    if (frameInfo.iOverallSizeInPixels <= ImageSize() &&
+        iImageReader->MimeString() == KJpegMimeType)
+        {
+        // Image resolution is <= personal image size and it is in JPEG
+        // format -> store the image directly skipping scaling and
+        // conversion.
+        iImageReader->Cancel();
+        StoreImageL();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ScaleBitmapL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ScaleBitmapL()
+    {
+    __ASSERT_DEBUG(iBitmap, Panic(EPanicPreCond_ScaleBitmapL));
+    iState = EStateScaleBitmap;
+    if (iBitmap->SizeInPixels() <= ImageSize())
+        {
+        // Bitmap size is <= personal image size -> skip scaling
+        CreateImageL();
+        }
+    else
+        {
+        if (!iBitmapScaler)
+            {
+            iBitmapScaler = CBitmapScaler::NewL();
+            }
+        iBitmapScaler->Scale(&iStatus, *iBitmap, ImageSize());
+        SetActive();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::CreateImageL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::CreateImageL()
+    {
+    __ASSERT_DEBUG(
+        iBitmap && iBitmap->SizeInPixels()<=ImageSize() && !iImageEncoder,
+        Panic(EPanicPreCond_CreateImageL));
+    iState = EStateCreateImage;
+    iImageEncoder = CreateImageWriterL();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    SetActive();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::ConvertToJpegL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::ConvertToJpegL()
+    {
+    __ASSERT_DEBUG(
+        iBitmap && iBitmap->SizeInPixels()<=ImageSize() && iImageEncoder,
+        Panic(EPanicPreCond_ConvertToJpegL));
+    
+    iImageEncoder->Convert(&iStatus, *iBitmap);
+    SetActive();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::StoreImageL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::StoreImageL()
+    {
+    iState = EStateStoreImage;
+    if (iImageEncoder)
+        {
+        // Store converted image        
+        StoreImageL(*iImageEncoder);
+        }
+    else
+        {
+        // Store input image directly
+        __ASSERT_DEBUG(iImageData, Panic(EPanicPreCond_StoreImageL));        
+        StoreImageL(*iImageData);
+        }
+    // this causes moving to next state asynchronously
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    SetActive();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::Complete
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::Complete()
+    {
+    // End state machine
+    iState = EStateEnd;
+    // Notify observer
+    iObserver.Pbk2ImageSetComplete(*this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::SetupReaderParams
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::SetupReaderParams(TPbk2ImageManagerParams& aParams)
+    {
+    aParams.iSize = ImageSize();
+    aParams.iFlags = 
+        TPbk2ImageManagerParams::EScaleImage | 
+        TPbk2ImageManagerParams::EUseFastScaling;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::RunL
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::RunL()
+    {
+    TInt status = iStatus.Int();
+    if (status == KErrNone)
+        {
+        NextState();
+        }
+    else
+        {
+        iObserver.Pbk2ImageSetFailed(*this, status);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ImageWriterBase::RunError(TInt aError)
+    {
+    iObserver.Pbk2ImageSetFailed(*this, aError);
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ImageWriterBase::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPbk2ImageWriterBase::DoCancel()
+    {
+    __ASSERT_DEBUG(iImageReader, Panic(EPanicPreCond_DoCancel));
+    // Cancel own operations
+    iState = EStateInitialize;
+    if (iImageEncoder)
+        {
+        iImageEncoder->Cancel();
+        delete iImageEncoder;
+        iImageEncoder = NULL;
+        }
+    if (iBitmapScaler) 
+        {
+        iBitmapScaler->Cancel();
+        }
+
+    iImageReader->Cancel();
+    delete iImageData;
+    iImageData = NULL;
+    delete iBitmap;
+    iBitmap = NULL;
+    }
+
+//  End of File