diff -r 000000000000 -r 33413c0669b9 vpnengine/sit/src/protocolversiongetter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/sit/src/protocolversiongetter.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,168 @@ +/* +* Copyright (c) 2003 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 getting IP version. +* +*/ + + + +#include "protocolversiongetter.h" +#include "ipsecpolparser.h" +#include "log.h" + +CProtocolVersionGetter* CProtocolVersionGetter::NewL(MTaskHandlerManager* aManager, + const TTaskArrivedEventData& aTaskInfo) + { + CProtocolVersionGetter* self = new (ELeave) CProtocolVersionGetter(aManager, aTaskInfo); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +CProtocolVersionGetter::CProtocolVersionGetter(MTaskHandlerManager* aManager, + const TTaskArrivedEventData& aTaskInfo) + : CTaskHandler(aManager, aTaskInfo, EGetProtocolVersionCancelEvent, &iEventSpecDes) + { + } + +void CProtocolVersionGetter::ConstructL() + { + CActiveScheduler::Add(this); + User::LeaveIfError(iEventMediator.Connect()); + User::LeaveIfError(iVpnServ.Connect()); + } + +CProtocolVersionGetter::~CProtocolVersionGetter() + { + Cancel(); + iEventMediator.Close(); + iVpnServ.Close(); + } + +void CProtocolVersionGetter::StartTaskHandling() + { + GotoState(KStateGetProtocolVersion); + } + +void CProtocolVersionGetter::ChangeStateL() + { + switch (NextState()) + { + case KStateGetProtocolVersion: + StateGetProtocolVersionL(); + break; + + default: + User::Panic(KSitName, EPanicInvalidTaskHandlerState); + } + } + +void CProtocolVersionGetter::CancelOngoingOperation() + { + switch (CurrState()) + { + case KStateGetProtocolVersion: + // There's no ongoing external request to cancel + break; + + default: + User::Panic(KSitName, EPanicInvalidTaskHandlerState); + } + } + +void CProtocolVersionGetter::StateGetProtocolVersionL() + { + SetCurrState(KStateGetProtocolVersion); + + // The protocol version getting process + // consists of one step only + GetProtocolVersionL(); + + TaskComplete(KErrNone); + } + +void CProtocolVersionGetter::ReportResult(TInt aStatus) + { + // Report the process status and protocol version + // information to the Event Mediator + + iEventData.iTaskStatus = aStatus; + // Protocol version is already in iEventData + + TPckg eventDataDes(iEventData); + ReportEvent(EGetProtocolVersionEvent, iEventSpecDes, eventDataDes); + } + +void CProtocolVersionGetter::GetProtocolVersionL() + { + HBufC8* policyData = NULL; + + // Load policy data via VPN Manager + User::LeaveIfError(iVpnServ.GetPolicyData(iEventSpecDes().iPolicyId, policyData)); + CleanupStack::PushL(policyData); + + ParseProtocolVersionL(*policyData); + + CleanupStack::PopAndDestroy(); // policyData + } + +void CProtocolVersionGetter::ParseProtocolVersionL(const TDesC8& aPolicyData) + { + // Parse the data + CIpSecurityPiece* pieceData = new (ELeave) CIpSecurityPiece; + CleanupStack::PushL(pieceData); + pieceData->ConstructL(); + + // Copy policy to 16bit buffer + TInt length = aPolicyData.Length(); + HBufC *policyDataHBufC16 = HBufC::NewL(length); + CleanupStack::PushL(policyDataHBufC16); + TPtr ptr(policyDataHBufC16->Des()); + ptr.Copy(aPolicyData); + + TIpSecParser parser(ptr); // Store policy to secparser + TInt err = parser.ParseAndIgnoreIKEL(pieceData); + if (err != KErrNone) + { + HBufC* errorInfo = HBufC16::NewL(200); + errorInfo->Des().Copy(pieceData->iErrorInfo); + LOG(TPtr ptr = errorInfo->Des(); Log::Printf(_L("Parsing error info: %S\n"), &ptr)); + delete errorInfo; + CleanupStack::PopAndDestroy(2); // pieceData, policyDataHBufC16 + User::Leave(err); + } + + CleanupStack::PopAndDestroy(1); // policyDataHBufC16 + + CSecurityPolicy *securityPolicy = pieceData->Policies(); + CSelectorList* selectorList = securityPolicy->SelectorList(); + TInt selectorCount = selectorList->Count(); + for (TInt i = 0; i < selectorCount; i++) + { + CPolicySelector *policySelector = selectorList->At(i); + if (policySelector->iRemote.Family() == KAfInet6) + { + iEventData.iProtocolVersion = EVersionIp6; + CleanupStack::PopAndDestroy(1); // pieceData + return; + } + } + if (selectorCount > 0) + { + iEventData.iProtocolVersion = EVersionIp; + } + + CleanupStack::PopAndDestroy(1); // pieceData + }