mmshplugins/mmshsettingsuiplugin/src/mussipprofilemodel.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:12:07 +0300
branchRCL_3
changeset 22 73a1feb507fb
parent 10 a184f3d659e6
child 23 bc78a40cd63c
permissions -rw-r--r--
Revision: 201032 Kit: 201035

/*
* Copyright (c) 2006-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:  Model for managing SIP profiles.
*
*/



#include "mussipprofilemodel.h"
#include "muslogger.h"
#include <aknnotewrappers.h>
#include <StringLoader.h>
#include <aknview.h>
#include <sipmanagedprofileregistry.h>


const TInt KSIPGranularity   = 5;
const TInt KUnknownProfileId = 0;


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


CMusSIPProfileModel::CMusSIPProfileModel()
    {
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::CMusSIPProfileModel()" )
    }


void CMusSIPProfileModel::ConstructL()
    {
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ConstructL()" )
    iEngine = CSIPManagedProfileRegistry::NewL( *this );
    ReadArrayFromEngineL();
    }


CMusSIPProfileModel* CMusSIPProfileModel::NewL()
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::NewL()" )
    CMusSIPProfileModel* self = new( ELeave ) CMusSIPProfileModel();

    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::NewL()" )
    return self;
    }


CMusSIPProfileModel::~CMusSIPProfileModel()
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::~CMusSIPProfileModel()" )
    DeleteProfiles();
    delete iEngine;
    iEngine = NULL;
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::~CMusSIPProfileModel()" )
    }


// ----------------------------------------------------------------------------
// Returns pointer to the locally cached SIP profile array.
// ----------------------------------------------------------------------------
//
CArrayPtr<CSIPManagedProfile>* CMusSIPProfileModel::ProfileArrayL()
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::ProfileArrayL()" )
    ReadProfileListFromEngineSafeL();
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ProfileArrayL()" )
    return iProfiles;
    }


// ----------------------------------------------------------------------------
// Returns index to the default SIP profile in locally cached array.
// ----------------------------------------------------------------------------
//
TInt CMusSIPProfileModel::DefaultProfileIndex()
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::DefaultProfileIndex()" )
    TInt index( KErrNotFound );

    for ( TInt i = 0; i < iProfiles->Count(); i++ )
        {
        TBool defProfile( EFalse );
        if (
    	    KErrNone ==
    	    iProfiles->At( i )->GetParameter( KSIPDefaultProfile, defProfile )
    	    && defProfile )
            {
            index = i;
            break;
            }
        }

    MUS_LOG1( "[MUSSET] <- CMusSIPProfileModel::DefaultProfileIndex()( %d )",
              index )
    return index;
    }


// ----------------------------------------------------------------------------
// Returns id of the default SIP profile. If default SIP profile is not found
// KUnknownProfileId is returned.
// ----------------------------------------------------------------------------
//
TUint32 CMusSIPProfileModel::DefaultProfileId()
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::DefaultProfileId()" )
    TUint32 id( KUnknownProfileId );

    for ( TInt i = 0; i < iProfiles->Count(); i++ )
        {
        TBool defProfile( EFalse );
        if (
    	    KErrNone ==
    	    iProfiles->At( i )->GetParameter( KSIPDefaultProfile, defProfile )
    	    && defProfile )
            {
        	iProfiles->At( i )->GetParameter( KSIPProfileId, id );
        	break;
            }
        }

    MUS_LOG1( "[MUSSET] <- CMusSIPProfileModel::DefaultProfileId()( %d )",
              id )
    return id;
    }


// ----------------------------------------------------------------------------
// Returns index of the default SIP profile on locally cached array. If default
// SIP profile is not found, KErrNotFound is returned.
// ----------------------------------------------------------------------------
//
TInt CMusSIPProfileModel::ProfileIndexByIdL( TUint32 aId )
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::ProfileIndexByIdL()" )
    TInt index( KErrNotFound );

	ReadProfileListFromEngineSafeL();
    for ( TInt i = 0; i < iProfiles->Count(); i++ )
        {
        TUint32 id( KUnknownProfileId );

        if ( KErrNone == iProfiles->At( i )->GetParameter( KSIPProfileId, id )
            && id == aId )
            {
            index = i;
            break;
            }
        }

    MUS_LOG1( "[MUSSET] <- CMusSIPProfileModel::ProfileIndexByIdL()( %d )",
              index )
    return index;
    }


// ----------------------------------------------------------------------------
// Returns profile ID by index.
// ----------------------------------------------------------------------------
//
TUint32 CMusSIPProfileModel::ProfileIdByIndex( TUint aIndex )
    {
    MUS_LOG1( "[MUSSET] -> CMusSIPProfileModel::ProfileIdByIndex()( %d )",
              aIndex )
	TUint32 profileId( KUnknownProfileId );
    if ( iProfiles->Count() > aIndex )
        {
        if ( iProfiles->At( aIndex )->GetParameter(
            KSIPProfileId, profileId ) )
            {
            profileId = KUnknownProfileId;
            }
        }

    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ProfileIdByIndex()" )
    return profileId;
    }


