--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/vpnmanager/src/vpnmanagerserver.cpp Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,135 @@
+/*
+* 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:
+* Server component for VPN Manager, used by VPN API.
+*
+*/
+
+#include <e32svr.h>
+#include <e32math.h>
+
+#include "vpnmanagerserver.h"
+#include "vpnmanagersession.h"
+#include "requestdispatcher.h"
+
+
+const TUint CVpnManagerServer::iVpnManRangeCount = 3;
+
+const TInt CVpnManagerServer::iVpnManRanges[iVpnManRangeCount] =
+ {
+ 0,
+ EVpnImportPolicy,
+ EVpnUpdatePolicyData+1
+ };
+
+const TUint8 CVpnManagerServer::iVpnManElementIndex[iVpnManRangeCount] =
+ {
+ CPolicyServer::ENotSupported,
+ 0,
+ CPolicyServer::ENotSupported
+ };
+
+const CPolicyServer::TPolicyElement CVpnManagerServer::iVpnManElements[] =
+ {
+ {_INIT_SECURITY_POLICY_C1(ECapabilityNetworkControl), CPolicyServer::EFailClient},
+ };
+
+const CPolicyServer::TPolicy CVpnManagerServer::iVpnManPolicy =
+ {
+ 0, // All connect attempts are checked
+ iVpnManRangeCount, // Count of ranges
+ iVpnManRanges, // 0-999, 1000-1008, 1009...
+ iVpnManElementIndex, // Only range 1000-1008 are checked
+ iVpnManElements // The list of policy elements
+ };
+
+CVpnManagerServer::CVpnManagerServer(TInt aPriority) : CPolicyServer(aPriority,iVpnManPolicy)
+ {
+ }
+
+CVpnManagerServer::~CVpnManagerServer()
+ {
+ delete iRequestDispatcher;
+ iFs.Close();
+ }
+
+CVpnManagerServer* CVpnManagerServer::NewL()
+ {
+ CVpnManagerServer* server = CVpnManagerServer::NewLC();
+ CleanupStack::Pop(); // server
+ return server;
+ }
+
+CVpnManagerServer* CVpnManagerServer::NewLC()
+ {
+ CVpnManagerServer* server = new (ELeave) CVpnManagerServer(EPriorityNormal);
+ CleanupStack::PushL(server);
+ server->ConstructL();
+ return server;
+ }
+
+void CVpnManagerServer::ConstructL()
+ {
+ User::LeaveIfError(iFs.Connect());
+ User::LeaveIfError(iFs.CreatePrivatePath(EDriveC));
+ iRequestDispatcher = CRequestDispatcher::NewL(iFs);
+ StartL(KVpnManagerServer);
+ }
+
+CSession2* CVpnManagerServer::NewSessionL(
+ const TVersion &aVersion,
+ const RMessage2& /*aMessage*/) const
+ {
+ // Check that the client is requesting a session with the right version
+ if (!User::QueryVersionSupported(TVersion(KVpnManagerMajorVersionNumber,
+ KVpnManagerMinorVersionNumber,
+ KVpnManagerBuildVersionNumber),
+ aVersion))
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ // Make new session
+ return CVpnManagerSession::NewL(*const_cast<CVpnManagerServer*>(this),
+ *iRequestDispatcher);
+ }
+
+void CVpnManagerServer::IncrementSessions()
+ {
+ iSessionCount++;
+ }
+
+void CVpnManagerServer::DecrementSessions()
+ {
+ iSessionCount--;
+
+ // Terminate the server when there are no clients left
+ if (iSessionCount <= 0)
+ {
+ CActiveScheduler::Stop();
+ }
+ }
+
+TInt CVpnManagerServer::RunError(TInt aError)
+ {
+ Message().Complete(aError);
+
+ // The leave will result in an early return from CServer::RunL(),
+ // skipping the call to request another message. So we issue the
+ // request here in order to keep the server running.
+ ReStart();
+
+ // Handled the error fully
+ return KErrNone;
+ }