diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/t_httpmessage/cbodydatasupplier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httptransportfw/Test/t_httpmessage/cbodydatasupplier.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,147 @@ +// Copyright (c) 2002-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: +// + +#include "cbodydatasupplier.h" + +#include "mbodydatasupplierobserver.h" + +const TInt KGranularity = 5; + +CBodyDataSupplier* CBodyDataSupplier::NewL(MBodyDataSupplierObserver& aObserver) + { + CBodyDataSupplier* self = new (ELeave) CBodyDataSupplier(aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CBodyDataSupplier::~CBodyDataSupplier() + { + if( iBodyParts ) + iBodyParts->Reset(); + delete iBodyParts; + } + +CBodyDataSupplier::CBodyDataSupplier(MBodyDataSupplierObserver& aObserver) +: CActive(CActive::EPriorityStandard), iObserver(aObserver) + { + CActiveScheduler::Add(this); + } + +void CBodyDataSupplier::ConstructL() + { + iBodyParts = new (ELeave) CDesC8ArrayFlat(KGranularity); + } + +void CBodyDataSupplier::AddBodyPartL(const TDesC8& aData) + { + iBodyParts->AppendL(aData); + + if( iState == EIdle ) + { + iState = EPendingRelease; + } + } + +void CBodyDataSupplier::SetBodySize(TInt aSize) + { + iOverallDataSize = aSize; + } + +TBool CBodyDataSupplier::IsChunked() const + { + return iOverallDataSize == KErrNotFound; + } + +void CBodyDataSupplier::CompleteSelf() + { + TRequestStatus* pStat = &iStatus; + User::RequestComplete(pStat, KErrNone); + SetActive(); + } + +void CBodyDataSupplier::ResetSupplier() + { + Cancel(); + iState = EPendingRelease; + iIndex = 0; + } + +/* + * Methods from CActive + */ + +void CBodyDataSupplier::RunL() + { + // Move to the EPendingRelease state. + iState = EPendingRelease; + + // Notify the observer + iObserver.NotifyMoreData(); + } + +void CBodyDataSupplier::DoCancel() + { + // Do nothing... + } + +/* + * Methods from MHTTPDataSupplier + */ + +TBool CBodyDataSupplier::GetNextDataPart(TPtrC8& aDataPart) + { + __ASSERT_DEBUG( iState == EPendingRelease, User::Invariant() ); + + aDataPart.Set(iBodyParts->MdcaPoint(iIndex)); + + return ( iIndex == iBodyParts->MdcaCount()-1 ); + } + +void CBodyDataSupplier::ReleaseData() + { + // Move onto the next part + ++iIndex; + + // Have all the parts been released? + if( iIndex < iBodyParts->MdcaCount() ) + { + // More to go - self-complete to notify observer and move to the + // EPendingNotify state. + iState = EPendingNotify; + CompleteSelf(); + } + else + { + // All done - move to EDone state + iState = EDone; + } + } + +TInt CBodyDataSupplier::OverallDataSize() + { + if( iIsChunked ) + return KErrNotFound; + else + return iOverallDataSize; + } + +TInt CBodyDataSupplier::Reset() + { + return KErrNotFound; + } + +