uigraphics/AknIcon/srvsrc/AknIconSrvPrecacher.cpp
changeset 0 05e9090e2422
child 11 33ddb261ab37
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uigraphics/AknIcon/srvsrc/AknIconSrvPrecacher.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,379 @@
+/*
+* Copyright (c) 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:  CAknIconSrvPrecacher class.
+*
+*
+*/
+
+#ifdef PRECACHE2
+#include <e32std.h>
+#include <fbs.h>
+#include <barsread.h>
+#include <barsc.h>
+#include "AknIconSrvPrecacher.h"
+#include "AknIconSrv.h"
+#include <AknIconSrv.rsg>
+#include "AknIconTraces.h"
+
+#include "AknIconSrv.h"
+#include "AknIconLoader.h"
+#include "AknIconSrvCache.h"
+#include "AknIconSrvDef.h"
+#include "AknIconManager.h"
+#include "AknIconSrvIconItem.h"
+#include "AknIconSrvUtils.h"
+#include "AknIconUtils.h"
+#include "mifconvdefs.h"
+#include "AknSvgFormatHandler.h"
+#include "akniconconfig.h"
+#include "AknIconFormatHandlerFactory.h"
+
+_LIT( KAknIconResourceFile, "z:\\resource\\akniconsrv.rsc" );
+
+// -----------------------------------------------------------------------------
+// 2 Phase Construction
+// -----------------------------------------------------------------------------
+CAknIconSrvPrecacher::CAknIconSrvPrecacher( CAknIconServer& aServer ) :
+    iServer(aServer)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 2 Phase Construction
+// -----------------------------------------------------------------------------
+CAknIconSrvPrecacher* CAknIconSrvPrecacher::NewL( CAknIconServer& aServer )
+    {
+    CAknIconSrvPrecacher* self = new( ELeave ) CAknIconSrvPrecacher( aServer );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// 2 Phase Construction
+// -----------------------------------------------------------------------------
+void CAknIconSrvPrecacher::ConstructL()
+    {
+    User::LeaveIfError( iFs.Connect() );
+    iSvgFormatHandler = CAknSvgFormatHandler::NewL();
+    User::LeaveIfError( RFbsSession::Connect() );
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CAknIconSrvPrecacher::~CAknIconSrvPrecacher()
+    {
+    delete iLoader;
+    delete iSvgFormatHandler;
+    RFbsSession::Disconnect();
+    iFs.Close();
+    }
+    
+// -----------------------------------------------------------------------------
+// Start reading from precache list
+// -----------------------------------------------------------------------------
+void CAknIconSrvPrecacher::Start()
+    {
+    HBufC8* res = NULL ;
+    TRAPD(err, res = SetupL());
+    if (err == KErrNone)
+        {
+        TResourceReader reader;
+        reader.SetBuffer( res );
+
+        TRAPD(merror, ReadPrecacheItemsL( reader));
+
+        if(merror != KErrNone)
+            {
+#ifdef __AKNICON_TRACES
+            RDebug::Printf("Error Processing Precacher List");
+#endif
+            }
+
+        iServer.iPrecacheComplete = ETrue;
+        RThread thread;
+        thread.Suspend();
+        
+        while (iServer.iFreePrecacheBitmapHandles.Count())
+            {
+            CFbsBitmap* bitmap = iServer.iFreePrecacheBitmapHandles[0];
+            delete bitmap;
+            iServer.iFreePrecacheBitmapHandles.Remove(0);
+            }
+        iServer.iFreePrecacheBitmapHandles.Close();
+        }
+        if(res)
+            {
+            delete res;
+            }
+    }
+    
+// -----------------------------------------------------------------------------
+// read each item from the list
+// -----------------------------------------------------------------------------
+TInt CAknIconSrvPrecacher::ReadPrecacheItemsL(TResourceReader& aReader)
+    {
+    TInt count = aReader.ReadInt16();
+    if (count > 0)
+        {
+        User::LeaveIfError( iSkinSession.Connect( ) );
+        
+        CAknsSrvChunkLookup* lookup = iSkinSession.CreateChunkLookupL();
+        CleanupStack::PushL( lookup );
+        
+        
+        iCurrentFileName.Zero();
+        
+        
+        for ( TInt i = 0 ; i < count ; i++ )
+            {
+#ifdef __AKNICON_TRACES
+            RDebug::Printf("precache loop,%d,%d",i,count);
+#endif
+            
+            TRAPD(error,ProcessEntryL(lookup, aReader));
+
+            if(error != KErrNone)
+                {
+#ifdef __AKNICON_TRACES
+                RDebug::Printf("Error Processing Precacher List");
+#endif
+                }
+
+            }
+            
+        CleanupStack::PopAndDestroy( 1 ); // lookup
+        iSkinSession.Close();
+    
+        }
+    return count;
+    }
+
+// -----------------------------------------------------------------------------
+// read each entry into iNewprecached items
+// -----------------------------------------------------------------------------
+void CAknIconSrvPrecacher::ProcessEntryL(CAknsSrvChunkLookup* lookup, TResourceReader& aReader)
+    {
+    TAknIconParams info;
+    info.iRotationAngle = 0;
+    info.iColor = KColorNotDefined;
+    
+    TFileName file;
+        
+    TInt skinIdMajor = aReader.ReadInt32();
+    TInt skinIdMinor = aReader.ReadInt32();
+    
+    HBufC* temp;
+    temp = aReader.ReadHBufC16L();
+    
+        
+    if (temp)
+        {
+        file.Copy(temp->Des());
+        delete temp;
+        }
+    else
+        {
+        file.Zero();
+        }
+    
+    info.iBitmapId = aReader.ReadInt32();
+    info.iMaskId = aReader.ReadInt32();
+    TInt width = aReader.ReadInt32();
+    TInt height = aReader.ReadInt32();
+    info.iSize = TSize(width,height);
+    info.iMode = (TScaleMode)aReader.ReadInt32();
+    info.iAppIcon = EFalse;
+    // Convert icon ID to MIF ID
+    if ( info.iBitmapId >= KMifIdFirst )
+        {
+        info.iBitmapId -= KMifIdFirst;
+        }
+    if ( info.iMaskId >= KMifIdFirst )
+        {
+        info.iMaskId -= KMifIdFirst;
+        }
+        
+    if (skinIdMajor != -1 || skinIdMinor != -1)
+        {
+        TAknsItemID id = { skinIdMajor, skinIdMinor };
+        CAknsItemDef* def = lookup->LookupAndCreateDefL( id );
+        if ( def )
+            {
+            CleanupStack::PushL( def );
+
+            TAknsItemType type = def->Type();
+
+            switch ( type )
+                {
+                case EAknsITBitmap:
+                    {
+                    info.iBitmapId=(*static_cast<CAknsBitmapItemDef*>( def )).Index();
+                    if ( info.iBitmapId >= KMifIdFirst )
+                        {
+                        info.iBitmapId -= KMifIdFirst;
+                        }
+                    info.iMaskId = -1;
+                    file = (*static_cast<CAknsBitmapItemDef*>( def )).Filename();
+                    break;
+                    }
+                case EAknsITMaskedBitmap:
+                    {
+                    info.iBitmapId=(*static_cast<CAknsBitmapItemDef*>( def )).Index();
+                    if ( info.iBitmapId >= KMifIdFirst )
+                        {
+                        info.iBitmapId -= KMifIdFirst;
+                        }
+                    info.iMaskId = info.iBitmapId + 1;
+
+                    file = (*static_cast<CAknsBitmapItemDef*>( def )).Filename();
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            CleanupStack::PopAndDestroy(); // def
+            }
+        }
+    if (file.Length() == 0)
+        {
+        #ifdef __AKNICON_TRACES
+        RDebug::Printf("Precacher resource: File name invalid");
+        #endif
+        
+        return;
+        }
+
+    if ( iCurrentFileName != file || iLoader == NULL )
+        {
+        delete iLoader;
+        iLoader = NULL;
+        iLoader = CAknIconLoader::NewL( iFs, file );
+#ifdef _NGATESTING
+        iLoader->SetIconTypeConfig(iServer.iConfigIconType, iServer.iNGADirectory);
+#endif
+        
+        iCurrentFileName = file;
+        }
+    if( iLoader == NULL )
+        {
+        #ifdef __AKNICON_TRACES
+        RDebug::Printf("Precacher resource: Unable to create iLoader");
+        #endif
+        
+        return;
+        }
+    TPtrC8 iconData ;
+    iconData.Set(iLoader->IconL( info.iBitmapId ));
+    
+    TDisplayMode bitmapDepth;
+    bitmapDepth = (TDisplayMode)iLoader->IconDepthL( info.iBitmapId );
+    
+  /*  TDisplayMode maskDepth;
+    maskDepth =  */(TDisplayMode)iLoader->MaskDepthL( info.iBitmapId );
+    
+    iSvgFormatHandler->SupportedDisplayMode(bitmapDepth, iServer.iIconMode );
+ 
+
+    TInt iconHandle;
+    
+    iSvgFormatHandler->PrepareIconL( iconData, iconHandle );
+    
+
+    iLoader->FreeIcon();
+    
+    iSvgFormatHandler->UsePreparedIconL( iconHandle );
+    
+    
+ 
+    CFbsBitmap* bitmap = new( ELeave ) CFbsBitmap;
+    CleanupStack::PushL( bitmap );
+    
+    CFbsBitmap* mask = NULL;
+    if ( info.iMaskId >= 0 )
+        {
+        mask = new( ELeave ) CFbsBitmap;
+        CleanupStack::PushL( mask );
+        }
+        
+    TAknContentDimensions dimensions;
+     
+    dimensions = AknIconSrvUtils::RenderPreparedIconL(
+        *iSvgFormatHandler,
+        bitmap,
+        mask,
+        bitmapDepth,
+        iServer.IconDepth(),
+        info.iSize,
+        (TScaleMode)info.iMode,
+        0 //RotationAngle 
+        );
+    
+    
+    
+    iSvgFormatHandler->UnprepareIcon( iconHandle );
+    
+    //
+    if (file.Left( KAknIconDefaultDirLength ) == KAknIconDefaultDir )
+        {
+        info.iFileName = file.Mid( KAknIconDefaultDirLength );
+        info.SetDefaultIconDirUsed();
+        }
+    else
+        {
+        info.iFileName = file;
+        }
+    //
+    CAknIconSrvIconItem* item;
+    
+    item = CAknIconSrvIconItem::NewL( info, bitmap, mask, dimensions, *(iServer.iFileNameCache ));
+    CleanupStack::PushL(item);//item
+    
+    item->iUserCount--;
+    
+   if ( mask )
+        {
+        item->iUserCount--;
+        }
+   item->iPrecacheItem = ETrue;
+   iServer.iNewPrecachedItems.AppendL(item);
+   CleanupStack::Pop(); // item
+   
+   if ( mask )
+        {
+        CleanupStack::Pop(); // mask
+        }
+   CleanupStack::Pop(); //bitmap             
+        
+   }
+   
+HBufC8* CAknIconSrvPrecacher::SetupL()
+    {
+    RResourceFile file;
+    file.OpenL( iFs, KAknIconResourceFile ) ;
+    CleanupClosePushL( file );
+    HBufC8* res =file.AllocReadLC( R_PRECACHE_LIST2 );
+    CleanupStack::Pop(1); // res
+    CleanupStack::PopAndDestroy(1);//file
+    
+    return res;
+    
+    }
+    #endif
+// ------------------------------EndOfFile-------------------------------------------
+