vpnui/vpnmanagementui/src/vpnmanagementuiserversettingscontainer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:21 +0100
branchRCL_3
changeset 41 e06095241a65
child 49 5960d2d03390
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2003-2009 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: The container is responsible of showing policy server details. 
*
*/

// INCLUDE FILES
#include <akntextsettingpage.h>
#include <aknnotewrappers.h>
#include <cmmanagerext.h>
#include <cmsettingsui.h>
#include <cmapplicationsettingsui.h>
#include <cmdestinationext.h>
#include <cmpluginvpndef.h>
#include <commdb.h>
#include <e32def.h>

#include <vpnmanagementuirsc.rsg>
#include "vpnuiloader.h"
#include "vpnmanagementuiserversettingscontainer.h"
#include "vpnmanagementuidefs.h"
#include "serversettingconnectionsettingitem.h"
#include "vpnmanagementui.hrh"
#include "log_vpnmanagementui.h"


#ifdef __SERIES60_HELP
#include <csxhelp/vpn.hlp.hrh> // for help context of VPN Management UI
#endif //__SERIES60_HELP

using namespace CMManager;

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

CServerSettingsContainer* CServerSettingsContainer::NewL(
    CVpnUiLoader& aLoader, TInt aServerIndex )
    {
    CServerSettingsContainer* self = new(ELeave) CServerSettingsContainer(
        aLoader, aServerIndex );
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);    
    return self;
    }

// ---------------------------------------------------------
// CServerSettingsContainer::CServerSettingsContainer()
// ---------------------------------------------------------
//
CServerSettingsContainer::CServerSettingsContainer(
    CVpnUiLoader& aLoader, TInt aServerIndex )
    :iLoader(aLoader), iServerIndex(aServerIndex)
    {
    ASSERT(aServerIndex >= KErrNotFound);
	}

// ---------------------------------------------------------
// CServerSettingsContainer::~CServerSettingsContainer()
// Destructor
// ---------------------------------------------------------
//
CServerSettingsContainer::~CServerSettingsContainer()
    {
    }


// ---------------------------------------------------------------------------
// CreateSettingItemL
// ---------------------------------------------------------------------------
//
CAknSettingItem* CServerSettingsContainer::CreateSettingItemL( 
    TInt aSettingId )
    {
    CAknSettingItem* settingItem(NULL);
    
    switch (aSettingId)
        {
        case EVpnUiSettingServerName:
            settingItem = new (ELeave) CAknTextSettingItem(
                aSettingId, iServerDetails.iServerNameLocal );
            break;
        case EVpnUiSettingServerAddress:
            if (iServerDetails.iServerUrl.Length() > 0)
                {                
                iServerAddressBuffer.Copy(iServerDetails.iServerUrl);
                }
            settingItem = new (ELeave) CAknTextSettingItem(
                aSettingId, iServerAddressBuffer );
            break;
        case EVpnUiSettingIap:              
            if ( iServerDetails.iSelection.iId <1 )
                {
                 RCmManagerExt cmManagerExt;
                 cmManagerExt.OpenL();        
                 CleanupClosePushL( cmManagerExt );     

                 //Makes sure that Internet Destination Exists
                 RArray<TUint32> destinationArray;    
                 cmManagerExt.AllDestinationsL( destinationArray );
                 CleanupClosePushL(destinationArray);    
                            
                 TUint32 internetDestinationId = 0;
                 for (TInt i = 0; i < destinationArray.Count(); ++i)
                     {
                      RCmDestinationExt destination = cmManagerExt.DestinationL( destinationArray[i] );
                      CleanupClosePushL(destination);
                            
                      TUint32 purposeMetaData = destination.MetadataL( ESnapMetadataPurpose );
                      if ( ESnapPurposeInternet ==  purposeMetaData )
                           {
                            internetDestinationId = destinationArray[i];
                            CleanupStack::PopAndDestroy(); //destination
                            break;
                           }                
                      CleanupStack::PopAndDestroy(); //destination
                      }
                              
                iServerDetails.iSelection.iId = internetDestinationId;
                
                iServerDetails.iSelection.iResult=EDestination;
                
                
                settingItem = new (ELeave) CServerSettingConnectionSettingItem(
                        aSettingId, iServerDetails.iSelection);
                CleanupStack::PopAndDestroy(2); //destinationArray,cmManagerExt
                
                }
            else
                settingItem = new (ELeave) CServerSettingConnectionSettingItem(
                        aSettingId, iServerDetails.iSelection);
            break;
        default:
            // Do nothing
            break;
            }
   
    return settingItem;
    }
    
    
