diff -r 000000000000 -r 33413c0669b9 vpnengine/dmadipsecvpn/src/dmadstorevpnapcmm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/dmadipsecvpn/src/dmadstorevpnapcmm.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,295 @@ +/* +* Copyright (c) 2008 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: VPN access point manipulation. +* +*/ + + + +#include +#include + +#include "dmadstorevpnap.h" +#include "vpnlogger.h" + +using namespace CMManager; +// ======== LOCAL FUNCTIONS ======== + +CVpnAp* CVpnAp::NewL(void) + { + TRACE("CVpnAp::NewL"); + CVpnAp* self = new (ELeave) CVpnAp; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + + +CVpnAp::CVpnAp() + { + TRACE("CVpnAp::CVpnAp"); + } + + +void CVpnAp::ConstructL() + { + TRACE("CVpnAp::ConstructL"); + + iCmManagerExt.OpenL(); + } + + +CVpnAp::~CVpnAp() + { + TRACE("CVpnAp::~CVpnAp"); + + iCmManagerExt.Close(); + } + + +TBool CVpnAp::FindVpnApL(TVpnApCommsId aId) + { + TRACE("CVpnAp::FindVpnApL"); + + TBool connectionFound = EFalse; + + RCmConnectionMethodExt vpnConnectionMethod; + TRAPD(err, vpnConnectionMethod = iCmManagerExt.ConnectionMethodL( aId )); + CleanupClosePushL(vpnConnectionMethod); + + switch(err) + { + case KErrNone: + if ( IsVpnConnectionMethodL(vpnConnectionMethod) ) + { + connectionFound = ETrue; + } + break; + case KErrNotFound: + //do nothing + break; + default: + User::Leave(err); + break; + } + + CleanupStack::PopAndDestroy(); //vpnConnectionMethod + return connectionFound; + } + + +void CVpnAp::DeleteVpnApL(TVpnApCommsId aId) + { + TRACE("CVpnAp::DeleteVpnApL"); + + RCmConnectionMethodExt vpnConnectionMethod = iCmManagerExt.ConnectionMethodL( aId ); + CleanupClosePushL(vpnConnectionMethod); + + //Check that the type of the connection is correct. + if ( !IsVpnConnectionMethodL(vpnConnectionMethod) ) + { + User::Leave(KErrNotFound); + } + + if ( !vpnConnectionMethod.DeleteL() ) + { + User::Leave(KErrGeneral); + } + + CleanupStack::PopAndDestroy(); //vpnConnectionMethod + } + + +void CVpnAp::ListVpnApsL(RArray& aIdArray) + { + TRACE("CVpnAp::ListVpnApsL"); + + aIdArray.Reset(); + + //First collect all VPN connection methods from destinations + RArray destinationArray; + iCmManagerExt.AllDestinationsL( destinationArray ); + CleanupClosePushL(destinationArray); + + for (TInt i = 0; i < destinationArray.Count(); ++i) + { + RCmDestinationExt destination = iCmManagerExt.DestinationL( destinationArray[i] ); + CleanupClosePushL(destination); + + TInt connectionMethodCount = destination.ConnectionMethodCount(); + for (TInt j = 0; j < connectionMethodCount; ++j) + { + RCmConnectionMethodExt connectionMethod = destination.ConnectionMethodL( j ); + CleanupClosePushL(connectionMethod); + if ( IsVpnConnectionMethodL(connectionMethod) ) + { + TUint32 apId = connectionMethod.GetIntAttributeL( ECmId ); + User::LeaveIfError(aIdArray.Append(apId)); + } + CleanupStack::PopAndDestroy(); //connectionMethod + } + + CleanupStack::PopAndDestroy(); //destination + } + CleanupStack::PopAndDestroy(); //destinationArray + + //Second collect VPN connection methods, which are not inside a destination. + RArray connectionMethodArray; + iCmManagerExt.ConnectionMethodL( connectionMethodArray ); + CleanupClosePushL(connectionMethodArray); + + for ( TInt i = 0; i < connectionMethodArray.Count(); ++i) + { + RCmConnectionMethodExt connectionMethod = + iCmManagerExt.ConnectionMethodL( connectionMethodArray[i] ); + CleanupClosePushL(connectionMethod); + if ( IsVpnConnectionMethodL(connectionMethod) ) + { + User::LeaveIfError(aIdArray.Append(connectionMethodArray[i])); + } + CleanupStack::PopAndDestroy(); //connectionMethod + } + CleanupStack::PopAndDestroy(); //connectionMethodArray + } + + +void CVpnAp::GetVpnApL(TVpnApCommsId aId, TVpnApParms& aVpnApParms) + { + TRACE("CVpnAp::GetVpnApL"); + + RCmConnectionMethodExt vpnConnectionMethod = iCmManagerExt.ConnectionMethodL( aId ); + CleanupClosePushL(vpnConnectionMethod); + + //Check that the type of the connection is correct. + if ( !IsVpnConnectionMethodL(vpnConnectionMethod) ) + { + User::Leave(KErrNotFound); + } + + HBufC* string = vpnConnectionMethod.GetStringAttributeL( ECmName ); + aVpnApParms.iName = *string; + delete string; + string = NULL; + + string = vpnConnectionMethod.GetStringAttributeL( EVpnServicePolicy ); + aVpnApParms.iPolicyId = *string; + delete string; + string = NULL; + + // real IAP or SNAP. ECmNextLayerIapId == EVpnIapId + TUint32 realConn = vpnConnectionMethod.GetIntAttributeL(EVpnIapId); + if (realConn != 0) + { + DEBUG_LOG1(_L("Real connection is IAP %d"), realConn); + aVpnApParms.iRealConnRefType = TVpnApParms::EIapRealConnRef; + aVpnApParms.iRealConnRef = realConn; + } + else + { + realConn = vpnConnectionMethod.GetIntAttributeL(ECmNextLayerSNAPId); + DEBUG_LOG1(_L("Real connection is snap %d"), realConn); + aVpnApParms.iRealConnRefType = TVpnApParms::ESnapRealConnRef; + aVpnApParms.iRealConnRef = realConn; + } + + CleanupStack::PopAndDestroy(); //vpnConnectionMethod + } + + +TVpnApCommsId CVpnAp::AddVpnApL(const TVpnApParms& aVpnApParms) + { + TRACE("CVpnAp::AddVpnApL"); + + RCmConnectionMethodExt vpnConnectionMethod = + iCmManagerExt.CreateConnectionMethodL( KPluginVPNBearerTypeUid ); + + CleanupClosePushL( vpnConnectionMethod ); + + UpdateVpnApL(vpnConnectionMethod, aVpnApParms); + + // save changes + vpnConnectionMethod.UpdateL(); + + TUint32 apId = vpnConnectionMethod.GetIntAttributeL( ECmId ); + + CleanupStack::PopAndDestroy(); // vpnConnectionMethod + + return apId; + } + + +void CVpnAp::UpdateVpnApL(TVpnApCommsId aId, const TVpnApParms& aVpnApParms) + { + TRACE("CVpnAp::UpdateVpnApL"); + + RCmConnectionMethodExt vpnConnectionMethod = iCmManagerExt.ConnectionMethodL( aId ); + CleanupClosePushL(vpnConnectionMethod); + + //Check that the type of the connection is correct. + if ( !IsVpnConnectionMethodL(vpnConnectionMethod) ) + { + User::Leave(KErrNotFound); + } + + UpdateVpnApL(vpnConnectionMethod, aVpnApParms); + vpnConnectionMethod.UpdateL(); + CleanupStack::PopAndDestroy(); //vpnConnectionMethod + } + + +void CVpnAp::UpdateVpnApL(RCmConnectionMethodExt& aConnectionMethod, + const TVpnApParms& aVpnApParms) + { + + TRACE("CVpnAp::UpdateVpnApL"); + + __ASSERT_DEBUG( aConnectionMethod.GetBoolAttributeL(ECmVirtual), User::Invariant() ); + + aConnectionMethod.SetIntAttributeL( ECmNamingMethod, ENamingNothing ); + aConnectionMethod.SetStringAttributeL( ECmName, aVpnApParms.iName ); + aConnectionMethod.SetStringAttributeL( EVpnServicePolicy, aVpnApParms.iPolicyId ); + + switch(aVpnApParms.iRealConnRefType) + { + case TVpnApParms::EIapRealConnRef: + aConnectionMethod.SetIntAttributeL( EVpnIapId, aVpnApParms.iRealConnRef ); + DEBUG_LOG1(_L("VPN iap uses real iap %d"), aVpnApParms.iRealConnRef); + DEBUG_LOG1(_L("ECmNextLayerSNAPId is %d"), aConnectionMethod.GetIntAttributeL(ECmNextLayerSNAPId)); + break; + case TVpnApParms::ESnapRealConnRef: + aConnectionMethod.SetIntAttributeL( ECmNextLayerSNAPId, aVpnApParms.iRealConnRef ); + DEBUG_LOG1(_L("VPN iap uses real SNAP %d"), aVpnApParms.iRealConnRef); + DEBUG_LOG1(_L("EVpnIapId is %d"), aConnectionMethod.GetIntAttributeL(EVpnIapId)); + break; + default: + User::Invariant(); + break; + } + } + + +TBool CVpnAp::IsVpnConnectionMethodL(RCmConnectionMethodExt& aConnectionMethod) const + { + TBool isVPNConnectionMethod = EFalse; + + if ( aConnectionMethod.GetBoolAttributeL(ECmVirtual) && + aConnectionMethod.GetIntAttributeL( ECmBearerType ) == KPluginVPNBearerTypeUid) + { + isVPNConnectionMethod = ETrue; + } + + return isVPNConnectionMethod; + }