menufw/hierarchynavigator/hnpresentationmodel/src/hnattrimgprovliwimage.cpp
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menufw/hierarchynavigator/hnpresentationmodel/src/hnattrimgprovliwimage.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,241 @@
+/*
+* Copyright (c) 2007-2008 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:  image provider for liw buffer
+*
+*/
+
+
+#include <fbs.h>
+#include <AknsSkinInstance.h>
+#include <AknsUtils.h>
+#include <liwcommon.h>
+#include <liwbufferextension.h>
+#include <s32mem.h>
+#include "hnattrimgprovliwimage.h"
+#include "hnextbmpiconholder.h"
+
+// ============================ MEMBER FUNCTIONS =============================
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CHnAttrImgProvLiwImage::CHnAttrImgProvLiwImage()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CHnAttrImgProvLiwImage::ConstructL( TLiwVariant*& aBitmap, 
+                                         TLiwVariant*& aMaskBitmap )
+    {
+    ASSERT( aBitmap );
+    CFbsBitmap* mask = NULL;
+    CFbsBitmap* bitmap = CreateBitmapFromVariantL( *aBitmap );
+    if ( bitmap )
+        {
+        if( aMaskBitmap )
+            {
+            mask = CreateBitmapFromVariantL( *aMaskBitmap );
+            }
+        CreateIconL( bitmap, mask );
+        }
+    else if ( aBitmap->TypeId() == LIW::EVariantTypeBuffer )
+        {
+        CLiwBitmapBuffer* bmpBuff =
+            static_cast<CLiwBitmapBuffer*>( aBitmap->AsBuffer() ); 
+        CLiwBitmapBuffer* maskBuff =
+            static_cast<CLiwBitmapBuffer*>(
+                    aMaskBitmap ? aMaskBitmap->AsBuffer() : NULL );
+        if ( bmpBuff )
+            {
+            bitmap = bmpBuff->AsBitmap();
+            }
+        if ( maskBuff )
+            {
+            mask = maskBuff->AsBitmap();
+            }
+        if ( bitmap )
+            {
+            CreateExtIconL( bitmap, mask, bmpBuff, maskBuff );
+            }
+        }
+    if ( !bitmap )
+        {
+        //No point to keep variant as bitmap was not created
+        aBitmap->Reset();
+        delete aBitmap;
+        aBitmap = NULL;
+        }
+    if ( aMaskBitmap && !mask )
+        {
+        //No point to keep variant as bitmap was not created
+        aMaskBitmap->Reset();
+        delete aMaskBitmap;
+        aMaskBitmap = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CHnAttrImgProvLiwImage::CreateExtIconL( CFbsBitmap* aBitmap,
+        CFbsBitmap* aMask, CLiwBitmapBuffer* aExtBmp,
+        CLiwBitmapBuffer* aExtMask )
+    {
+    // the condition in the assertion below means: if you provide aMask then
+    // you must also provide aExtMask
+    __ASSERT_DEBUG( aBitmap && aExtBmp && ( !aMask || aExtMask ),
+            User::Invariant() );
+    
+    CGulIcon* newIcon = CGulIcon::NewL( aBitmap, aMask );
+    CleanupStack::PushL( newIcon );
+    newIcon->SetBitmapsOwnedExternally( ETrue );
+    CHnExtBmpIconHolder *newIconHolder = new (ELeave) CHnExtBmpIconHolder();
+    newIconHolder->SetGulIcon( newIcon , aExtBmp, aExtMask );
+    CleanupStack::Pop( newIcon );
+    
+    if ( iIconHolder )
+        {
+        iIconHolder->Close();
+        }
+    iIconHolder = newIconHolder;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CHnAttrImgProvLiwImage* CHnAttrImgProvLiwImage::NewL( 
+        TLiwVariant*& aBitmap, TLiwVariant*& aMaskBitmap )
+    {
+    CHnAttrImgProvLiwImage* self = NewLC( aBitmap, aMaskBitmap );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CHnAttrImgProvLiwImage* CHnAttrImgProvLiwImage::NewLC( 
+        TLiwVariant*& aBitmap, TLiwVariant*& aMaskBitmap )
+    {
+    CHnAttrImgProvLiwImage* self = new( ELeave ) CHnAttrImgProvLiwImage;
+    CleanupStack::PushL( self );
+    self->ConstructL( aBitmap, aMaskBitmap );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CHnAttrImgProvLiwImage::~CHnAttrImgProvLiwImage()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CHnAttrImgProvLiwImage::RemoveLiwObjects()
+    {
+    if ( iIconHolder )
+        {
+        iIconHolder->Close();
+        iIconHolder = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CHnAttrImgProvLiwImage::Value( )
+    {
+    return iValue;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+CFbsBitmap* CHnAttrImgProvLiwImage::CreateBitmapFromVariantL( 
+                                                const TLiwVariant& aVariant )
+    {
+    CFbsBitmap* bitmap( NULL );
+    TInt handle = 0;
+
+    if ( ExtractBitmapHandleFromVariant( aVariant, handle ) == KErrNone )
+        {
+        CFbsBitmap* tempBitmap  = new( ELeave ) CFbsBitmap;
+        if ( tempBitmap->Duplicate( handle ) == KErrNone )
+            {
+            bitmap = tempBitmap;
+            }
+        else
+            {
+            delete tempBitmap;
+            }
+        }
+    else if ( aVariant.TypeId() == LIW::EVariantTypeDesC8 )
+        {
+        CFbsBitmap* tempBitmap = new ( ELeave ) CFbsBitmap;
+        CleanupStack::PushL( tempBitmap );
+        TPtrC8 buf = aVariant.AsData();
+        RDesReadStream stream( buf );
+        CleanupClosePushL( stream );
+        tempBitmap->InternalizeL( stream );
+        CleanupStack::PopAndDestroy( &stream );
+        CleanupStack::Pop( tempBitmap );
+        bitmap = tempBitmap;
+        }
+    return bitmap;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//  
+TInt CHnAttrImgProvLiwImage::ExtractBitmapHandleFromVariant(
+        const TLiwVariant& aVariant, TInt& aHandle )
+    {
+    TInt err = KErrNone;
+    switch ( aVariant.TypeId() )
+        {
+        case LIW::EVariantTypeTInt32:
+            aHandle = static_cast<TInt>( aVariant.AsTInt32() );         
+            break;
+        case LIW::EVariantTypeTUint:
+            aHandle = static_cast<TInt>( aVariant.AsTUint() );         
+            break;
+        case LIW::EVariantTypeTInt64:
+            aHandle = static_cast<TInt>( aVariant.AsTInt64() );         
+            break;
+        case LIW::EVariantTypeTBool:
+            // Putting a TInt into a TLiwVariant will result in the variant
+            // storing a TBool variable. CFbsBitmap::Handle() returns TInt, so
+            // we can assume that the TBool stored in aVariant is in fact TInt.
+            aHandle = static_cast<TInt>( aVariant.AsTBool() );
+            break;
+        default:
+            err = KErrNotFound;
+        }
+    return err;
+    }