applayerprotocols/httptransportfw/Test/T_WspProtHnd/CWspFileDataSupplier.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/Test/T_WspProtHnd/CWspFileDataSupplier.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,156 @@
+// Copyright (c) 2001-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:
+// System includes
+// Local includes
+// 
+//
+
+// Class signatures
+#include "cwspfiledatasupplier.h"
+
+
+// Constants used in this file
+_LIT(KFileSystemRoot,"C:\\");
+const TInt KChunkSize = 64;
+
+/** Implementation of class 'CWspFileDataSupplier'.
+*/
+
+
+CWspFileDataSupplier* CWspFileDataSupplier::NewL()
+	{
+	CWspFileDataSupplier* me = new(ELeave)CWspFileDataSupplier();
+	CleanupStack::PushL(me);
+	me->ConstructL();
+	CleanupStack::Pop(me);
+	return me;
+	}
+
+CWspFileDataSupplier* CWspFileDataSupplier::NewL(const TDesC& aFileName)
+	{
+	CWspFileDataSupplier* me = new(ELeave)CWspFileDataSupplier();
+	CleanupStack::PushL(me);
+	me->ConstructL(aFileName);
+	CleanupStack::Pop(me);
+	return me;
+	}
+
+CWspFileDataSupplier::~CWspFileDataSupplier()
+	{
+	delete iBuffer;
+	iFileHnd.Close();
+	iFileSrvHnd.Close();
+	}
+
+void CWspFileDataSupplier::CleanUp(TAny* aDataSupplierItem)
+	{
+	delete STATIC_CAST(CWspFileDataSupplier*, aDataSupplierItem);
+	}
+
+void CWspFileDataSupplier::SetFileL(const TDesC& aFileName)
+	{
+	// Close any already open file
+	if (iFileOpen)
+		{
+		iFileHnd.Close();
+		iFileOpen = EFalse;
+		}
+
+	// Parse the name of the new file and open it
+	iParsedFileName.Set(KFileSystemRoot, &aFileName, NULL);
+	User::LeaveIfError(iFileHnd.Open(iFileSrvHnd, iParsedFileName.FullName(), EFileRead));
+	iFileOpen = ETrue;
+
+	// Read from the request body file
+	TPtr8 bufferPtr = iBuffer->Des();
+
+	// Read initially into the dynamic buffer.  If we haven't hit the
+	// end of file, then read more into a local buffer and append to the
+	// dynamic one, expanding and reallocating where necessary
+	TInt err = iFileHnd.Read(bufferPtr);
+	TBuf8<KChunkSize> chunk;
+	TBool done = EFalse;
+	while (!done)
+		{
+		// If it's not at EOF, then the read should have been successful with no error
+		User::LeaveIfError(err);
+
+		// Read some more... detect EOF
+		err = iFileHnd.Read(chunk);
+		done = (chunk.Length() == 0);
+		if ((err == KErrNone) && !done)
+			{
+			// Determine whether we need to grow the dynamic buffer
+			if (chunk.Length() > (bufferPtr.MaxLength() - bufferPtr.Length()))
+				{
+				HBufC8* oldbuffer = iBuffer;
+				iBuffer = oldbuffer->ReAllocL(oldbuffer->Length() + KChunkSize);
+				bufferPtr = iBuffer->Des();
+				}
+
+			// Append from the local buffer
+			bufferPtr.Append(chunk);
+			}
+		}
+	}
+
+TBool CWspFileDataSupplier::GetNextDataPart(TPtrC8& aDataPart)
+	{
+	__ASSERT_ALWAYS(iFileOpen, User::Invariant());
+	// Return the data in one chunk
+	aDataPart.Set(*iBuffer);
+	return ETrue;
+	}
+
+void CWspFileDataSupplier::ReleaseData()
+	{
+	__ASSERT_ALWAYS(iFileOpen, User::Invariant());
+	// Clear out the submit buffer
+	TPtr8 bufferPtr = iBuffer->Des();
+	bufferPtr.Zero();
+	}
+
+TInt CWspFileDataSupplier::OverallDataSize()
+	{
+	__ASSERT_ALWAYS(iFileOpen, User::Invariant());
+	return iBuffer->Length();
+	}
+
+TInt CWspFileDataSupplier::Reset()
+	{
+	__ASSERT_ALWAYS(iFileOpen, User::Invariant());
+	return KErrNotSupported;
+	}
+
+CWspFileDataSupplier::CWspFileDataSupplier()
+	{
+	}
+
+void CWspFileDataSupplier::ConstructL()
+	{
+	// Connect to the fileserver
+	User::LeaveIfError(iFileSrvHnd.Connect());
+
+	// Make a buffer to hold chunks taken from the file
+	iBuffer = HBufC8::NewMaxL(KChunkSize);
+	}
+
+void CWspFileDataSupplier::ConstructL(const TDesC& aFileName)
+	{
+	// General set-up first
+	ConstructL();
+
+	// Open the specified file
+	SetFileL(aFileName);
+	}