libraries/iosrv/tsrc/t_ioread.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/iosrv/tsrc/t_ioread.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,162 @@
+// t_ioread.cpp
+// 
+// Copyright (c) 2009 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <fshell/ioutils.h>
+
+using namespace IoUtils;
+
+// enum corresponding to RIoReadHandle::TReadMode
+_LIT(KReadModeEnum, "full,line,oneormore");
+
+static const TInt KDefaultReadSize = 0x100;
+
+class CIoReadTest : public CCommandBase
+	{
+public:
+	static CCommandBase* NewLC();
+	~CIoReadTest();
+private:
+	CIoReadTest();
+	void ReadFileL();
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual const TDesC& Description() const;
+	virtual void DoRunL();
+	virtual void ArgumentsL(RCommandArgumentList& aArguments);
+	virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+	TFileName2 iFile;
+	TInt iReadSize;
+	RIoReadHandle::TReadMode iReadMode;
+	RBuf iFileContents;
+	
+	RIoFile iIoFile;
+	RIoReadHandle iFileReader;
+	RBuf iReadBuf;
+	CTextBuffer* iFileBuffer;
+	};
+
+
+CCommandBase* CIoReadTest::NewLC()
+	{
+	CIoReadTest* self = new(ELeave) CIoReadTest();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CIoReadTest::~CIoReadTest()
+	{
+	iFileContents.Close();
+	iIoFile.Close();
+	iFileReader.Close();
+	iReadBuf.Close();
+	delete iFileBuffer;
+	}
+
+CIoReadTest::CIoReadTest()
+	: iReadSize(KDefaultReadSize)
+	{
+	}
+
+const TDesC& CIoReadTest::Name() const
+	{
+	_LIT(KName, "t_ioread");	
+	return KName;
+	}
+
+const TDesC& CIoReadTest::Description() const
+	{
+	_LIT(KDescription, "Test harness for iosrv file reading functionality");
+	return KDescription;
+	}
+	
+void CIoReadTest::ReadFileL()
+	{
+	RFile file;
+	LeaveIfErr(file.Open(Fs(), iFile, EFileRead | EFileShareExclusive), _L("Cannot open file '%S'"), &iFile);
+	CleanupClosePushL(file);
+	TInt fileSize;
+	User::LeaveIfError(file.Size(fileSize));
+	
+	RBuf8 contents;
+	contents.CreateL(fileSize);
+	CleanupClosePushL(contents);
+	User::LeaveIfError(file.Read(contents));
+	
+	// convert data to 16-bit which is how it'll come out of the io server
+	iFileContents.CreateL(fileSize);
+	iFileContents.Copy(contents); // copy & expand
+	CleanupStack::PopAndDestroy(2, &file); // contents, file
+	}
+
+void CIoReadTest::DoRunL()
+	{
+	// read the file into memory
+	ReadFileL();
+	
+	LeaveIfErr(iIoFile.Create(IoSession(), iFile, RIoFile::ERead), _L("Cannot create file end point for '%S'"), &iFile);
+	
+	iFileReader.CreateL(IoSession());
+	iIoFile.AttachL(iFileReader, RIoEndPoint::EForeground);
+	
+	iFileReader.SetReadModeL(iReadMode);
+	
+	iReadBuf.CreateL(iReadSize);
+	
+	
+	iFileBuffer = CTextBuffer::NewL(0x20);
+	TInt err;
+	do
+		{
+		iReadBuf.Zero();
+		err = iFileReader.Read(iReadBuf);
+		iFileBuffer->AppendL(iReadBuf);
+		} while (err == KErrNone);
+		
+	if (err!=KErrEof) LeaveIfErr(err, _L("Unexpected error from RIoReadHandle::Read"));
+	
+	TInt completion = 0;
+	if (iFileBuffer->Length() != iFileContents.Length())
+		{
+		PrintWarning(_L("Amount of data read from file (%d) differs from file size (%d)."), iFileBuffer->Length(), iFileContents.Length());
+		completion = 1;
+		}
+	if (iFileBuffer->Descriptor().Compare(iFileContents) != 0)
+		{
+		PrintWarning(_L("Data read from file differs from file contents."));
+		completion = 1;
+		}
+	Complete(completion);
+	}
+
+void CIoReadTest::ArgumentsL(RCommandArgumentList& aArguments)
+	{
+	_LIT(KFile, "file");
+	_LIT(KFileDescription, "File to test with");
+	aArguments.AppendFileNameL(iFile, KFile, KFileDescription);
+	}
+
+void CIoReadTest::OptionsL(RCommandOptionList& aOptions)
+	{
+	_LIT(KReadSize, "size");
+	_LIT(KReadSizeDescription, "The size of each read to issue");
+	aOptions.AppendIntL(iReadSize, 's', KReadSize, KReadSizeDescription);
+	
+	_LIT(KReadMode, "mode");
+	_LIT(KReadModeDescription, "The type of read to issue");
+	aOptions.AppendEnumL((TInt&)iReadMode, 'm', KReadMode, KReadModeDescription, KReadModeEnum);
+	}
+
+
+EXE_BOILER_PLATE(CIoReadTest)
+