pkiutilities/ocsp/test/transport.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkiutilities/ocsp/test/transport.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,139 @@
+// Copyright (c) 2005-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:
+// Test transport object.  May be used in place of the default transport used by
+// the ocsp module.  May later be extended to act as a dummy server producing
+// a variety of test responses.
+// 
+//
+
+#include "transport.h"
+
+#include <f32file.h>
+
+CTOCSPTransport* CTOCSPTransport::NewL(const TDesC& aResponseFile, const TDesC* aRequestFile)
+	{
+	CTOCSPTransport* self = new (ELeave) CTOCSPTransport;
+	CleanupStack::PushL(self);
+	self->ConstructL(aResponseFile, aRequestFile);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+void CTOCSPTransport::ConstructL(const TDesC& aResponseFile, const TDesC* aRequestFile)
+	{
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iResponseStream.Open(iFs, aResponseFile, EFileShareReadersOnly));
+	iTransactions = iResponseStream.ReadUint32L();
+
+	if (aRequestFile)
+		{
+		iRequestStream = new (ELeave) RFileReadStream;
+		User::LeaveIfError(iRequestStream->Open(iFs, *aRequestFile, EFileShareReadersOnly));
+		TInt requests = iRequestStream->ReadUint32L();
+		__ASSERT_ALWAYS(requests == iTransactions, User::Leave(KErrCorrupt));	
+		} 		
+	}
+
+
+CTOCSPTransport::~CTOCSPTransport()
+	{
+	iResponseStream.Close();
+	
+	if (iRequestStream)
+		{
+		iRequestStream->Close();
+		delete iRequestStream;
+		}
+	
+	iFs.Close();
+	delete iResponseData;
+	}
+
+
+void CTOCSPTransport::SendRequest(const TDesC8& aURI,
+								  const TDesC8& aRequest, 
+								  const TInt,				// Timeout not used
+								  TRequestStatus& aStatus)
+	{
+	iCallBack = &aStatus;
+	aStatus = KRequestPending;
+
+	TRAPD(error, DoSendRequestL(aURI, aRequest));
+	User::RequestComplete(iCallBack, error);
+	}
+
+
+void CTOCSPTransport::DoSendRequestL(const TDesC8& aURI,
+									 const TDesC8& aRequest)
+	{	
+	__ASSERT_ALWAYS(iIndex++ < iTransactions, User::Leave(TOCSP::ETooManyTransactions));
+
+	CheckRequestL(aURI, aRequest);
+
+	delete iResponseData;
+	iResponseData = NULL;
+
+	iResponseData = ReadDataLC(iResponseStream);
+	CleanupStack::Pop(iResponseData);
+	}
+
+
+void CTOCSPTransport::CheckRequestL(const TDesC8& aURI,
+									const TDesC8& aRequest)
+	{
+	if (!iRequestStream)
+		{
+		return;
+		}
+
+	HBufC8* expectURI = ReadDataLC(*iRequestStream);
+	if (aURI != *expectURI)
+		{
+		User::Leave(TOCSP::EURIMismatch);
+		}
+	CleanupStack::PopAndDestroy(expectURI);
+	
+	HBufC8* expectRequest = ReadDataLC(*iRequestStream);
+	if (aRequest != *expectRequest)
+		{
+		User::Leave(TOCSP::ERequestMismatch);
+		}
+	CleanupStack::PopAndDestroy(expectRequest);
+	}
+
+HBufC8* CTOCSPTransport::ReadDataLC(RFileReadStream& aStream)
+	{
+	TUint32 len = aStream.ReadUint32L();
+	HBufC8* data = HBufC8::NewLC(len);
+	TPtr8 dataDes = data->Des();
+	aStream.ReadL(dataDes, len);
+	return data;
+	}
+
+void CTOCSPTransport::CancelRequest()
+	{
+	// If its not been done already, complete the active object
+	if (iCallBack)
+		{
+		User::RequestComplete(iCallBack, KErrCancel);
+		}
+	}
+
+
+TPtrC8 CTOCSPTransport::GetResponse() const
+	{
+	__ASSERT_ALWAYS(iResponseData, User::Panic(_L("TOCSP"), KErrNotReady));
+	return *iResponseData;
+	}