diff -r 000000000000 -r 33413c0669b9 vpnengine/pkiservice/src/pkiservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/pkiservice/src/pkiservice.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,179 @@ +/* +* Copyright (c) 2006-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: PKI server main module +* +*/ + + + +#include "pkiservice.h" +#include "pkisession.h" +#include "PKIMapper.h" +#include "pkiserviceclientservercommon.h" +#include "certificaterequeststore.h" +#include "keyoperationqueue.h" +#include "log_r6.h" +#include "pkiserviceassert.h" + +const TUint CPKIService::iRangeCount = 2; + +const TInt CPKIService::iRanges[iRangeCount] = + { + PkiService::ELogon, + PkiService::ESetInformational+1 + }; + +const TUint8 CPKIService::iElementIndex[iRangeCount] = + { + 0, + CPolicyServer::ENotSupported + }; + +const CPolicyServer::TPolicyElement CPKIService::iElements[] = + { + {_INIT_SECURITY_POLICY_C1(ECapabilityNetworkControl), CPolicyServer::EFailClient}, + }; + +const CPolicyServer::TPolicy CPKIService::iPolicy = + { + 0, // All connect attempts are checked + iRangeCount, // Count of ranges + iRanges, // 0-25, 26... + iElementIndex, // Only range 0-25§ are checked + iElements // The list of policy elements + }; + +CPKIService::CPKIService(void):CPolicyServer(EPriorityStandard,iPolicy) + { + iSessionCount = 0; + } + + +CPKIService::~CPKIService(void) + { + delete iKeyOperationQueue; + delete iMapper; + delete iShutdown; + delete iCertificateRequestStore; + } + + +CPKIService* CPKIService::NewL(void) + { + CPKIService* self = new (ELeave) CPKIService; + CleanupStack::PushL(self); + + self->ConstructL(); + + CleanupStack::Pop(self); + return self; + } + + +void CPKIService::ConstructL() + { + //Makes sure private path exists + RFs fileServer; + User::LeaveIfError(fileServer.Connect()); + CleanupClosePushL(fileServer); + TInt err = fileServer.CreatePrivatePath(EDriveC); + if (err != KErrNone && + err != KErrAlreadyExists) + { + User::Leave(err); + } + CleanupStack::PopAndDestroy(); //fileServer + + iCertificateRequestStore = CCertificateRequestStore::NewL(); + iShutdown = new (ELeave) CSuspendedShutdown(); + iShutdown->Construct(); + + iMapper = CPKIMapper::NewL(); + iKeyOperationQueue = CKeyOperationQueue::NewL(*iMapper); + + + StartL(KPkiServerName); + } + + +CSession2* CPKIService::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const + { + iShutdown->Cancel(); + CSession2* session = CPKISession::NewL(*const_cast(this), *iMapper, *iKeyOperationQueue); + iSessionCount++; + return session; + } + +void CPKIService::SessionDeleted() + { + LOG_("-> CPKIService::SessionDeleted()"); + iSessionCount--; + + LOG_1("iSessionCount (%d)", iSessionCount); + PKISERVICE_ASSERT(iSessionCount >= 0); + + + if (iSessionCount == 0) + { + if (iStopImmediately) + { + CActiveScheduler::Stop(); + } + else + { + iShutdown->ArmShutdown(); + } + } + LOG_("<- CPKIService::SessionDeleted()"); + } + +CCertificateRequestStore& CPKIService::CertificateRequestStore() + { + return *iCertificateRequestStore; + } + + +const TInt KSuspendTime = 240000000; // 240 sec +//const TInt KSuspendTime = 5000000; // 5 sec + +CSuspendedShutdown::CSuspendedShutdown() : CActive(EPriorityStandard) +{ +} + +void CSuspendedShutdown::Construct() +{ + iTimer.CreateLocal(); + CActiveScheduler::Add(this); +} + +CSuspendedShutdown::~CSuspendedShutdown() +{ + iTimer.Close(); +} + +void CSuspendedShutdown::ArmShutdown() +{ + iTimer.After(iStatus, KSuspendTime); + SetActive(); +} + +void CSuspendedShutdown::DoCancel() +{ + iTimer.Cancel(); +} + +void CSuspendedShutdown::RunL() +{ + CActiveScheduler::Stop(); +}