// ---------------------------------------------------------------------------
// CServerSettingsContainer::ConstructL()
// ---------------------------------------------------------------------------
//
void CServerSettingsContainer::ConstructL()
    {
	// Server settings view sets iServerIndex to -1 when creating a new 
	// server
	if ( iServerIndex >= 0 )
	    {
	    iLoader.VpnApiWrapperL().GetServerDetailsL( iServerDetails );
	    UpdateTitleL( iServerDetails.iServerNameLocal );    
	    }    
	ConstructFromResourceL(R_VPN_SERVER_SETTING_LIST);	
	CAknSettingItem* item = SettingItemArray()->At(EVpnUiSettingIap); 
	
	using namespace CMManager;
	    
	RCmManagerExt cmManagerExt;
	cmManagerExt.OpenL();        
	CleanupClosePushL( cmManagerExt );     

	//Makes sure that Internet Destination Exists
	RArray<TUint32> destinationArray;    
	cmManagerExt.AllDestinationsL( destinationArray );
	CleanupClosePushL(destinationArray);    
	TBool internetIapExist=EFalse;       
	TUint32 internetDestinationId = 0;
	for (TInt i = 0; i < destinationArray.Count(); ++i)
	        {
	        RCmDestinationExt destination = cmManagerExt.DestinationL( destinationArray[i] );
	        CleanupClosePushL(destination);
	        
	        TUint32 purposeMetaData = destination.MetadataL( ESnapMetadataPurpose );
	        if ( ESnapPurposeInternet ==  purposeMetaData )
	            {
	            internetDestinationId = destinationArray[i];
	            CleanupStack::PopAndDestroy(); //destination
	            internetIapExist=ETrue;
	            break;
	            }                
	        CleanupStack::PopAndDestroy(); //destination
	        }
	
	if ( internetIapExist != EFalse)
	    {
        HBufC* defaultConn = GetDestinationNameL(internetDestinationId);
        CleanupStack::PushL(defaultConn);
        item->SetEmptyItemTextL(*defaultConn);
        item->LoadL();
        item->UpdateListBoxTextL();
        CleanupStack::PopAndDestroy(defaultConn); 
	    }
	
	CleanupStack::PopAndDestroy(); //destinationArray 
	CleanupStack::PopAndDestroy(); //cmManagerExt 
	}
	
	
// ---------------------------------------------------------------------------
// UpdateTitleL
// ---------------------------------------------------------------------------
//
void CServerSettingsContainer::UpdateTitleL( TDes& aText )
    {
    iLoader.ActivateTitleL(KViewTitleParametersView,aText);
    } 


void CServerSettingsContainer::HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
    {
    switch(aEventType)
        {
        case EEventEnterKeyPressed: 
        case EEventItemSingleClicked:
            ChangeSettingValueL();            
            break;
        default:
            CAknSettingItemList::HandleListBoxEventL(aListBox, aEventType);
        }    
    }


