phonebookui/Phonebook/BCardEng/src/CBCardThumbnailHandler.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/BCardEng/src/CBCardThumbnailHandler.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2002 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: 
+*         Handling thumbnail save/retrieve operations and making these
+*         operations synchronous
+*
+*/
+
+
+// INCLUDE FILES
+#include    "CBCardThumbnailHandler.h"
+#include    <fbs.h>
+#include    <CPbkThumbnailManager.h>
+#include    <PbkImageData.h>
+#include    <TPbkImageLoadParameters.h>
+#include    "CBCardImageUtil.h"
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+// Default size for thumbnail images
+#define KDefaultThumbnailSize TSize(80,96)
+/// JPEG file mime type
+_LIT8(KJpegMimeType, "image/jpeg");
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_ProcessComplete = 1,
+    EPanicPreCond_ProcessError,
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CBCardThumbnailHandler");
+    User::Panic(KPanicText,aReason);
+    }
+
+#endif // _DEBUG
+
+} // namespace
+
+// ==================== MEMBER FUNCTIONS ====================
+
+
+CBCardThumbnailHandler* CBCardThumbnailHandler::NewL(CPbkContactEngine& aEngine)
+    {
+	CBCardThumbnailHandler* self = new (ELeave) CBCardThumbnailHandler();
+	CleanupStack::PushL(self);
+	self->ConstructL(aEngine);
+	CleanupStack::Pop(self);
+	return self;
+    }
+
+CBCardThumbnailHandler::CBCardThumbnailHandler()
+    {
+    }
+
+CBCardThumbnailHandler::~CBCardThumbnailHandler()
+    {
+    delete iImageBlob;
+    delete iBitmap;
+    delete iImageData;
+    delete iThumbOperation;
+    delete iManager;
+    }
+
+void CBCardThumbnailHandler::ConstructL(CPbkContactEngine& aEngine)
+    {
+    iManager = CPbkThumbnailManager::NewL(aEngine); 
+    }
+
+void CBCardThumbnailHandler::SaveThumbnailL(
+        CPbkContactItem& aContactItem,const TDesC8& aSource)
+    {
+    iError = KErrNone;
+    delete iThumbOperation; 
+    iThumbOperation = NULL;
+   
+    iThumbOperation = iManager->SetThumbnailAsyncL(*this, aContactItem, aSource);    
+    if(iWait.IsStarted())
+        {
+        iWait.AsyncStop();
+        }
+    iWait.Start();
+	User::LeaveIfError(iError);
+    }
+
+TBool CBCardThumbnailHandler::HasThumbnail(
+        const CPbkContactItem& aContactItem) const
+    {
+    return iManager->HasThumbnail(aContactItem);
+    }
+
+const TDesC8& CBCardThumbnailHandler::GetThumbnailL(CPbkContactItem& aContactItem)
+    {
+    if (IsAlreadyExportableL(aContactItem))
+        {
+        const TDesC8& imageBuf = iImageData->ImageData().GetBufferL();        
+        return imageBuf; 
+        }
+    else
+        {
+        delete iImageData;
+        iImageData = NULL;
+
+        delete iImageBlob;
+        iImageBlob = NULL;
+        iImageBlob = GetThumbnailBitmapL(aContactItem);
+        
+        return *iImageBlob;
+        }
+    }
+
+TBool CBCardThumbnailHandler::IsAlreadyExportableL(CPbkContactItem& aContactItem)
+    {
+    iError = KErrNone;
+    delete iThumbOperation; 
+    iThumbOperation = NULL;
+        
+    iThumbOperation = iManager->GetThumbnailImageAsyncL(*this, aContactItem);
+    if(iWait.IsStarted())
+        {
+        iWait.AsyncStop();
+        }
+    iWait.Start();
+    User::LeaveIfError(iError);
+    
+    // Image must be in jpeg format
+    if (iImageData->MimeType() != KJpegMimeType)
+        {
+        return EFalse;
+        }
+
+    // Image must be of size 80x96
+    return (iImageData->ImageSizeInPixels() == KDefaultThumbnailSize);
+    }
+
+
+HBufC8* CBCardThumbnailHandler::GetThumbnailBitmapL(CPbkContactItem& aContactItem)
+    {
+    iError = KErrNone;
+    delete iThumbOperation; 
+    iThumbOperation = NULL;
+
+
+    // Define parameters for thumbnail
+    TPbkImageLoadParameters params;
+    params.iSize = KDefaultThumbnailSize;
+    params.iFlags = TPbkImageLoadParameters::EScaleImage | 
+                    TPbkImageLoadParameters::EKeepAspectRatio;
+
+    iThumbOperation = iManager->GetThumbnailAsyncL(*this, aContactItem ,params);
+    if(iWait.IsStarted())
+        {
+        iWait.AsyncStop();
+        }
+    iWait.Start();
+    User::LeaveIfError(iError);
+    
+    CBCardImageUtil* util = CBCardImageUtil::NewL();
+    CleanupStack::PushL(util);
+    
+    if (!iBitmap)
+        {
+        User::Leave(KErrNotFound);
+        }
+
+    
+    // convert bitmap to jpeg descriptor
+    HBufC8* imageBlob = util->BitmapToDescL(*iBitmap);
+
+    delete iBitmap;
+    iBitmap = NULL;
+
+    CleanupStack::PopAndDestroy(util);
+    
+    return imageBlob;
+    }
+
+void CBCardThumbnailHandler::PbkThumbnailGetImageComplete(
+        MPbkThumbnailOperation& aOperation, CPbkImageDataWithInfo* aImageData)
+    {    
+    ProcessComplete(aOperation);
+        
+    delete iImageData; 
+    iImageData = aImageData;    
+    }
+
+void CBCardThumbnailHandler::PbkThumbnailGetImageFailed(
+        MPbkThumbnailOperation& aOperation, TInt aError)
+    {
+    ProcessError(aOperation, aError);
+    }
+
+void CBCardThumbnailHandler::PbkThumbnailGetComplete(
+        MPbkThumbnailOperation& aOperation, CFbsBitmap* aBitmap)
+    {
+    ProcessComplete(aOperation);
+        
+    delete iBitmap;        
+    iBitmap = aBitmap;
+    }
+
+void CBCardThumbnailHandler::PbkThumbnailGetFailed(
+        MPbkThumbnailOperation& aOperation, TInt aError)
+    {
+    ProcessError(aOperation, aError);
+    }
+
+void CBCardThumbnailHandler::PbkThumbnailSetComplete(
+        MPbkThumbnailOperation& aOperation)    
+    {
+    ProcessComplete(aOperation);
+    }
+
+void CBCardThumbnailHandler::PbkThumbnailSetFailed(
+        MPbkThumbnailOperation& aOperation, TInt aError)
+    {
+    ProcessError(aOperation, aError);
+    }
+
+void CBCardThumbnailHandler::ProcessError(
+    MPbkThumbnailOperation& 
+    #ifdef _DEBUG 
+    aOperation
+    #endif
+    , TInt aError)
+    {
+    __ASSERT_DEBUG(iThumbOperation && iThumbOperation == &aOperation, 
+        Panic(EPanicPreCond_ProcessError));
+
+    iWait.AsyncStop();
+    iError = aError;            
+    }
+
+void CBCardThumbnailHandler::ProcessComplete(
+    MPbkThumbnailOperation& 
+    #ifdef _DEBUG 
+    aOperation
+    #endif
+    )
+    {
+    __ASSERT_DEBUG(iThumbOperation && iThumbOperation == &aOperation, 
+        Panic(EPanicPreCond_ProcessComplete));
+
+    iWait.AsyncStop();
+    iError = KErrNone;            
+    }
+
+//  End of File