uifw/AvKon/src/AknIconArray.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknIconArray.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,156 @@
+/*
+* 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 "AknIconArray.h"  // This class
+#include <barsread.h>       // TResourceReader
+#include <fbs.h>            // CFbsBitmap
+#include <gulicon.h>        // CGulIcon
+#include <coemain.h>        // CCoeEnv
+#include <bautils.h>
+#include "avkon.hrh"
+#include "AknPanic.h"
+
+#include <AknIconUtils.h>
+
+
+// LOCAL FUNCTION PROTOTYPES
+// ==================== LOCAL FUNCTIONS ====================
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+EXPORT_C CAknIconArray::CAknIconArray(TInt aGranurality)
+    : CArrayPtrFlat<CGulIcon>(aGranurality)
+    {
+    }
+
+EXPORT_C void CAknIconArray::ConstructFromResourceL(TInt aResId)
+    {
+    AppendFromResourceL(aResId);
+    }
+
+EXPORT_C void CAknIconArray::ConstructFromResourceL(TResourceReader& aReader)
+    {
+    AppendFromResourceL(aReader);
+    }
+
+EXPORT_C CAknIconArray::~CAknIconArray()
+    {
+    ResetAndDestroy();
+    }
+
+EXPORT_C void CAknIconArray::AppendFromResourceL(TInt aResId)
+    {
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, aResId);
+    AppendFromResourceL(reader);
+    CleanupStack::PopAndDestroy();  // reader
+    }
+
+EXPORT_C void CAknIconArray::AppendFromResourceL(TResourceReader& aReader)
+    {
+    TInt type = aReader.ReadInt16();
+    switch (type)
+		{
+		case EAknIconArraySimple:
+		break; // go to the actual reader
+		case EAknIconArrayComplex:
+			{
+			TInt count_a = aReader.ReadInt16();
+			while(count_a-- > 0)
+				{
+				// recursive algorithm.	
+				AppendFromResourceL(aReader);
+				}
+			}
+			return;
+		default:
+		aReader.Rewind(2);
+
+		};
+    
+
+    // this reads AKN_ICON_ARRAY *except* the type field!
+    HBufC* bmpName = GetBmpNameLC(aReader); 
+
+    TInt count = aReader.ReadInt16();
+    SetReserveL(Count() + count);
+    while (count-- > 0)
+        {
+        TInt32 iconId = aReader.ReadInt32();
+        TInt32 maskId = aReader.ReadInt32();
+
+    	CFbsBitmap* bitmap;
+        CFbsBitmap* mask;
+
+        AknIconUtils::CreateIconLC( bitmap, mask, *bmpName, iconId, maskId );
+
+        CGulIcon* icon = CGulIcon::NewL(bitmap, mask);
+        CleanupStack::Pop(2);  // mask, bitmap
+
+        // Following AppendL call cannot leave due to lack of memory because 
+        // of SetReserveL above. This is why there is no need to push icon
+        // on the cleanup stack.
+        AppendL(icon);
+        }
+
+    CleanupStack::PopAndDestroy();  // bmpName
+    }
+
+HBufC* CAknIconArray::GetBmpNameLC(TResourceReader& aReader)
+    {
+    HBufC* bmpName = aReader.ReadHBufCL();
+    CleanupStack::PushL(bmpName);
+
+    TBool drivePresent =
+        (bmpName->Length() >= 3 &&
+        (*bmpName)[1] == ':' &&
+        (*bmpName)[2] == '\\' );
+
+    RFs& fs = CCoeEnv::Static()->FsSession();
+
+    TBool found = EFalse;
+    if ( drivePresent )
+        {
+        found = BaflUtils::FileExists( fs, *bmpName );
+        }
+
+    // If drive letter is not specified, or not found in the specified drive,
+    // FindByDir scans the drives in order E:, D:, C:, Z:
+
+    if (!found)
+        {
+        TFindFile find( fs );
+        if (find.FindByDir(*bmpName, KNullDesC) == KErrNone)
+            {
+            if (bmpName->Length() < find.File().Length())
+                {
+                bmpName = bmpName->ReAllocL(find.File().Length());
+                CleanupStack::Pop(); // old bmpName
+                CleanupStack::PushL( bmpName );
+                }
+    
+            *bmpName = find.File();
+            }
+        }
+
+    return bmpName;
+    }
+//  End of File  
+