--- /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<CPKIService*>(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();
+}