mmshplugins/mmshsettingsuiplugin/src/mussipprofilemodel.cpp
changeset 22 496ad160a278
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmshplugins/mmshsettingsuiplugin/src/mussipprofilemodel.cpp	Fri Jun 11 13:36:18 2010 +0300
@@ -0,0 +1,343 @@
+/*
+* 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()" )
+    }