diff --git a/mozilla/netwerk/base/public/nsIStreamListener.h b/mozilla/netwerk/base/public/nsIStreamListener.h
index 0e5065b30d2..1e0188a6a07 100644
--- a/mozilla/netwerk/base/public/nsIStreamListener.h
+++ b/mozilla/netwerk/base/public/nsIStreamListener.h
@@ -48,7 +48,8 @@ public:
* @return The return value is currently ignored.
*/
NS_IMETHOD OnDataAvailable(nsISupports* context,
- nsIInputStream *aIStream,
+ nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength) = 0;
};
diff --git a/mozilla/netwerk/base/src/nsFileTransport.cpp b/mozilla/netwerk/base/src/nsFileTransport.cpp
index 00165882fbb..3150846cb73 100644
--- a/mozilla/netwerk/base/src/nsFileTransport.cpp
+++ b/mozilla/netwerk/base/src/nsFileTransport.cpp
@@ -24,6 +24,7 @@
#include "nsIFileStream.h"
#include "nsFileSpec.h"
#include "nsIByteBufferInputStream.h"
+#include "prcmon.h"
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
@@ -33,7 +34,7 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
nsFileTransport::nsFileTransport()
: mPath(nsnull), mContext(nsnull), mListener(nsnull), mState(ENDED),
mSuspended(PR_FALSE), mFileStream(nsnull), mBufferStream(nsnull),
- mStatus(NS_OK), mService(nsnull)
+ mStatus(NS_OK), mService(nsnull), mSourceOffset(0)
{
NS_INIT_REFCNT();
}
@@ -222,7 +223,7 @@ nsFileTransport::OpenOutputStream(nsIOutputStream* *result)
////////////////////////////////////////////////////////////////////////////////
void
-nsFileTransport::Continue(void)
+nsFileTransport::Process(void)
{
PR_CEnterMonitor(this);
switch (mState) {
@@ -255,9 +256,12 @@ nsFileTransport::Continue(void)
if (NS_FAILED(mStatus)) goto error;
// and feed the buffer to the application via the byte buffer stream:
- mStatus = mListener->OnDataAvailable(mContext, mBufferStream, amt); // XXX maybe amt should be mBufferStream->GetLength()
+ // XXX maybe amt should be mBufferStream->GetLength():
+ mStatus = mListener->OnDataAvailable(mContext, mBufferStream, mSourceOffset, amt);
if (NS_FAILED(mStatus)) goto error;
+ mSourceOffset += amt;
+
// stay in the READING state
break;
}
@@ -316,7 +320,7 @@ NS_IMETHODIMP
nsFileTransport::Run(void)
{
while (mState != ENDED && !mSuspended) {
- Continue();
+ Process();
}
return NS_OK;
}
diff --git a/mozilla/netwerk/base/src/nsFileTransport.h b/mozilla/netwerk/base/src/nsFileTransport.h
index 96a16c4aeb1..d5953c9b5f3 100644
--- a/mozilla/netwerk/base/src/nsFileTransport.h
+++ b/mozilla/netwerk/base/src/nsFileTransport.h
@@ -70,7 +70,7 @@ public:
nsresult Init(nsISupports* context,
nsIStreamListener* listener,
State state);
- void Continue(void);
+ void Process(void);
protected:
char* mPath;
@@ -84,6 +84,7 @@ protected:
nsIBaseStream* mFileStream; // cast to nsIInputStream/nsIOutputStream for reading/writing
nsIByteBufferInputStream* mBufferStream;
nsresult mStatus;
+ PRUint32 mSourceOffset;
};
#define NS_FILE_TRANSPORT_BUFFER_SIZE (4*1024)
diff --git a/mozilla/netwerk/base/src/nsMarshalingStreamListener.cpp b/mozilla/netwerk/base/src/nsMarshalingStreamListener.cpp
index b72b89ddce2..281b2755e75 100644
--- a/mozilla/netwerk/base/src/nsMarshalingStreamListener.cpp
+++ b/mozilla/netwerk/base/src/nsMarshalingStreamListener.cpp
@@ -79,6 +79,7 @@ public:
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength);
// nsMarshalingStreamListener methods:
@@ -240,11 +241,13 @@ public:
mIStream(nsnull), mLength(0) {}
virtual ~nsOnDataAvailableEvent();
- nsresult Init(nsIInputStream* aIStream, PRUint32 aLength);
+ nsresult Init(nsIInputStream* aIStream, PRUint32 aSourceOffset,
+ PRUint32 aLength);
NS_IMETHOD HandleEvent();
protected:
nsIInputStream* mIStream;
+ PRUint32 mSourceOffset;
PRUint32 mLength;
};
@@ -254,8 +257,10 @@ nsOnDataAvailableEvent::~nsOnDataAvailableEvent()
}
nsresult
-nsOnDataAvailableEvent::Init(nsIInputStream* aIStream, PRUint32 aLength)
+nsOnDataAvailableEvent::Init(nsIInputStream* aIStream, PRUint32 aSourceOffset,
+ PRUint32 aLength)
{
+ mSourceOffset = aSourceOffset;
mLength = aLength;
mIStream = aIStream;
NS_ADDREF(mIStream);
@@ -266,12 +271,13 @@ NS_IMETHODIMP
nsOnDataAvailableEvent::HandleEvent()
{
nsIStreamListener* receiver = (nsIStreamListener*)mListener->GetReceiver();
- return receiver->OnDataAvailable(mContext, mIStream, mLength);
+ return receiver->OnDataAvailable(mContext, mIStream, mSourceOffset, mLength);
}
NS_IMETHODIMP
nsMarshalingStreamListener::OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength)
{
nsresult rv = GetStatus();
@@ -282,7 +288,7 @@ nsMarshalingStreamListener::OnDataAvailable(nsISupports* context,
if (event == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
- rv = event->Init(aIStream, aLength);
+ rv = event->Init(aIStream, aSourceOffset, aLength);
if (NS_FAILED(rv)) goto failed;
rv = event->Fire(mEventQueue);
if (NS_FAILED(rv)) goto failed;
diff --git a/mozilla/netwerk/base/src/nsSocketTransport.cpp b/mozilla/netwerk/base/src/nsSocketTransport.cpp
index 2fd125e5b87..7ce00e4bbec 100644
--- a/mozilla/netwerk/base/src/nsSocketTransport.cpp
+++ b/mozilla/netwerk/base/src/nsSocketTransport.cpp
@@ -1,4 +1,4 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
@@ -124,6 +124,7 @@ nsSocketTransport::nsSocketTransport()
mWriteStream = nsnull;
mListener = nsnull;
mContext = nsnull;
+ mSourceOffset = 0;
mService = nsnull;
//
@@ -516,7 +517,8 @@ nsresult nsSocketTransport::doRead(PRInt16 aSelectFlags)
// been filled into the stream as possible...
//
if (totalBytesWritten) {
- mListener->OnDataAvailable(mContext, mReadStream, totalBytesWritten);
+ mListener->OnDataAvailable(mContext, mReadStream, mSourceOffset, totalBytesWritten);
+ mSourceOffset += totalBytesWritten;
}
//
@@ -543,7 +545,7 @@ nsresult nsSocketTransport::doRead(PRInt16 aSelectFlags)
//-----
nsresult nsSocketTransport::doWrite(PRInt16 aSelectFlags)
{
- PRUint32 size, bytesRead;
+ PRUint32 bytesRead;
PRInt32 len;
PRErrorCode code;
nsresult rv = NS_OK;
diff --git a/mozilla/netwerk/base/src/nsSocketTransport.h b/mozilla/netwerk/base/src/nsSocketTransport.h
index 719816f33f9..4e430513602 100644
--- a/mozilla/netwerk/base/src/nsSocketTransport.h
+++ b/mozilla/netwerk/base/src/nsSocketTransport.h
@@ -110,6 +110,7 @@ protected:
nsIStreamListener* mListener;
nsIByteBufferInputStream* mReadStream;
nsIInputStream* mWriteStream;
+ PRUint32 mSourceOffset;
nsSocketTransportService* mService;
};
diff --git a/mozilla/netwerk/base/src/nsSyncStreamListener.cpp b/mozilla/netwerk/base/src/nsSyncStreamListener.cpp
index 0a0dfafbfa2..022da5af7b3 100644
--- a/mozilla/netwerk/base/src/nsSyncStreamListener.cpp
+++ b/mozilla/netwerk/base/src/nsSyncStreamListener.cpp
@@ -32,6 +32,7 @@ public:
NS_IMETHOD OnStartBinding(nsISupports* context);
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength);
NS_IMETHOD OnStopBinding(nsISupports* context,
nsresult aStatus,
@@ -47,7 +48,7 @@ public:
nsresult Init(nsIInputStream* *result);
protected:
- nsIByteBufferOutputStream* mOutputStream;
+ nsIOutputStream* mOutputStream;
};
////////////////////////////////////////////////////////////////////////////////
@@ -57,17 +58,10 @@ nsSyncStreamListener::Init(nsIInputStream* *result)
{
nsresult rv;
nsIInputStream* in;
- nsIOutputStream* out;
- rv = NS_NewPipe(&in, &out);
+ rv = NS_NewPipe(&in, &mOutputStream);
if (NS_FAILED(rv)) return rv;
- rv = out->QueryInterface(nsIByteBufferOutputStream::GetIID(), (void**)&mOutputStream);
- NS_RELEASE(out);
- if (NS_FAILED(rv)) {
- NS_RELEASE(in);
- return rv;
- }
*result = in;
return NS_OK;
}
@@ -103,6 +97,7 @@ nsSyncStreamListener::OnStartBinding(nsISupports* context)
NS_IMETHODIMP
nsSyncStreamListener::OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength)
{
nsresult rv;
diff --git a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.cpp b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.cpp
index 0525fe33530..c208eb711a5 100644
--- a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.cpp
+++ b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.cpp
@@ -316,8 +316,9 @@ nsFtpProtocolConnection::OnStopBinding(nsISupports* context,
// routine/logic for handling.
NS_IMETHODIMP
nsFtpProtocolConnection::OnDataAvailable(nsISupports* context,
- nsIInputStream *aIStream,
- PRUint32 aLength) {
+ nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
+ PRUint32 aLength) {
nsresult rv;
// we've got some data. suck it out of the inputSteam.
diff --git a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.h b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.h
index eab4db6e0d6..117e4606a31 100644
--- a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.h
+++ b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolConnection.h
@@ -98,6 +98,7 @@ public:
// nsIStreamListener methods:
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength);
// nsFtpProtocolConnection methods:
diff --git a/mozilla/netwerk/protocol/http/public/nsIHttpEventSink.h b/mozilla/netwerk/protocol/http/public/nsIHttpEventSink.h
index 50d23504732..87766d0e98e 100644
--- a/mozilla/netwerk/protocol/http/public/nsIHttpEventSink.h
+++ b/mozilla/netwerk/protocol/http/public/nsIHttpEventSink.h
@@ -19,7 +19,7 @@
#ifndef nsIHttpEventSink_h___
#define nsIHttpEventSink_h___
-#include "nsISupports.h"
+#include "nsIStreamListener.h"
#include "nscore.h"
class nsIUrl;
@@ -37,7 +37,7 @@ class nsIUrl;
* argument of nsINetService::NewConnection for http URLs. It defines
* the callbacks to the application program (the html parser).
*/
-class nsIHttpEventSink : public nsISupports
+class nsIHttpEventSink : public nsIStreamListener
{
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IHTTPEVENTSINK_IID);
@@ -45,12 +45,17 @@ public:
/**
* Notify the EventSink that progress as occurred for the URL load.
*/
- NS_IMETHOD OnProgress(nsIUrl* aURL, PRUint32 aProgress, PRUint32 aProgressMax) = 0;
+ NS_IMETHOD OnProgress(nsISupports* context, PRUint32 aProgress, PRUint32 aProgressMax) = 0;
/**
* Notify the EventSink with a status message for the URL load.
*/
- NS_IMETHOD OnStatus(nsIUrl* aURL, const PRUnichar* aMsg) = 0;
+ NS_IMETHOD OnStatus(nsISupports* context, const PRUnichar* aMsg) = 0;
+
+ /**
+ * Called after the headers have been received signaling that they now may be accessed.
+ */
+ NS_IMETHOD OnHeadersAvailable(nsISupports* context) = 0;
};
diff --git a/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.cpp b/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.cpp
index c8dc77adfa2..5f35f682887 100644
--- a/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.cpp
+++ b/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.cpp
@@ -241,6 +241,10 @@ nsHttpProtocolConnection::Get(void)
rv = Write(in, CRLF, 2);
if (NS_FAILED(rv)) goto done;
+ // blank line to end the request
+ rv = Write(in, CRLF, 2);
+ if (NS_FAILED(rv)) goto done;
+
// send it to the server:
rv = mTransport->AsyncWrite(in,
NS_STATIC_CAST(nsIProtocolConnection*, this),
@@ -316,9 +320,25 @@ nsHttpProtocolConnection::OnStopBinding(nsISupports* context,
NS_IMETHODIMP
nsHttpProtocolConnection::OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength)
{
- return NS_ERROR_NOT_IMPLEMENTED;
+ nsresult rv = NS_OK;
+ switch (mState) {
+ case WAITING_REPLY:
+ // data coming in for our request
+
+ // XXX do some header parsing here
+
+// mEventSink->OnProgress();
+ rv = mEventSink->OnDataAvailable(context, aIStream, aSourceOffset, aLength);
+
+ break;
+ default:
+ NS_NOTREACHED("bad state");
+ break;
+ }
+ return rv;
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.h b/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.h
index b80827b55a3..89498687cb7 100644
--- a/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.h
+++ b/mozilla/netwerk/protocol/http/src/nsHttpProtocolConnection.h
@@ -63,6 +63,7 @@ public:
// nsIStreamListener methods:
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength);
// nsHttpProtocolConnection methods:
diff --git a/mozilla/netwerk/test/TestFileInput.cpp b/mozilla/netwerk/test/TestFileInput.cpp
index 6181dc6a884..03854c7668d 100644
--- a/mozilla/netwerk/test/TestFileInput.cpp
+++ b/mozilla/netwerk/test/TestFileInput.cpp
@@ -93,6 +93,7 @@ public:
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength) {
PR_CEnterMonitor(this);
char buf[1025];
@@ -171,6 +172,7 @@ Simulated_nsFileTransport_Run(nsReader* reader, const char* path)
nsIInputStream* fileStr = nsnull;
nsIByteBufferInputStream* bufStr = nsnull;
nsFileSpec spec(path);
+ PRUint32 sourceOffset = 0;
rv = reader->OnStartBinding(nsnull);
if (NS_FAILED(rv)) goto done; // XXX should this abort the transfer?
@@ -194,8 +196,10 @@ Simulated_nsFileTransport_Run(nsReader* reader, const char* path)
}
if (NS_FAILED(rv)) break;
- rv = reader->OnDataAvailable(nsnull, bufStr, amt);
+ rv = reader->OnDataAvailable(nsnull, bufStr, sourceOffset, amt);
if (NS_FAILED(rv)) break;
+
+ sourceOffset += amt;
}
done:
diff --git a/mozilla/netwerk/test/TestSocketIO.cpp b/mozilla/netwerk/test/TestSocketIO.cpp
index ca0360187e3..5dd53cf6b82 100644
--- a/mozilla/netwerk/test/TestSocketIO.cpp
+++ b/mozilla/netwerk/test/TestSocketIO.cpp
@@ -29,6 +29,7 @@
#include "nsIStreamListener.h"
#include "nsIInputStream.h"
#include "nsIByteBufferInputStream.h"
+#include "nsCRT.h"
#ifdef XP_PC
#define XPCOM_DLL "xpcom32.dll"
@@ -62,6 +63,7 @@ public:
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength);
NS_IMETHOD OnStopBinding(nsISupports* context,
@@ -95,6 +97,7 @@ InputTestConsumer::OnStartBinding(nsISupports* context)
NS_IMETHODIMP
InputTestConsumer::OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength)
{
char buf[1025];
@@ -226,7 +229,7 @@ main(int argc, char* argv[])
rv = NS_NewByteBufferInputStream(&stream);
if (NS_FAILED(rv)) return rv;
- char *buffer = PR_smprintf("GET %s HTML/1.0\r\n\r\n", fileName);
+ char *buffer = PR_smprintf("GET %s HTML/1.0%s%s", fileName, CRLF, CRLF);
stream->Fill(buffer, strlen(buffer), &bytesWritten);
printf("\n+++ Request is: %s\n", buffer);
diff --git a/mozilla/netwerk/test/TestSocketInput.cpp b/mozilla/netwerk/test/TestSocketInput.cpp
index 79f6f8a587f..d7c572313cf 100644
--- a/mozilla/netwerk/test/TestSocketInput.cpp
+++ b/mozilla/netwerk/test/TestSocketInput.cpp
@@ -57,6 +57,7 @@ public:
NS_IMETHOD OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength);
NS_IMETHOD OnStopBinding(nsISupports* context,
@@ -90,6 +91,7 @@ InputTestConsumer::OnStartBinding(nsISupports* context)
NS_IMETHODIMP
InputTestConsumer::OnDataAvailable(nsISupports* context,
nsIInputStream *aIStream,
+ PRUint32 aSourceOffset,
PRUint32 aLength)
{
char buf[1025];