diff -r 000000000000 -r 4e1aa6a622a0 psmservices/psmserver/src/engine/psmsettingshandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/psmservices/psmserver/src/engine/psmsettingshandler.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,486 @@ +/* +* Copyright (c) 2007 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: PSM Settings handler +* +*/ + + +#include +#include +#include "psmsettingshandler.h" +#include "psmconfigstorage.h" +#include "psmbackupstorage.h" +#include "psmcenrepstorage.h" +#include "psmtrace.h" + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPsmSettingsHandler* CPsmSettingsHandler::NewL( const TPsmsrvMode aMode ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::NewL()" ) ) ); + + CPsmSettingsHandler* self = CPsmSettingsHandler::NewLC( aMode ); + CleanupStack::Pop( self ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::NewL - return 0x%x" ), self ) ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPsmSettingsHandler* CPsmSettingsHandler::NewLC( const TPsmsrvMode aMode ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::NewLC()" ) ) ); + + CPsmSettingsHandler* self = new( ELeave ) CPsmSettingsHandler( aMode ); + CleanupStack::PushL( self ); + self->ConstructL(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::NewLC - return 0x%x" ), self ) ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::CPsmSettingsHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPsmSettingsHandler::CPsmSettingsHandler( const TPsmsrvMode aMode ) : + iMode( aMode ), + iCurrentMode( aMode ) + { + // Nothing to do + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::ConstructL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ConstructL()" ) ) ); + User::LeaveIfError( iFileSession.Connect() ); + // Create storage files + iConfigStorage = CPsmConfigStorage::NewL( iMode, iFileSession ); + iBackupStorage = CPsmBackupStorage::NewL( iMode, iFileSession ); + iCenRepStorage = CPsmCenRepStorage::NewL( iMode, iFileSession ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ConstructL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CPsmSettingsHandler::~CPsmSettingsHandler() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::~CPsmSettingsHandler()" ) ) ); + + delete iConfigStorage; + delete iBackupStorage; + delete iCenRepStorage; + + iFileSession.Close(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::~CPsmSettingsHandler - return") ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::BackupAndGetSettingsL +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::BackupAndGetSettingsL( + RConfigInfoArray& aPsmConfigArray, TUint32 aRepository ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::BackupAndGetSettingsL()" ) ) ); + // Change settings from normal config storage + iConfigStorage->InitStorageL( aRepository ); + ChangeSettingsL( aPsmConfigArray, aRepository, *iConfigStorage ); + iConfigStorage->CloseStorageL(); + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::BackupAndGetSettingsL() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::GetCurrentSettingsL +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::GetSettingsL( + RConfigInfoArray& aPsmConfigArray, TUint32 aRepository ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::GetCurrentSettingsL()" ) ) ); + // Get current settings from normal config storage + + // Use own storage in case PSM mode is ongoing by some plugin + if ( EPsmsrvModeNormal == iMode ) + { + // Normal mode, get current settings from backup storage + CPsmBackupStorage* backupStorage = CPsmBackupStorage::NewLC( iMode, iFileSession ); + backupStorage->InitStorageL( aRepository ); + backupStorage->GetConfigurationL( aPsmConfigArray ); + CleanupStack::PopAndDestroy( backupStorage ); + } + else + { + // PSM mode, get current settings from config storage + CPsmConfigStorage* configStorage = CPsmConfigStorage::NewLC( iMode, iFileSession ); + configStorage->InitStorageL( aRepository ); + configStorage->GetConfigurationL( aPsmConfigArray ); + CleanupStack::PopAndDestroy( configStorage ); + } + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::GetCurrentSettingsL() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::BackupSettingsL +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::BackupSettingsL( + const RConfigInfoArray& aPsmConfigArray, const TUint32 aRepository ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::BackupSettingsL()" ) ) ); + + if ( EPsmsrvModeNormal == iMode ) + { + ERROR_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::BackupSettingsL() - Not allowed in normal mode - LEAVE" ) ) ); + // Backup is not allowed in normal mode + User::Leave( KErrWrite ); + } + + // Use own storage in case PSM mode is ongoing by some plugin + CPsmBackupStorage* backupStorage = CPsmBackupStorage::NewLC( iMode, iFileSession ); + backupStorage->InitStorageL( aRepository ); + backupStorage->BackupConfigurationL( aPsmConfigArray ); + backupStorage->CloseStorageL(); + CleanupStack::PopAndDestroy( backupStorage ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::BackupSettingsL() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::Compare +// ----------------------------------------------------------------------------- +// +TBool CPsmSettingsHandler::Compare( + const TPsmsrvConfigInfo& aSource, + const TPsmsrvConfigInfo& aTarget ) const + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::Compare()" ) ) ); + TBool returnValue( EFalse ); + if ( ( aSource.iConfigId == aTarget.iConfigId ) && + ( aSource.iConfigType == aTarget.iConfigType ) ) + { + // Check type and copare values + switch ( aSource.iConfigType ) + { + case EConfigTypeInt: + returnValue = ( aSource.iIntValue == aTarget.iIntValue ); + break; + case EConfigTypeReal: + returnValue = ( aSource.iRealValue == aTarget.iRealValue ); + break; + case EConfigTypeBuf: + returnValue = ( aSource.iDesValue == aTarget.iDesValue ); + break; + default: + returnValue = EFalse; + } + } + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::Compare() - return" ) ) ); + return returnValue; + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::ChangeSettingsL +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::ChangeSettingsL( + RConfigInfoArray& aPsmConfigArray, + TUint32 aRepository, + CPsmStorage& aConfigStorage ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeSettingsL()" ) ) ); + + TInt err( KErrNone ); + // First, get current settings + RConfigInfoArray currentSettings; + CleanupClosePushL( currentSettings ); + + iBackupStorage->InitStorageL( aRepository ); + iBackupStorage->ListCurrentSettingSetL( currentSettings ); + + // Check currently owned settings and compare those to the new ones + RConfigInfoArray settingsToBackUp; + CleanupClosePushL( settingsToBackUp ); + + for ( TInt i = 0; aPsmConfigArray.Count() != i; i++ ) + { + TBool found = EFalse; + for ( TInt a = 0; !found && currentSettings.Count() != a; a++ ) + { + found = Compare( currentSettings[ a ], aPsmConfigArray[ i ] ); + } + + if ( !found ) + { + // Add new settings to backup + settingsToBackUp.Append( aPsmConfigArray[ i ] ); + currentSettings.Append( aPsmConfigArray[ i ] ); + } + } + + // Get new values from config + if ( EPsmsrvModeNormal == iMode ) + { + // Restore to normal mode, initialize backup storage + iBackupStorage->GetConfigurationL( aPsmConfigArray ); + } + else + { + // Moving from power save mode to another power save mode + iBackupStorage->BackupConfigurationL( settingsToBackUp ); + aConfigStorage.GetConfigurationL( aPsmConfigArray ); + } + + if( aPsmConfigArray.Count() == 0 ) + { + err = KErrNotFound; + } + + // Check for missing values and get those from backup + RConfigInfoArray settingsFromBackUp; + CleanupClosePushL( settingsFromBackUp ); + + for ( TInt i = 0; currentSettings.Count() != i; i++ ) + { + TPsmsrvConfigInfo& currentInfo = currentSettings[ i ]; + TBool found = EFalse; + TPsmsrvConfigInfo newInfo; + for ( TInt index = 0; !found && aPsmConfigArray.Count() != index; index++ ) + { + newInfo = aPsmConfigArray[ index ]; + found = ( newInfo.iConfigId == currentInfo.iConfigId ); + } + + // Check was setting found + if ( !found ) + { + // not found, get setting from backup + settingsFromBackUp.Append( currentInfo ); + currentSettings.Remove( i ); + i--; + } + else + { + // Setting found, update values + currentInfo = newInfo; + } + } + + // Finally, get remaining settings from backup + if ( settingsFromBackUp.Count() ) + { + iBackupStorage->GetConfigurationL( settingsFromBackUp ); + } + + iBackupStorage->UpdateCurrentSettingSetL( currentSettings ); + + // Close backup storage + iBackupStorage->CloseStorageL(); + + // add settings from backup to settings + for ( TInt i = 0; i < settingsFromBackUp.Count(); i++ ) + { + aPsmConfigArray.Append( settingsFromBackUp[ i ] ); + } + + // Cleanup config arrays + CleanupStack::PopAndDestroy( &settingsFromBackUp ); + CleanupStack::PopAndDestroy( &settingsToBackUp ); + CleanupStack::PopAndDestroy( ¤tSettings ); + + User::LeaveIfError( err ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeSettingsL() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::ChangeCenRepSettingsL +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::ChangeCenRepSettingsL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeCenRepSettingsL()" ) ) ); + + // First resolve the CenRep config files + RPassiveConfigList passiveConfigs; + CleanupClosePushL( passiveConfigs ); + + iCenRepStorage->ListPassiveConfigs( passiveConfigs ); + + const TInt configCount( passiveConfigs.Count() ); + + // Loop found passive configs + for ( TInt i = 0; i < configCount; i++ ) + { + RConfigInfoArray psmConfigArray; + CleanupClosePushL( psmConfigArray ); + + const TUint32 repository = passiveConfigs[i]; + + iCenRepStorage->InitStorageL( repository ); + + if ( EPsmsrvModeNormal == iMode ) + { + // Moving to normal mode, get passive config set from baskup storage + iBackupStorage->InitStorageL( repository ); + iBackupStorage->ListPassiveConfigSetL( psmConfigArray ); + iBackupStorage->CloseStorageL(); + } + else + { + // Get configuration set + iCenRepStorage->ListPassiveConfigSetL( psmConfigArray ); + } + + // Change values + ChangeCenRepSettingsL( psmConfigArray, repository ); + + // close storage + iCenRepStorage->CloseStorageL(); + CleanupStack::PopAndDestroy( &psmConfigArray ); + } + + CleanupStack::PopAndDestroy( &passiveConfigs ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeCenRepSettingsL() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::ChangeCenRepSettingsL +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::ChangeCenRepSettingsL( + RConfigInfoArray& aPsmConfigArray, TUint32 aRepository ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeCenRepSettingsL()" ) ) ); + + // First read current values from CenRep + TUid cenRepUid = { aRepository }; + CRepository* cenrep = CRepository::NewLC( cenRepUid ); + + TInt setCount( aPsmConfigArray.Count() ); + + for ( TInt i = 0; i < setCount; i++ ) + { + TPsmsrvConfigInfo& info = aPsmConfigArray[i]; + switch ( info.iConfigType ) + { + case EConfigTypeInt: + { + User::LeaveIfError( cenrep->Get( info.iConfigId, info.iIntValue ) ); + break; + } + case EConfigTypeReal: + { + User::LeaveIfError( cenrep->Get( info.iConfigId, info.iRealValue ) ); + break; + } + case EConfigTypeBuf: + { + User::LeaveIfError( cenrep->Get( info.iConfigId, info.iDesValue ) ); + break; + } + default: + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeCenRepSettingsL() - Unknown type LEAVE" ) ) ); + User::Leave( KErrUnknown ); + } + } + } + + // Get new values from storage + TRAP_IGNORE( ChangeSettingsL( aPsmConfigArray, aRepository, *iCenRepStorage ) ); + + // Get new count + setCount = aPsmConfigArray.Count(); + + // Write new values to CenRep + for ( TInt j = 0; j < setCount; j++ ) + { + TPsmsrvConfigInfo& info = aPsmConfigArray[j]; + switch ( info.iConfigType ) + { + case EConfigTypeInt: + { + User::LeaveIfError( cenrep->Set( info.iConfigId, info.iIntValue ) ); + break; + } + case EConfigTypeReal: + { + User::LeaveIfError( cenrep->Set( info.iConfigId, info.iRealValue ) ); + break; + } + case EConfigTypeBuf: + { + User::LeaveIfError( cenrep->Set( info.iConfigId, info.iDesValue ) ); + break; + } + default: + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeCenRepSettingsL() - Unknown type LEAVE" ) ) ); + User::Leave( KErrUnknown ); + } + } + } + + // Cleanup CenRep + CleanupStack::PopAndDestroy( cenrep ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::ChangeCenRepSettingsL() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSettingsHandler::SetMode +// ----------------------------------------------------------------------------- +// +void CPsmSettingsHandler::SetMode( TPsmsrvMode aMode ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::SetMode()" ) ) ); + + // Store previous mode + iCurrentMode = iMode; + + // Store mode + iMode = aMode; + + // Update mode to storage handlers also + iBackupStorage->SetMode( aMode ); + iConfigStorage->SetMode( aMode ); + iCenRepStorage->SetMode( aMode ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSettingsHandler::SetMode() - return" ) ) ); + } + +// End of file