// ---------------------------------------------------------------------------
// ChangeSettingValueL
// ---------------------------------------------------------------------------
//
void CServerSettingsContainer::ChangeSettingValueL()
    {
  
    TInt currentItem( ListBox()->CurrentItemIndex() );
           
    switch(currentItem)
        {        
        case EVpnUiSettingServerName:
            {
            EditItemL(EVpnUiSettingServerName, ETrue);   
            SettingItemArray()->At(EVpnUiSettingServerName)->StoreL(); 
            }
            if (iServerDetails.iServerNameLocal.Length() > 0)
            {                
            UpdateTitleL( iServerDetails.iServerNameLocal );
            }
            
            break;            
        case EVpnUiSettingServerAddress:
            {
            EditItemL(EVpnUiSettingServerAddress, ETrue);    
            }
            break;
        case EVpnUiSettingIap:
            {
            EditItemL(EVpnUiSettingIap, ETrue);    
            }
            break;
        default:            
            User::Invariant();
            break;
        }
    }



const TAgileProvisionApiServerSettings& CServerSettingsContainer::ServerDetailsL()
    {
    StoreSettingsL();
    if (iServerAddressBuffer.Length() > 0)
        {
        iServerDetails.iServerUrl.Copy(iServerAddressBuffer);
        }

    //If server name is left empty, but we have an address,
    //set address as a server name.        
    if (iServerDetails.iServerNameLocal.Length() == 0 &&
        iServerDetails.iServerUrl.Length() > 0)
        {         

        //If the address is already in use as server name, generate
        //a new unique name.                
        TUint16 i = 1;
            static const TInt KSuffixLength = 10;
            _LIT(KSuffixFormat, "(%d)");
                        
            TBuf<KSuffixLength> suffix;                            
            suffix.Zero();
            if (i > 1)
                {
                suffix.Format(KSuffixFormat, i);                
                }
            i++;
            
            //First assumes that the address is too long to fit
            TInt numberOfCharactersCopiedFromAddress =
                          iServerDetails.iServerNameLocal.MaxLength() - suffix.Length();         

            //If this is not the case adjust the length                           
            if (numberOfCharactersCopiedFromAddress > iServerDetails.iServerUrl.Length())
                {
                numberOfCharactersCopiedFromAddress = iServerDetails.iServerUrl.Length();
                }
            
            TPtrC8 serverNameAddress = iServerDetails.iServerUrl.Left(numberOfCharactersCopiedFromAddress);
            iServerDetails.iServerNameLocal.Copy(serverNameAddress);             
            iServerDetails.iServerNameLocal.Append(suffix);                                                             
   
        CAknSettingItem* item = SettingItemArray()->At(EVpnUiSettingServerName); 
        
        item->LoadL();
        item->UpdateListBoxTextL();        
        }
    return iServerDetails;
    }


// ---------------------------------------------------------------------------
// GetIapNameL
// ---------------------------------------------------------------------------
//
HBufC* CServerSettingsContainer::GetDestinationNameL( TUint aId )
	{
    RCmManagerExt cmManager;    
	cmManager.OpenLC();
	RCmDestinationExt dest = cmManager.DestinationL( aId );
	CleanupClosePushL( dest );
	HBufC* name = dest.NameLC();   
	CleanupStack::Pop(name);
	CleanupStack::PopAndDestroy( 2 ); // dest, cmManager
	return name;
	}


HBufC* CServerSettingsContainer::GetConnectionMethodNameL( TUint aId )
	{
	RCmManagerExt cmManager;    
	cmManager.OpenLC();
	RCmConnectionMethodExt conn = cmManager.ConnectionMethodL( aId );
	CleanupClosePushL( conn );	
	HBufC* name = conn.GetStringAttributeL( ECmName );
	CleanupStack::PopAndDestroy( 2 ); // conn, cmManager
	return name;
	}


TInt CServerSettingsContainer::ServerIndex() const
    {
    return iServerIndex;
    }


// ---------------------------------------------------------
// CServerSettingsContainer::GetHelpContext
// ---------------------------------------------------------

#ifdef __SERIES60_HELP
void CServerSettingsContainer::GetHelpContext( TCoeHelpContext& aContext ) const
    {
	aContext.iMajor = KUidVpnManagementUi;
    aContext.iContext = KSET_HLP_VPN_POLICY_SERVER_SET;
    }
#endif //__SERIES60_HELP


// End of File