vpnengine/dmadipsecvpn/src/dmadstorevpnapcmm.cpp
changeset 0 33413c0669b9
--- /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 <cmpluginvpndef.h>
+#include <cmdestinationext.h>
+
+#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<TVpnApCommsId>& aIdArray)
+    {
+    TRACE("CVpnAp::ListVpnApsL");
+            
+    aIdArray.Reset();            
+            
+    //First collect all VPN connection methods from destinations
+    RArray<TUint32> 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<TUint32> 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;
+    }