forked from mirrors/gecko-dev
This change aims to make the way that the nsStringInputStream owns the backing data buffer more flexible. This has a few impacts, including allowing arbitrarily large payload sizes on 64-bit platforms, not requiring as complex checks around borrowed string buffers or nsTArray data storage, and supporting custom data ownership schemes such as those used by blobs. The new system uses a separate refcounted object internally to provide the contiguous backing buffer, with the nsStringInputStream wrapping it and providing the `nsIInputStream` interface and cursor. This also avoids issues around the buffer being mutated during reads, as mutating the `nsIInputStream` no longer mutates the actual data storage object. Differential Revision: https://phabricator.services.mozilla.com/D135162
58 lines
1.6 KiB
C++
58 lines
1.6 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_StreamBufferSource_h
|
|
#define mozilla_StreamBufferSource_h
|
|
|
|
#include "mozilla/MemoryReporting.h"
|
|
#include "nsString.h"
|
|
#include "nsISupportsImpl.h"
|
|
|
|
namespace mozilla {
|
|
|
|
class StreamBufferSource {
|
|
public:
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(StreamBufferSource)
|
|
|
|
virtual Span<const char> Data() = 0;
|
|
|
|
virtual nsresult GetData(nsACString& aString) {
|
|
Span<const char> data = Data();
|
|
if (!aString.Assign(data.Elements(), data.Length(), fallible)) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
virtual bool Owning() = 0;
|
|
|
|
virtual size_t SizeOfExcludingThisIfUnshared(MallocSizeOf aMallocSizeOf) {
|
|
return SizeOfExcludingThisEvenIfShared(aMallocSizeOf);
|
|
}
|
|
size_t SizeOfIncludingThisIfUnshared(MallocSizeOf aMallocSizeOf) {
|
|
if (mRefCnt > 1) {
|
|
return 0;
|
|
}
|
|
size_t n = aMallocSizeOf(this);
|
|
n += SizeOfExcludingThisIfUnshared(aMallocSizeOf);
|
|
return n;
|
|
}
|
|
|
|
virtual size_t SizeOfExcludingThisEvenIfShared(
|
|
MallocSizeOf aMallocSizeOf) = 0;
|
|
size_t SizeOfIncludingThisEvenIfShared(MallocSizeOf aMallocSizeOf) {
|
|
size_t n = aMallocSizeOf(this);
|
|
n += SizeOfExcludingThisEvenIfShared(aMallocSizeOf);
|
|
return n;
|
|
}
|
|
|
|
protected:
|
|
virtual ~StreamBufferSource() = default;
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_StreamBufferSource_h
|