diff -r 000000000000 -r 33413c0669b9 vpnengine/vpnmanager/src/vpnmanagerserver.cpp --- /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 +#include + +#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(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; + }