dom/file/MemoryStreams.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/file/MemoryStreams.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,90 @@
     1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* vim: set ts=2 et sw=2 tw=80: */
     1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +#include "MemoryStreams.h"
    1.11 +
    1.12 +#include "nsStreamUtils.h"
    1.13 +
    1.14 +USING_FILE_NAMESPACE
    1.15 +
    1.16 +// static
    1.17 +already_AddRefed<MemoryOutputStream>
    1.18 +MemoryOutputStream::Create(uint64_t aSize)
    1.19 +{
    1.20 +  NS_ASSERTION(aSize, "Passed zero size!");
    1.21 +
    1.22 +  NS_ENSURE_TRUE(aSize <= UINT32_MAX, nullptr);
    1.23 +
    1.24 +  nsRefPtr<MemoryOutputStream> stream = new MemoryOutputStream();
    1.25 +
    1.26 +  char* dummy;
    1.27 +  uint32_t length = stream->mData.GetMutableData(&dummy, aSize, fallible_t());
    1.28 +  NS_ENSURE_TRUE(length == aSize, nullptr);
    1.29 +
    1.30 +  return stream.forget();
    1.31 +}
    1.32 +
    1.33 +NS_IMPL_ISUPPORTS(MemoryOutputStream, nsIOutputStream)
    1.34 +
    1.35 +NS_IMETHODIMP
    1.36 +MemoryOutputStream::Close()
    1.37 +{
    1.38 +  mData.Truncate(mOffset);
    1.39 +  return NS_OK;
    1.40 +}
    1.41 +
    1.42 +NS_IMETHODIMP
    1.43 +MemoryOutputStream::Write(const char* aBuf, uint32_t aCount, uint32_t* _retval)
    1.44 +{
    1.45 +  return WriteSegments(NS_CopySegmentToBuffer, (char*)aBuf, aCount, _retval);
    1.46 +}
    1.47 +
    1.48 +NS_IMETHODIMP
    1.49 +MemoryOutputStream::Flush()
    1.50 +{
    1.51 +  return NS_OK;
    1.52 +}
    1.53 +
    1.54 +NS_IMETHODIMP
    1.55 +MemoryOutputStream::WriteFrom(nsIInputStream* aFromStream, uint32_t aCount,
    1.56 +                              uint32_t* _retval)
    1.57 +{
    1.58 +  return NS_ERROR_NOT_IMPLEMENTED;
    1.59 +}
    1.60 +
    1.61 +NS_IMETHODIMP
    1.62 +MemoryOutputStream::WriteSegments(nsReadSegmentFun aReader, void* aClosure,
    1.63 +                                  uint32_t aCount, uint32_t* _retval)
    1.64 +{
    1.65 +  NS_ASSERTION(mData.Length() >= mOffset, "Bad stream state!");
    1.66 +
    1.67 +  uint32_t maxCount = mData.Length() - mOffset;
    1.68 +  if (maxCount == 0) {
    1.69 +    *_retval = 0;
    1.70 +    return NS_OK;
    1.71 +  }
    1.72 +
    1.73 +  if (aCount > maxCount) {
    1.74 +    aCount = maxCount;
    1.75 +  }
    1.76 +
    1.77 +  nsresult rv = aReader(this, aClosure, mData.BeginWriting() + mOffset, 0,
    1.78 +                        aCount, _retval);
    1.79 +  if (NS_SUCCEEDED(rv)) {
    1.80 +    NS_ASSERTION(*_retval <= aCount,
    1.81 +                 "Reader should not read more than we asked it to read!");
    1.82 +    mOffset += *_retval;
    1.83 +  }
    1.84 +
    1.85 +  return NS_OK;
    1.86 +}
    1.87 +
    1.88 +NS_IMETHODIMP
    1.89 +MemoryOutputStream::IsNonBlocking(bool* _retval)
    1.90 +{
    1.91 +  *_retval = false;
    1.92 +  return NS_OK;
    1.93 +}

mercurial