--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/widgetmanager/src/wmconfiguration.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,512 @@
+/*
+* Copyright (c) 2009 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:
+* WidgetManager configuration class
+*
+*/
+
+// INCLUDE FILES
+#include <centralrepository.h>
+#include <StringLoader.h>
+#include <AknsConstants.h>
+#include <widgetregistryclient.h> // widget reqistry
+
+#include <widgetmanagerview.rsg>
+#include <widgetmanager.mbg>
+#include "wmconfiguration.h"
+#include "wmresourceloader.h"
+#include "wmcrkeys.h"
+
+// some constants regarging the central repository localised section.
+// these will ensure CR localisation section compatibility even if
+// new strings are added
+const TInt KLangOffsetOperatorUrl = KOperatorButtonUrl0 - KLangId0;
+const TInt KLangOffsetOperatorText = KOperatorButtonText0 - KLangId0;
+const TInt KLangGroupSize = KLangId1 - KLangId0;
+const TUint32 KLastLangId = KLangId9;
+
+_LIT( KOpAppTypeS60, "s60" );
+_LIT( KOpAppTypeCwrt, "cwrt" );
+_LIT( KOpAppTypeWrt, "wrt" );
+_LIT( KOpAppTypeJava, "java" );
+_LIT( KOpAppTypeQt, "qt" );
+_LIT( KSeparator, ":" );
+_LIT( KOperatorIcon, "uid(%d)");
+_LIT( KHexPrefix, "0x" );
+
+// ---------------------------------------------------------
+// CWmConfiguration::NewL
+// ---------------------------------------------------------
+//
+CWmConfiguration* CWmConfiguration::NewL(
+ CWmResourceLoader& aResourceLoader )
+ {
+ CWmConfiguration* self = new (ELeave) CWmConfiguration( aResourceLoader );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::CWmConfiguration()
+// ---------------------------------------------------------
+//
+CWmConfiguration::CWmConfiguration(
+ CWmResourceLoader& aResourceLoader )
+ : iResourceLoader( aResourceLoader )
+ {
+
+ // ovi
+ iOviStoreUid = KNullUid;
+
+ // operator
+ iOperatorAppIdUid = KNullUid;
+ iOperatorAppType = EUnknown;
+ iOperatorButtonEnabled = EFalse;
+ iButtonsMirrored = EFalse;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::~CWmConfiguration()
+// ---------------------------------------------------------
+//
+CWmConfiguration::~CWmConfiguration()
+ {
+ delete iRepository;
+ // ovi
+ delete iOviStoreClientParam;
+ delete iOviButtonTitle;
+ delete iOviButtonIcon;
+ // operator
+ delete iOperatorButtonTitle;
+ delete iOperatorButtonIcon;
+ delete iOperatorButtonUrl;
+ delete iOperatorParam;
+ delete iOperatorAppIdStr;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::ConstructL
+// ---------------------------------------------------------
+//
+void CWmConfiguration::ConstructL()
+ {
+ // localised ovistore button text
+ iOviButtonTitle = StringLoader::LoadL( R_QTN_WM_GO_TO_OVI_STORE );
+
+ // ovistore icon descriptor. It will look something like this:
+ // skin( 0x101f86e3 0x23f6 ):mif( z:\resource\apps\widgetmanager.mif 16388 16389 )
+ _LIT( KSkinMifIconFormat, "skin( 0x%x 0x%x ):mif( %S %d %d )");
+ const TInt KMaxIconDescriptorLength = 256;
+ TBuf<KMaxIconDescriptorLength> buf;
+ buf.Format( KSkinMifIconFormat(),
+ EAknsMajorGeneric, EAknsMinorGenericQgnMenuOviStore,
+ &iResourceLoader.IconFilePath(),
+ EMbmWidgetmanagerQgn_menu_ovistore,
+ EMbmWidgetmanagerQgn_menu_ovistore_mask );
+ iOviButtonIcon = buf.AllocL();
+
+ // read data from repository
+ TRAP_IGNORE( LoadConfigurationL(); );
+
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::LoadConfigurationL
+// ---------------------------------------------------------
+//
+void CWmConfiguration::LoadConfigurationL()
+ {
+ iRepository = CRepository::NewL(
+ TUid::Uid( KCrWidgetManagerm ) );
+
+ // read Ovi parameters
+ ReadInt32Parameter( KOviStoreUid, iOviStoreUid.iUid );
+ iOviStoreClientParam = ReadDescParameterL( KOviStoreClientParam );
+
+ // read operator parameters if operator button enabled
+ ReadIntParameter( KOperatorButtonEnabled, iOperatorButtonEnabled );
+ if ( iOperatorButtonEnabled )
+ {
+ // determine language and read localised parameters
+ iLanguageIndex = FindCorrectLanguageId();
+ iOperatorButtonTitle = ReadLocalisedParameterL( KLangOffsetOperatorText );
+ iOperatorButtonUrl = ReadLocalisedParameterL( KLangOffsetOperatorUrl );
+ // read non-localised parameters
+ iOperatorButtonIcon = ReadDescParameterL( KOperatorButtonIcon );
+ ReadOperatorApplicationInfoL();
+ iOperatorParam = ReadDescParameterL( KOperatorParam );
+ ReadIntParameter( KOperatorButtonHigherPriority, iButtonsMirrored );
+ }
+
+ delete iRepository;
+ iRepository = NULL;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::FindCorrectLanguageId
+// ---------------------------------------------------------
+//
+TInt CWmConfiguration::FindCorrectLanguageId()
+ {
+ TInt languageIndex = KErrNotFound; // the correct language
+ TInt englishIndex = KErrNotFound; // english
+ TInt anyIndex = KErrNotFound; // backup - any existing
+ TLanguage sysLang = User::Language();
+
+ //read language id's from cenrep, find a match
+ for( TUint32 i=KLangId0; i<=KLastLangId && languageIndex<0; i+=KLangGroupSize )
+ {
+ TInt crLang = 0;
+ if ( iRepository->Get( i, crLang ) == KErrNone )
+ {
+ if ( crLang == sysLang && languageIndex < 0 )
+ { languageIndex = i; }
+ if ( crLang == ELangEnglish && englishIndex < 0 )
+ { englishIndex = i; }
+ if ( crLang > 0 && anyIndex < 0 )
+ { anyIndex = i; }
+ }
+ }
+
+ // if correct language was not found, use english
+ if ( languageIndex < 0 ) languageIndex = englishIndex;
+ // if english was not found, use any configured language
+ if ( languageIndex < 0 ) languageIndex = anyIndex;
+ // if there are no languages configured, we're in trouble...
+ if ( languageIndex < 0 ) languageIndex = 0;
+
+ return languageIndex;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::ReadDescParameterL
+// ---------------------------------------------------------
+//
+HBufC* CWmConfiguration::ReadDescParameterL( TInt aKey )
+ {
+ TBuf<NCentralRepositoryConstants::KMaxUnicodeStringLength> buf;
+ TInt err = iRepository->Get( aKey, buf );
+
+ HBufC* heapBuffer = NULL;
+ if ( err == KErrNone )
+ {
+ heapBuffer = HBufC::NewL( buf.Length() );
+ heapBuffer->Des().Copy( buf );
+ }
+ return heapBuffer;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::ReadInt32ParameterIntL
+// ---------------------------------------------------------
+//
+void CWmConfiguration::ReadInt32Parameter( TInt aKey, TInt32& aValue )
+ {
+ TInt value = 0;
+ if ( iRepository->Get( aKey, value ) == KErrNone )
+ {
+ aValue = value;
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::ReadIntParameterIntL
+// ---------------------------------------------------------
+//
+void CWmConfiguration::ReadIntParameter( TInt aKey, TInt& aValue )
+ {
+ aValue = 0;
+ iRepository->Get( aKey, aValue );
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::ReadLocalisedParameterL
+// ---------------------------------------------------------
+//
+HBufC* CWmConfiguration::ReadLocalisedParameterL(
+ TInt aOffset )
+ {
+ TBuf<NCentralRepositoryConstants::KMaxUnicodeStringLength> buf;
+ TInt err = KErrNone;
+
+ err = iRepository->Get( iLanguageIndex + aOffset, buf );
+ if ( err != KErrNone || buf.Length() == 0 )
+ {
+ // This language is empty. Try default language (index 0)
+ err = iRepository->Get( KLangId0 + aOffset, buf );
+ }
+
+ // construct string in heap
+ HBufC* heapBuffer = NULL;
+ if ( err == KErrNone )
+ {
+ heapBuffer = buf.AllocL();
+ }
+ return heapBuffer;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::ReadOperatorApplicationInfoL
+// ---------------------------------------------------------
+//
+void CWmConfiguration::ReadOperatorApplicationInfoL()
+ {
+ HBufC* applicationInfo = ReadDescParameterL( KOperatorAppTypeAndId );
+ if ( applicationInfo && applicationInfo->Des().Length() > 0 )
+ {
+ CleanupStack::PushL( applicationInfo );
+ applicationInfo->Des().TrimAll();
+
+ // parse
+ TInt separator = applicationInfo->Des().Find( KSeparator );
+ if ( separator != KErrNotFound )
+ {
+ TPtrC type = applicationInfo->Des().Left( separator );
+ TPtrC appId = applicationInfo->Des().Mid(
+ separator + KSeparator().Length() );
+
+ if ( !type.Compare( KOpAppTypeS60 ) )
+ {
+ iOperatorAppType = ES60;
+ iOperatorAppIdUid = StringToUid( appId );
+ SetOperatorIconL( iOperatorAppIdUid );
+ }
+ else if ( !type.Compare( KOpAppTypeCwrt ) )
+ {
+ iOperatorAppType = ECwrt;
+ iOperatorAppIdUid = FetchWidgetUidFromRegistryL( appId );
+ SetOperatorIconL( iOperatorAppIdUid );
+ }
+ else if ( !type.Compare( KOpAppTypeWrt ) )
+ {
+ iOperatorAppType = EWrt;
+ iOperatorAppIdUid = FetchWidgetUidFromRegistryL( appId );
+ SetOperatorIconL( iOperatorAppIdUid );
+ }
+ else if ( !type.Compare( KOpAppTypeJava ) )
+ {
+ //TODO: java support is not fully implemented
+ User::Leave( KErrGeneral );
+ iOperatorAppType = EJava;
+ iOperatorAppIdStr = appId.AllocL();
+ }
+ else if ( !type.Compare( KOpAppTypeQt ) )
+ {
+ iOperatorAppType = EQt;
+ iOperatorAppIdUid = StringToUid( appId );
+ SetOperatorIconL( iOperatorAppIdUid );
+ }
+ }
+ CleanupStack::PopAndDestroy( applicationInfo );
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::SetOperatorIcon
+// ---------------------------------------------------------
+//
+void CWmConfiguration::SetOperatorIconL( TUid aUid )
+ {
+ if ( iOperatorButtonIcon &&
+ !iOperatorButtonIcon->Des().Length() )
+ {
+ delete iOperatorButtonIcon;
+ iOperatorButtonIcon = NULL;
+ iOperatorButtonIcon = HBufC::NewL(
+ KMaxUidName + KOperatorIcon().Length() );
+ iOperatorButtonIcon->Des().Format(
+ KOperatorIcon(), aUid );
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::FetchWidgetUidFromRegistryL
+// ---------------------------------------------------------
+//
+TUid CWmConfiguration::FetchWidgetUidFromRegistryL(
+ const TDesC& aBundleId )
+ {
+ RWidgetRegistryClientSession clientSession;
+ User::LeaveIfError( clientSession.Connect() );
+ CleanupClosePushL( clientSession );
+ TInt ret = clientSession.GetWidgetUidL( aBundleId );
+ clientSession.Disconnect();
+ CleanupStack::PopAndDestroy( &clientSession );
+ return TUid::Uid( ret );
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonCount
+// ---------------------------------------------------------
+//
+TInt CWmConfiguration::PortalButtonCount()
+ {
+ return ( iOperatorButtonEnabled ? 2 : 1 );
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonText
+// ---------------------------------------------------------
+//
+const TDesC& CWmConfiguration::PortalButtonText( TInt aIndex )
+ {
+ if ( aIndex == 0 && iOviButtonTitle )
+ return *iOviButtonTitle;
+ if ( aIndex == 1 && iOperatorButtonTitle && iOperatorButtonEnabled )
+ return *iOperatorButtonTitle;
+ return KNullDesC;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonIcon
+// ---------------------------------------------------------
+//
+const TDesC& CWmConfiguration::PortalButtonIcon( TInt aIndex )
+ {
+ if ( aIndex == 0 && iOviButtonIcon )
+ return *iOviButtonIcon;
+ if ( aIndex == 1 && iOperatorButtonIcon && iOperatorButtonEnabled )
+ return *iOperatorButtonIcon;
+ return KNullDesC;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonBrowserUrl
+// ---------------------------------------------------------
+//
+const TDesC& CWmConfiguration::PortalButtonBrowserUrl( TInt aIndex )
+ {
+ // No support for ovi here
+ if ( aIndex == 1 && iOperatorButtonUrl && iOperatorButtonEnabled )
+ return *iOperatorButtonUrl;
+ return KNullDesC;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonClientUid
+// ---------------------------------------------------------
+//
+TUid CWmConfiguration::PortalButtonClientUid( TInt aIndex )
+ {
+ if ( aIndex == 0 )
+ {
+ return iOviStoreUid;
+ }
+ // operator not supported. Get operator data using
+ // PortalButtonApplicationInfoL
+ return KNullUid;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonClientParam
+// ---------------------------------------------------------
+//
+const TDesC& CWmConfiguration::PortalButtonClientParam( TInt aIndex )
+ {
+ if ( aIndex == 0 && iOviStoreClientParam )
+ {
+ return *iOviStoreClientParam;
+ }
+ if ( aIndex == 1 && iOperatorParam && iOperatorButtonEnabled )
+ {
+ return *iOperatorParam;
+ }
+ return KNullDesC;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonsMirrored
+// ---------------------------------------------------------
+//
+TBool CWmConfiguration::PortalButtonsMirrored()
+ {
+ return iButtonsMirrored;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonApplicationType
+// ---------------------------------------------------------
+//
+CWmConfiguration::TOpAppType CWmConfiguration::PortalButtonApplicationType(
+ TInt aIndex )
+ {
+ if ( aIndex == 1 )
+ {
+ return iOperatorAppType;
+ }
+ // no support for ovi
+ return EUnknown;
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonApplicationId
+// ---------------------------------------------------------
+//
+void CWmConfiguration::PortalButtonApplicationId(
+ TInt aIndex, TDes& aOperatorAppId )
+ {
+ if ( aIndex == 1 )
+ {
+ aOperatorAppId.Copy( *iOperatorAppIdStr );
+ }
+ // no support for ovi
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::PortalButtonApplicationId
+// ---------------------------------------------------------
+//
+void CWmConfiguration::PortalButtonApplicationId(
+ TInt aIndex, TUid& aOperatorAppId )
+ {
+ if ( aIndex == 1 )
+ {
+ aOperatorAppId = iOperatorAppIdUid;
+ }
+ // no support for ovi
+ }
+
+// ---------------------------------------------------------
+// CWmConfiguration::StringToUid
+// ---------------------------------------------------------
+//
+TUid CWmConfiguration::StringToUid( const TDesC& aStr )
+ {
+ if ( aStr.Length() > 0 && aStr.Find( KHexPrefix ) == 0 )
+ {
+ // hex value 0x12345678
+ TLex lex( aStr.Mid( KHexPrefix().Length() ) );
+ TUint id = 0;
+ if ( lex.Val( id, EHex ) == KErrNone )
+ {
+ return TUid::Uid( (TInt)id );
+ }
+ }
+ else if ( aStr.Length() > 0 )
+ {
+ TLex lex( aStr );
+ TUint id( 0 );
+ if ( KErrNone == lex.Val( id ) )
+ {
+ return TUid::Uid( (TInt)id );
+ }
+ }
+ return KNullUid;
+ }
+
+
+// End of File
+