diff -r 000000000000 -r 33413c0669b9 vpnengine/sit/src/vpnconncloser.cpp --- /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 eventDataDes(eventData); + ReportEvent(ECloseVpnConnEvent, iEventSpecDes, eventDataDes); + iKmdServ.Close(); + }