зеркало из https://github.com/mozilla/gecko-dev.git
180 строки
5.2 KiB
C++
180 строки
5.2 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* 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
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#ifndef nsByteBufferInputStream_h__
|
|
#define nsByteBufferInputStream_h__
|
|
|
|
#include "nsIByteBufferInputStream.h"
|
|
#include "nsCRT.h"
|
|
|
|
class nsByteBufferInputStream;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class nsByteBufferOutputStream : public nsIOutputStream
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
|
|
// nsIBaseStream methods:
|
|
NS_IMETHOD Close(void);
|
|
|
|
// nsIOutputStream methods:
|
|
NS_IMETHOD Write(const char* aBuf, PRUint32 aCount, PRUint32 *aWriteCount);
|
|
NS_IMETHOD Write(nsIInputStream* fromStream, PRUint32 *aWriteCount);
|
|
NS_IMETHOD Flush(void);
|
|
|
|
// nsByteBufferOutputStream methods:
|
|
nsByteBufferOutputStream(nsByteBufferInputStream* in);
|
|
virtual ~nsByteBufferOutputStream();
|
|
|
|
protected:
|
|
nsByteBufferInputStream* mInputStream;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class nsByteBufferInputStream : public nsIByteBufferInputStream
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
|
|
// nsIBaseStream methods:
|
|
NS_IMETHOD Close(void);
|
|
|
|
// nsIInputStream methods:
|
|
NS_IMETHOD GetLength(PRUint32 *aLength);
|
|
NS_IMETHOD Read(char* aBuf, PRUint32 aCount, PRUint32 *aReadCount);
|
|
|
|
// nsIByteBufferInputStream methods:
|
|
NS_IMETHOD Fill(nsIInputStream* stream, PRUint32 *aWriteCount);
|
|
NS_IMETHOD Fill(const char* aBuf, PRUint32 aCount, PRUint32 *aWriteCount);
|
|
|
|
// nsByteBufferInputStream methods:
|
|
nsByteBufferInputStream(PRBool blocking, PRUint32 size);
|
|
virtual ~nsByteBufferInputStream();
|
|
|
|
friend class nsByteBufferOutputStream;
|
|
|
|
nsresult Init(void);
|
|
nsresult SetEOF(void);
|
|
nsresult Drain(void);
|
|
|
|
PRBool AtEOF() { return mEOF && (mReadCursor == mWriteCursor) && !mFull; }
|
|
|
|
PRUint32 ReadableAmount() {
|
|
if (mReadCursor < mWriteCursor)
|
|
return mWriteCursor - mReadCursor;
|
|
else if (mReadCursor == mWriteCursor && !mFull)
|
|
return 0;
|
|
else
|
|
return (mLength - mReadCursor) + mWriteCursor;
|
|
}
|
|
|
|
PRUint32 WritableAmount() {
|
|
if (mWriteCursor < mReadCursor)
|
|
return mWriteCursor - mReadCursor;
|
|
else if (mReadCursor == mWriteCursor && mFull)
|
|
return 0;
|
|
else
|
|
return (mLength - mWriteCursor) + mReadCursor;
|
|
}
|
|
|
|
void ReadChunk(char* toBuf, PRUint32 max,
|
|
PRUint32 end, PRUint32 *totalRef)
|
|
{
|
|
NS_ASSERTION(mReadCursor <= end, "bad range");
|
|
PRUint32 diff = end - mReadCursor;
|
|
PRInt32 amt = PR_MIN(max, diff);
|
|
if (amt > 0) {
|
|
nsCRT::memcpy(toBuf, &mBuffer[mReadCursor], amt);
|
|
#ifdef DEBUG_warren
|
|
// nsCRT::memset(&mBuffer[mReadCursor], 0xDD, amt);
|
|
#endif
|
|
mReadCursor += amt;
|
|
*totalRef += amt;
|
|
}
|
|
}
|
|
|
|
nsresult WriteChunk(nsIInputStream* in,
|
|
PRUint32 end, PRUint32 *totalRef)
|
|
{
|
|
NS_ASSERTION(mWriteCursor <= end, "bad range");
|
|
PRUint32 amt = end - mWriteCursor;
|
|
if (amt > 0) {
|
|
PRUint32 readAmt;
|
|
nsresult rv = in->Read(&mBuffer[mWriteCursor], amt, &readAmt);
|
|
if (NS_FAILED(rv)) return rv;
|
|
mWriteCursor += readAmt;
|
|
*totalRef += readAmt;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
protected:
|
|
char* mBuffer;
|
|
PRUint32 mLength;
|
|
PRUint32 mReadCursor;
|
|
PRUint32 mWriteCursor;
|
|
PRBool mFull;
|
|
PRBool mClosed;
|
|
PRBool mEOF;
|
|
PRBool mBlocking;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class nsDummyBufferStream : public nsIInputStream
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
|
|
// nsIBaseStream methods:
|
|
NS_IMETHOD Close(void) {
|
|
NS_NOTREACHED("nsDummyBufferStream::Close");
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
// nsIInputStream methods:
|
|
NS_IMETHOD GetLength(PRUint32 *aLength) {
|
|
*aLength = mLength;
|
|
return NS_OK;
|
|
}
|
|
NS_IMETHOD Read(char* aBuf, PRUint32 aCount, PRUint32 *aReadCount) {
|
|
PRUint32 amt = PR_MIN(aCount, mLength);
|
|
if (amt > 0) {
|
|
nsCRT::memcpy(aBuf, mBuffer, amt);
|
|
mBuffer += amt;
|
|
mLength -= amt;
|
|
}
|
|
*aReadCount = amt;
|
|
return NS_OK;
|
|
}
|
|
|
|
// nsDummyBufferStream methods:
|
|
nsDummyBufferStream(const char* buffer, PRUint32 length)
|
|
: mBuffer(buffer), mLength(length) {}
|
|
virtual ~nsDummyBufferStream() {}
|
|
|
|
protected:
|
|
const char* mBuffer;
|
|
PRUint32 mLength;
|
|
};
|
|
|
|
#endif // nsByteBufferInputStream_h__
|