--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cmmgr/Plugins/cmpluginvpn/src/cmpvpnsettingsdlg.cpp Thu Dec 17 08:55:21 2009 +0200
@@ -0,0 +1,604 @@
+/*
+* 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: Dialog for editing VPN settings for a VPN
+* connection method
+*
+*/
+
+// INCLUDE FILES
+#include <cmpluginbaseeng.h>
+#include <cmpluginvpn.mbg>
+#include <cmpluginvpnui.rsg>
+#include <AknDialog.h>
+#include <StringLoader.h>
+#include <cmmanager.rsg>
+#include <akntextsettingpage.h>
+#include <akntitle.h>
+#include <cmcommonui.h>
+#include <csxhelp/cp.hlp.hrh>
+
+#include "cmlogger.h"
+#include "cmmanagerimpl.h"
+#include "cmpluginvpn.h"
+#include "cmpvpnsettingsdlg.h"
+#include "cmvpncommonconstants.h"
+#include <cmpluginvpndef.h>
+#include "cmpvpnpolicyselectiondlg.h"
+#include <cmcommonconstants.h>
+#include <cmpsettingsconsts.h>
+#include "cmconnsettingsuiimpl.h"
+#include "cmdestinationimpl.h"
+#include "cmmanagerimpl.h"
+
+using namespace CMManager;
+
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::NewL()
+// Two-phase dconstructor, second phase is ConstructAndRunLD
+// --------------------------------------------------------------------------
+//
+CmPluginVpnSettingsDlg* CmPluginVpnSettingsDlg::NewL(
+ CCmPluginBaseEng& aCmPluginBase )
+ {
+ CmPluginVpnSettingsDlg* self =
+ new ( ELeave ) CmPluginVpnSettingsDlg( aCmPluginBase );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::CmPluginVpnSettingsDlg()
+// --------------------------------------------------------------------------
+//
+CmPluginVpnSettingsDlg::CmPluginVpnSettingsDlg(
+ CCmPluginBaseEng& aCmPluginBase )
+ : CmPluginBaseSettingsDlg( aCmPluginBase )
+ {
+
+ }
+
+//---------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::ConstructAndRunLD
+// --------------------------------------------------------------------------
+//
+TInt CmPluginVpnSettingsDlg::ConstructAndRunLD( )
+ {
+ LOGGER_ENTERFN( "CmPluginVpnSettingsDlg::ConstructAndRunLD" );
+ CleanupStack::PushL( this );
+ LoadResourceL( KPluginVPNResDirAndFileName );
+
+ // check if VPN is available, as if not, we can not show the details...
+ RVpnServ ps;
+ CleanupClosePushL<RVpnServ>( ps );
+ TInt err = ps.Connect();
+ if ( err )
+ {
+ // show note
+ HBufC* text = StringLoader::LoadLC(
+ R_QTN_VPN_INFO_MGMT_UI_NOT_ACCESSIBLE );
+ TCmCommonUi::ShowNoteL( *text, TCmCommonUi::ECmInfoNote );
+ CleanupStack::PopAndDestroy( text );
+ User::Leave( KLeaveWithoutAlert );
+ }
+ CleanupStack::PopAndDestroy(); // ps.close
+
+ // check for compulsory fields missing & display note about it
+ // information note VPN access point is incomplete. Try reconfiguring
+ // the access point. §qtn.vpn.info.vpn.iap.incomplete§ is displayed and
+ // Must be defined qtn_selec_setting_compulsory is displayed
+ // for the invalid settings.
+ if ( !CompulsoryFilledL() )
+ {
+ // show note
+ HBufC* text = StringLoader::LoadLC(
+ R_QTN_VPN_INFO_VPN_IAP_INCOMPLETE );
+ TCmCommonUi::ShowNoteL( *text, TCmCommonUi::ECmInfoNote );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+ CleanupStack::Pop( this );
+
+ CCmManagerImpl& cmMgr = iCmPluginBaseEng.CmMgr();
+ cmMgr.WatcherRegisterL( this );
+
+ return CmPluginBaseSettingsDlg::ConstructAndRunLD( );
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::~CmPluginVpnSettingsDlg
+// Destructor
+// --------------------------------------------------------------------------
+//
+CmPluginVpnSettingsDlg::~CmPluginVpnSettingsDlg()
+ {
+ iResourceReader.Close();
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::UpdateListBoxContentBearerSpecificL
+// --------------------------------------------------------------------------
+//
+void CmPluginVpnSettingsDlg::UpdateListBoxContentBearerSpecificL(
+ CDesCArray& aItemArray )
+ {
+ LOGGER_ENTERFN( "CmPluginVpnSettingsDlg::UpdateListBoxContentBearerSpecificL" );
+ HBufC* value = NULL;
+
+ // VPN policy - Compulsory field
+ AppendSettingTextsL( aItemArray, EVpnServicePolicyName );
+
+ TUint32 iapId = iCmPluginBaseEng.GetIntAttributeL( EVpnIapId );
+ TUint32 destId = iCmPluginBaseEng.GetIntAttributeL( ECmNextLayerSNAPId );
+
+ CCmDestinationImpl* dest = NULL;
+
+ // The underlying CM is a Destination
+ if ( destId )
+ {
+ dest = iCmPluginBaseEng.CmMgr().DestinationL( destId );
+ CleanupStack::PushL( dest );
+// CleanupReleasePushL( dest );
+ value = dest->NameLC();
+ }
+ // The underlying CM is a CM
+ else if ( iapId )
+ {
+ value = iCmPluginBaseEng.CmMgr().GetConnectionMethodInfoStringL(
+ iapId, ECmName );
+ CleanupStack::PushL( value );
+ }
+ else
+ {
+ // Must be defined
+ value = StringLoader::LoadLC( R_QTN_VPN_SETT_VPN_IAP_REAL_NETW_REF_COMPULSORY );
+ }
+
+ AppendSettingTextsL( aItemArray,
+ ECmNextLayerIapId,
+ R_QTN_VPN_SETT_VPN_IAP_REAL_NETW_REFERENCE,
+ *value,
+ ETrue );
+ CleanupStack::PopAndDestroy( value );
+
+ if ( destId )
+ {
+ CleanupStack::PopAndDestroy( dest );
+ }
+
+ // Proxy server address
+ AppendSettingTextsL( aItemArray, ECmProxyServerName );
+ // Proxy port number
+ AppendSettingTextsL( aItemArray, ECmProxyPortNumber );
+
+ }
+
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::RunAdvancedSettingsL
+// --------------------------------------------------------------------------
+//
+void CmPluginVpnSettingsDlg::RunAdvancedSettingsL()
+ {
+ /* empty functionality */
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CmPluginVpnSettingsDlg::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ if ( aResourceId == R_PLUGIN_BASE_MENU )
+ {
+ aMenuPane->SetItemDimmed( EPluginBaseCmdAdvanced, ETrue );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::ShowPopupSettingPageL
+// --------------------------------------------------------------------------
+//
+TBool CmPluginVpnSettingsDlg::ShowPopupSettingPageL( TUint32 aAttribute,
+ TInt aCommandId )
+ {
+ LOGGER_ENTERFN( "CmPluginVpnSettingsDlg::ShowPopupSettingPageL" );
+ TBool retVal = EFalse;
+ switch ( aAttribute )
+ {
+ case EVpnServicePolicyName:
+ {
+ CmPluginVpnPolicySelectionDlg* dlg =
+ CmPluginVpnPolicySelectionDlg::NewL( iCmPluginBaseEng );
+ CleanupStack::PushL( dlg );
+ retVal = dlg->ShowPolicySelectionDlgL();
+ UpdateListBoxContentL();
+ CleanupStack::PopAndDestroy();
+ break;
+ }
+ case ECmProxyServerName:
+ {
+ retVal = ShowPopupTextSettingPageL( aAttribute );
+ break;
+ }
+ case EVpnIapId:
+ case ECmNextLayerIapId:
+ {
+ ShowIapSelectionSettingPageL();
+ break;
+ }
+ case ECmProxyPortNumber:
+ {
+ retVal = ShowPopupPortNumSettingPageL( aAttribute );
+ break;
+ }
+ default:
+ {
+ CmPluginBaseSettingsDlg::ShowPopupSettingPageL( aAttribute,
+ aCommandId );
+ break;
+ }
+ }
+ return retVal;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::ShowIapSelectionSettingPageL
+// --------------------------------------------------------------------------
+//
+TBool CmPluginVpnSettingsDlg::ShowIapSelectionSettingPageL()
+ {
+ LOGGER_ENTERFN( "CmPluginVpnSettingsDlg::ShowIapSelectionSettingPageL" );
+ TBool retVal( EFalse );
+
+ CCmConnSettingsUiImpl* settings =
+ CCmConnSettingsUiImpl::NewL();
+ CleanupStack::PushL( settings );
+ settings->EnableEasyWlan( ETrue );
+ settings->EnableEmptyDestinations( EFalse );
+ settings->EnableVirtualCMs( EFalse );
+
+ CCmDestinationImpl* d = iCmPluginBaseEng.ParentDestination();
+ if ( d )
+ {
+ settings->SetDestinationToOmit( d->Id() );
+// settings->EnableUncat( ETrue );
+ }
+ else
+ {
+// settings->EnableUncat( EFalse );
+ }
+ delete d;
+ settings->EnableUncat( ETrue );
+
+ CCmPluginVpn* plugin = static_cast<CCmPluginVpn *>
+ ( &iCmPluginBaseEng );
+
+ RArray<TUint32> cmArray ( KCmArrayMediumGranularity );
+ CleanupClosePushL( cmArray );
+
+ plugin->BindableDestinationsL( cmArray );
+
+ settings->SetDestinationArrayToUseL( cmArray );
+
+ TCmSettingSelection selection;
+
+ // Get the underlying CM
+ selection.iId = iCmPluginBaseEng.GetIntAttributeL( ECmNextLayerIapId );
+
+ if ( selection.iId )
+ {
+ selection.iResult = EConnectionMethod;
+ }
+ // The underlying CM is a destination
+ else
+ {
+ selection.iResult = EDestination;
+ selection.iId = iCmPluginBaseEng.GetIntAttributeL( ECmNextLayerSNAPId );
+ }
+
+ TBearerFilterArray aFilterArray;
+ if ( settings->RunApplicationSettingsL( selection,
+ EShowDestinations |
+ EShowConnectionMethods ,
+ aFilterArray ) )
+ {
+ switch ( selection.iResult )
+ {
+ case EDestination:
+ {
+ iCmPluginBaseEng.SetIntAttributeL( ECmNextLayerSNAPId, selection.iId );
+ break;
+ }
+ case EConnectionMethod:
+ {
+
+ iCmPluginBaseEng.SetIntAttributeL( ECmNextLayerIapId, selection.iId );
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ }
+ }
+ UpdateListBoxContentL();
+
+ // update the title pane with the new name
+ HBufC* newCmName = iCmPluginBaseEng.GetStringAttributeL( ECmName );
+ CleanupStack::PushL( newCmName );
+ iTitlePane->SetTextL( *newCmName );
+ CleanupStack::PopAndDestroy( newCmName );
+
+ retVal = ETrue;
+ }
+ CleanupStack::PopAndDestroy( &cmArray );
+ CleanupStack::PopAndDestroy( settings );
+ return retVal;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::ProcessCommandL
+// --------------------------------------------------------------------------
+//
+void CmPluginVpnSettingsDlg::ProcessCommandL( TInt aCommandId )
+ {
+ if ( MenuShowing() )
+ {
+ HideMenu();
+ }
+
+ switch ( aCommandId )
+ {
+ case EAknSoftkeyOk:
+ case EPluginBaseCmdChange:
+ {
+ ShowPopupSettingPageL(
+ iSettingIndex->At( iListbox->CurrentItemIndex() ),
+ aCommandId );
+ break;
+ }
+ case EVpnIapId:
+ case ECmNextLayerIapId:
+ case ECmProxyServerName:
+ case ECmProxyPortNumber:
+ {
+ TInt attrib = iSettingIndex->At( iListbox->CurrentItemIndex() );
+ ShowPopupSettingPageL( attrib, aCommandId );
+ break;
+ }
+ case EVpnServicePolicyName:
+ {
+ CmPluginVpnPolicySelectionDlg* dlg =
+ CmPluginVpnPolicySelectionDlg::NewL( iCmPluginBaseEng );
+ CleanupStack::PushL( dlg );
+ if ( dlg->ShowPolicySelectionDlgL() )
+ {
+ // update the setting
+ UpdateListBoxContentL();
+ }
+ // we might need to update even if not accepted
+
+ CleanupStack::PopAndDestroy();
+ break;
+ }
+ default:
+ {
+ CmPluginBaseSettingsDlg::ProcessCommandL( aCommandId );
+ break;
+ }
+ }
+ }
+
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::CompulsoryFilledL
+// --------------------------------------------------------------------------
+//
+TBool CmPluginVpnSettingsDlg::CompulsoryFilledL()
+ {
+ LOGGER_ENTERFN( "CmPluginVpnSettingsDlg::CompulsoryFilledL" );
+
+ TBool retval = ETrue;
+ // compulsory settings are ECmName, EVpnIapId, EVpnServicePolicy
+
+ // check name first
+ HBufC* name = iCmPluginBaseEng.GetStringAttributeL( ECmName );
+ if ( ( name->Compare( KNullDesC() ) ) == 0 )
+ {
+ retval = EFalse;
+ }
+ delete name;
+
+ // check VPN IAP ID
+ TUint32 iapid = iCmPluginBaseEng.GetIntAttributeL( EVpnIapId );
+ if ( !iapid )
+ {
+ TUint32 nextiapid = iCmPluginBaseEng.GetIntAttributeL( ECmNextLayerIapId );
+ TUint32 snapid = iCmPluginBaseEng.GetIntAttributeL( ECmNextLayerSNAPId );
+ if ( !(nextiapid ^ snapid) )
+ {
+ retval = EFalse;
+ }
+ }
+
+ // check policy
+ HBufC* polId = iCmPluginBaseEng.GetStringAttributeL( EVpnServicePolicy );
+ if ( ( polId->Compare( KNullDesC() ) ) == 0 )
+ {
+ retval = EFalse;
+ }
+ delete polId;
+
+ // check policy name
+ HBufC* polname = iCmPluginBaseEng.GetStringAttributeL( EVpnServicePolicyName );
+ if ( ( polname->Compare( KNullDesC() ) ) == 0 )
+ {
+ retval = EFalse;
+ }
+ delete polname;
+
+ return retval;
+ }
+
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::OkToExitL
+// Good to know : EAknSoftkeyCancel is never called, because
+// EEikDialogFlagNotifyEsc flag is not set in the resource.
+// --------------------------------------------------------------------------
+//
+TBool CmPluginVpnSettingsDlg::OkToExitL( TInt aButtonId )
+ {
+ // Translate the button presses into commands for the appui & current
+ // view to handle
+ TBool retval( EFalse );
+
+ switch ( aButtonId )
+ {
+ case EAknSoftkeyBack:
+ {
+ if ( CompulsoryFilledL() )
+ {
+ if( iIsPossibleToSaveSetting && iHasSettingChanged )
+ {
+ iCmPluginBaseEng.UpdateL();
+ iHasSettingChanged = EFalse;
+ }
+ retval = ETrue;
+
+ iCmPluginBaseEng.CmMgr().WatcherUnRegister();
+ }
+ else
+ {
+ // If there are compulsory fields empty, a confirmation query
+ // Incomplete VPN access point details. Exit without saving?
+ // §qtn.vpn.quest.vpn.iap.incomplete.delete§ is displayed.
+ // show note that compulsory settings are not filled
+ TInt res = TCmCommonUi::ShowConfirmationQueryL(
+ R_QTN_VPN_QUEST_VPN_IAP_INCOMPLETE_DELETE );
+ if ( res )
+ { // quit without save
+ retval = ETrue;
+ TUint32 id = iCmPluginBaseEng.GetIntAttributeL( ECmId );
+ iCmPluginBaseEng.RestoreAttributeL( ECmName );
+ iCmPluginBaseEng.RestoreAttributeL( EVpnServicePolicyName );
+ // EVpnServicePolicy has been restored when EVpnServicePolicyName
+ // is restored.
+ //iCmPluginBaseEng.RestoreAttributeL( EVpnServicePolicy );
+ iCmPluginBaseEng.RestoreAttributeL( EVpnIapId );
+ iCmPluginBaseEng.RestoreAttributeL( ECmNextLayerIapId );
+ iCmPluginBaseEng.RestoreAttributeL( ECmNextLayerSNAPId );
+ iCmPluginBaseEng.RestoreAttributeL( ECmProxyServerName );
+ iCmPluginBaseEng.RestoreAttributeL( ECmProxyPortNumber );
+
+ iCmPluginBaseEng.CmMgr().WatcherUnRegister();
+ }
+ else
+ { // do not save, reconfigure
+ retval = EFalse;
+ }
+ }
+ break;
+ }
+ default:
+ {
+ if( aButtonId == EPluginBaseCmdExit )
+ {
+ iCmPluginBaseEng.CmMgr().WatcherUnRegister();
+ }
+
+ retval = CmPluginBaseSettingsDlg::OkToExitL( aButtonId );
+ break;
+ }
+ }
+
+ return retval;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::GetHelpContext
+// --------------------------------------------------------------------------
+//
+
+void CmPluginVpnSettingsDlg::GetHelpContext( TCoeHelpContext& aContext ) const
+ {
+ LOGGER_ENTERFN( "CmPluginVpnSettingsDlg::GetHelpContext" );
+ aContext.iMajor = KHelpUidPlugin;
+ aContext.iContext = KSET_HLP_VPN_AP_SETTINGS_VIEW;
+ }
+
+// --------------------------------------------------------------------------
+// CmPluginVpnSettingsDlg::CommsDatChangesL
+// --------------------------------------------------------------------------
+//
+void CmPluginVpnSettingsDlg::CommsDatChangesL()
+ {
+ CCmManagerImpl& cmMgr = iCmPluginBaseEng.CmMgr();
+ CCmDestinationImpl* parentDest = iCmPluginBaseEng.ParentDestination();
+
+ if ( parentDest )
+ {
+ if( !cmMgr.DestinationStillExistedL( parentDest ) )
+ {
+ cmMgr.WatcherUnRegister();
+ // If parent destination diappears with some reason
+ // then the view must exit back to main view for it
+ // may be danger if going back to parent view
+ iExitReason = KDialogUserExit;
+ TryExitL( iExitReason );
+
+ cmMgr.RemoveDestFromPool( parentDest );
+ delete parentDest;
+ return;
+ }
+
+ if( !cmMgr.IsIapStillInDestL( parentDest, iCmPluginBaseEng ) )
+ {
+ cmMgr.WatcherUnRegister();
+ // In this case, the view can go back to the parent view
+ TryExitL( iExitReason );
+
+ cmMgr.RemoveDestFromPool( parentDest );
+ delete parentDest;
+ return;
+ }
+
+ // We may have to go back to parent view even though this Iap is still in CommsDat
+ // for cmMgr ( = iCmPluginBaseEng.CmMgr() ) can not be accessed any more
+ // after this call when some Iap is deleted.
+ cmMgr.WatcherUnRegister();
+ TryExitL( iExitReason );
+
+ cmMgr.RemoveDestFromPool( parentDest );
+ delete parentDest;
+ }
+ else
+ {
+ if( !cmMgr.IapStillExistedL( iCmPluginBaseEng ) )
+ {
+ cmMgr.WatcherUnRegister();
+ // In this case, the dialog can go back to the parent view
+ TryExitL( iExitReason );
+ return;
+ }
+
+ // We may have to go back to parent view even though this Iap is still in CommsDat
+ // for cmMgr ( = iCmPluginBaseEng.CmMgr() ) can not be accessed any more
+ // after this call when some Iap is deleted.
+ cmMgr.WatcherUnRegister();
+ TryExitL( iExitReason );
+ }
+ }