genericpositioningplugins/locationnpppsy/src/npppsysettinghandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 18:40:52 +0300
changeset 32 b12ea03c50a3
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* Copyright (c) 2006 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:  This is NPP PSY Positioning Plug-in ( PSY ).
*
*/



// INCLUDE FILES
#include <e32std.h>            
#include <centralrepository.h>

#include "npppsysettinghandler.h"
#include "npppsystatushandler.h"
#include "npppsyinternalcrkeys.h"
#include "npppsylogging.h"
#include "npppsypanic.h"
#include "npppsy.hrh"

// Constants
// Sepperator used in setting
_LIT( KNppPsySettingSeperator, " " );

// The width of each PSY uid in PSY list
const TInt KNppPsyPsyUidWidth = 8;

// The length of buffer which is used for logging into file
const TInt KBufferSize = 64;

// PSY list length when the list is frozen and no fallback
const TInt KNppPsyListLengthWhenFrozenNoFallback = 1;

const TText KNppPsySpaceCharacter = ' ';

// ========================== == MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::CNppPsySettingHandler
// C++default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CNppPsySettingHandler::CNppPsySettingHandler( CNppPsyStatusHandler& aStatusHandler )
    : CActive( CActive::EPriorityStandard ),
      iStatusHandler( aStatusHandler )
    {
    CActiveScheduler::Add( this );
    }


// -----------------------------------------------------------------------------
// CNppPsySettingHandler::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::ConstructL()
    {
    TRACESTRING( "CNppPsySettingHandler::ConstructL start" )
    //Central repository
    iRepository = CRepository::NewL( KCRUidNppPsy );

    //Start notification
    iRepository->NotifyRequest( KNppPsyPsyList, iStatus );
    SetActive();
    
    //Parse settings
    ParseSettingL( iListFrozen, iPsyList );

    //Check if key value is changed in ROM key
    ValidateRomKeyValueL();

    //Check if the list is empty
    iStatusHandler.SetPsyListStatus( iPsyList.Count() != 0 );
    
    TRACESTRING( "CNppPsySettingHandler::ConstructL end" )
    }


// -----------------------------------------------------------------------------
// CNppPsySettingHandler::NewL
// Two - phased constructor.
// -----------------------------------------------------------------------------
//
CNppPsySettingHandler* CNppPsySettingHandler::NewL( 
        CNppPsyStatusHandler& aStatusHandler )
    {
    CNppPsySettingHandler* self = new( ELeave ) 
        CNppPsySettingHandler( aStatusHandler );
    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    return self;
    }

    
// -----------------------------------------------------------------------------
// CNppPsySettingHandler::~CNppPsySettingHandler
// -----------------------------------------------------------------------------
//
CNppPsySettingHandler::~CNppPsySettingHandler()
    {
    Cancel();
    
    delete iRepository;
    
    iPsyList.Close();
    
    TRACESTRING( "CNppPsySettingHandler:: destructed" )
    }


