diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/T_WspProtHnd/CWspFileDataSupplier.cpp --- /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 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); + }