1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "MemoryStreams.h"
9 #include "nsStreamUtils.h"
14 already_AddRefed
<MemoryOutputStream
>
15 MemoryOutputStream::Create(uint64_t aSize
)
17 NS_ASSERTION(aSize
, "Passed zero size!");
19 NS_ENSURE_TRUE(aSize
<= UINT32_MAX
, nullptr);
21 nsRefPtr
<MemoryOutputStream
> stream
= new MemoryOutputStream();
24 uint32_t length
= stream
->mData
.GetMutableData(&dummy
, aSize
, fallible_t());
25 NS_ENSURE_TRUE(length
== aSize
, nullptr);
27 return stream
.forget();
30 NS_IMPL_THREADSAFE_ISUPPORTS1(MemoryOutputStream
, nsIOutputStream
)
33 MemoryOutputStream::Close()
35 mData
.Truncate(mOffset
);
40 MemoryOutputStream::Write(const char* aBuf
, uint32_t aCount
, uint32_t* _retval
)
42 return WriteSegments(NS_CopySegmentToBuffer
, (char*)aBuf
, aCount
, _retval
);
46 MemoryOutputStream::Flush()
52 MemoryOutputStream::WriteFrom(nsIInputStream
* aFromStream
, uint32_t aCount
,
55 return NS_ERROR_NOT_IMPLEMENTED
;
59 MemoryOutputStream::WriteSegments(nsReadSegmentFun aReader
, void* aClosure
,
60 uint32_t aCount
, uint32_t* _retval
)
62 NS_ASSERTION(mData
.Length() >= mOffset
, "Bad stream state!");
64 uint32_t maxCount
= mData
.Length() - mOffset
;
70 if (aCount
> maxCount
) {
74 nsresult rv
= aReader(this, aClosure
, mData
.BeginWriting() + mOffset
, 0,
76 if (NS_SUCCEEDED(rv
)) {
77 NS_ASSERTION(*_retval
<= aCount
,
78 "Reader should not read more than we asked it to read!");
86 MemoryOutputStream::IsNonBlocking(bool* _retval
)