// -----------------------------------------------------------------------------
// CNppPsySettingHandler::GetPsyListL
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::GetPsyListL( RArray < TUid> &aList )
    {
    aList.Reset();
    TInt count = iPsyList.Count();
    
    if(iListFrozen == ENppPsyPsyListFrozenNoFallback)
        {
        //If list is frozen and no fallback, we return only the first PSY
        count = ( count == 0 ? 0 : KNppPsyListLengthWhenFrozenNoFallback );
        }
        
   TBuf<KBufferSize> buffer;
   buffer.Copy(_L("Get PSY List..."));
   TRACETEXT(buffer)
    for ( TInt i = 0; i < count; i++ )
        {
        User::LeaveIfError( aList.Append( iPsyList[i] ) );
	   
	    buffer.Copy(iPsyList[i].Name());
	    TRACETEXT(buffer)
        }
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::MovePsyLast
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::MovePsyLast( TUid aPsy )
    {
    if ( !iListFrozen )
        {
        TInt index = iPsyList.Find( aPsy );
        if ( index != KErrNotFound )
            {
            iPsyList.Remove( index );
            if ( iPsyList.Append( aPsy ) == KErrNone )
                {
                WriteSetting();
                }
            }
        }

    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::RemovePsy
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::RemovePsy( TUid aPsy )
    {
    TInt index = iPsyList.Find( aPsy );
    if ( index != KErrNotFound )
        {
        iPsyList.Remove( index );
        WriteSetting();
        }
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::RunL
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::RunL()
    {
    ParseSettingL( iListFrozen, iPsyList );

    //Check if the list is empty
    iStatusHandler.SetPsyListStatus( iPsyList.Count() != 0 );

    //issue another request
    iRepository->NotifyRequest( KNppPsyPsyList, iStatus );
    SetActive();
    }
        
// -----------------------------------------------------------------------------
// CNppPsySettingHandler::DoCancel
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::DoCancel()
    {
    if ( iRepository )
        {
        iRepository->NotifyCancelAll(); //error ignored
        }
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::RunError
// -----------------------------------------------------------------------------
//
TInt CNppPsySettingHandler::RunError( TInt aError )
    {
    //This function may be called when PSY list is corrupted
    if ( aError != KErrNoMemory && aError != KErrCancel )
        {
        iStatusHandler.SetPsyListStatus( EFalse );
        }
        
    //issue another request
    iRepository->NotifyRequest( KNppPsyPsyList, iStatus );
    SetActive();

    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::ParseSettingL
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::ParseSettingL(
            TInt& aListFrozen, 
            RArray < TUid >& aPsyList )
    {
    TBuf < KNppPsyPsyListMaxLength > setting;
    User::LeaveIfError( iRepository->Get( KNppPsyPsyList, setting ) );

    TRACESTRING("PSY List from CenRep...")
    TRACETEXT(setting)
    //Reset list
    aPsyList.Reset();

    TLex lex( setting );
    lex.SkipSpace();
    TInt frozen;
    User::LeaveIfError( lex.Val( frozen ) ); //frozen status
    aListFrozen = frozen;

    lex.SkipSpace();
    TUint32 psyUid;
    while ( !lex.Eos() )
        {
        User::LeaveIfError( lex.Val( psyUid, EHex ) );
        User::LeaveIfError( aPsyList.Append( TUid::Uid( psyUid ) ) );
        lex.SkipSpace();
        }
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::ValidateRomKeyValueL
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::ValidateRomKeyValueL()
    {
	TInt romListFrozen;
    RArray < TUid > romPsyList;
    CleanupClosePushL(romPsyList);

	TBuf < KNppPsyPsyListMaxLength > setting;
	User::LeaveIfError( iRepository->Get( KNppPsyPsyList, setting ) );
	setting.TrimRight();
	setting.Append(KNppPsySpaceCharacter);
	User::LeaveIfError(iRepository->Set( KNppPsyPsyList,setting ));
	
    iRepository->Reset( KNppPsyPsyList );
    ParseSettingL( romListFrozen, romPsyList );
    
    RemoveDuplicatePsyUid(iPsyList,romPsyList);
	iListFrozen = romListFrozen;
	
    CleanupStack::PopAndDestroy(&romPsyList);
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::WriteSetting
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::WriteSetting()
    {
    TBuf < KNppPsyPsyListMaxLength > setting;

    //Frozen status
    setting.AppendNum( iListFrozen );
    setting.Append( KNppPsySettingSeperator );

    TInt count = iPsyList.Count();
    for ( TInt i = 0; i < count; i++ )
        {
        setting.AppendNumFixedWidth( iPsyList[i].iUid, EHex, KNppPsyPsyUidWidth );
        setting.Append( KNppPsySettingSeperator );
        }
        
	TRACESTRING("Writing PSY List...")
	TRACETEXT(setting)
 
    iRepository->Set( KNppPsyPsyList, setting ); //error ignored
    }

// -----------------------------------------------------------------------------
// CNppPsySettingHandler::RemoveDuplicatePsyUid
// -----------------------------------------------------------------------------
//
void CNppPsySettingHandler::RemoveDuplicatePsyUid(
            RArray < TUid >& aToPsyList ,
            RArray < TUid >& aFromPsyList )
    {
    
	    TInt count = aFromPsyList.Count();
	    for ( TInt i = 0; i < count; i++ )
	        {
                TInt index = aToPsyList.Find( aFromPsyList[i] );
	            if (  index == KErrNotFound )
        	  	{
        	  		aToPsyList.Append( aFromPsyList[i] );		
        	  	}
	        }
	    WriteSetting();    
    }
    
//  End of File