diff -r 095bea5f582e -r 0ac9a5310753 mmserv/radioutility/presetutility/src/cenrephandler.cpp --- a/mmserv/radioutility/presetutility/src/cenrephandler.cpp Tue Aug 31 15:43:02 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,390 +0,0 @@ -/* -* 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: -* -* -*/ - - -// System includes -#include -#include - -// User includes -#include "cenrephandler.h" -#include "presetcrkeys.h" -#include -#include "cenrepbookkeeping.h" -#include "trace.h" - - -class TChannelIndexList - { -public: - TInt iChannelIndex; - TInt iNameIndex; - TInt iFrequencyIndex; - TInt iUrlIndex; - TInt iRestOfParametersIndex; - }; - -// ============= STATIC FUNCTIONS ============== - -static TInt CalculateChannelIndexes( const TInt aChannelIndex, TChannelIndexList& aChannelIndexList) - { - FUNC_LOG; - TInt err( KErrNone ); - if ( ( KMaxNumberOfPresetStations <= aChannelIndex ) || - ( 0 > aChannelIndex ) ) - { - err = KErrArgument; - } - else - { - aChannelIndexList.iChannelIndex = - KRadioPresetChannel1 + ( KNbrOfParametersPerChannelSequence * aChannelIndex ); - aChannelIndexList.iNameIndex = - aChannelIndexList.iChannelIndex + KChannelNameOffset; - aChannelIndexList.iFrequencyIndex = - aChannelIndexList.iChannelIndex + KFrequencyOffset; - aChannelIndexList.iUrlIndex = - aChannelIndexList.iChannelIndex + KUrlOffset; - aChannelIndexList.iRestOfParametersIndex = - aChannelIndexList.iChannelIndex + KRestOfParametersOffset; - } - return err; - } - -// ============= MEMBER FUNCTIONS ============== - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CCenrepHandler::CCenrepHandler() - { - FUNC_LOG; - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CCenrepHandler::ConstructL() - { - FUNC_LOG; - iCentralRepository = CRepository::NewL( KCRUidPresetUtility ); - iBookKeeping = new (ELeave) CCenrepBookKeeping; - ReadBookKeepingL(); - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CCenrepHandler* CCenrepHandler::NewL() - { - FUNC_LOG; - CCenrepHandler* self = new (ELeave) CCenrepHandler(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CCenrepHandler::~CCenrepHandler() - { - FUNC_LOG; - delete iCentralRepository; - delete iBookKeeping; - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -TInt CCenrepHandler::MaxPresetCount() const - { - FUNC_LOG; - return KMaxNumberOfPresetStations; - } - -// ----------------------------------------------------------------------------- -// Get the current number of presets -// ----------------------------------------------------------------------------- -// -TInt CCenrepHandler::PresetCount() const - { - FUNC_LOG; - return iBookKeeping->PresetCount(); - } - -// ----------------------------------------------------------------------------- -// Gets the first preset -// ----------------------------------------------------------------------------- -// -TInt CCenrepHandler::FirstPreset() const - { - FUNC_LOG; - return iBookKeeping->FirstIndex(); - } - -// ----------------------------------------------------------------------------- -// Get the next preset index that has been set, given the current index -// ----------------------------------------------------------------------------- -// -TInt CCenrepHandler::NextPreset( TInt aFromIndex ) const - { - FUNC_LOG; - return iBookKeeping->NextIndex( aFromIndex ); - } - -// ----------------------------------------------------------------------------- -// Delete the current preset -// ----------------------------------------------------------------------------- -// -TInt CCenrepHandler::DeletePreset( TInt aIndex ) - { - FUNC_LOG; - TInt err( KErrNone ); - if ( -1 == aIndex ) - { - // Delete all - TChannelIndexList channelIndexList; - for ( TInt j( FirstPreset() ); 0 <= j; j = FirstPreset() ) - { - INFO_1("Deleting index: %i", j ); - if ( KErrNone == CalculateChannelIndexes( j, channelIndexList ) ) - { - iCentralRepository->Delete( channelIndexList.iNameIndex ); - iCentralRepository->Delete( channelIndexList.iFrequencyIndex ); - iCentralRepository->Delete( channelIndexList.iUrlIndex ); - iCentralRepository->Delete( channelIndexList.iRestOfParametersIndex ); - iBookKeeping->RemoveIndex( j ); - } - } - } - else - { - TChannelIndexList channelIndexList; - err = CalculateChannelIndexes( aIndex, channelIndexList ); - if ( KErrNone == err ) - { - iCentralRepository->Delete( channelIndexList.iNameIndex ); - iCentralRepository->Delete( channelIndexList.iFrequencyIndex ); - iCentralRepository->Delete( channelIndexList.iUrlIndex ); - iCentralRepository->Delete( channelIndexList.iRestOfParametersIndex ); - iBookKeeping->RemoveIndex( aIndex ); - } - } - if ( KErrNone == err ) - { - SaveBookKeeping(); - } - return err; - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -TInt CCenrepHandler::SavePresetL( const TPreset& aPreset, TInt aIndex ) - { - FUNC_LOG; - if ( 0 > aIndex ) - { - aIndex = iBookKeeping->FindUnusedIndex(); - } - if ( 0 > aIndex ) - { - User::Leave( KErrDiskFull ); // Not really a good code for this - } - TChannelIndexList channelIndexList; - User::LeaveIfError( CalculateChannelIndexes( aIndex, channelIndexList) ); - - // First save name to its own key in the key sequence. - User::LeaveIfError( iCentralRepository->Set( channelIndexList.iNameIndex, aPreset.Name() ) ); - - // Frequency to its own key in the key sequence. - User::LeaveIfError( iCentralRepository->Set( channelIndexList.iFrequencyIndex, (TInt)aPreset.Frequency() ) ); - - // Url to its own key in the key sequence. - User::LeaveIfError( iCentralRepository->Set( channelIndexList.iUrlIndex, aPreset.Url() ) ); - - // Then externalize the rest of the data to a common key. - TInt err( KErrNone ); - TInt length( aPreset.MyExternalizedDataSize() ); - TUint i ( 1 ); - INFO_1( "aPreset.MyExternalizedDataSize()=%i", length ); - for ( TBool cont = ( 0 < length ) ? ETrue : EFalse; (cont); cont = ( KErrOverflow == err ) ? ETrue : EFalse ) - { - HBufC8* buf = HBufC8::NewLC( i * length ); - TPtr8 bufPtr = buf->Des(); - RDesWriteStream outStream( bufPtr ); - CleanupClosePushL( outStream ); - TRAP( err, aPreset.ExternalizeL( outStream ) ); - if ( KErrNone == err ) - { - outStream.CommitL(); - User::LeaveIfError( iCentralRepository->Set( channelIndexList.iRestOfParametersIndex, *buf ) ); - } - else - { - INFO_2( "SavePresetL bigger buffer (%i) needed than required by aPreset.MyExternalizedDataSize()=%i", i*length, aPreset.MyExternalizedDataSize() ); - ++i; - } - CleanupStack::PopAndDestroy( &outStream ); - CleanupStack::PopAndDestroy( buf ); - } - User::LeaveIfError( err ); - - iBookKeeping->AddIndex( aIndex ); - SaveBookKeeping(); - return aIndex; - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CCenrepHandler::ReadPresetL( TInt aIndex, TPreset& aPreset ) - { - FUNC_LOG; - - // Read name from its own key in the key sequence - TChannelIndexList channelIndexList; - User::LeaveIfError( CalculateChannelIndexes( aIndex, channelIndexList) ); - TPresetName tempChannelName; - User::LeaveIfError( iCentralRepository->Get(channelIndexList.iNameIndex, tempChannelName ) ); - aPreset.SetName( tempChannelName ); - - // Read frequency from its own key in the key sequence - TInt frequency( 0 ); - User::LeaveIfError( iCentralRepository->Get( channelIndexList.iFrequencyIndex, frequency ) ); - aPreset.SetFrequency( frequency ); - - // Read url from its own key in the key sequence - TRadioUrl tempUrlName; - TInt err = iCentralRepository->Get( channelIndexList.iUrlIndex, tempUrlName ); - if ( KErrNone == err ) - { - aPreset.SetUrl( tempUrlName ); - } - else if ( KErrNotFound == err ) - { - // This is an optional parameter. - } - else - { - User::Leave( err ); - } - - - // Then use the below code to internalize rest of parameters from the common key - TInt actualLength( aPreset.MyExternalizedDataSize() ); - INFO_1( "ReadPresetL aPreset.MyExternalizedDataSize()=%i", actualLength ); - for ( TBool cont = ( 0 < actualLength ) ? ETrue : EFalse; (cont); cont = ( KErrOverflow == err ) ? ETrue : EFalse ) - { - HBufC8* buf = HBufC8::NewLC( actualLength ); - TPtr8 bufPtr = buf->Des(); - err = iCentralRepository->Get( channelIndexList.iRestOfParametersIndex, bufPtr, actualLength ); - if ( ( KErrNone == err ) && ( 0 < buf->Length() ) ) - { - RDesReadStream inStream; - inStream.Open( *buf ); - CleanupClosePushL( inStream ); - aPreset.InternalizeL( inStream ); - CleanupStack::PopAndDestroy( &inStream ); - } - else if ( KErrNotFound == err ) - { - // This is not filled by CT tool even though name, frequency and URL might be - // filled for the current channel. Don't leave. - INFO_1( "ReadPresetL KErrNotFound, key=%i", channelIndexList.iRestOfParametersIndex ); - } - else if ( KErrOverflow == err ) - { - INFO_2( "ReadPresetL KErrOverflow, buf->Length()=%i actualLength=%i", buf->Length(), actualLength ); - // Trying again with actual with buffer that can store the whole key - } - else - { - User::Leave( err ); - } - CleanupStack::PopAndDestroy(buf); - } // for (;;) - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CCenrepHandler::ReadBookKeepingL() - { - FUNC_LOG; - TPtr8 bufPtr = iBookKeeping->BookKeepingData(); - - TInt err( iCentralRepository->Get( KRadioBookKeepingLocation, bufPtr ) ); - if ( KErrNotFound == err ) - { - // Bookkeeping does not exist. Search possible preconfigured channels. - ReadPreDefinedPresetsL(); - err = KErrNone; - } - User::LeaveIfError( err ); - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CCenrepHandler::SaveBookKeeping() - { - FUNC_LOG; - TInt err( iCentralRepository->Set( KRadioBookKeepingLocation, iBookKeeping->BookKeepingData() ) ); - if ( KErrNone != err ) - { - INFO_1("Saving of BookKeeping failed with error: %i ", err) - // It is better to destroy data that is out of sync - iCentralRepository->Delete( KRadioBookKeepingLocation ); - // Go on with local bookkeeping data - } - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CCenrepHandler::ReadPreDefinedPresetsL() - { - FUNC_LOG; - TInt frequency ( 0 ); - TInt err( KErrNone ); - TChannelIndexList channelIndexList; - iBookKeeping->Clear(); - for(TInt index = 0; index < KMaxNumberOfPresetStations; index++) - { - User::LeaveIfError( CalculateChannelIndexes( index, channelIndexList) ); - err = iCentralRepository->Get( channelIndexList.iFrequencyIndex, frequency ); - if ( KErrNone == err ) - { - iBookKeeping->AddIndex( index ); - } - } - SaveBookKeeping(); - }