--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/satui/satapp/src/csatuiiconhandler.cpp Fri Mar 19 09:40:14 2010 +0200
@@ -0,0 +1,245 @@
+/*
+* Copyright (c) 2006-2010 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: Implementation of CSatUiIconHandler class.
+*
+*/
+
+#include <exception>
+#include <fbs.h>
+#include <rsatservice.h>
+#include <tsaticoninfo.h>
+
+#include "csatuiiconhandler.h"
+#include "tflogger.h"
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// First part of Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CSatUiIconHandler* CSatUiIconHandler::NewL()
+ {
+ TFLOGSTRING( "CSatUiIconHandler::NewL enter" )
+ CSatUiIconHandler* self = new ( ELeave ) CSatUiIconHandler;
+ TFLOGSTRING( "CSatUiIconHandler::NewL exit" )
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CSatUiIconHandler::~CSatUiIconHandler()
+ {
+ TFLOGSTRING( "CSatUiIconHandler::~CSatUiIconHandler enter" )
+ // Close RSatService interface
+ iSatService.Close();
+ TFLOGSTRING( "CSatUiIconHandler::~CSatUiIconHandler exit" )
+ }
+
+// ---------------------------------------------------------------------------
+// Fetches first icon information, then the handle to the icon and at last
+// does the duplication of the icon bitmap. Object is set to wait the
+// completion of the request.
+// ---------------------------------------------------------------------------
+//
+CFbsBitmap* CSatUiIconHandler::FetchIconL( const RSatSession& aSatSession,
+ const TUint8 aIconId,
+ const TInt aOptWidth,
+ const TInt aOptHeight,
+ TBool& aIconSupport )
+ {
+ TFLOGSTRING( "CSatUiIconHandler::FetchIconL enter" )
+ TFLOGSTRING3( "CSatUiIconHandler::FetchIconL aOptWidth=%d aOptHeight=%d",
+ aOptWidth, aOptHeight )
+
+ iSatService.OpenL( aSatSession );
+ CleanupClosePushL( iSatService );
+
+ RIconEf iconEf;
+ CleanupClosePushL( iconEf );
+ // Order of superiority list
+ RArray<TInt> selectedIcons;
+ CleanupClosePushL( selectedIcons );
+ CFbsBitmap* iconBitmap = NULL;
+
+ // Getting the information of the icon
+ TRAPD( err, iSatService.GetIconInfoL( aIconId, iconEf ); );
+
+ if ( KErrNone == err )
+ {
+ TFLOGSTRING( "CSatUiIconHandler::FetchIconL no error" )
+ // Sorting into order of superiority
+ SortIconsL( iconEf, selectedIcons, aOptWidth, aOptHeight );
+
+ // Reset iconCount by approved icons
+ const TInt iconCount = selectedIcons.Count() <= iconEf.Count() ?
+ selectedIcons.Count() :
+ iconEf.Count();
+ TBool fetchSuccess( EFalse );
+
+ TFLOGSTRING2( "CSatUiIconHandler::FetchIconL iconCount: %d", iconCount )
+ // If there were icons to be fetched
+ if ( 0 < iconCount )
+ {
+ // start going through approved icons list from the
+ // first and biggest icon
+ TInt counter( 0 );
+ for ( counter = 0; ( counter < iconCount ) && !fetchSuccess;
+ counter++ )
+ {
+ TInt selectedIconCounter = selectedIcons.operator[]( counter );
+ TFLOGSTRING2( "CSatUiIconHandler::\
+ FetchIconL selectedIconCounter: %d", selectedIconCounter )
+ TRAPD( err,
+ iconBitmap = iSatService.GetIconL( iconEf.operator[](
+ selectedIconCounter ) ) );
+ if ( KErrNone == err )
+ {
+ fetchSuccess = ETrue;
+ TFLOGSTRING( "CSatUiIconHandler::FetchIconL fetchSuccess!" )
+ }
+ else
+ {
+ delete iconBitmap;
+ }
+ }
+ }
+ }
+
+ TFLOGSTRING2( "CSatUiIconHandler::FetchIconL icon info error=%d", err )
+ if ( KErrNotSupported == err )
+ {
+ TFLOGSTRING( "CSatUiIconHandler::FetchIconL icons not supported" )
+ aIconSupport = EFalse;
+ }
+
+ // selectedIcons, iconEf and iSatService not deleted but closed
+ CleanupStack::PopAndDestroy( 3, &iSatService );
+
+ TFLOGSTRING( "CSatUiIconHandler::FetchIconL exit" )
+ // Icon was not found, icons are not supported or an error was received.
+ return iconBitmap;
+ }
+
+// ---------------------------------------------------------------------------
+// C++ default constructor cannot contain any code that might leave.
+// ---------------------------------------------------------------------------
+//
+CSatUiIconHandler::CSatUiIconHandler()
+ {
+ TFLOGSTRING( "CSatUiIconHandler::CSatUiIconHandler enter - exit" )
+ }
+
+// ---------------------------------------------------------------------------
+// Sorts icons into order of superiority
+// ---------------------------------------------------------------------------
+//
+void CSatUiIconHandler::SortIconsL( const RIconEf& aIconEf,
+ RArray<TInt>& aSelectedIcons, const TInt aOptWidth,
+ const TInt aOptHeight ) const
+ {
+ TFLOGSTRING( "CSatUiIconHandler::SortIcons enter" )
+
+ const TInt iconCount = aIconEf.Count();
+ TFLOGSTRING2( "CSatUiIconHandler::SortIcons iconCount=%d", iconCount )
+ TInt counter( 0 );
+ // Search icon from available iconarray
+ for ( counter = 0; counter < iconCount; counter++ )
+ {
+ TFLOGSTRING3( "CSatUiIconHandler::SortIcons Icon Width=%d Height=%d",
+ aIconEf.operator[]( counter ).IconSize().iWidth,
+ aIconEf.operator[]( counter ).IconSize().iHeight )
+
+ const TInt selectedCount( aSelectedIcons.Count() );
+ TBool replacement( EFalse );
+
+ // Count the difference of the icon versus layout
+ TInt newWidthDifference(
+ aOptWidth - aIconEf.operator[]( counter ).IconSize().iWidth );
+ TInt newHeightDifference(
+ aOptHeight - aIconEf.operator[]( counter ).IconSize().iHeight );
+
+ // Make the difference absolute value
+ if ( newWidthDifference < 0 )
+ {
+ newWidthDifference = -newWidthDifference;
+ }
+
+ if ( newHeightDifference < 0 )
+ {
+ newHeightDifference = -newHeightDifference;
+ }
+ TInt listCounter( 0 );
+ // Going through the list of icons of suitable size
+ for ( listCounter = 0; ( listCounter < selectedCount ) &&
+ !replacement; listCounter++ )
+ {
+
+ // Count the difference of the icon versus layout
+ TInt oldWidthDifference( aOptWidth - aIconEf.operator[](
+ aSelectedIcons.operator[]( listCounter ) ).IconSize().iWidth );
+ TInt oldHeightDifference( aOptHeight - aIconEf.operator[](
+ aSelectedIcons.operator[]( listCounter ) ).IconSize().iHeight );
+
+ // Make the difference absolute value
+ if ( oldWidthDifference < 0 )
+ {
+ oldWidthDifference = -oldWidthDifference;
+ }
+
+ if ( oldHeightDifference < 0 )
+ {
+ oldHeightDifference = -oldHeightDifference;
+ }
+
+ // New icon is better either by being closer to the layout or by
+ // being same size and color instead of black and white
+ if ( ( ( newWidthDifference < oldWidthDifference ) &&
+ ( newHeightDifference <= oldHeightDifference ) ) ||
+ ( ( newWidthDifference <= oldWidthDifference ) &&
+ ( newHeightDifference < oldHeightDifference ) ) ||
+ ( ( newWidthDifference == oldWidthDifference ) &&
+ ( newHeightDifference == oldHeightDifference ) &&
+ ( TSatIconInfo::EBasic == aIconEf.operator[]( aSelectedIcons.
+ operator[]( listCounter ) ).CodingScheme() ) &&
+ ( TSatIconInfo::EColor == aIconEf.operator[]( counter ).
+ CodingScheme() ) ) )
+ {
+ TFLOGSTRING2( "CSatUiIconHandler::SortIcons \
+ newWidthDifference: %d", newWidthDifference )
+ TFLOGSTRING2( "CSatUiIconHandler::SortIcons \
+ oldHeightDifference: %d", oldHeightDifference )
+ // Insert new icon to correct place
+ aSelectedIcons.InsertL( counter, listCounter );
+ replacement = ETrue;
+ }
+ }
+
+ TFLOGSTRING2( "CSatUiIconHandler::SortIcons listCounter: %d", \
+ listCounter )
+ // Either first item or was not better than any in the list
+ // New icon is added to the end of the array
+ if ( !replacement )
+ {
+ aSelectedIcons.AppendL( counter );
+ }
+ }
+
+ TFLOGSTRING2( "CSatUiIconHandler::SortIcons counter: %d", \
+ counter )
+ TFLOGSTRING( "CSatUiIconHandler::SortIcons exit" )
+ }
+