uigraphics/AknIcon/srvsrc/AknIconDataPreserver.cpp
changeset 0 05e9090e2422
child 50 c6286dcf6040
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uigraphics/AknIcon/srvsrc/AknIconDataPreserver.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,239 @@
+/*
+* 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:   
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <e32std.h>
+#include <mifconvdefs.h>
+#include "AknIconDataPreserver.h"
+#include "AknIconFormatHandlerFactory.h"
+#include "AknIconFormatHandler.h"
+#include "AknIconDataItem.h"
+#include "AknIconSrvDef.h"
+#include "AknIconSrv.h"
+#include "AknIconSrvIconItem.h"
+#include "AknIconLoader.h"
+#include "AknIconSrvPanic.h"
+#include "AknIconSrvUtils.h"
+#include "AknIconPanic.h"
+
+
+// CONSTANTS
+const TInt KIconDataItemGranularity = 1;
+
+// ================= MEMBER FUNCTIONS ==========================================
+
+CAknIconDataPreserver::CAknIconDataPreserver( CAknIconServer& aServer ) : 
+    iServer( aServer ),
+    iItems( KIconDataItemGranularity )
+    {
+    }
+
+CAknIconDataPreserver::~CAknIconDataPreserver()
+    {
+    iItems.ResetAndDestroy();
+    }
+
+CAknIconDataPreserver* CAknIconDataPreserver::NewL( CAknIconServer& aServer )
+    {
+    return new( ELeave ) CAknIconDataPreserver( aServer );
+    }
+
+// -----------------------------------------------------------------------------
+// CAknIconDataPreserver::CreateIconL
+// -----------------------------------------------------------------------------
+//
+CAknIconSrvIconItem* CAknIconDataPreserver::CreateIconL(
+    const TAknIconParams& aParams )
+    {
+    CAknIconSrvIconItem* iconItem = NULL;
+
+    // Can be instantiated in stack with this constructor.
+    CAknIconDataItem compareItem( aParams );
+
+    TInt index = iItems.FindInOrder( 
+        &compareItem, CAknIconDataItem::LinearOrder );
+
+    if ( index >= 0 )
+        {
+        CFbsBitmap* bitmap = new (ELeave) CFbsBitmap;
+        CleanupStack::PushL( bitmap );
+
+        CFbsBitmap* mask = NULL;
+
+        if ( aParams.iMaskId >= 0 )
+            {
+            mask = new (ELeave) CFbsBitmap;
+            CleanupStack::PushL( mask );
+            }
+
+        iHandler->UsePreparedIconL( iItems[index]->iHandle );
+
+        TAknContentDimensions dimensions = AknIconSrvUtils::RenderPreparedIconL(
+            *iHandler,
+            bitmap,
+            mask,
+            iItems[index]->iBitmapDepth,
+            iServer.IconDepth(),
+            aParams.iSize,
+            (TScaleMode)aParams.iMode,
+            aParams.iRotationAngle, aParams.iColor, aParams.iAppIcon );
+
+        iconItem = CAknIconSrvIconItem::NewL( aParams,
+                                              bitmap,
+                                              mask,
+                                              dimensions,
+                                              iServer.IconFileNameCache() );
+        CleanupStack::Pop(); // bitmap
+        if ( mask )
+            {
+            CleanupStack::Pop(); // mask
+            }
+        }
+
+    return iconItem;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknIconDataPreserver::PreserveIconDataL
+// -----------------------------------------------------------------------------
+//
+const CAknIconDataItem* CAknIconDataPreserver::PreserveIconDataL(
+    const TAknIconParams& aParams )
+    {
+    CAknIconDataItem* item = NULL;
+
+    CAknIconDataItem compareItem( aParams );
+
+    TInt index = iItems.FindInOrder( 
+        &compareItem, CAknIconDataItem::LinearOrder );
+
+    if ( index >= 0 )
+        {
+        item = iItems[index];
+        item->iUserCount++;
+        }
+    else
+        {
+        CAknIconLoader* loader;
+        TPtrC8 iconData = iServer.InitIconDataAndHandlerLC(
+            aParams, loader, iHandler );
+        
+        // Do not perform preserving for NVG as 
+        // NVG does not need preserving data
+        if (loader->IconTypeL( aParams.iBitmapId ) == EIconFormatNVG )
+            {
+            CleanupStack::PopAndDestroy(); // InitIconDataAndHandlerLC
+            User::Leave( KErrGeneral );
+            }
+
+        item = CAknIconDataItem::NewL( aParams, iServer.IconFileNameCache() );
+        CleanupStack::PushL( item );
+
+        // Makes sure that the icon loader is released when required.
+        CleanupStack::PushL( 
+            TCleanupItem( CAknIconServer::CleanupIconLoader, &iServer ) );
+
+
+
+        item->iBitmapDepth = (TDisplayMode)loader->IconDepthL( aParams.iBitmapId );
+        item->iMaskDepth = (TDisplayMode)loader->MaskDepthL( aParams.iBitmapId );
+
+        iHandler->PrepareIconL( iconData, item->iHandle );
+
+        // CleanupIconLoader, InitIconDataAndHandlerLC
+        CleanupStack::PopAndDestroy(); // CleanupIconLoader, 
+
+        User::LeaveIfError( iItems.InsertInOrder(
+            item, CAknIconDataItem::LinearOrder ) );
+
+        CleanupStack::Pop(); // item
+        CleanupStack::PopAndDestroy(); // InitIconDataAndHandlerLC
+        }
+
+    return item;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknIconDataPreserver::UnpreserveIconData
+// -----------------------------------------------------------------------------
+//
+const CAknIconDataItem* CAknIconDataPreserver::UnpreserveIconData(
+    const TAknIconParams& aParams, TInt aCount, const RMessage2& /*aMessage*/)
+    {
+    CAknIconDataItem compareItem( aParams );
+
+    TInt index = iItems.FindInOrder( 
+        &compareItem, CAknIconDataItem::LinearOrder );
+
+    CAknIconDataItem* item = 0;
+    if (index >= 0)
+        {
+        item = iItems[index];
+        item->iUserCount -= aCount;
+    
+        if ( item->iUserCount == 0 )
+            {
+            iHandler->UnprepareIcon( item->iHandle );
+            delete item;
+            iItems.Remove( index );
+            }
+        }
+    // OK to return also a pointer to a deleted item.
+    return item;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknIconDataPreserver::GetContentDimensionsL
+// -----------------------------------------------------------------------------
+//
+void CAknIconDataPreserver::GetContentDimensionsL( 
+    const TAknIconParams& aParams,
+    TAknContentDimensions& aContentDimensions )
+    {
+    CAknIconDataItem compareItem( aParams );
+
+    TInt index = iItems.FindInOrder( 
+        &compareItem, CAknIconDataItem::LinearOrder );
+
+    if ( index >= 0 )
+        {
+        iHandler->UsePreparedIconL( iItems[index]->iHandle );
+        iHandler->GetContentDimensionsL( aContentDimensions );
+        }
+    else
+        {
+        CAknIconLoader* loader;
+        TPtrC8 iconData = iServer.InitIconDataAndHandlerLC(
+            aParams, loader, iHandler );
+
+        TInt handle;
+        iHandler->PrepareIconL( iconData, handle );
+        TRAPD( err,
+            {
+            iHandler->UsePreparedIconL( handle );
+            iHandler->GetContentDimensionsL( aContentDimensions );
+            } );
+        iHandler->UnprepareIcon( handle );
+        User::LeaveIfError( err );
+        CleanupStack::PopAndDestroy(); // InitIconDataAndHandlerLC
+        }
+    }
+
+//  End of File