--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cmmgr/Framework/Src/cmpbasesettingsdlg.cpp Thu Dec 17 08:55:21 2009 +0200
@@ -0,0 +1,1493 @@
+/*
+* 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: base class for connection method plugin dialogs
+*
+*/
+
+
+// INCLUDE FILES
+
+// System
+#include <cmmanager.rsg>
+#include <aknnavide.h>
+#include <StringLoader.h>
+#include <akntitle.h>
+#include <aknradiobuttonsettingpage.h>
+#include <data_caging_path_literals.hrh>
+#include <akntextsettingpage.h>
+#include <aknpasswordsettingpage.h>
+#include <in_sock.h>
+#include <aknmfnesettingpage.h>
+#include <AknQueryDialog.h>
+#include <featmgr.h>
+
+#include <hlplch.h>
+
+// User
+#include <mcmdexec.h>
+#include <cmpbasesettingsdlg.h>
+#include <cmmanager.h>
+#include <cmpluginbaseeng.h>
+#include "cmmanagerimpl.h"
+#include "cmmanager.hrh"
+#include <cmcommonui.h>
+#include <cmcommonconstants.h>
+#include <cmpsettingsconsts.h>
+#include "cmpluginmultilinedialog.h"
+#include "cmlogger.h"
+#include "ccmdexec.h"
+
+using namespace CMManager;
+
+// Maximum speed mapping
+struct TIPv6DNSMapping
+ {
+ TInt iResId;
+ TInt iSettingValue;
+ };
+
+// Mapping for IPv6 DNS types
+const TIPv6DNSMapping KTIPv6DNSItems[] =
+ {
+ { R_QTN_SET_DNS_SERVERS_AUTOMATIC, EIPv6Unspecified },
+ { R_QTN_SET_IP_WELL_KNOWN, EIPv6WellKnown },
+ { R_QTN_SET_IP_USER_DEFINED, EIPv6UserDefined },
+ { 0, 0 }
+ };
+
+const TUint32 KMaxInt32Length = 10;
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ConstructAndRunLD
+// Constructs the dialog and runs it.
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CmPluginBaseSettingsDlg::ConstructAndRunLD( )
+ {
+ CleanupStack::PushL( this );
+ FeatureManager::InitializeLibL();
+ iHelp = FeatureManager::FeatureSupported( KFeatureIdHelp );
+ FeatureManager::UnInitializeLib();
+ ConstructL( R_PLUGIN_BASE_MENUBAR );
+ PrepareLC( R_PLUGIN_BASE_DIALOG );
+ CleanupStack::Pop( this );
+ iSettingIndex = new ( ELeave ) CArrayFixFlat<TUint>( 4 );
+
+ if (!iHasSettingChanged)
+ {
+ iHasSettingChanged = ETrue;
+ }
+
+ return RunLD();
+ }
+
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::CmPluginBaseSettingsDlg()
+// --------------------------------------------------------------------------
+//
+EXPORT_C CmPluginBaseSettingsDlg::CmPluginBaseSettingsDlg(
+ CCmPluginBaseEng& aCmPluginBase ) :
+ iCmPluginBaseEng( aCmPluginBase ),
+ iExitReason( KDialogUserBack ),
+ iResourceReader( *CCoeEnv::Static() ),
+ iIsPossibleToSaveSetting( ETrue ),
+ iHasSettingChanged( EFalse )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::~CApSelectorDialog
+// --------------------------------------------------------------------------
+//
+EXPORT_C CmPluginBaseSettingsDlg::~CmPluginBaseSettingsDlg()
+ {
+ // iModel is deleted by the ListBox because LB owns the model...
+ // of course only after we passed ownership...
+ if ( iNaviDecorator )
+ {
+ delete iNaviDecorator;
+ }
+ if ( iTitlePane )
+ {
+ // set old text back, if we have it...
+ if ( iOldTitleText )
+ {
+ TRAP_IGNORE( iTitlePane->SetTextL( *iOldTitleText ) );
+ delete iOldTitleText;
+ }
+ }
+ if ( iSettingIndex )
+ {
+ delete iSettingIndex;
+ }
+ iResourceReader.Close();
+
+ delete iCmdExec;
+ iCmdExec = NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::PreLayoutDynInitL();
+// called by framework before dialog is shown
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::PreLayoutDynInitL()
+ {
+ iListbox = STATIC_CAST( CAknSettingStyleListBox*,
+ Control( KPluginBaseListboxId ) );
+ iListbox->CreateScrollBarFrameL( ETrue );
+ iListbox->ScrollBarFrame()->SetScrollBarVisibilityL
+ ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+ iListbox->SetListBoxObserver( this );
+
+ HandleListboxDataChangeL();
+ iListbox->HandleItemAdditionL();
+ InitTextsL();
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::UpdateListBoxContentL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::UpdateListBoxContentL()
+ {
+ // Must save listbox indexes because content will be deleted
+ TInt lastListBoxPos = iListbox->CurrentItemIndex();
+ TInt lastListBoxTopPos = iListbox->TopItemIndex();
+
+ // deleting listbox content
+ MDesCArray* itemList = iListbox->Model()->ItemTextArray();
+ CDesCArray* itemArray = (CDesCArray*)itemList;
+
+ while ( itemArray->Count() )
+ {
+ itemArray->Delete( 0 );
+ }
+ while ( iSettingIndex->Count() )
+ {
+ iSettingIndex->Delete( 0 );
+ }
+
+ // CONNECTION NAME
+ AppendSettingTextsL( *itemArray, ECmName );
+
+ // BEARER SPECIFIC SETTINGS
+ UpdateListBoxContentBearerSpecificL( *itemArray );
+
+ //-----------------------------------------------------------------------
+ // Handle content changes
+ iListbox->Reset();
+ iListbox->HandleItemAdditionL();
+
+ // Listbox might not have index
+ if ( lastListBoxPos != -1 )
+ {
+ iListbox->SetCurrentItemIndex( lastListBoxPos );
+ iListbox->SetTopItemIndex( lastListBoxTopPos );
+ }
+ iListbox->DrawNow();
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::AppendSettingTextsL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::AppendSettingTextsL(
+ CDesCArray& aItemArray,
+ const TInt aSettingItemId,
+ const TInt aValueResId )
+ {
+ HBufC* value = StringLoader::LoadLC( aValueResId );
+
+ AppendSettingTextsL( aItemArray, aSettingItemId, value );
+
+ CleanupStack::PopAndDestroy( value );
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::AppendSettingTextsL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::AppendSettingTextsL(
+ CDesCArray& aItemArray,
+ const TInt aSettingItemId,
+ const HBufC* aValueString )
+ {
+ const TCmAttribConvTable* convItem =
+ iCmPluginBaseEng.ConvTableItem( aSettingItemId );
+ HBufC* value = NULL;
+
+ if ( aValueString )
+ {
+ value = (HBufC*)aValueString;
+ }
+ else
+ {
+ if ( convItem->iAttribFlags & EConvNumber )
+ {
+ TUint32 num = iCmPluginBaseEng.GetIntAttributeL( aSettingItemId );
+
+ if( !num && convItem->iDefSettingResId )
+ {
+ value = StringLoader::LoadL( convItem->iDefSettingResId );
+ }
+ else
+ {
+ value = HBufC::NewL( KMaxInt32Length );
+ value->Des().AppendNum( num );
+
+ TPtr number( value->Des() );
+ AknTextUtils::LanguageSpecificNumberConversion( number );
+ }
+ }
+ else
+ {
+ if( convItem->iAttribFlags & EConv8Bits )
+ // make 16bits copy of this 8bits buffer
+ {
+ HBufC8* value8 = iCmPluginBaseEng.GetString8AttributeL( aSettingItemId );
+ CleanupStack::PushL( value8 );
+ value = HBufC::NewL( value8->Length() );
+ value->Des().Copy( *value8 );
+ CleanupStack::PopAndDestroy( value8 );
+ }
+ else
+ {
+ value = iCmPluginBaseEng.GetStringAttributeL( aSettingItemId );
+ }
+
+ if ( convItem->iDefSettingResId )
+ // We have default value in resource.
+ // Check if we have use it, instead of current value.
+ {
+ if ( convItem->iAttribFlags & EConvIPv4 )
+ // This is an IPv4 text attribute
+ {
+ if ( IsUnspecifiedIPv4Address( *value ) )
+ // Use default value from resource instead of
+ // displaying unspecified IP address
+ {
+ delete value; value = NULL;
+ }
+ }
+ else if ( convItem->iAttribFlags & EConvIPv6 )
+ // This is an IPv4 text attribute
+ {
+ }
+ else if( convItem->iAttribFlags & EConvPassword )
+ // In case of password, we can show only the resource
+ // string.
+ {
+ delete value; value = NULL;
+ }
+ else if ( *value == KNullDesC && convItem->iDefSettingResId )
+ // empty string, but it has a default value in resource
+ // Use the resource value.
+ {
+ delete value; value = NULL;
+ }
+
+ if ( !value )
+ // use default value from resource.
+ {
+ value = StringLoader::LoadL( convItem->iDefSettingResId );
+ }
+ }
+ }
+
+ CleanupStack::PushL( value );
+ }
+
+ HBufC* title = StringLoader::LoadLC( convItem->iTitleId );
+
+ _LIT( KSettingListFormat, "\t%S\t\t%S" );
+ HBufC* itemTextBuf = HBufC::NewLC( KSettingListFormat().Length() +
+ title->Length() +
+ value->Length() +
+ KTxtCompulsory().Length() );
+
+ TPtr itemText = itemTextBuf->Des();
+
+ itemText.Format( KSettingListFormat, title, value );
+
+ // indicator for compulsory settings
+ if ( convItem->iAttribFlags & EConvCompulsory )
+ {
+ itemText.Append( KTxtCompulsory );
+ }
+
+ aItemArray.AppendL( itemText );
+ CleanupStack::PopAndDestroy( 2, title ); // itemTextBuf, title
+
+ if ( !aValueString )
+ {
+ CleanupStack::PopAndDestroy( (HBufC*)value );
+ }
+
+ iSettingIndex->AppendL( aSettingItemId );
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::AppendSettingTextsL
+// --------------------------------------------------------------------------
+//
+
+EXPORT_C void CmPluginBaseSettingsDlg::AppendSettingTextsL(
+ CDesCArray& aItemArray,
+ const TInt aSettingItemId,
+ const TInt aTitleResId,
+ const TInt aValueResId,
+ const TBool aCompulsory ) const
+ {
+ HBufC* value = NULL;
+ if ( aValueResId )
+ {
+ value = StringLoader::LoadLC( aValueResId );
+ }
+ else
+ {
+ value = KNullDesC().AllocL();
+ CleanupStack::PushL( value );
+ }
+ TPtr ptrValue = value->Des();
+
+ AppendSettingTextsL( aItemArray, aSettingItemId,
+ aTitleResId, ptrValue, aCompulsory );
+
+ CleanupStack::PopAndDestroy( value );
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::AppendSettingTextsL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::AppendSettingTextsL(
+ CDesCArray& aItemArray,
+ const TInt aSettingItemId,
+ const TInt aTitleResId,
+ const TDesC& aValueString,
+ const TBool aCompulsory ) const
+ {
+ // Title
+ HBufC* title = StringLoader::LoadLC( aTitleResId );
+
+ _LIT( KSettingListFormat, "\t%S\t\t%S" );
+ HBufC* itemTextBuf = HBufC::NewLC( KSettingListFormat().Length() +
+ title->Length() +
+ aValueString.Length() +
+ KTxtCompulsory().Length() );
+
+ TPtr itemText = itemTextBuf->Des();
+
+ itemText.Format( KSettingListFormat, title, &aValueString );
+
+ // indicator for compulsory settings
+ if ( aCompulsory )
+ {
+ itemText.Append( KTxtCompulsory );
+ }
+
+ aItemArray.AppendL( itemText );
+ CleanupStack::PopAndDestroy( 2, title ); // itemTextBuf, title
+ iSettingIndex->AppendL( aSettingItemId );
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::DynInitMenuPaneL(
+ TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ CAknDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
+
+ if ( aResourceId == R_PLUGIN_BASE_MENU )
+ {
+ if (!iHelp)
+ {
+ aMenuPane->DeleteMenuItem( EAknCmdHelp );
+ }
+ TInt currentItem = iSettingIndex->At( iListbox->CurrentItemIndex() );
+ if ( currentItem == ECmBearerSettingName )
+ {
+
+ aMenuPane->SetItemDimmed( EPluginBaseCmdChange, ETrue );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ProcessCommandL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::ProcessCommandL( TInt aCommandId )
+ {
+ if ( MenuShowing() )
+ {
+ HideMenu();
+ }
+
+ switch ( aCommandId )
+ {
+ case EAknSoftkeyOptions:
+ {
+ DisplayMenuL();
+ break;
+ }
+ case EPluginBaseCmdExit:
+ {
+ iExitReason = KDialogUserExit;
+ if( iIsPossibleToSaveSetting && iHasSettingChanged )
+ {
+ iCmPluginBaseEng.UpdateL();
+ iHasSettingChanged = EFalse;
+ }
+
+ TryExitL( iExitReason );
+ break;
+ }
+ case EAknSoftkeyOk:
+ case EAknSoftkeyChange:
+ {
+ // Function CheckSpaceBelowCriticalLevelL may User::Leave with KLeaveWithoutAlert
+ // if no space available to save changes. The User::Leave message will be caught
+ // by iCmdExec. So,it is not caught here.
+ iCmPluginBaseEng.CheckSpaceBelowCriticalLevelL();
+
+ ShowPopupSettingPageL(
+ iSettingIndex->At( iListbox->CurrentItemIndex() ),
+ aCommandId );
+
+ break;
+ }
+ case EAknCmdHelp:
+ {
+ // Help context (the default value) has been set so this value is used.
+ HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+ iEikonEnv->EikAppUi()->AppHelpContextL() );
+ }
+ break;
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::InitTextsL
+// called before the dialog is shown
+// to initialize localized textual data
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::InitTextsL()
+ {
+ // set pane text if neccessary...
+ // pane text needed if not pop-up...
+ if ( iEikonEnv )
+ {
+ iStatusPane = iEikonEnv->AppUiFactory()->StatusPane();
+ iTitlePane = ( CAknTitlePane* )iStatusPane->ControlL(
+ TUid::Uid( EEikStatusPaneUidTitle ) );
+
+ iOldTitleText = iTitlePane->Text()->AllocL();
+ HBufC* pdConnName = iCmPluginBaseEng.GetStringAttributeL( ECmName );
+ CleanupStack::PushL( pdConnName ); // 1
+
+ if ( pdConnName )
+ {
+ iTitlePane->SetTextL( *pdConnName );
+ }
+ else
+ {
+ iTitlePane->SetTextL( KNullDesC );
+ }
+ CleanupStack::PopAndDestroy( pdConnName ); // 0
+
+
+ iNaviPane = ( CAknNavigationControlContainer* )iStatusPane->ControlL(
+ TUid::Uid( EEikStatusPaneUidNavi ) );
+ iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC );
+ iNaviPane->PushL( *iNaviDecorator );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::OkToExitL
+// Good to know : EAknSoftkeyCancel is never called, because
+// EEikDialogFlagNotifyEsc flag is not set in the resource.
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::OkToExitL( TInt aButtonId )
+ {
+ // Translate the button presses into commands for the appui & current
+ // view to handle
+ TBool retval( EFalse );
+
+ switch ( aButtonId )
+ {
+ case EAknSoftkeyOk:
+ case EAknSoftkeyChange:
+ {
+ ProcessCommandL( aButtonId );
+ break;
+ }
+ case EAknSoftkeyBack:
+ case EAknSoftkeyExit:
+ case KDialogUserExit:
+ {
+
+ if ( iIsPossibleToSaveSetting && iHasSettingChanged )
+ {
+ iCmPluginBaseEng.UpdateL();
+ iHasSettingChanged = EFalse;
+ }
+ retval = ETrue;
+ break;
+ }
+ case EAknSoftkeyOptions:
+ {
+ DisplayMenuL();
+ break;
+ }
+ default:
+ {
+ retval = ETrue;
+ break;
+ }
+ }
+
+ return retval;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::HandleListBoxEventL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::HandleListBoxEventL(
+ CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+ {
+ switch ( aEventType )
+ {
+ case EEventEnterKeyPressed:
+ case EEventItemSingleClicked:
+ {
+ if ( !iProcessing )
+ {
+ delete iCmdExec;
+ iCmdExec = NULL;
+ iCmdExec = new (ELeave) CCmdExec(*this);
+ iCmdExec->Execute();
+ }
+ break;
+ }
+ case EEventEditingStarted:
+ {
+ break;
+ }
+ case EEventEditingStopped:
+ {
+ break;
+ }
+ default:
+ {
+ break;
+// User::Leave( KErrNotSupported );
+ }
+ }
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::LoadResourceL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TInt CmPluginBaseSettingsDlg::LoadResourceL (
+ const TDesC& aResFileName )
+ {
+ TInt err( KErrNone );
+ // Add resource file.
+ TParse* fp = new ( ELeave ) TParse();
+ err = fp->Set( aResFileName,
+ &KDC_RESOURCE_FILES_DIR,
+ NULL );
+ if ( err )
+ {
+ User::Leave( err );
+ }
+
+ TFileName resourceFileNameBuf = fp->FullName();
+ delete fp;
+
+ iResourceReader.OpenL( resourceFileNameBuf );
+ return err;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::HandleListboxDataChangeL
+// called before the dialog is shown to initialize listbox data
+//---------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::HandleListboxDataChangeL()
+ {
+ UpdateListBoxContentL();
+ iListbox->HandleItemAdditionL();
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowPopupSettingPageL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::ShowPopupSettingPageL(
+ TUint32 aAttribute, TInt /*aCommandId*/ )
+ {
+ TBool retval( EFalse );
+
+ switch ( aAttribute )
+ {
+ case ECmBearerSettingName:
+ {
+ TCmCommonUi::ShowNoteL ( R_PLUGIN_BASE_INFO_BEARER_NOT_EDITABLE,
+ TCmCommonUi::ECmInfoNote );
+ break;
+ }
+ case ECmName:
+ default:
+ {
+ retval = ShowPopupTextSettingPageL( aAttribute );
+ break;
+ }
+ }
+ return retval;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::SelectItem
+//---------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::SelectItem( TInt aItemIndex )
+ {
+ iListbox->ScrollToMakeItemVisible( aItemIndex );
+ iListbox->SetCurrentItemIndexAndDraw( aItemIndex );
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::StringAttributeWithDefaultL
+//---------------------------------------------------------------------------
+//
+EXPORT_C HBufC* CmPluginBaseSettingsDlg::StringAttributeWithDefaultL(
+ TUint32 aAttribute, TUint32 aDefRes )
+ {
+ HBufC* value = iCmPluginBaseEng.GetStringAttributeL( aAttribute );
+ if ( *value == KNullDesC )
+ {
+ delete value;
+ value = NULL;
+ value = StringLoader::LoadL( aDefRes );
+ }
+
+ return value;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::GetHelpContext
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::GetHelpContext( TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KHelpUidPlugin;
+ aContext.iContext = iHelpContext;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowPopupIpSettingPageL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::ShowPopupIpSettingPageL(
+ TUint32 aAttribute,
+ TUint32 aTitleId )
+
+ {
+ TBool retval = EFalse;
+ const TCmAttribConvTable* convItem =
+ iCmPluginBaseEng.ConvTableItem( aAttribute );
+
+ HBufC* servName = HBufC::NewLC( convItem->iMaxLength );
+ TPtr ptrServName ( servName->Des() );
+
+ HBufC* orig = iCmPluginBaseEng.GetStringAttributeL( aAttribute );
+ CleanupStack::PushL( orig );
+ ptrServName.Copy( *orig );
+
+ TInetAddr addr;
+ addr.Input( ptrServName );
+
+ TInt resId = EditorId( convItem->iEditorResId, R_TEXT_SETTING_PAGE_IP );
+
+ CAknIpFieldSettingPage* dlg =
+ new ( ELeave ) CAknIpFieldSettingPage(
+ resId,
+ addr );
+
+ CleanupStack::PushL( dlg );
+ SetTitleL( dlg, convItem->iTitleId, aTitleId );
+ CleanupStack::Pop( dlg );
+
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted ) )
+ {
+ addr.Output( ptrServName );
+
+ if ( orig->Des().CompareF( ptrServName ) )
+ // User modified IP address
+ {
+ iCmPluginBaseEng.SetStringAttributeL( aAttribute, ptrServName );
+ retval = ETrue;
+ UpdateListBoxContentL();
+ }
+ }
+
+ CleanupStack::PopAndDestroy( 2, servName ); // orig, servName
+ return retval;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowRadioButtonSettingPageL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CmPluginBaseSettingsDlg::ShowRadioButtonSettingPageL(
+ const TUint32* aResIds,
+ TInt& aCurrentItem,
+ TUint32 aTitleId )
+ {
+ CDesCArrayFlat* items =
+ new ( ELeave ) CDesCArrayFlat( KCmArraySmallGranularity );
+
+ CleanupStack::PushL( items );
+ TInt count( 0 );
+ for( ; aResIds[count]; ++count )
+ {
+ HBufC* item = StringLoader::LoadLC( aResIds[count] );
+ items->AppendL( *item );
+ }
+
+ TUint32 resId = EditorId( 0, R_RADIO_BUTTON_SETTING_PAGE_OK_CANCEL );
+ CAknRadioButtonSettingPage* dlg =
+ new ( ELeave ) CAknRadioButtonSettingPage(
+ resId,
+ aCurrentItem,
+ items );
+ CleanupStack::PushL( dlg );
+ SetTitleL( dlg, 0, aTitleId );
+ CleanupStack::Pop( dlg );
+
+ TBool retVal = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+
+ CleanupStack::PopAndDestroy( count ); // selection items
+ CleanupStack::PopAndDestroy( items );
+
+ return retVal;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowRadioButtonSettingPageL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CmPluginBaseSettingsDlg::ShowRadioButtonSettingPageL(
+ CDesCArrayFlat& aItems,
+ TInt& aCurrentItem,
+ TUint32 aTitleId )
+ {
+ TUint32 resId = EditorId( 0, R_RADIO_BUTTON_SETTING_PAGE_OK_CANCEL );
+ CAknRadioButtonSettingPage* dlg =
+ new ( ELeave ) CAknRadioButtonSettingPage(
+ resId,
+ aCurrentItem,
+ &aItems );
+ CleanupStack::PushL( dlg );
+ SetTitleL( dlg, 0, aTitleId );
+ CleanupStack::Pop( dlg );
+
+ TBool retVal = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+
+ return retVal;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowPopupTextSettingPageL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::ShowPopupTextSettingPageL(
+ TUint32 aAttribute,
+ TUint32 aTitleId )
+ {
+ TBool retval( EFalse );
+ const TCmAttribConvTable* convItem =
+ iCmPluginBaseEng.ConvTableItem( aAttribute );
+
+ HBufC* textToChange = HBufC::NewLC( convItem->iMaxLength );
+ TPtr ptrTextToChange( textToChange->Des() );
+
+ HBufC* value = HBufC::NewLC( convItem->iMaxLength );
+ if ( convItem->iAttribFlags & EConv8Bits )
+ // convert 8bits attribute to 16bits
+ {
+ HBufC8* stringFromCm =
+ iCmPluginBaseEng.GetString8AttributeL( aAttribute );
+ value->Des().Copy( *stringFromCm );
+
+ delete stringFromCm; stringFromCm = NULL;
+ }
+ else
+ {
+ HBufC* stringFromCm =
+ iCmPluginBaseEng.GetStringAttributeL( aAttribute );
+ value->Des().Copy( *stringFromCm );
+
+ delete stringFromCm; stringFromCm = NULL;
+ }
+
+ if( *value == KNullDesC && convItem->iDefValueResId )
+ // empty string is replaced with the default value from resource
+ {
+ HBufC* stringFromCm = StringLoader::LoadL( convItem->iDefValueResId );
+
+ value->Des().Copy( *stringFromCm );
+
+ delete stringFromCm; stringFromCm = NULL;
+ }
+
+ TPtr ptrValue( value->Des() );
+ ptrTextToChange.Copy( ptrValue );
+
+ TInt textSettingPageFlags( EAknSettingPageNoOrdinalDisplayed );
+
+ if ( !(convItem->iAttribFlags & EConvNoZeroLength) )
+ {
+ textSettingPageFlags = CAknTextSettingPage::EZeroLengthAllowed;
+ }
+
+ TUint32 resId = EditorId( convItem->iEditorResId, 0 );
+
+ CAknTextSettingPage* dlg = new ( ELeave ) CAknTextSettingPage(
+ resId,
+ ptrTextToChange,
+ textSettingPageFlags );
+
+ CleanupStack::PushL( dlg );
+ SetTitleL( dlg, convItem->iTitleId, aTitleId );
+ CleanupStack::Pop( dlg );
+
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted ) )
+ {
+ if ( aAttribute == ECmName )
+ {
+ iTitlePane->SetTextL( ptrTextToChange );
+ }
+ if ( ptrTextToChange.Compare( ptrValue ) )
+ // user modified the value
+ {
+ if ( convItem->iAttribFlags & EConv8Bits )
+ // convert back from 16bits to 8bits
+ {
+ HBufC8* stringTo = HBufC8::NewLC( ptrTextToChange.Length() );
+
+ stringTo->Des().Copy( ptrTextToChange );
+ iCmPluginBaseEng.SetString8AttributeL( aAttribute, *stringTo );
+
+ CleanupStack::PopAndDestroy( stringTo );
+ }
+ else
+ {
+ if( aAttribute == ECmName )
+ {
+ SetUniqueNameL( ptrTextToChange );
+ }
+ else
+ {
+ iCmPluginBaseEng.SetStringAttributeL( aAttribute,
+ ptrTextToChange );
+ }
+ }
+
+ retval = ETrue;
+ UpdateListBoxContentL();
+ }
+ }
+
+ CleanupStack::PopAndDestroy( 2, textToChange );
+ return retval;
+ }
+
+
+void CmPluginBaseSettingsDlg::SetUniqueNameL( TPtr aPtrTextToChange )
+ {
+ // Saves the recent naming method and set it to "Not accept"
+ TUint32 savedNM = iCmPluginBaseEng.GetIntAttributeL( ECmNamingMethod );
+ iCmPluginBaseEng.SetIntAttributeL( ECmNamingMethod, ENamingNotAccept );
+
+ // Tries to save the nem name. If it is not unique
+ // then ret == KErrArgument
+ TRAPD( err, iCmPluginBaseEng.SetStringAttributeL( ECmName, aPtrTextToChange ) );
+
+ if( KErrArgument == err )
+ {
+ // Opens a info note
+ HBufC* noteLine = StringLoader::LoadLC(
+ R_CMMANAGERUI_INFO_DEST_ALREADY_IN_USE, aPtrTextToChange );
+
+ TCmCommonUi::ShowNoteL( *noteLine, TCmCommonUi::ECmInfoNote );
+
+ CleanupStack::PopAndDestroy( noteLine );
+ }
+
+ // Sets back the original naming method
+ iCmPluginBaseEng.SetIntAttributeL( ECmNamingMethod, savedNM );
+ }
+
+
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowPopupPasswordSettingPageL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::ShowPopupPasswordSettingPageL(
+ TUint32 aAttribute,
+ TUint32 aTitleId )
+ {
+ TBool retVal( EFalse );
+
+ const TCmAttribConvTable* convItem =
+ iCmPluginBaseEng.ConvTableItem( aAttribute );
+ HBufC* newPassword = HBufC::NewLC( KCmMaxPasswordLength );
+ TPtr16 ptrNewPassword = newPassword->Des();
+
+ HBufC* oldPassword = NULL;
+ oldPassword = iCmPluginBaseEng.GetStringAttributeL( aAttribute );
+ CleanupStack::PushL( oldPassword );
+
+ TUint32 resId = EditorId( convItem->iEditorResId,
+ R_TEXT_SETTING_PAGE_PASSWD );
+ CAknAlphaPasswordSettingPage* dlg =
+ new ( ELeave ) CAknAlphaPasswordSettingPage(
+ resId,
+ ptrNewPassword,
+ *oldPassword );
+ CleanupStack::PushL( dlg );
+ SetTitleL( dlg, convItem->iTitleId, aTitleId );
+ CleanupStack::Pop( dlg );
+
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ iCmPluginBaseEng.SetStringAttributeL( aAttribute, newPassword->Des() );
+ UpdateListBoxContentL();
+
+ retVal = ETrue;
+ }
+ CleanupStack::PopAndDestroy( 2, newPassword );
+
+ return retVal;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowNumSettingPageL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::ShowPopupPortNumSettingPageL(
+ TUint32 aAttribute, TUint32 aTitleId )
+ {
+ TBool retVal( EFalse );
+ const TCmAttribConvTable* convItem =
+ iCmPluginBaseEng.ConvTableItem( aAttribute );
+
+ TInt value( 0 );
+ value = iCmPluginBaseEng.GetIntAttributeL( aAttribute );
+
+ TInt origVal = value;
+
+ HBufC* buf = HBufC::NewLC( convItem->iMaxLength );
+ TPtr ptr( buf->Des() );
+
+ ptr.Num( value );
+
+ TInt flags = EAknSettingPageNoOrdinalDisplayed;
+
+ if ( !(convItem->iAttribFlags & EConvNoZeroLength) )
+ {
+ flags |= CAknTextSettingPage::EZeroLengthAllowed;
+ }
+
+ TUint32 resId = EditorId( convItem->iEditorResId,
+ R_PORT_NUMBER_SETTING_PAGE );
+ CAknTextSettingPage* dlg = new ( ELeave ) CAknTextSettingPage(
+ resId,
+ ptr,
+ flags );
+
+ CleanupStack::PushL( dlg );
+ SetTitleL( dlg, convItem->iTitleId, aTitleId );
+ CleanupStack::Pop( dlg );
+
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted ) )
+ {
+ TLex lex ( buf->Des() );
+
+ // An empty string should be treated as default
+ if ( buf->Des() == KNullDesC )
+ {
+ value = 0;
+ }
+ else
+ {
+ lex.Val( value );
+ }
+ if ( value != origVal )
+ {
+ iCmPluginBaseEng.SetIntAttributeL( aAttribute, value );
+ retVal = ETrue;
+ UpdateListBoxContentL();
+ }
+ }
+
+ CleanupStack::PopAndDestroy( buf );
+ return retVal;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowPopupIPv4DNSEditorL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TBool CmPluginBaseSettingsDlg::ShowPopupIPv4DNSEditorL(
+ TUint32 aDNSUsageAttribute,
+ TUint32 aDNS1ServAttribute,
+ TUint32 aDNS2ServAttribute,
+ TUint32 aTitleId )
+ {
+ // In default the return value is 'Automatic'
+ TBool retVal( EFalse );
+ // In default DNS setting is automatic.
+ const TCmAttribConvTable* convItem =
+ iCmPluginBaseEng.ConvTableItem( aDNSUsageAttribute );
+
+ HBufC* primServ = iCmPluginBaseEng.GetStringAttributeL( aDNS1ServAttribute );
+ CleanupStack::PushL( primServ );
+ HBufC* secServ = iCmPluginBaseEng.GetStringAttributeL( aDNS2ServAttribute );
+ CleanupStack::PushL( secServ );
+
+ TBuf<KIpAddressWidth> newPrim;
+ TBuf<KIpAddressWidth> newSec;
+
+ newPrim.Copy( *primServ );
+ newSec.Copy( *secServ );
+
+ TInetAddr dns1Addr;
+ TInetAddr dns2Addr;
+
+ dns1Addr.Input( newPrim );
+ dns2Addr.Input( newSec );
+
+ CAknMultiLineIpQueryDialog* dlg =
+ CAknMultiLineIpQueryDialog::NewL( dns1Addr,
+ dns2Addr );
+
+ CleanupStack::PushL( dlg );
+
+ TUint32 editorId = EditorId( convItem->iEditorResId, R_DNSIP4_QUERY );
+ dlg->PrepareLC( editorId );
+
+ TUint32 titleId = TitleId( convItem->iTitleId, aTitleId );
+ if ( titleId )
+ {
+ dlg->SetTitleL( titleId );
+ }
+
+ CleanupStack::Pop( dlg );
+
+ if ( dlg->RunLD() )
+ {
+ dns1Addr.Output( newPrim );
+ dns2Addr.Output( newSec );
+
+ if ( newPrim.CompareF( *primServ ) ||
+ newSec.CompareF( *secServ ) )
+ // User modified the DNS setting
+ {
+ iCmPluginBaseEng.SetDNSServerAddressL(
+ aDNS1ServAttribute,
+ newPrim,
+ aDNS2ServAttribute,
+ newSec,
+ aDNSUsageAttribute,
+ EFalse );
+
+ UpdateListBoxContentL();
+
+ retVal = ETrue;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( 2, primServ );
+
+ return retVal;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::ShowPopupIPv6DNSEditorL
+//---------------------------------------------------------------------------
+//
+EXPORT_C TInt CmPluginBaseSettingsDlg::ShowPopupIPv6DNSEditorL(
+ const TUint32* aSelectionItems,
+ TUint32 aDNSUsageAttribute,
+ TUint32 aDNS1ServAttribute,
+ TUint32 aDNS2ServAttribute )
+ {
+ TBool update( EFalse );
+ TInt selected = GetIPv6DNSTypeL( aDNS1ServAttribute, aDNS2ServAttribute );
+
+ // convert the current setting value to the selection index
+ TInt resId = KTIPv6DNSItems[selected].iResId;
+ TInt i = 0;
+ while ( aSelectionItems[i] )
+ {
+ if ( resId == aSelectionItems[i] )
+ {
+ selected = i;
+ break;
+ }
+ i++;
+ }
+
+ if ( ShowRadioButtonSettingPageL( aSelectionItems,
+ selected,
+ R_QTN_SET_DNS_SERVERS_IP ) )
+ {
+ // convert the selection to the setting value
+ resId = aSelectionItems[selected];
+ TInt j = 0;
+
+ while ( KTIPv6DNSItems[j].iResId )
+ {
+ if ( resId == KTIPv6DNSItems[j].iResId )
+ {
+ selected = KTIPv6DNSItems[j].iSettingValue;
+ break;
+ }
+ j++;
+ }
+
+ switch ( selected )
+ {
+ case EIPv6WellKnown:
+ {
+ iCmPluginBaseEng.SetStringAttributeL(
+ aDNS1ServAttribute, KKnownIp6NameServer1 );
+ iCmPluginBaseEng.SetStringAttributeL(
+ aDNS2ServAttribute, KKnownIp6NameServer2 );
+
+ iCmPluginBaseEng.SetBoolAttributeL(
+ aDNSUsageAttribute, EFalse );
+
+ update = ETrue;
+ }
+ break;
+
+ case EIPv6Unspecified:
+ {
+ iCmPluginBaseEng.SetStringAttributeL(
+ aDNS1ServAttribute, KDynamicIpv6Address );
+ iCmPluginBaseEng.SetStringAttributeL(
+ aDNS2ServAttribute, KDynamicIpv6Address );
+ iCmPluginBaseEng.SetBoolAttributeL(
+ aDNSUsageAttribute, ETrue );
+
+ update = ETrue;
+ }
+ break;
+
+ case EIPv6UserDefined:
+ {
+ TInt err1;
+ TInt err2;
+ TBool cancelled(EFalse);
+ do
+ {
+ // These has to be reset to KErrNone in case of
+ // inputting an invalid address (DLAN-7FJD68).
+ err1 = KErrNone;
+ err2 = KErrNone;
+
+ HBufC* dns1 = HBufC::NewLC( KMaxIPv6NameServerLength );
+ HBufC* dns2 = HBufC::NewLC( KMaxIPv6NameServerLength );
+
+ TPtr dns1ptr( dns1->Des() );
+ TPtr dns2ptr( dns2->Des() );
+
+ HBufC* temp = iCmPluginBaseEng.GetStringAttributeL(
+ aDNS1ServAttribute );
+ dns1ptr.Copy( *temp );
+ delete temp; temp = NULL;
+
+ temp = iCmPluginBaseEng.GetStringAttributeL(
+ aDNS2ServAttribute );
+ dns2ptr.Copy( *temp );
+ delete temp; temp = NULL;
+
+ // KDynamicIpv6Address is offered instead of empty string
+ if ( dns1ptr.Length() == 0 )
+ {
+ dns1ptr = KDynamicIpv6Address;
+ }
+ if ( dns2ptr.Length() == 0 )
+ {
+ dns2ptr = KDynamicIpv6Address;
+ }
+
+
+ if ( ( dns1ptr.Compare( KKnownIp6NameServer1 ) == 0 ) &&
+ ( dns2ptr.Compare( KKnownIp6NameServer2 ) == 0 ) )
+ { // special value, well-known
+ // in this case 'dynamic' string must be offered so
+ // temp data must be changed to 'dynamic'
+ dns1ptr = KDynamicIpv6Address;
+ dns2ptr = KDynamicIpv6Address;
+ }
+
+ CCmPluginMultiLineDialog* ipquery =
+ CCmPluginMultiLineDialog::NewL( dns1ptr,
+ dns2ptr );
+
+ if ( ipquery->ExecuteLD( R_DNSIP6_QUERY ) )
+ {
+ TInetAddr dns1Addr;
+ TInetAddr dns2Addr;
+
+ if ( dns1ptr.Compare( KNullDesC ) )
+ {
+ err1 = dns1Addr.Input( dns1ptr );
+ }
+ if ( dns2ptr.Compare( KNullDesC ) )
+ {
+ err2 = dns2Addr.Input( dns2ptr );
+ }
+ if ( err1 || err2 )
+ {
+ TCmCommonUi::ShowNoteL
+ ( R_QTN_SET_INFO_INVALID_IP,
+ TCmCommonUi::ECmErrorNote );
+ }
+ else
+ {
+ iCmPluginBaseEng.SetDNSServerAddressL(
+ aDNS1ServAttribute,
+ dns1ptr,
+ aDNS2ServAttribute,
+ dns2ptr,
+ aDNSUsageAttribute,
+ ETrue );
+
+ update = ETrue;
+ }
+ }
+ else
+ {
+ cancelled = ETrue;
+ }
+ CleanupStack::PopAndDestroy( dns2 );
+ CleanupStack::PopAndDestroy( dns1 );
+ } while ( (err1 || err2) && (!cancelled) );
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ }
+ }
+ }
+
+ if( update )
+ {
+ UpdateListBoxContentL();
+ }
+
+ return selected;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::TitleId
+//---------------------------------------------------------------------------
+//
+TUint32 CmPluginBaseSettingsDlg::TitleId( TUint32 aConvTitleId,
+ TUint32 aTitleId ) const
+ {
+ TUint32 titleId( 0 );
+ if ( aTitleId )
+ {
+ titleId = aTitleId;
+ }
+ else if ( !titleId )
+ {
+ titleId = aConvTitleId;
+ }
+
+ return titleId;
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::SetTitleL
+//---------------------------------------------------------------------------
+//
+void CmPluginBaseSettingsDlg::SetTitleL( CAknSettingPage* aDlg,
+ TUint32 aConvTitleId,
+ TUint32 aTitleId ) const
+ {
+ TUint32 titleId( TitleId( aConvTitleId, aTitleId ) );
+
+ if ( titleId )
+ {
+ HBufC* title = StringLoader::LoadLC( titleId );
+ aDlg->SetSettingTextL( *title );
+ CleanupStack::PopAndDestroy( title );
+ }
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::EditorId
+//---------------------------------------------------------------------------
+//
+TUint32 CmPluginBaseSettingsDlg::EditorId( TUint32 aConvEditorId,
+ TUint32 aEditorId ) const
+ {
+ TUint32 resId( 0 );
+ if ( aConvEditorId )
+ {
+ resId = aConvEditorId;
+ }
+ if ( !resId )
+ {
+ resId = aEditorId;
+ }
+
+ return resId;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::GetIPv6DNSTypeL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CmPluginBaseSettingsDlg::GetIPv6DNSTypeL(
+ TUint32 aDNS1ServAttribute,
+ TUint32 aDNS2ServAttribute )
+ {
+ TIPv6Types retval( EIPv6UserDefined );
+
+ HBufC* priServ = NULL;
+ priServ = iCmPluginBaseEng.GetStringAttributeL( aDNS1ServAttribute );
+ CleanupStack::PushL( priServ );
+ TPtr16 ptr1( priServ->Des() );
+
+ HBufC* secServ = NULL;
+ secServ = iCmPluginBaseEng.GetStringAttributeL( aDNS2ServAttribute );
+ CleanupStack::PushL( secServ );
+ TPtr16 ptr2( secServ->Des() );
+
+ // net type 6: if IspIPv6NameServ <> 0.0.0.0
+ // => User defined OR well-known
+
+ if ( ( !ptr1.Compare( KKnownIp6NameServer1 ) )
+ && ( !ptr2.Compare( KKnownIp6NameServer2 ) ) )
+ { // special value, well-known
+ retval = EIPv6WellKnown;
+ }
+ else
+ {
+ // dynamic, if 0:0:...
+ // OR EMPTY text...
+ if ( ( ( !ptr1.Compare( KDynamicIpv6Address ) )
+ || ( !ptr1.Compare( KNullDesC ) ) )
+ &&( ( !ptr2.Compare( KDynamicIpv6Address ) )
+ ||( !ptr2.Compare( KDynamicIpv6Address ) ) ) )
+ { // dynamic, 0:0:...
+ retval = EIPv6Unspecified;
+ }
+ else
+ { // other value, user defined
+ retval = EIPv6UserDefined;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( 2, priServ );
+
+ return retval;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::HandleResourceChange
+// --------------------------------------------------------------------------
+//
+
+EXPORT_C void CmPluginBaseSettingsDlg::HandleResourceChange( TInt aType )
+ {
+ CCoeControl::HandleResourceChange( aType );
+
+ CAknDialog::HandleResourceChange(aType);
+
+ if( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ DrawNow();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::Execute
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::Execute()
+ {
+ iProcessing = ETrue;
+
+ TRAPD( err, ProcessCommandL( EAknSoftkeyChange ) );
+ if ( err )
+ {
+ HandleLeaveError( err );
+ }
+ iProcessing = EFalse;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginBaseSettingsDlg::HandleLeaveError
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CmPluginBaseSettingsDlg::HandleLeaveError( TInt aError )
+{
+ switch( aError )
+ {
+ case KLeaveWithoutAlert:
+ case KErrNoMemory:
+ // Indicate no memory to save setting changes
+ iIsPossibleToSaveSetting = EFalse;
+
+ if (iProcessing)
+ {
+ // Release processing protection so that the next processing can be done
+ iProcessing = EFalse;
+ }
+ break;
+ default:
+ // More leave errors may be handled if necessary
+ // Now other leave errors are ignored here
+ break;
+ }
+}