1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
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
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "SimpleBuffer.h"
13 SimpleBuffer::SimpleBuffer() : mStatus(NS_OK
), mAvailable(0) {}
15 nsresult
SimpleBuffer::Write(char *src
, size_t len
) {
16 NS_ASSERT_OWNINGTHREAD(SimpleBuffer
);
17 if (NS_FAILED(mStatus
)) {
22 SimpleBufferPage
*p
= mBufferList
.getLast();
23 if (p
&& (p
->mWriteOffset
== SimpleBufferPage::kSimpleBufferPageSize
)) {
24 // no room.. make a new page
28 p
= new (fallible
) SimpleBufferPage();
30 mStatus
= NS_ERROR_OUT_OF_MEMORY
;
33 mBufferList
.insertBack(p
);
36 SimpleBufferPage::kSimpleBufferPageSize
- p
->mWriteOffset
;
37 size_t toWrite
= std::min(roomOnPage
, len
);
38 memcpy(p
->mBuffer
+ p
->mWriteOffset
, src
, toWrite
);
41 p
->mWriteOffset
+= toWrite
;
42 mAvailable
+= toWrite
;
47 size_t SimpleBuffer::Read(char *dest
, size_t maxLen
) {
48 NS_ASSERT_OWNINGTHREAD(SimpleBuffer
);
49 if (NS_FAILED(mStatus
)) {
54 for (SimpleBufferPage
*p
= mBufferList
.getFirst(); p
&& (rv
< maxLen
);
55 p
= mBufferList
.getFirst()) {
56 size_t avail
= p
->mWriteOffset
- p
->mReadOffset
;
57 size_t toRead
= std::min(avail
, (maxLen
- rv
));
58 memcpy(dest
+ rv
, p
->mBuffer
+ p
->mReadOffset
, toRead
);
60 p
->mReadOffset
+= toRead
;
61 if (p
->mReadOffset
== p
->mWriteOffset
) {
67 MOZ_ASSERT(mAvailable
>= rv
);
72 size_t SimpleBuffer::Available() {
73 NS_ASSERT_OWNINGTHREAD(SimpleBuffer
);
74 return NS_SUCCEEDED(mStatus
) ? mAvailable
: 0;
77 void SimpleBuffer::Clear() {
78 NS_ASSERT_OWNINGTHREAD(SimpleBuffer
);
80 while ((p
= mBufferList
.popFirst())) {
87 } // namespace mozilla