presencesettingsui/src/psuigspluginmodel.cpp
changeset 0 c8caa15ef882
child 13 b7e70c0792e6
child 18 52d91a16fec3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presencesettingsui/src/psuigspluginmodel.cpp	Tue Feb 02 01:05:17 2010 +0200
@@ -0,0 +1,756 @@
+/*
+* 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:    Presence settings UI model implementation.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <escapeutils.h>
+#include <sipmanagedprofileregistry.h>
+#include <sipprofileregistryobserver.h>
+#include <sipmanagedprofile.h>
+#include <sipprofile.h>
+#include <StringLoader.h>
+#include <psuigspluginrsc.rsg>
+#include <XdmSettingsApi.h>
+#include "psuigspluginmodel.h"
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::CPSUIGSPluginModel()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CPSUIGSPluginModel::CPSUIGSPluginModel()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::~CPSUIGSPluginModel()
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPSUIGSPluginModel::~CPSUIGSPluginModel()
+    {
+    delete iSIPEngine;
+    if ( iSIPProfiles )
+        {
+        iSIPProfiles->ResetAndDestroy();
+        delete iSIPProfiles;
+        }     
+        
+    iXdmIdArray.Close();
+    delete iXdmNameArray;
+    
+    iPSIdArray.Close();
+    delete iPSNameArray;    
+    delete iVisibleSettingName;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CPSUIGSPluginModel::ConstructL()
+    {
+    RetrieveSettingsL();
+    iVisibleSettingName = HBufC::NewL( 
+        KPresSetNameMaxLength + 2 );// max chars + KColumnListSeparator
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::NewL()
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CPSUIGSPluginModel* CPSUIGSPluginModel::NewL()
+    {
+    CPSUIGSPluginModel* self = new ( ELeave ) CPSUIGSPluginModel();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self ); // self
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::RetrieveSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//
+void CPSUIGSPluginModel::RetrieveSettingsL()
+    {
+    RefreshPSArraysL();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SaveSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//    
+void CPSUIGSPluginModel::SaveSettingsL()
+    {
+    if ( iSettingId == 0 )
+        {// new settings
+        iSettingId = PresSettingsApi::CreateSetL( iSettingSet );
+        }
+    else
+        {// old & edited settings
+        PresSettingsApi::UpdateSetL( iSettingSet, iSettingId );
+        }
+    RefreshPSArraysL();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::CreateDefaultSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//    
+void CPSUIGSPluginModel::CreateDefaultSettingsL()
+    {
+    iSettingId = 0; // new settings
+    
+    iSettingSet.iSetName.Zero();
+    HBufC* name = CreateSettingNameLC();
+    iSettingSet.iSetName.Append( *name );
+    CleanupStack::PopAndDestroy( name );// name
+    
+    iSettingSet.iSipProfile = KErrNotFound;
+    iSettingSet.iXDMSetting = KErrNotFound;
+    iSettingSet.iObjectSize = KErrNotFound;
+    iSettingSet.iContSrvrAdd.Zero();
+    iSettingSet.iPublicationInt = KErrNotFound;
+    iSettingSet.iMaxSubscriptions = KErrNotFound;
+    iSettingSet.iMaxContactsInList = KErrNotFound;
+    iSettingSet.iDomainSyntax.Zero();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::DuplicateExistingSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//    
+void CPSUIGSPluginModel::DuplicateExistingSettingsL( TInt aIndex )
+    {
+    __ASSERT_DEBUG( aIndex < iPSIdArray.Count() ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow ));
+    
+    iSettingId = 0; // new settings
+    TPresSettingsSet originalSettings;
+    PresSettingsApi::SettingsSetL( iPSIdArray[ aIndex ], originalSettings );
+    
+    iSettingSet.iSetName.Zero();
+    HBufC* name = CreateSettingNameLC( originalSettings.iSetName.AllocL() );
+    iSettingSet.iSetName.Append( *name );
+    CleanupStack::PopAndDestroy( name );// name
+    
+    iSettingSet.iSipProfile = originalSettings.iSipProfile;
+    iSettingSet.iXDMSetting = originalSettings.iXDMSetting;
+    iSettingSet.iObjectSize = originalSettings.iObjectSize;
+    iSettingSet.iContSrvrAdd = originalSettings.iContSrvrAdd;
+    iSettingSet.iPublicationInt = originalSettings.iPublicationInt;
+    iSettingSet.iMaxSubscriptions = originalSettings.iMaxSubscriptions;
+    iSettingSet.iMaxContactsInList = originalSettings.iMaxContactsInList;
+    iSettingSet.iDomainSyntax = originalSettings.iDomainSyntax;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::AllCompulsoryFieldsFilled()
+// See header for details.
+// ---------------------------------------------------------------------------
+//    
+TBool CPSUIGSPluginModel::AllCompulsoryFieldsFilled()
+    {
+    TBool returnValue = ETrue;
+    for ( TInt i = EPSUIServerNameId ; i <= EPSUIDomainSyntaxId && returnValue ; i++ )
+        {
+        switch( i ) 
+            {
+            case EPSUIServerNameId:
+                returnValue = ( iSettingSet.iSetName.Length() != 0 );
+                break;
+            case EPSUISIPProfileId:
+                returnValue = ( iSettingSet.iSipProfile != KErrNotFound );
+                break;
+            case EPSUIObjectSizeId:
+                returnValue = ( iSettingSet.iObjectSize != KErrNotFound );
+                break;
+            case EPSUIDomainSyntaxId:
+                returnValue = ( iSettingSet.iDomainSyntax.Length() != 0 );
+                break;
+            default:
+                // do nothing with non-compulsory ones
+                break;
+            }        
+        }    
+    return returnValue;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::IsItDuplicatePSName()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+TBool CPSUIGSPluginModel::IsItDuplicatePSName()
+    {
+    TBool found = KErrNone;
+    TInt pos = 0;
+    found = ( iPSNameArray->Find( iSettingSet.iSetName, pos ) == KErrNone );
+    if ( found )
+        {// dupe found, let's check it's not the same setting
+        __ASSERT_DEBUG( pos < iPSIdArray.Count() ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow ));
+        found = !( iSettingId == iPSIdArray[ pos ]);
+        }
+    return found;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::EditSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+void CPSUIGSPluginModel::EditSettingsL( TInt aIndex )
+    {
+    __ASSERT_DEBUG( aIndex < iPSIdArray.Count() ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow ));
+    TInt settingId = iPSIdArray[ aIndex ];
+    PresSettingsApi::SettingsSetL( settingId, iSettingSet );
+    iSettingId = settingId;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::DeleteSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+void CPSUIGSPluginModel::DeleteSettingsL( TInt aToBeDeleted, TBool aIsIndex )
+    {
+    if ( aIsIndex )
+        {// is index
+        __ASSERT_DEBUG( aToBeDeleted < iPSIdArray.Count() ,
+            User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow ));
+        PresSettingsApi::RemoveSetL( iPSIdArray[ aToBeDeleted ]);
+        }
+    else
+        {// is id
+        PresSettingsApi::RemoveSetL( aToBeDeleted );
+        }
+    RefreshPSArraysL();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::RefreshPSArraysL()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+void CPSUIGSPluginModel::RefreshPSArraysL()
+    {
+    delete iPSNameArray;
+    iPSNameArray = NULL;
+    iPSIdArray.Reset();
+    
+    iPSNameArray = PresSettingsApi::GetAllSetsNamesLC( iPSIdArray );
+    CleanupStack::Pop( iPSNameArray );// iPSNameArray
+    ReArrangePresenceSettingsL();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ReArrangePresenceSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+void CPSUIGSPluginModel::ReArrangePresenceSettingsL()
+    {
+    const TInt settingsCount = iPSNameArray->Count();
+    __ASSERT_DEBUG( 
+        settingsCount == iPSIdArray.Count(), 
+        User::Panic( KPSUIGSPluginPanicCategory, KErrArgument ));
+   
+    // make a tables of the original pairs
+    RPointerArray<CPSUINameIDPair> pairArray;
+    TCleanupItem clItem( ResetAndDestroy, &pairArray );
+    CleanupStack::PushL( clItem );
+    CPSUINameIDPair* pair = NULL;
+    for( TInt i = 0;i < settingsCount;i++ )
+        {
+        pair = new ( ELeave ) CPSUINameIDPair;
+        CleanupStack::PushL( pair );
+        pair->iID = iPSIdArray[ i ];
+        pair->iName = iPSNameArray->MdcaPoint( i ).AllocL();
+        pairArray.AppendL( pair );
+        CleanupStack::Pop( pair );// pair is in array's responsibility now
+        }
+
+    // sort the original
+    iPSNameArray->Sort( ECmpCollated );
+    
+    // re-arrange the iPSIdArray based on order of iPSNameArray
+    iPSIdArray.Reset();
+    for( TInt i = 0;i < settingsCount;i++ )
+        {
+        for( TInt ii = 0;ii < pairArray.Count();ii++ )
+            {
+            if ( !iPSNameArray->MdcaPoint( i ).Compare(  
+                *pairArray[ii]->iName ))
+                {
+                iPSIdArray.AppendL( pairArray[ii]->iID );
+                delete pairArray[ii];
+                pairArray.Remove(ii);
+                break;// no need to go through if already found
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( &pairArray );
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::MdcaCount()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+TInt CPSUIGSPluginModel::MdcaCount() const
+    {
+    return iPSNameArray->MdcaCount();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::MdcaPoint()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+TPtrC16 CPSUIGSPluginModel::MdcaPoint( TInt aIndex ) const
+    {
+    TPtr tempText = iVisibleSettingName->Des();
+    tempText.Zero();
+    tempText.Append( KColumnListSeparator );
+    tempText.Append( iPSNameArray->MdcaPoint( aIndex ));
+
+    return tempText;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::CreateSettingNameLC()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+HBufC* CPSUIGSPluginModel::CreateSettingNameLC( HBufC* aOriginalName )
+    {
+    _LIT( KPSUIGSPluginNumbering, "(%N)" );
+    const TInt KPSUIFormattingExtraLength = 6;
+    
+    // prepare
+    HBufC* settingName = aOriginalName ? 
+        aOriginalName : 
+        StringLoader::LoadL( R_QTN_PRESENCE_NAME_DEFAULT );
+
+    if ( settingName->Length() + KPSUIFormattingExtraLength > KPresSetNameMaxLength )
+        {//if there is no room for duplicate-numbering, let user take care of that when saving settings
+        CleanupStack::PushL( settingName );
+        return settingName;
+        }
+    
+    settingName = settingName->ReAlloc( 
+        settingName->Length() + KPSUIFormattingExtraLength );// enough for formatting
+    CleanupStack::PushL( settingName );
+    HBufC* tempSetName = NULL;
+    TInt pos = 0;// used as dummy
+    TInt found = 0;
+    TInt index = 1;
+    TPtr ptr = settingName->Des();
+    
+    // do the actual checking of name
+    found = iPSNameArray->Find( *settingName, pos );
+    while ( found == 0 )
+        {
+        if ( !tempSetName )
+            {
+            if ( aOriginalName )
+                {// aOriginalName given
+                tempSetName = GetPrefixL( settingName );
+                tempSetName = tempSetName->ReAlloc( 
+                    tempSetName->Length() + KPSUIFormattingExtraLength );// enough for formatting
+                CleanupStack::PushL( tempSetName );
+                tempSetName->Des().Append( KPSUIGSPluginNumbering );
+                }
+            else
+                {// aOriginalName not given
+                tempSetName = StringLoader::LoadLC( R_QTN_PRESENCE_NAME_DEFAULT_NUMBER );
+                }
+            }
+        StringLoader::Format( ptr, *tempSetName, -1, index );
+        found = iPSNameArray->Find( *settingName, pos );
+        index++;
+        }
+
+    // cleanup
+    if ( tempSetName )
+        {
+        CleanupStack::PopAndDestroy( tempSetName ); //tempSetName
+        }
+
+    return settingName;    
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::GetPrefixL()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+HBufC* CPSUIGSPluginModel::GetPrefixL( HBufC* aName )
+    {
+    TPtrC prefix = aName->Des();
+    TInt lastBrace = aName->LocateReverse('(');
+    if ( lastBrace != KErrNotFound )
+        {
+        // aName looks like "<prefix><brace><something>".
+        // See if <something> is an integer number and
+        // <something> ends to a brace.
+        TPtrC num = aName->Right( aName->Length() - lastBrace - 1 );
+        TInt val;
+        TLex lex( num );
+        if ( lex.Val( val ) == KErrNone && num.Locate(')') == num.Length() - 1 )
+            {
+            // Yes, the trailer is an integer.
+            prefix.Set( aName->Left( lastBrace ) );
+            }
+        }
+    return prefix.AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::CurrentSettingName()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+HBufC* CPSUIGSPluginModel::SettingNameLC( TInt aIndex )
+    {
+    return iPSNameArray->MdcaPoint( aIndex ).AllocLC();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SettingNames()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+CDesCArray* CPSUIGSPluginModel::SettingNames()
+    {
+    return iPSNameArray;// ownership stays in CPSUIGSPluginModel
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SettingsSet()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+TPresSettingsSet& CPSUIGSPluginModel::SettingsSet()
+    {
+    return iSettingSet;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ClearInvalidSIPAndXDMSettingsL()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+void CPSUIGSPluginModel::ClearInvalidSIPAndXDMSettingsL()
+    {
+    // SIP
+    ReadSipArrayFromEngineL();
+    if ( iSettingSet.iSipProfile != KErrNotFound && 
+        KErrNotFound == SipProfileIndex( iSettingSet.iSipProfile ))
+        {
+        iSettingSet.iSipProfile = KErrNotFound;
+        }
+    // XDM
+    XdmCollectionNamesL();
+    if ( iSettingSet.iXDMSetting != KErrNotFound && 
+        KErrNotFound == XdmSettingIndex( iSettingSet.iXDMSetting ))
+        {
+        iSettingSet.iXDMSetting = KErrNotFound;
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SettingsId()
+// See header for details.
+// ---------------------------------------------------------------------------
+// 
+TInt& CPSUIGSPluginModel::SettingsId()
+    {
+    return iSettingId;
+    }    
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SettingsIDArray()
+// See header for details.
+// ---------------------------------------------------------------------------
+//
+RArray<TInt>& CPSUIGSPluginModel::SettingsIDArray()
+    {
+    return iPSIdArray;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SipProfilesLC()
+// See header for details.
+// ---------------------------------------------------------------------------
+//   
+CDesCArray* CPSUIGSPluginModel::SipProfilesLC()
+    {
+    ReadSipArrayFromEngineL();
+    CDesCArray* array = new ( ELeave ) CDesCArrayFlat( 2 );
+    CleanupStack::PushL( array );
+    const TInt arrayCount = iSIPProfiles->Count();
+    for ( TInt i = 0; i < arrayCount; i++ )
+        {
+        const TDesC8* profileName;
+        iSIPProfiles->At( i )->GetParameter( KSIPProviderName, profileName );
+        HBufC* profileName16 = 
+            EscapeUtils::ConvertToUnicodeFromUtf8L( *profileName );
+        CleanupStack::PushL( profileName16 );
+        array->AppendL( profileName16->Des() );
+        CleanupStack::PopAndDestroy( profileName16 );// profileName16
+        }
+    return array;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SipProfileId()
+// See header for details.
+// ---------------------------------------------------------------------------
+//   
+TInt CPSUIGSPluginModel::SipProfileId( TInt aIndex )
+    {
+    __ASSERT_DEBUG( iSIPProfiles, User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound ));
+
+    TUint32 id = 0;
+    if ( aIndex < iSIPProfiles->Count())
+        {        
+        iSIPProfiles->At( aIndex )->GetParameter( KSIPProfileId, id );
+        }
+
+    __ASSERT_DEBUG( id < KMaxTInt ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow ));
+    return id ? TInt( id ) : KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SipProfileIndex()
+// See header for details.
+// ---------------------------------------------------------------------------
+//   
+TInt CPSUIGSPluginModel::SipProfileIndex( TInt aId )
+    {
+    __ASSERT_DEBUG( iSIPProfiles, User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound ));    
+    const TInt arrayCount = iSIPProfiles->Count();
+    TUint32 idValue = aId;
+    for ( TInt i = 0; i < arrayCount; i++ )
+        {
+        TUint32 tempValue;
+        iSIPProfiles->At( i )->GetParameter( KSIPProfileId, tempValue );
+        if ( tempValue == idValue )
+            {
+            return i;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::SipProfileNameL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//   
+HBufC* CPSUIGSPluginModel::SipProfileNameL( TInt aId )
+    {
+    const TInt arrayCount = iSIPProfiles->Count();
+    TUint32 idValue = aId;
+    for ( TInt i = 0; i < arrayCount; i++ )
+        {
+        TUint32 tempValue;
+        iSIPProfiles->At( i )->GetParameter( KSIPProfileId, tempValue );
+        if ( tempValue == idValue )
+            {
+            const TDesC8* profileName;
+            iSIPProfiles->At( i )->GetParameter( KSIPProviderName, profileName );
+            return EscapeUtils::ConvertToUnicodeFromUtf8L( *profileName );// name found
+            }
+        }
+    return HBufC::NewL( 0 );// name not found
+    }
+ 
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ReadSipArrayFromEngineL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//       
+void CPSUIGSPluginModel::ReadSipArrayFromEngineL()
+    {
+    RArray<TSIPProfileTypeInfo> array;
+    CleanupClosePushL( array );
+    
+    if ( !iSIPEngine )
+        {
+        iSIPEngine = CSIPManagedProfileRegistry::NewL( *this );
+        }
+    
+    // Get the supported profile types
+    iSIPEngine->SupportedProfileTypesL( array );
+    
+    // check iSIPProfiles, if exists delete
+    if ( iSIPProfiles )
+        {
+        iSIPProfiles->ResetAndDestroy();
+        delete iSIPProfiles;
+        }
+
+    // Create the profile pointer array
+    iSIPProfiles = 
+        new ( ELeave ) CArrayPtrFlat<CSIPManagedProfile>( 2 );
+
+    RPointerArray<CSIPProfile> profilePointerArray;
+    TCleanupItem clItem( ResetAndDestroy, &profilePointerArray );
+    CleanupStack::PushL( clItem );
+    
+    // Get all profiles based on profile types
+    const TInt arrayCount = array.Count();
+    for ( TInt i = 0; i < arrayCount; i++ )
+        {        
+        iSIPEngine->ProfilesL( array[i], profilePointerArray );
+        while ( profilePointerArray.Count() > 0 )
+            {
+            CSIPManagedProfile* profile = 
+                static_cast<CSIPManagedProfile*>( profilePointerArray[ 0 ]);
+            iSIPProfiles->AppendL( profile );
+            profilePointerArray.Remove( 0 ); 
+            }                    
+        profilePointerArray.Reset();    
+        }
+
+    CleanupStack::PopAndDestroy( 2, &array ); // array
+    }    
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ResetAndDestroy()
+// See header for details.
+// ---------------------------------------------------------------------------
+//   
+void CPSUIGSPluginModel::ResetAndDestroy( 
+    TAny* aPointerArray )
+    {
+    RPointerArray<CSIPProfile>* array =
+        static_cast<RPointerArray<CSIPProfile>*>( aPointerArray );
+    array->ResetAndDestroy();
+    array->Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ProfileRegistryEventOccurred()
+// See header for details.
+// ---------------------------------------------------------------------------
+//   
+void CPSUIGSPluginModel::ProfileRegistryEventOccurred( 
+    TUint32 /*aSIPProfileId*/, TEvent aEvent )
+    {
+    switch( aEvent )    
+        {
+        case EProfileCreated:
+        case EProfileUpdated:   
+        case EProfileDestroyed:
+            // update sip profile array
+            TRAP_IGNORE( ReadSipArrayFromEngineL() );
+            break;
+        default:
+            // do nothing.
+            break;
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::ProfileRegistryErrorOccurred()
+// See header for details.
+// ---------------------------------------------------------------------------
+//       
+void CPSUIGSPluginModel::ProfileRegistryErrorOccurred(                  
+    TUint32 /*aSIPProfileId*/,
+    TInt /*aError*/ )
+    {        
+    // update sip profile array
+    TRAP_IGNORE( ReadSipArrayFromEngineL() );
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::XdmCollectionNamesL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//  
+CDesCArray* CPSUIGSPluginModel::XdmCollectionNamesL()
+    {
+    delete iXdmNameArray;
+    iXdmNameArray = NULL;
+    iXdmIdArray.Reset();
+    
+    iXdmNameArray = TXdmSettingsApi::CollectionNamesLC( iXdmIdArray );
+    CleanupStack::Pop( iXdmNameArray );// iXdmNameArray
+    return iXdmNameArray;// pointer is given, but ownership stays here
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::XdmCollectionNameL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//  
+HBufC* CPSUIGSPluginModel::XdmCollectionNameL( TInt aId )
+    {
+    HBufC* buf = NULL;
+    TRAPD( err, buf = TXdmSettingsApi::PropertyL( aId, EXdmPropName ));
+    return ( err == KErrNone ) ? buf : HBufC::NewL( 0 );
+    }
+
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::XdmSettingIndex()
+// See header for details.
+// ---------------------------------------------------------------------------
+//  
+TInt CPSUIGSPluginModel::XdmSettingIndex( TInt aId )
+    {
+    const TInt arrayCount = iXdmIdArray.Count();
+    for ( TInt i = 0; i < arrayCount; i++ )
+        {
+        if ( aId == iXdmIdArray[ i ] )
+            {
+            return i;
+            }
+        }    
+    return KErrNotFound;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CPSUIGSPluginModel::XdmSettingId()
+// See header for details.
+// ---------------------------------------------------------------------------
+//  
+TInt CPSUIGSPluginModel::XdmSettingId( TInt aIndex )
+    {
+    TInt id = KErrNotFound;
+    if ( aIndex+1 <= iXdmIdArray.Count())
+        {        
+        id = iXdmIdArray[ aIndex ];
+        }
+    return id;
+    }
+
+// End of file