installationservices/swi/test/tsisfile/tsisocspserver.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/test/tsisfile/tsisocspserver.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,263 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+#include "tocspserver.h"
+#include "tocspclientserver.h"
+
+using Swi::Test::COcspServer;
+using Swi::Test::COcspStateMachine;
+using Swi::Test::COcspSession;
+using Swi::Test::COcspServerShutdown;
+
+static void PanicClient(const RMessagePtr2& aMessage, 
+						Swi::Test::TOcspServerPanic aPanic)
+	{
+	aMessage.Panic(Swi::Test::KOcspServerName, aPanic);
+	}
+
+/////
+///// TOCSP Server
+/////
+
+/*static*/ COcspServer* COcspServer::NewLC()
+	{
+	COcspServer* self = new(ELeave) COcspServer();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+	
+void COcspServer::AddSession()
+	{
+	++iSessionCount;
+	iShutdown->Cancel();
+	}
+	
+void COcspServer::DropSession()
+	{
+	if (--iSessionCount==0)
+		{
+		iShutdown->Start();
+		}
+	}
+
+COcspServer::~COcspServer()
+	{
+	delete iShutdown;
+	}
+
+COcspServer::COcspServer() : CServer2(EPriorityNormal, ESharableSessions)
+	{
+	}
+
+void COcspServer::ConstructL()
+	{
+	StartL(Swi::Test::KOcspServerName);
+//	iConsole = Console::NewL(_L("SWI Console Server Test"), TSize(KDefaultConsWidth, KDefaultConsHeight));
+	iShutdown = COcspServerShutdown::NewL();
+	// Ensure that the server still exits even if the 1st client fails to
+	// connect
+	iShutdown->Start();
+	}
+
+CSession2* COcspServer::NewSessionL(const TVersion& /*aVersion*/, 
+									   const RMessage2& /*aMessage*/) const
+	{
+	return new(ELeave) COcspSession();
+	}
+
+void COcspSession::CreateL()
+	{
+	Server().AddSession();
+	}
+
+COcspSession::COcspSession(/*CConsoleBase& aConsole*/) : CSession2() //, iConsole(aConsole)
+	{
+	}
+
+COcspSession::~COcspSession()
+	{
+	Server().DropSession();
+	}
+
+COcspServer& COcspSession::Server()
+	{
+	return *static_cast<COcspServer*>(
+		const_cast<CServer2*>(CSession2::Server()));
+	}
+
+/////
+///// COcspSession		
+/////
+	
+void COcspSession::ServiceL(const RMessage2& aMessage)
+	{
+	switch (aMessage.Function())
+		{
+		case ECheck:
+			{
+			if (iStateMachine)
+				{
+				delete iStateMachine;
+				}
+			iStateMachine = COcspStateMachine::NewL(aMessage);
+			iStateMachine->DoCheck();
+			}
+			break;
+			
+		default:
+			{
+			PanicClient(aMessage, Swi::Test::EPanicOcspServerIllegalFunction);
+			break;
+			}
+		}
+	}
+
+void COcspSession::ServiceError(const RMessage2& aMessage, TInt aError)
+	{
+	if (aError==KErrBadDescriptor)
+		{
+		PanicClient(aMessage, Swi::Test::EPanicOcspServerBadDescriptor);
+		}
+	CSession2::ServiceError(aMessage, aError);
+	}
+
+/////
+///// CInstallServerShutdown
+/////
+		
+inline COcspServerShutdown::COcspServerShutdown() : CTimer(-1)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+inline void COcspServerShutdown::ConstructL()
+	{
+	CTimer::ConstructL();
+	}
+
+inline void COcspServerShutdown::Start()
+	{
+	After(KShutdownDelay);
+	}
+
+/*static*/ COcspServerShutdown* COcspServerShutdown::NewL()
+	{
+	COcspServerShutdown* self = new(ELeave) COcspServerShutdown();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// Initiate server exit when the timer expires
+void COcspServerShutdown::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+
+
+////
+//// State Machine
+////
+
+/*static*/ COcspStateMachine* COcspStateMachine::NewL(const RMessage2& aMessage)
+	{
+	COcspStateMachine* self = new (ELeave) COcspStateMachine(aMessage);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+COcspStateMachine::COcspStateMachine(const RMessage2& aMessage) : CActive(EPriorityNormal), iClientMessage(aMessage)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+COcspStateMachine::~COcspStateMachine()
+	{
+	if (iSecurityManager)
+		{
+		delete iSecurityManager;
+		}
+
+	iOcspOutcomes.ResetAndDestroy();
+	iCerts.ResetAndDestroy();
+
+	if (iOcspUri) 
+		{
+		delete iOcspUri;
+		}
+	}
+	
+void COcspStateMachine::ConstructL()
+	{	
+	}
+
+void COcspStateMachine::DoCheck()
+	{
+	iSecurityManager = CSecurityManager::NewL();
+
+	iState = EDone;	
+	iIap = 0;
+	iSecurityManager->PerformOcspL(*iOcspUri, 
+								   iIap,
+							   	   iRevocationMessage, 
+							   	   iOcspOutcomes, 
+							   	   iCerts,
+							   	   iStatus);
+	SetActive();
+	}
+
+	
+void COcspStateMachine::RunL()
+	{
+	if (iStatus.Int() != KErrNone)
+		{
+		User::Leave(iStatus.Int()); // Hop into RunError()
+		}
+
+	switch (iState)
+		{
+		case EDone:
+			{
+			iClientMessage.Complete(static_cast<TInt>(*iRevocationMessage));
+			}
+			break;
+			
+		default:
+			{
+			User::Panic(_L("Test OCSP Server"), 1);
+			}
+		}
+	}
+	
+void COcspStateMachine::DoCancel()
+	{
+	
+	}
+	
+TInt COcspStateMachine::RunError(TInt aError)
+	{
+	iClientMessage.Complete(aError);
+	
+	return KErrNone;
+	}
+