diff -r 000000000000 -r 72b543305e3a email/imum/Utils/Src/ComDbUtl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Utils/Src/ComDbUtl.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,539 @@ +/* +* 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: + * Class implementation file + * +*/ + + +// INCLUDE FILES +#include "ComDbUtl.h" +#include "EmailFeatureUtils.h" +#include "IMSSettingsDialog.h" +#include "ImumUtilsLogging.h" +#include "ImumPanic.h" + +#include // CDesCArrayFlat +#include // StringLoader +#include // KImapDefaultFetchSizeBytes +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::CMsvCommDbUtilities() +// ---------------------------------------------------------------------------- +// +CMsvCommDbUtilities::CMsvCommDbUtilities() + { + IMUM_CONTEXT( CMsvCommDbUtilities::CMsvCommDbUtilities, 0, KLogUi ); + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::NewLC() +// ---------------------------------------------------------------------------- +// +CMsvCommDbUtilities* CMsvCommDbUtilities::NewLC() + { + IMUM_STATIC_CONTEXT( CMsvCommDbUtilities::NewL, 0, utils, KLogUi ); + + CMsvCommDbUtilities* self = new ( ELeave ) CMsvCommDbUtilities; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::NewL() +// ---------------------------------------------------------------------------- +// +CMsvCommDbUtilities* CMsvCommDbUtilities::NewL() + { + IMUM_STATIC_CONTEXT( CMsvCommDbUtilities::NewL, 0, utils, KLogUi ); + + CMsvCommDbUtilities* self = NewLC(); + CleanupStack::Pop(); // self + return self; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::~CMsvCommDbUtilities() +// ---------------------------------------------------------------------------- +// +CMsvCommDbUtilities::~CMsvCommDbUtilities() + { + IMUM_CONTEXT( CMsvCommDbUtilities::~CMsvCommDbUtilities, 0, KLogUi ); + delete iFlags; + iFilters.Close(); + iIapList.Close(); + iCmManager.Close(); + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::ConstructL() +// ---------------------------------------------------------------------------- +// +void CMsvCommDbUtilities::ConstructL() + { + IMUM_CONTEXT( CMsvCommDbUtilities::ConstructL, 0, KLogUi ); + + iInitialized = EFalse; + iFlags = MsvEmailMtmUiFeatureUtils::EmailFeaturesL( ETrue, ETrue ); + iFeatureAllowVPN = MsvEmailMtmUiFeatureUtils::LocalFeatureL( + KCRUidMuiuVariation, KMuiuEmailConfigFlags, + KEmailFeatureIdEmailVPNAllowed ); + + // Fill IAP Filter array + iFilters.Append( KUidPacketDataBearerType ); + iFilters.Append( KUidLanBearerType ); + if ( iFlags->GF( EMailFeatureCsd ) ) + { + iFilters.Append( KUidCSDBearerType ); + iFilters.Append( KUidHSCSDBearerType ); + } + if ( iFlags->GF( EMailFeatureProtocolWlan ) ) + { + iFilters.Append( KUidWlanBearerType ); + } + if( iFeatureAllowVPN ) + { + iFilters.Append( KPluginVPNBearerTypeUid ); + } + + iCmManager.OpenL(); + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::IsApBearerCircuitSwitchedL() +// ---------------------------------------------------------------------------- +// +TBool CMsvCommDbUtilities::IsApBearerCircuitSwitchedL( TUint32 aApId ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::IsApBearerCircuitSwitchedL, 0, KLogUi ); + + TBool retVal = EFalse; + + // Get the connection method that's used, leaves if no + // connection methods found + RCmConnectionMethod connectionMethod = iCmManager.ConnectionMethodL( aApId ); + CleanupClosePushL( connectionMethod ); + + // Check for CSD type + TInt bearerType = connectionMethod.GetIntAttributeL( CMManager::ECmBearerType ); + if( bearerType == KCommDbBearerCSD ) + { + retVal = ETrue; + } + // Check for VPN access point's home IAP + else if( bearerType == KPluginVPNBearerTypeUid ) + { + TInt homeIAP = connectionMethod.GetIntAttributeL( CMManager::EVpnIapId ); + + RCmConnectionMethod vpnMethod = iCmManager.ConnectionMethodL( homeIAP ); + CleanupClosePushL( vpnMethod ); + TInt vpnBearerType = vpnMethod.GetIntAttributeL( CMManager::ECmBearerType ); + + // Is the home AP a CSD access point? + if( vpnBearerType == KCommDbBearerCSD ) + { + retVal = ETrue; + } + CleanupStack::PopAndDestroy(); // vpnMethod + } + + CleanupStack::PopAndDestroy(); // connectionMethod + return retVal; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::FillCustomIapArrayL() +// ---------------------------------------------------------------------------- +// +void CMsvCommDbUtilities::FillCustomIapArrayL( CDesCArrayFlat& aFillArray ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::FillCustomIapArrayL, 0, KLogUi ); + + // Set filters and get the accesspoint list + InitializeSelectionL(); + + // Create the current iap list + const TInt count = iIapList.Count(); + + // Make sure there are items in the array + if ( count ) + { + // Add all iap items to main array + for ( TInt item = 0; item < count; item++ ) + { + RCmConnectionMethod cm = iCmManager.ConnectionMethodL( iIapList[item] ); + CleanupClosePushL( cm ); + + HBufC* apname = cm.GetStringAttributeL(CMManager::ECmName); + CleanupStack::PushL(apname); + // Insert to array and delete old item + aFillArray.AppendL( apname->Des() ); + CleanupStack::PopAndDestroy(2); // CSI: 47 # cm, apname + } + } + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::InitializeSelectionL() +// ---------------------------------------------------------------------------- +// +void CMsvCommDbUtilities::InitializeSelectionL() + { + IMUM_CONTEXT( CMsvCommDbUtilities::InitializeSelectionL, 0, KLogUi ); + + if(!iInitialized) + { + TBool wlanSupported = EFalse; + if ( iFlags->GF( EMailFeatureProtocolWlan ) ) + { + wlanSupported = ETrue; + } + + //fill the array of connection method id's + iCmManager.ConnectionMethodL( iIapList, ETrue, EFalse, wlanSupported ); + + TInt methodCount = iIapList.Count(); + TInt bearerCount = iFilters.Count(); + + // Make sure there are items in the array + if ( methodCount ) + { + for ( TInt methodItem = 0; methodItem < methodCount; methodItem++ ) + { + RCmConnectionMethod cm = + iCmManager.ConnectionMethodL( iIapList[methodItem] ); + CleanupClosePushL( cm ); + TUint methodBearer = cm.GetIntAttributeL( CMManager::ECmBearerType ); + CleanupStack::PopAndDestroy(1); //cm + + TBool found(EFalse); + for ( TInt bearerItem = 0; bearerItem < bearerCount; bearerItem++ ) + { + TUint bearerUid = iFilters[bearerItem]; + if( bearerUid == methodBearer ) + { + found = ETrue; + } + } + if(!found) + { + iIapList.Remove(methodItem); + methodCount--; + } + } + } + iInitialized = ETrue; + } + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::StaticIAPCount() +// ---------------------------------------------------------------------------- +// +TInt CMsvCommDbUtilities::StaticIAPCount() + { + IMUM_CONTEXT( CMsvCommDbUtilities::StaticIAPCount, 0, KLogUi ); + IMUM_IN(); + + TInt staticCount = 1; // this is for default connection + + if ( iFlags->GF( EMailFeatureProtocolWlan ) ) + { + // Add one for WLAN Access Point + staticCount++; + } + + IMUM_OUT(); + return staticCount; + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::InitItemAccessPointL() +// ---------------------------------------------------------------------------- +// +void CMsvCommDbUtilities::InitItemAccessPointL( + CIMSSettingsAccessPointItem& aIapItem, + const TBool aIsWizard ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::InitItemAccessPointL, 0, KLogUi ); + + // Initialize to first access point if called from wizard + if( aIsWizard ) + { + aIapItem.iIap.iResult = CMManager::EDefaultConnection; + aIapItem.iIap.iId = 0; + aIapItem.iIapRadioButton = 0; + } + else + { + if( aIapItem.iIap.iId == 0 ) + { + aIapItem.iIap.iResult = CMManager::EDefaultConnection; + aIapItem.iIapRadioButton = 0; + } + else + { + aIapItem.iIap.iResult = CMManager::EConnectionMethod; + aIapItem.iIapRadioButton = GetIapIndexL( aIapItem.iIap.iId ); + } + } + + aIapItem.iIsWizard = aIsWizard; + + // Trap the leave but ignore the error, as the result is only seen in UI + TRAP_IGNORE( SettingsItemIapStringL( aIapItem ) ); + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::GetWizardRadioButton() +// ---------------------------------------------------------------------------- +// +TInt CMsvCommDbUtilities::GetWizardRadioButton( + CIMSSettingsAccessPointItem& aIapItem ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::GetWizardRadioButton, 0, KLogUi ); + + return aIapItem.iIapRadioButton; + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::GetIapIndexL() +// ---------------------------------------------------------------------------- +// +TInt CMsvCommDbUtilities::GetIapIndexL( const TUint32 aId ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::GetIapIndexL, 0, KLogUi ); + IMUM_IN(); + + for ( TInt index = 0; index< iIapList.Count(); index++ ) + { + TUint32 iapId( 0 ); + RCmConnectionMethod cm = iCmManager.ConnectionMethodL( iIapList[index] ); + CleanupClosePushL( cm ); + iapId = cm.GetIntAttributeL( CMManager::ECmId ); + CleanupStack::PopAndDestroy(1); // cm + if( iapId == aId ) + { + IMUM_OUT(); + return index; + } + } + + IMUM_OUT(); + // Default to 0 so the radio button points to the default connection + return 0; + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::SettingsItemIapStringL() +// ---------------------------------------------------------------------------- +// +const TDesC* CMsvCommDbUtilities::SettingsItemIapStringL( + CIMSSettingsAccessPointItem& aIapItem ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::SettingsItemIapStringL, 0, KLogUi ); + + // If the static access point is set, the name of the accesspoint can + // be fetched from the list. + if ( aIapItem.iIap.iResult != CMManager::EDefaultConnection ) + { + RCmConnectionMethod cm; + cm = iCmManager.ConnectionMethodL( aIapItem.iIap.iId ); + CleanupClosePushL( cm ); + HBufC* bearerName = cm.GetStringAttributeL(CMManager::ECmName); + CleanupStack::PushL( bearerName ); + aIapItem.iItemSettingText->Copy( bearerName->Des() ); + CleanupStack::PopAndDestroy( 2, &cm ); // CSI: 47 # cm, bearername + } + else + { + TInt resourceId = 0; + resourceId = R_NETW_CONSET_OPTIONS_DEFAULT_CONNECTION; + ItemLoadBufferForItemL( aIapItem, resourceId ); + } + + return aIapItem.iItemSettingText; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::ItemLoadBufferForItemL() +// ---------------------------------------------------------------------------- +// +void CMsvCommDbUtilities::ItemLoadBufferForItemL( + CIMSSettingsAccessPointItem& aIapItem, + const TInt aResource ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::ItemLoadBufferForItemL, 0, KLogUi ); + + // Load the string from the resource and store it into the setting item + HBufC* text = StringLoader::LoadL( aResource ); + CleanupStack::PushL( text ); + + aIapItem.iItemSettingText->Copy( + text->Left( KMuiuDynMaxSettingsLongTextLength ) ); + + CleanupStack::PopAndDestroy( text ); + text = NULL; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::LaunchIapPageL() +// ---------------------------------------------------------------------------- +// +TInt CMsvCommDbUtilities::LaunchIapPageL( CIMSSettingsAccessPointItem& aIapItem ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::LaunchIapPageL, 0, KLogUi ); + + // This function handles the launching of the IAP setting page. + // using the Connection Method Manager + TInt result = KErrNotFound; + + // Show the access point list using Connection Method Manager + CCmApplicationSettingsUi* settingsUi = CCmApplicationSettingsUi::NewLC(); + TUint apFilter = CMManager::EShowDefaultConnection | + CMManager::EShowConnectionMethods; + result = settingsUi->RunApplicationSettingsL( aIapItem.iIap, + apFilter, + iFilters ); + CleanupStack::PopAndDestroy( settingsUi ); + + // Return the quit method + return result ? KErrNone : KErrCancel; + } + + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::IsWlanAccessPointL() +// ---------------------------------------------------------------------------- +// +TBool CMsvCommDbUtilities::IsWlanAccessPointL( TUint32 aIap ) const + { + IMUM_CONTEXT( CMsvCommDbUtilities::IsWlanAccessPointL, 0, KLogUi ); + + TBool isWlan = EFalse; + + // First check if the AP is of wlan type + TUint bearerType = BearerTypeL( aIap ); + if( bearerType == KUidWlanBearerType ) + { + isWlan = ETrue; + } + // Then make sure VPN doesn't have wlan IAP as home IAP + else if( bearerType == KPluginVPNBearerTypeUid ) + { + RCmConnectionMethod vpnCM = iCmManager.ConnectionMethodL( aIap ); + CleanupClosePushL( vpnCM ); + TInt homeIAP = vpnCM.GetIntAttributeL( CMManager::EVpnIapId ); + CleanupStack::PopAndDestroy(); // vpnCM + + isWlan = ( BearerTypeL( homeIAP ) == KUidWlanBearerType ); + } + + return isWlan; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::DetermineImap4BufferSize() +// ---------------------------------------------------------------------------- +// +TInt CMsvCommDbUtilities::DetermineImap4BufferSize( + const TUint32 aIap, + const CImumMboxDefaultData& aDefaultData ) const + { + IMUM_CONTEXT( CMsvCommDbUtilities::DetermineImap4BufferSize, 0, KLogUi ); + + // If the following leaves, it really, really doesn't matter + TBool isWlan = EFalse; + TRAP_IGNORE( isWlan = IsWlanAccessPointL( aIap ) ); + + TInt key = isWlan ? + TImumInSettings:: EKeyDownloadBufferWlan: + TImumInSettings:: EKeyDownloadBufferGprs; + + TInt value = 0; + aDefaultData.GetAttr( key, value ); + return value; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::BearerTypeL() +// ---------------------------------------------------------------------------- +// +TUint32 CMsvCommDbUtilities::BearerTypeL( TUint32 aUid ) const + { + IMUM_CONTEXT( CMsvCommDbUtilities::BearerTypeL, 0, KLogUi ); + IMUM_IN(); + + RCmConnectionMethod cm; + cm = iCmManager.ConnectionMethodL( aUid ); + CleanupClosePushL( cm ); + TInt retVal = cm.GetIntAttributeL(CMManager::ECmBearerType); + CleanupStack::PopAndDestroy(1); //cm + + IMUM_OUT(); + return retVal; + } + +// ---------------------------------------------------------------------------- +// CMsvCommDbUtilities::GetIapIdL() +// ---------------------------------------------------------------------------- +// +TInt CMsvCommDbUtilities::GetIapIdL( const TInt32 aSelectionIndex ) + { + IMUM_CONTEXT( CMsvCommDbUtilities::GetIapIdL, 0, KLogUi ); + IMUM_IN(); + + // The radiobutton id can't go over the count of access point list + __ASSERT_ALWAYS( aSelectionIndex <= iIapList.Count(), + User::Panic( KImumCommsDbUtilPanic, + EPanicIAPsDoNotMatch ) ); + + TUint32 iapId( 0 ); + RCmConnectionMethod cm = iCmManager.ConnectionMethodL( + iIapList[ aSelectionIndex - 1 ] ); + CleanupClosePushL( cm ); + iapId = cm.GetIntAttributeL( CMManager::ECmId ); + CleanupStack::PopAndDestroy(); // cm + IMUM_OUT(); + return iapId; + + } + + +// End of File