diff --git a/mozilla/content/html/style/src/nsCSSScanner.cpp b/mozilla/content/html/style/src/nsCSSScanner.cpp
index dae971a213b..063c40ae6e8 100644
--- a/mozilla/content/html/style/src/nsCSSScanner.cpp
+++ b/mozilla/content/html/style/src/nsCSSScanner.cpp
@@ -310,7 +310,7 @@ PRInt32 nsCSSScanner::Read(PRInt32& aErrorCode)
}
if (mOffset == mCount) {
mOffset = 0;
- aErrorCode = mInput->Read(mBuffer, 0, BUFFER_SIZE, (PRUint32*)&mCount);
+ aErrorCode = mInput->Read(mBuffer, BUFFER_SIZE, (PRUint32*)&mCount);
if (NS_FAILED(aErrorCode) || mCount == 0) {
mCount = 0;
return -1;
diff --git a/mozilla/htmlparser/src/nsExpatDriver.cpp b/mozilla/htmlparser/src/nsExpatDriver.cpp
index 47706867234..67916bd6eae 100644
--- a/mozilla/htmlparser/src/nsExpatDriver.cpp
+++ b/mozilla/htmlparser/src/nsExpatDriver.cpp
@@ -609,7 +609,7 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
mInExternalDTD = PR_TRUE;
- while (NS_SUCCEEDED(uniIn->Read(uniBuff, 0, 1024, &readCount)) && result) {
+ while (NS_SUCCEEDED(uniIn->Read(uniBuff, 1024, &readCount)) && result) {
if (readCount) {
// Pass the buffer to expat for parsing
result = XML_Parse(entParser, (char *)uniBuff, readCount * sizeof(PRUnichar), 0);
diff --git a/mozilla/intl/uconv/src/nsConverterInputStream.cpp b/mozilla/intl/uconv/src/nsConverterInputStream.cpp
index f93e052be1b..57c9d77cb71 100644
--- a/mozilla/intl/uconv/src/nsConverterInputStream.cpp
+++ b/mozilla/intl/uconv/src/nsConverterInputStream.cpp
@@ -95,7 +95,6 @@ nsConverterInputStream::Close()
NS_IMETHODIMP
nsConverterInputStream::Read(PRUnichar* aBuf,
- PRUint32 aOffset,
PRUint32 aCount,
PRUint32 *aReadCount)
{
@@ -112,13 +111,56 @@ nsConverterInputStream::Read(PRUnichar* aBuf,
if (rv > aCount) {
rv = aCount;
}
- memcpy(aBuf + aOffset, mUnicharData->GetBuffer() + mUnicharDataOffset,
+ memcpy(aBuf, mUnicharData->GetBuffer() + mUnicharDataOffset,
rv * sizeof(PRUnichar));
mUnicharDataOffset += rv;
*aReadCount = rv;
return NS_OK;
}
+NS_IMETHODIMP
+nsConverterInputStream::ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount, PRUint32 *aReadCount)
+{
+ NS_ASSERTION(mUnicharDataLength >= mUnicharDataOffset, "unsigned madness");
+ PRUint32 bytesToWrite = mUnicharDataLength - mUnicharDataOffset;
+ nsresult rv;
+ if (0 == bytesToWrite) {
+ // Fill the unichar buffer
+ bytesToWrite = Fill(&rv);
+ if (bytesToWrite <= 0) {
+ *aReadCount = 0;
+ return rv;
+ }
+ }
+
+ if (bytesToWrite > aCount)
+ bytesToWrite = aCount;
+
+ PRUint32 bytesWritten;
+ PRUint32 totalBytesWritten = 0;
+
+ while (bytesToWrite) {
+ rv = aWriter(this, aClosure,
+ mUnicharData->GetBuffer() + mUnicharDataOffset,
+ totalBytesWritten, bytesToWrite, &bytesWritten);
+ if (NS_FAILED(rv)) {
+ // don't propagate errors to the caller
+ break;
+ }
+
+ bytesToWrite -= bytesWritten;
+ totalBytesWritten += bytesWritten;
+ mUnicharDataOffset += bytesWritten;
+
+ }
+
+ *aReadCount = totalBytesWritten;
+
+ return NS_OK;
+}
+
PRUint32
nsConverterInputStream::Fill(nsresult * aErrorCode)
{
diff --git a/mozilla/intl/uconv/src/nsConverterInputStream.h b/mozilla/intl/uconv/src/nsConverterInputStream.h
index 8039247e619..02658447b6b 100644
--- a/mozilla/intl/uconv/src/nsConverterInputStream.h
+++ b/mozilla/intl/uconv/src/nsConverterInputStream.h
@@ -58,12 +58,14 @@ class nsConverterInputStream : nsIConverterInputStream {
public:
NS_DECL_ISUPPORTS
NS_IMETHOD Read(PRUnichar* aBuf,
- PRUint32 aOffset,
PRUint32 aCount,
PRUint32 *aReadCount);
NS_IMETHOD Close();
NS_IMETHOD Init(nsIInputStream* aStream, const PRUnichar *aCharset,
PRInt32 aBufferSize, PRBool aRecoverFromErrors);
+ NS_IMETHOD ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount, PRUint32* aReadCount);
nsConverterInputStream() :
mLastErrorCode(NS_OK),
diff --git a/mozilla/layout/style/nsCSSScanner.cpp b/mozilla/layout/style/nsCSSScanner.cpp
index dae971a213b..063c40ae6e8 100644
--- a/mozilla/layout/style/nsCSSScanner.cpp
+++ b/mozilla/layout/style/nsCSSScanner.cpp
@@ -310,7 +310,7 @@ PRInt32 nsCSSScanner::Read(PRInt32& aErrorCode)
}
if (mOffset == mCount) {
mOffset = 0;
- aErrorCode = mInput->Read(mBuffer, 0, BUFFER_SIZE, (PRUint32*)&mCount);
+ aErrorCode = mInput->Read(mBuffer, BUFFER_SIZE, (PRUint32*)&mCount);
if (NS_FAILED(aErrorCode) || mCount == 0) {
mCount = 0;
return -1;
diff --git a/mozilla/parser/htmlparser/src/nsExpatDriver.cpp b/mozilla/parser/htmlparser/src/nsExpatDriver.cpp
index 47706867234..67916bd6eae 100644
--- a/mozilla/parser/htmlparser/src/nsExpatDriver.cpp
+++ b/mozilla/parser/htmlparser/src/nsExpatDriver.cpp
@@ -609,7 +609,7 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
mInExternalDTD = PR_TRUE;
- while (NS_SUCCEEDED(uniIn->Read(uniBuff, 0, 1024, &readCount)) && result) {
+ while (NS_SUCCEEDED(uniIn->Read(uniBuff, 1024, &readCount)) && result) {
if (readCount) {
// Pass the buffer to expat for parsing
result = XML_Parse(entParser, (char *)uniBuff, readCount * sizeof(PRUnichar), 0);
diff --git a/mozilla/xpcom/ds/nsIUnicharBuffer.h b/mozilla/xpcom/ds/nsIUnicharBuffer.h
index cde829ece0c..b788ee18a2e 100644
--- a/mozilla/xpcom/ds/nsIUnicharBuffer.h
+++ b/mozilla/xpcom/ds/nsIUnicharBuffer.h
@@ -39,7 +39,6 @@
#include "nscore.h"
#include "nsISupports.h"
-class nsIUnicharInputStream;
#define NS_IUNICHARBUFFER_IID \
{ 0x14cf6970, 0x93b5, 0x11d1, \
@@ -55,8 +54,6 @@ public:
NS_IMETHOD_(PRInt32) GetBufferSize() const = 0;
NS_IMETHOD_(PRUnichar*) GetBuffer() const = 0;
NS_IMETHOD_(PRBool) Grow(PRInt32 aNewSize) = 0;
- NS_IMETHOD_(PRInt32) Fill(nsresult* aErrorCode, nsIUnicharInputStream* aStream,
- PRInt32 aKeep) = 0;
};
/// Factory method for nsIUnicharBuffer.
diff --git a/mozilla/xpcom/ds/nsPersistentProperties.cpp b/mozilla/xpcom/ds/nsPersistentProperties.cpp
index 463ee2b5286..8c6665cdd92 100644
--- a/mozilla/xpcom/ds/nsPersistentProperties.cpp
+++ b/mozilla/xpcom/ds/nsPersistentProperties.cpp
@@ -369,7 +369,7 @@ nsPersistentProperties::Read()
PRUint32 nRead;
nsresult ret;
- ret = mIn->Read(&c, 0, 1, &nRead);
+ ret = mIn->Read(&c, 1, &nRead);
if (ret == NS_OK && nRead == 1) {
return c;
}
diff --git a/mozilla/xpcom/ds/nsUnicharBuffer.cpp b/mozilla/xpcom/ds/nsUnicharBuffer.cpp
index 58cfd1306f7..3ef8492cd7e 100644
--- a/mozilla/xpcom/ds/nsUnicharBuffer.cpp
+++ b/mozilla/xpcom/ds/nsUnicharBuffer.cpp
@@ -37,7 +37,6 @@
* ***** END LICENSE BLOCK ***** */
#include "nsUnicharBuffer.h"
-#include "nsIUnicharInputStream.h"
#include "nsCRT.h"
#define MIN_BUFFER_SIZE 32
@@ -122,40 +121,6 @@ UnicharBufferImpl::Grow(PRInt32 aNewSize)
return PR_FALSE;
}
-NS_IMETHODIMP_(PRInt32)
-UnicharBufferImpl::Fill(nsresult* aErrorCode,
- nsIUnicharInputStream* aStream,
- PRInt32 aKeep)
-{
- NS_PRECONDITION(nsnull != aStream, "null stream");
- NS_PRECONDITION(PRUint32(aKeep) < PRUint32(mLength), "illegal keep count");
- if ((nsnull == aStream) || (PRUint32(aKeep) >= PRUint32(mLength))) {
- // whoops
- *aErrorCode = NS_BASE_STREAM_ILLEGAL_ARGS;
- return -1;
- }
-
- if (0 != aKeep) {
- // Slide over kept data
- memmove(mBuffer, mBuffer + (mLength - aKeep),
- aKeep * sizeof(PRUnichar));
- }
-
- // Read in some new data
- mLength = aKeep;
- PRInt32 amount = mSpace - aKeep;
- PRUint32 nb;
- NS_ASSERTION(aKeep >= 0, "unsigned madness");
- NS_ASSERTION(amount >= 0, "unsigned madness");
- *aErrorCode = aStream->Read(mBuffer, (PRUint32)aKeep, (PRUint32)amount, &nb);
- if (NS_SUCCEEDED(*aErrorCode)) {
- mLength += nb;
- }
- else
- nb = 0;
- return nb;
-}
-
NS_COM nsresult
NS_NewUnicharBuffer(nsIUnicharBuffer** aInstancePtrResult,
nsISupports* aOuter,
diff --git a/mozilla/xpcom/ds/nsUnicharBuffer.h b/mozilla/xpcom/ds/nsUnicharBuffer.h
index ff9cacbdef1..413ba46543d 100644
--- a/mozilla/xpcom/ds/nsUnicharBuffer.h
+++ b/mozilla/xpcom/ds/nsUnicharBuffer.h
@@ -54,8 +54,6 @@ public:
NS_IMETHOD_(PRInt32) GetBufferSize() const;
NS_IMETHOD_(PRUnichar*) GetBuffer() const;
NS_IMETHOD_(PRBool) Grow(PRInt32 aNewSize);
- NS_IMETHOD_(PRInt32) Fill(nsresult* aErrorCode, nsIUnicharInputStream* aStream,
- PRInt32 aKeep);
PRUnichar* mBuffer;
PRUint32 mSpace;
diff --git a/mozilla/xpcom/io/nsIUnicharInputStream.h b/mozilla/xpcom/io/nsIUnicharInputStream.h
index 3dbbc5c139a..a8635533358 100644
--- a/mozilla/xpcom/io/nsIUnicharInputStream.h
+++ b/mozilla/xpcom/io/nsIUnicharInputStream.h
@@ -41,6 +41,14 @@
#include "nscore.h"
class nsString;
+class nsIUnicharInputStream;
+
+typedef NS_CALLBACK(nsWriteUnicharSegmentFun)(nsIUnicharInputStream *aInStream,
+ void *aClosure,
+ const PRUnichar *aFromSegment,
+ PRUint32 aToOffset,
+ PRUint32 aCount,
+ PRUint32 *aWriteCount);
#define NS_IUNICHAR_INPUT_STREAM_IID \
{ 0x2d97fbf0, 0x93b5, 0x11d1, \
@@ -49,15 +57,18 @@ class nsString;
/** Abstract unicode character input stream
* @see nsIInputStream
*/
-class nsIUnicharInputStream : public nsISupports {
+class NS_NO_VTABLE nsIUnicharInputStream : public nsISupports {
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IUNICHAR_INPUT_STREAM_IID)
NS_IMETHOD Read(PRUnichar* aBuf,
- PRUint32 aOffset,
PRUint32 aCount,
PRUint32 *aReadCount) = 0;
NS_IMETHOD Close() = 0;
+ NS_IMETHOD ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount,
+ PRUint32 *aReadCount) = 0;
};
/**
diff --git a/mozilla/xpcom/io/nsUnicharInputStream.cpp b/mozilla/xpcom/io/nsUnicharInputStream.cpp
index 6e2779284b5..ced7c850b64 100644
--- a/mozilla/xpcom/io/nsUnicharInputStream.cpp
+++ b/mozilla/xpcom/io/nsUnicharInputStream.cpp
@@ -57,9 +57,11 @@ public:
NS_DECL_ISUPPORTS
NS_IMETHOD Read(PRUnichar* aBuf,
- PRUint32 aOffset,
PRUint32 aCount,
PRUint32 *aReadCount);
+ NS_IMETHOD ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount, PRUint32* aReadCount);
NS_IMETHOD Close();
nsString* mString;
@@ -81,10 +83,10 @@ StringUnicharInputStream::~StringUnicharInputStream()
}
}
-nsresult StringUnicharInputStream::Read(PRUnichar* aBuf,
- PRUint32 aOffset,
- PRUint32 aCount,
- PRUint32 *aReadCount)
+NS_IMETHODIMP
+StringUnicharInputStream::Read(PRUnichar* aBuf,
+ PRUint32 aCount,
+ PRUint32 *aReadCount)
{
if (mPos >= mLen) {
*aReadCount = 0;
@@ -102,6 +104,36 @@ nsresult StringUnicharInputStream::Read(PRUnichar* aBuf,
return NS_OK;
}
+NS_IMETHODIMP
+StringUnicharInputStream::ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount, PRUint32 *aReadCount)
+{
+ PRUint32 bytesWritten;
+ PRUint32 totalBytesWritten = 0;
+
+ nsresult rv;
+ aCount = PR_MIN(mString->Length() - mPos, aCount);
+
+ while (aCount) {
+ rv = aWriter(this, aClosure, mString->get() + mPos,
+ totalBytesWritten, aCount, &bytesWritten);
+
+ if (NS_FAILED(rv)) {
+ // don't propagate errors to the caller
+ break;
+ }
+
+ aCount -= bytesWritten;
+ totalBytesWritten += bytesWritten;
+ mPos += bytesWritten;
+ }
+
+ *aReadCount = totalBytesWritten;
+
+ return NS_OK;
+}
+
nsresult StringUnicharInputStream::Close()
{
mPos = mLen;
@@ -143,9 +175,12 @@ public:
NS_DECL_ISUPPORTS
NS_IMETHOD Read(PRUnichar* aBuf,
- PRUint32 aOffset,
PRUint32 aCount,
PRUint32 *aReadCount);
+ NS_IMETHOD ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount,
+ PRUint32 *aReadCount);
NS_IMETHOD Close();
protected:
@@ -203,7 +238,6 @@ nsresult UTF8InputStream::Close()
}
nsresult UTF8InputStream::Read(PRUnichar* aBuf,
- PRUint32 aOffset,
PRUint32 aCount,
PRUint32 *aReadCount)
{
@@ -221,13 +255,56 @@ nsresult UTF8InputStream::Read(PRUnichar* aBuf,
if (rv > aCount) {
rv = aCount;
}
- memcpy(aBuf + aOffset, mUnicharData->GetBuffer() + mUnicharDataOffset,
+ memcpy(aBuf, mUnicharData->GetBuffer() + mUnicharDataOffset,
rv * sizeof(PRUnichar));
mUnicharDataOffset += rv;
*aReadCount = rv;
return NS_OK;
}
+NS_IMETHODIMP
+UTF8InputStream::ReadSegments(nsWriteUnicharSegmentFun aWriter,
+ void* aClosure,
+ PRUint32 aCount, PRUint32 *aReadCount)
+{
+ NS_ASSERTION(mUnicharDataLength >= mUnicharDataOffset, "unsigned madness");
+ PRUint32 bytesToWrite = mUnicharDataLength - mUnicharDataOffset;
+ nsresult rv = NS_OK;
+ if (0 == bytesToWrite) {
+ // Fill the unichar buffer
+ bytesToWrite = Fill(&rv);
+ if (bytesToWrite <= 0) {
+ *aReadCount = 0;
+ return rv;
+ }
+ }
+
+ if (bytesToWrite > aCount)
+ bytesToWrite = aCount;
+
+ PRUint32 bytesWritten;
+ PRUint32 totalBytesWritten = 0;
+
+ while (bytesToWrite) {
+ rv = aWriter(this, aClosure,
+ mUnicharData->GetBuffer() + mUnicharDataOffset,
+ totalBytesWritten, bytesToWrite, &bytesWritten);
+
+ if (NS_FAILED(rv)) {
+ // don't propagate errors to the caller
+ break;
+ }
+
+ bytesToWrite -= bytesWritten;
+ totalBytesWritten += bytesWritten;
+ mUnicharDataOffset += bytesWritten;
+ }
+
+ *aReadCount = totalBytesWritten;
+
+ return NS_OK;
+}
+
PRInt32 UTF8InputStream::Fill(nsresult * aErrorCode)
{
if (nsnull == mInput) {