vpnengine/sit/src/vpnconncloser.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/sit/src/vpnconncloser.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,146 @@
+/*
+* 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: Task handler for closing VPN connection.
+*
+*/
+
+
+
+#include "vpnconncloser.h"
+#include "kmdapi.h"
+#include "log.h"
+
+CVpnConnCloser* CVpnConnCloser::NewL(MTaskHandlerManager* aManager,
+                                     const TTaskArrivedEventData& aTaskInfo)
+    {
+    CVpnConnCloser* self = new (ELeave) CVpnConnCloser(aManager, aTaskInfo);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+CVpnConnCloser::CVpnConnCloser(MTaskHandlerManager* aManager,
+                               const TTaskArrivedEventData& aTaskInfo)
+    : CTaskHandler(aManager, aTaskInfo, ECloseVpnConnCancelEvent, &iEventSpecDes) 
+    {
+    }
+
+void CVpnConnCloser::ConstructL()
+    {
+    CActiveScheduler::Add(this);
+    User::LeaveIfError(iEventMediator.Connect());
+    User::LeaveIfError(iKmdServ.Connect());
+    User::LeaveIfError(iPolicyServ.Connect());
+    }
+    
+CVpnConnCloser::~CVpnConnCloser()
+    {
+    Cancel();
+    iEventMediator.Close();
+    iKmdServ.Close();
+    iPolicyServ.Close();
+    RELEASE_EVENT_LOGGER;
+    }
+    
+void CVpnConnCloser::StartTaskHandling()
+    {
+	DEB(LOG(Log::Printf(_L("Starting VPN IAP deactivation\n")));)			
+    INIT_EVENT_LOGGER(iEventMediator, iEventSpecDes().iVpnIapId, iEventSpecDes().iRealIapId);
+    GotoState(KStateDeactivateKmd);
+    }
+    
+void CVpnConnCloser::ChangeStateL()
+    {
+    switch (NextState())
+        {
+        case KStateDeactivateKmd:
+            StateDeactivateKmdL();
+            break;
+
+        case KStateUnloadIpsecPolicy:
+            StateUnloadIpsecPolicy();
+            break;
+
+        case KStateAfterUnloadIpsecPolicy:
+            StateAfterUnloadIpsecPolicy();
+            break;
+
+        default:
+            User::Panic(KSitName, EPanicInvalidTaskHandlerState);
+        }
+    }
+
+void CVpnConnCloser::CancelOngoingOperation()
+    {
+    switch (CurrState())
+        {
+        case KStateDeactivateKmd:
+        case KStateAfterUnloadIpsecPolicy:
+            // There's no ongoing external request to cancel
+            break;
+
+        case KStateUnloadIpsecPolicy:
+			DEB(LOG(Log::Printf(_L("Canceling Ipsec policy unload\n")));)
+            iPolicyServ.CancelUnload();
+            break;
+
+        default:
+            User::Panic(KSitName, EPanicInvalidTaskHandlerState);
+        }
+    }
+
+void CVpnConnCloser::StateDeactivateKmdL()
+    {
+    SetCurrState(KStateDeactivateKmd);
+    TInt err = iKmdServ.StopVpnConnection( iEventSpecDes().iVpnIapId,
+                                        (TKmdStopConnection::TType)iEventSpecDes().iDeactivateType );
+	DEB(LOG(Log::Printf(_L("VPN connection stopped, VPN IAP id=%d, err=%d\n"),
+	        iEventSpecDes().iVpnIapId, err ));)	
+    GotoState(KStateUnloadIpsecPolicy);
+    }
+
+void CVpnConnCloser::StateUnloadIpsecPolicy()
+    {
+    SetCurrState(KStateUnloadIpsecPolicy);
+
+    iPolicyServ.UnloadPolicy(iEventSpecDes().iIpsecPolicyHandle, iStatus);
+	DEB(LOG(Log::Printf(_L("Ipsec policy unloaded, handle = %d\n"), iEventSpecDes().iIpsecPolicyHandle));)	
+    SetNextState(KStateAfterUnloadIpsecPolicy);
+    SetActive();
+    }
+
+void CVpnConnCloser::StateAfterUnloadIpsecPolicy()
+    {
+    SetCurrState(KStateAfterUnloadIpsecPolicy);
+	DEB(LOG(Log::Printf(_L("VPN IAP deactivation completed, Ipsec policy unload status = %d\n"), iStatus.Int()));)
+
+    LOG_EVENT(R_VPN_MSG_VPN_IAP_DEACT, NULL, iStatus.Int(), iEventSpecDes().iDeactivateType);
+    
+    TaskComplete(iStatus.Int());
+    }
+
+void CVpnConnCloser::ReportResult(TInt aStatus)
+    {
+    // Report the close operation status
+    // information to the Event Mediator
+
+    TCloseVpnConnEventData eventData;
+    
+    eventData.iTaskStatus = aStatus;
+    
+    TPckg<TCloseVpnConnEventData> eventDataDes(eventData);
+    ReportEvent(ECloseVpnConnEvent, iEventSpecDes, eventDataDes);
+    iKmdServ.Close();
+    }