diff --git a/mozilla/xpcom/ds/nsBuffer.cpp b/mozilla/xpcom/ds/nsBuffer.cpp index 23e6e5d89c8..67aa32b3108 100644 --- a/mozilla/xpcom/ds/nsBuffer.cpp +++ b/mozilla/xpcom/ds/nsBuffer.cpp @@ -155,7 +155,7 @@ nsBuffer::Read(char* toBuf, PRUint32 bufLen, PRUint32 *readCount) *readCount = 0; while (bufLen > 0) { - rv = GetReadBuffer(&readBufferLen, &readBuffer); + rv = GetReadBuffer(0, &readBuffer, &readBufferLen); if (rv == NS_BASE_STREAM_EOF) // all we're going to get return *readCount > 0 ? NS_OK : NS_BASE_STREAM_EOF; if (NS_FAILED(rv)) return rv; @@ -181,7 +181,9 @@ nsBuffer::Read(char* toBuf, PRUint32 bufLen, PRUint32 *readCount) } NS_IMETHODIMP -nsBuffer::GetReadBuffer(PRUint32 *readBufferLength, char* *result) +nsBuffer::GetReadBuffer(PRUint32 startPosition, + char* *result, + PRUint32 *readBufferLength) { if (mReadSegment == nsnull) { if (PR_CLIST_IS_EMPTY(&mSegments)) { @@ -229,7 +231,7 @@ nsBuffer::Write(const char* fromBuf, PRUint32 bufLen, PRUint32 *writeCount) while (bufLen > 0) { PRUint32 writeBufLen; char* writeBuf; - rv = GetWriteBuffer(&writeBufLen, &writeBuf); + rv = GetWriteBuffer(0, &writeBuf, &writeBufLen); if (NS_FAILED(rv)) { // if we failed to allocate a new segment, we're probably out // of memory, but we don't care -- just report what we were @@ -254,7 +256,7 @@ nsBuffer::Write(const char* fromBuf, PRUint32 bufLen, PRUint32 *writeCount) } NS_IMETHODIMP -nsBuffer::Write(nsIInputStream* fromStream, PRUint32 *writeCount) +nsBuffer::WriteFrom(nsIInputStream* fromStream, PRUint32 count, PRUint32 *writeCount) { nsresult rv; @@ -262,10 +264,10 @@ nsBuffer::Write(nsIInputStream* fromStream, PRUint32 *writeCount) return NS_BASE_STREAM_EOF; *writeCount = 0; - while (PR_TRUE) { + while (count > 0) { PRUint32 writeBufLen; char* writeBuf; - rv = GetWriteBuffer(&writeBufLen, &writeBuf); + rv = GetWriteBuffer(0, &writeBuf, &writeBufLen); if (NS_FAILED(rv)) { // if we failed to allocate a new segment, we're probably out // of memory, but we don't care -- just report what we were @@ -274,13 +276,14 @@ nsBuffer::Write(nsIInputStream* fromStream, PRUint32 *writeCount) } PRUint32 readCount; - rv = fromStream->Read(writeBuf, writeBufLen, &readCount); + rv = fromStream->Read(writeBuf, PR_MIN(writeBufLen, count), &readCount); if (NS_FAILED(rv)) { // if we failed to read just report what we were // able to write so far return NS_OK; } *writeCount += readCount; + count -= readCount; // set the write cursor after the data is valid if (mWriteCursor + readCount == mWriteSegmentEnd) { mWriteSegment = nsnull; // allocate a new segment next time around @@ -294,7 +297,9 @@ nsBuffer::Write(nsIInputStream* fromStream, PRUint32 *writeCount) } NS_IMETHODIMP -nsBuffer::GetWriteBuffer(PRUint32 *writeBufferLength, char* *result) +nsBuffer::GetWriteBuffer(PRUint32 startPosition, + char* *result, + PRUint32 *writeBufferLength) { if (mEOF) return NS_BASE_STREAM_EOF; diff --git a/mozilla/xpcom/ds/nsBuffer.h b/mozilla/xpcom/ds/nsBuffer.h index 094e6ef88a1..30002e54993 100644 --- a/mozilla/xpcom/ds/nsBuffer.h +++ b/mozilla/xpcom/ds/nsBuffer.h @@ -35,11 +35,15 @@ public: NS_IMETHOD Init(PRUint32 growBySize, PRUint32 maxSize, nsIAllocator* allocator); NS_IMETHOD Read(char* toBuf, PRUint32 bufLen, PRUint32 *readCount); - NS_IMETHOD GetReadBuffer(PRUint32 *readBufferLength, char* *result); + NS_IMETHOD GetReadBuffer(PRUint32 startPosition, + char* *result, + PRUint32 *readBufferLength); NS_IMETHOD Write(const char* fromBuf, PRUint32 bufLen, PRUint32 *writeCount); - NS_IMETHOD Write(nsIInputStream* fromStream, PRUint32 *writeCount); - NS_IMETHOD GetWriteBuffer(PRUint32 *writeBufferLength, char* *result); + NS_IMETHOD WriteFrom(nsIInputStream* fromStream, PRUint32 count, PRUint32 *writeCount); + NS_IMETHOD GetWriteBuffer(PRUint32 startPosition, + char* *result, + PRUint32 *writeBufferLength); NS_IMETHOD SetEOF(); // nsBuffer methods: diff --git a/mozilla/xpcom/ds/nsIBuffer.h b/mozilla/xpcom/ds/nsIBuffer.h index ef05cdff3ea..4c9a42466d5 100644 --- a/mozilla/xpcom/ds/nsIBuffer.h +++ b/mozilla/xpcom/ds/nsIBuffer.h @@ -54,11 +54,15 @@ public: nsIAllocator* allocator) = 0; NS_IMETHOD Read(char* toBuf, PRUint32 bufLen, PRUint32 *readCount) = 0; - NS_IMETHOD GetReadBuffer(PRUint32 *readBufferLength, char* *result) = 0; + NS_IMETHOD GetReadBuffer(PRUint32 startPosition, + char* *result, + PRUint32 *readBufferLength) = 0; NS_IMETHOD Write(const char* fromBuf, PRUint32 bufLen, PRUint32 *writeCount) = 0; - NS_IMETHOD Write(nsIInputStream* fromStream, PRUint32 *writeCount) = 0; - NS_IMETHOD GetWriteBuffer(PRUint32 *writeBufferLength, char* *result) = 0; + NS_IMETHOD WriteFrom(nsIInputStream* fromStream, PRUint32 count, PRUint32 *writeCount) = 0; + NS_IMETHOD GetWriteBuffer(PRUint32 startPosition, + char* *result, + PRUint32 *writeBufferLength) = 0; NS_IMETHOD SetEOF() = 0; }; diff --git a/mozilla/xpcom/io/nsIByteBufferInputStream.h b/mozilla/xpcom/io/nsIByteBufferInputStream.h index b55ab0bd234..f253bd24b39 100644 --- a/mozilla/xpcom/io/nsIByteBufferInputStream.h +++ b/mozilla/xpcom/io/nsIByteBufferInputStream.h @@ -42,7 +42,7 @@ class nsIByteBufferInputStream : public nsIInputStream { public: NS_DEFINE_STATIC_IID_ACCESSOR(NS_IBYTEBUFFERINPUTSTREAM_IID); - NS_IMETHOD Fill(nsIInputStream* stream, PRUint32 *aWriteCount) = 0; + NS_IMETHOD Fill(nsIInputStream* stream, PRUint32 aCount, PRUint32 *aWriteCount) = 0; NS_IMETHOD Fill(const char* aBuf, PRUint32 aCount, PRUint32 *aWriteCount) = 0; diff --git a/mozilla/xpcom/io/nsPipe.cpp b/mozilla/xpcom/io/nsPipe.cpp index 0c31ddf9216..8c9f17810a8 100644 --- a/mozilla/xpcom/io/nsPipe.cpp +++ b/mozilla/xpcom/io/nsPipe.cpp @@ -17,7 +17,7 @@ */ #include "nsIBuffer.h" -#include "nsIInputStream.h" +#include "nsIBufferInputStream.h" #include "nsIOutputStream.h" #include "nsAutoLock.h" @@ -25,7 +25,7 @@ class nsBufferInputStream; //////////////////////////////////////////////////////////////////////////////// -class nsBufferInputStream : public nsIInputStream +class nsBufferInputStream : public nsIBufferInputStream { public: NS_DECL_ISUPPORTS @@ -37,6 +37,11 @@ public: NS_IMETHOD GetLength(PRUint32 *aLength); NS_IMETHOD Read(char* aBuf, PRUint32 aCount, PRUint32 *aReadCount); + // nsIBufferInputStream methods: + NS_IMETHOD GetBuffer(PRUint32 startPosition, char * *bufferSegment, + PRUint32 *bufferSegmentSize); + NS_IMETHOD Find(char * aString, PRInt32 *_retval); + // nsBufferInputStream methods: nsBufferInputStream(nsIBuffer* buf, PRBool blocking); virtual ~nsBufferInputStream(); @@ -45,7 +50,7 @@ public: nsresult rv; PRUint32 amt; char* buf; - rv = mBuffer->GetReadBuffer(&amt, &buf); // should never fail + rv = mBuffer->GetReadBuffer(0, &buf, &amt); // should never fail NS_ASSERTION(NS_SUCCEEDED(rv), "GetInputBuffer failed"); return amt; } @@ -70,7 +75,8 @@ public: // nsIOutputStream methods: NS_IMETHOD Write(const char* aBuf, PRUint32 aCount, PRUint32 *aWriteCount); - NS_IMETHOD Write(nsIInputStream* fromStream, PRUint32 *aWriteCount); + NS_IMETHOD WriteFrom(nsIInputStream* fromStream, PRUint32 aCount, + PRUint32 *aWriteCount); NS_IMETHOD Flush(void); // nsBufferOutputStream methods: @@ -143,7 +149,7 @@ nsBufferInputStream::GetLength(PRUint32 *aLength) return NS_BASE_STREAM_CLOSED; char* buf; - return mBuffer->GetReadBuffer(aLength, &buf); + return mBuffer->GetReadBuffer(0, &buf, aLength); } NS_IMETHODIMP @@ -174,6 +180,19 @@ nsBufferInputStream::Read(char* aBuf, PRUint32 aCount, PRUint32 *aReadCount) return rv; } +NS_IMETHODIMP +nsBufferInputStream::GetBuffer(PRUint32 startPosition, char * *bufferSegment, + PRUint32 *bufferSegmentSize) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +nsBufferInputStream::Find(char * aString, PRInt32 *_retval) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + nsresult nsBufferInputStream::SetEOF() { @@ -206,7 +225,7 @@ nsBufferInputStream::Fill() // check read buffer again while in the monitor PRUint32 amt; char* buf; - rv = mBuffer->GetReadBuffer(&amt, &buf); + rv = mBuffer->GetReadBuffer(0, &buf, &amt); if (rv == NS_BASE_STREAM_EOF) return rv; if (NS_SUCCEEDED(rv) && amt > 0) return NS_OK; @@ -320,7 +339,8 @@ nsBufferOutputStream::Write(const char* aBuf, PRUint32 aCount, PRUint32 *aWriteC } NS_IMETHODIMP -nsBufferOutputStream::Write(nsIInputStream* fromStream, PRUint32 *aWriteCount) +nsBufferOutputStream::WriteFrom(nsIInputStream* fromStream, PRUint32 aCount, + PRUint32 *aWriteCount) { if (mBuffer == nsnull) return NS_BASE_STREAM_CLOSED; @@ -328,9 +348,9 @@ nsBufferOutputStream::Write(nsIInputStream* fromStream, PRUint32 *aWriteCount) nsresult rv = NS_OK; *aWriteCount = 0; - while (PR_TRUE) { // write until fromStream gets EOF + while (aCount > 0) { PRUint32 amt; - rv = mBuffer->Write(fromStream, &amt); + rv = mBuffer->WriteFrom(fromStream, aCount, &amt); if (rv == NS_BASE_STREAM_EOF) return *aWriteCount > 0 ? NS_OK : rv; if (NS_FAILED(rv)) return rv; @@ -339,6 +359,7 @@ nsBufferOutputStream::Write(nsIInputStream* fromStream, PRUint32 *aWriteCount) if (NS_FAILED(rv)) return rv; } else { + aCount -= amt; *aWriteCount += amt; } } @@ -358,7 +379,7 @@ nsBufferOutputStream::Flush(void) // check write buffer again while in the monitor PRUint32 amt; char* buf; - rv = mBuffer->GetWriteBuffer(&amt, &buf); + rv = mBuffer->GetWriteBuffer(0, &buf, &amt); if (rv == NS_BASE_STREAM_EOF) return rv; if (NS_SUCCEEDED(rv) && amt > 0) return NS_OK; diff --git a/mozilla/xpcom/tests/TestBuffers.cpp b/mozilla/xpcom/tests/TestBuffers.cpp index 673777055c3..4eb324d2306 100644 --- a/mozilla/xpcom/tests/TestBuffers.cpp +++ b/mozilla/xpcom/tests/TestBuffers.cpp @@ -39,7 +39,7 @@ public: char buf[100]; PRUint32 readCnt; char* readBuf; - rv = mReadBuffer->GetReadBuffer(&readCnt, &readBuf); + rv = mReadBuffer->GetReadBuffer(0, &readBuf, &readCnt); if (NS_FAILED(rv)) return rv; while (!(mDone && readCnt == 0)) { rv = mReadBuffer->Read(buf, 99, &readCnt); @@ -52,7 +52,7 @@ public: break; mon.Notify(); // wake up writer mon.Wait(); // wait for more - rv = mReadBuffer->GetReadBuffer(&readCnt, &readBuf); + rv = mReadBuffer->GetReadBuffer(0, &readBuf, &readCnt); if (NS_FAILED(rv)) return rv; } else {