diff -r 000000000000 -r ba25891c3a9e installationservices/swi/test/tsisfile/tsisocspserver.cpp --- /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( + const_cast(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(*iRevocationMessage)); + } + break; + + default: + { + User::Panic(_L("Test OCSP Server"), 1); + } + } + } + +void COcspStateMachine::DoCancel() + { + + } + +TInt COcspStateMachine::RunError(TInt aError) + { + iClientMessage.Complete(aError); + + return KErrNone; + } +