applayerprotocols/httpservice/src/chttpdatasender.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpservice/src/chttpdatasender.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,143 @@
+// Copyright (c) 2003-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 "chttpdatasender.h"
+#include "chttpcontentreader.h"
+#include "chttpclienttransaction.h"
+#include <thttpevent.h>
+
+CHttpDataSender* CHttpDataSender::New(RHTTPTransaction aTrans, CHttpClientTransaction& aClientTrans, MHttpContentSource* aSource)
+    {
+    return new CHttpDataSender(aTrans, aClientTrans, aSource);
+    }
+
+CHttpDataSender* CHttpDataSender::New(RHTTPTransaction aTrans, CHttpClientTransaction& aClientTrans, RFile& aFile)
+    {
+    CHttpDataSender* self = new CHttpDataSender(aTrans, aClientTrans);
+    if(self)
+        {
+        if(self->Construct(aFile) != KErrNone)
+            {
+            delete self;
+            self = NULL;
+            }
+        }
+    return self;
+    }
+
+
+CHttpDataSender::CHttpDataSender(RHTTPTransaction aTrans, CHttpClientTransaction& aClientTrans)
+: iTransaction(aTrans),iClientTrans(aClientTrans),
+iDynamicContentLen(KErrNotFound)
+	{
+	}
+
+CHttpDataSender::CHttpDataSender(RHTTPTransaction aTrans, CHttpClientTransaction& aClientTrans, MHttpContentSource* aSource)
+: iTransaction(aTrans),iDynamicSource(aSource),
+iClientTrans(aClientTrans)
+    {
+    
+    }
+
+CHttpDataSender::~CHttpDataSender()
+    {
+    delete iFileReader;
+    }
+
+TInt CHttpDataSender::Construct(RFile& aFile)
+    {
+    iFileReader = CHttpFileReader::New(aFile, *this);
+    return iFileReader ? KErrNone : KErrNoMemory;
+    }
+
+// From MHttpDataSender
+void CHttpDataSender::Notify(const TDesC8& aData, TBool aLast)
+	{
+	__ASSERT_DEBUG(iDataPtr.Length() == 0, User::Invariant());
+	iDataPtr.Set(aData.Ptr(), aData.Length());
+	iLastPart = aLast;
+	if(!iInCallback)
+	    {
+	    iTransaction.SendEvent(THTTPEvent::ENotifyNewRequestBodyPart, THTTPEvent::EOutgoing, THTTPFilterHandle::EClient);
+	    }
+	}
+
+void CHttpDataSender::Error(TInt aError)
+	{
+	THTTPEvent evt(aError);
+	iTransaction.SendEvent(evt, THTTPEvent::EIncoming, THTTPFilterHandle::EClient);
+	}
+	
+// From MHTTPDataSupplier
+TBool CHttpDataSender::GetNextDataPart(TPtrC8& aDataPart)
+	{
+	aDataPart.Set(KNullDesC8());
+	iInCallback = ETrue;
+	if(iDataPtr.Length() == 0)
+	    {
+	    RequestData();
+	    }
+	
+	if(iDataPtr.Length() > 0)
+	    {
+	    iTransfferedDataSize += iDataPtr.Length();
+	    iClientTrans.OnTransferProgress(iTransaction.Request().Body()->OverallDataSize(), iTransfferedDataSize);
+	    aDataPart.Set(iDataPtr);
+	    iWaitingForRelease = ETrue;
+	    }
+	iInCallback = EFalse;
+	return iLastPart;
+	}
+	
+void CHttpDataSender::ReleaseData()
+	{
+	if(iWaitingForRelease)
+	    {
+	    iDataPtr.Set(NULL, 0);
+	    if(!iLastPart)
+	        RequestData();
+	    iWaitingForRelease = EFalse;
+	    }
+	}
+	
+TInt CHttpDataSender::OverallDataSize()
+	{
+	if(iFileReader)
+	    return iFileReader->Size();
+	return iDynamicContentLen;
+	}
+	
+TInt CHttpDataSender::Reset()
+	{
+	return KErrNone;
+	}
+
+void CHttpDataSender::RequestData()
+    {
+    if(iDynamicSource)
+        {
+        THttpContentSourceOp op(this);
+        iDynamicSource->OnData(op);
+        }
+    else if(iFileReader)
+        {
+        iFileReader->Read();
+        }
+    }
+
+void CHttpDataSender::SetDynamicContentLen(TInt aLen)
+    {
+    iDynamicContentLen = aLen;
+    }