// ----------------------------------------------------------------------------
// Reads SIP profiles from SIP Profile Client array to locally cached array.
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::ReadArrayFromEngineL()
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::ReadArrayFromEngineL()" )

    DeleteProfiles();

    // Create the profile pointer array
    iProfiles =
        new ( ELeave ) CArrayPtrFlat<CSIPManagedProfile>( KSIPGranularity );

    RPointerArray<CSIPProfile> profilePointerArray;
    TCleanupItem clItem( ResetAndDestroy, &profilePointerArray );
    CleanupStack::PushL( clItem );

    iEngine->ProfilesL( profilePointerArray );
    for ( TInt i = 0; i < profilePointerArray.Count(); i++ )
        {
        iProfiles->AppendL(
            static_cast<CSIPManagedProfile*>( profilePointerArray[i] ) );
        }

    profilePointerArray.Reset();
    CleanupStack::PopAndDestroy(); // clItem (profilePointerArray)

    SortProfilesL();

    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ReadArrayFromEngineL()" )
    }


// ----------------------------------------------------------------------------
// Sorts internal array of SIP profiles by id. Used algorithm is generally
// slower than quicksort and selectionsort but very feasible for expected
// amount of items to be sorted and complexity vise.
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::SortProfilesL()
    {
	TUint32 profileIdFirst( 0 );
	TUint32 profileIdSecond( 0 );
    for ( TInt a = 0; a < iProfiles->Count() - 1; a++ )
        {
        for ( TInt b = a + 1; b < iProfiles->Count(); b++ )
            {
            User::LeaveIfError( iProfiles->At( a )->GetParameter(
            	KSIPProfileId, profileIdFirst ) );
    		User::LeaveIfError( iProfiles->At( b )->GetParameter(
    			KSIPProfileId, profileIdSecond ) );
            if ( profileIdFirst > profileIdSecond )
                {
                CSIPManagedProfile* tmp = iProfiles->At( b );
                iProfiles->At( b ) = iProfiles->At( a );
                iProfiles->At( a )  = tmp;
                }
            }
        }
    }


// ----------------------------------------------------------------------------
// Deletes internally cached SIP profiles.
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::DeleteProfiles()
    {
    if ( iProfiles )
        {
        iProfiles->ResetAndDestroy();
        delete iProfiles;
        iProfiles = NULL;
        }
    }


// ----------------------------------------------------------------------------
// From class MSIPProfileRegistryObserver.
// Notifies of an event in SIP profile registry.
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::ProfileRegistryEventOccurred(
    TUint32 /*aSIPProfileId*/, TEvent /*aEvent*/ )
	{
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ProfileRegistryEventOccurred()" )
	}


// ----------------------------------------------------------------------------
// From class MSIPProfileRegistryObserver.
// An asynchronous error has occurred related to SIP profile
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::ProfileRegistryErrorOccurred(
	TUint32 /*aSIPProfileId*/,
	TInt /*aError*/ )
    {
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ProfileRegistryErrorOccurred()" )
    }


// ----------------------------------------------------------------------------
// Reads SIP profile list from engine; if reading fails, old cached list is
// kept and returned.
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::ReadProfileListFromEngineSafeL()
    {
    MUS_LOG(
    	"[MUSSET] -> CMusSIPProfileModel::ReadProfileListFromEngineSafeL()" )
    // To prevent complete disaster it we'll save the pointer of the old array
    CArrayPtrFlat<CSIPManagedProfile>* profiles = iProfiles;
    iProfiles = 0;
    TRAPD( error, ReadArrayFromEngineL() );

    if ( error )
        {
        // Problems with re-reading profiles; use existing array
        DeleteProfiles();
        iProfiles = profiles;
        User::Leave( error );
        }
    else
        {
        // No problems; delete backup array
        profiles->ResetAndDestroy();
        delete profiles;
        }
    MUS_LOG(
    	"[MUSSET] <- CMusSIPProfileModel::ReadProfileListFromEngineSafeL()" )
    }


// ----------------------------------------------------------------------------
// For deleting RPointerArray in case of leave (used in association with
// TCleanupItem).
// ----------------------------------------------------------------------------
//
void CMusSIPProfileModel::ResetAndDestroy( TAny* aPointerArray )
    {
    MUS_LOG( "[MUSSET] -> CMusSIPProfileModel::ResetAndDestroy()" )
    RPointerArray<CSIPProfile>* array =
        static_cast<RPointerArray<CSIPProfile>*>( aPointerArray );
    array->ResetAndDestroy();
    array->Close();
    MUS_LOG( "[MUSSET] <- CMusSIPProfileModel::ResetAndDestroy()" )
    }