netwerk/base/PartiallySeekableInputStream.h
author Andrew Osmond <aosmond@mozilla.com>
Fri, 17 Nov 2017 06:45:28 -0500
changeset 392351 b9a29d94ccac646c9336fa75e084bbc8581501ad
parent 385944 09796501dad641249aea7702179c5a287d0f773a
child 396188 4c8f363c833225ef34bbf10b9f418e2cb8a0c774
permissions -rw-r--r--
Bug 1368776 - Part 15. Cache flags passed to ImageResource::GetImageContainerImpl for consistency. r=tnikkel When FLAG_HIGH_QUALITY_SCALING is used, we need to make sure we continue using that flag when we update the container. We should also use it for comparing whether or not an existing image container is equivalent.

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 PartiallySeekableInputStream_h
#define PartiallySeekableInputStream_h

#include "mozilla/Attributes.h"
#include "nsCOMPtr.h"
#include "nsIAsyncInputStream.h"
#include "nsICloneableInputStream.h"
#include "nsIIPCSerializableInputStream.h"
#include "nsISeekableStream.h"

namespace mozilla {
namespace net {

// A wrapper for making a stream seekable for the first |aBufferSize| bytes.
// Note that this object takes the ownership of the underlying stream.

class PartiallySeekableInputStream final : public nsISeekableStream
                                         , public nsIAsyncInputStream
                                         , public nsICloneableInputStream
                                         , public nsIIPCSerializableInputStream
                                         , public nsIInputStreamCallback
{
public:
  NS_DECL_THREADSAFE_ISUPPORTS
  NS_DECL_NSIINPUTSTREAM
  NS_DECL_NSISEEKABLESTREAM
  NS_DECL_NSIASYNCINPUTSTREAM
  NS_DECL_NSICLONEABLEINPUTSTREAM
  NS_DECL_NSIIPCSERIALIZABLEINPUTSTREAM
  NS_DECL_NSIINPUTSTREAMCALLBACK

  explicit PartiallySeekableInputStream(already_AddRefed<nsIInputStream> aInputStream,
                                        uint64_t aBufferSize = 4096);

private:
  ~PartiallySeekableInputStream();

  nsCOMPtr<nsIInputStream> mInputStream;

  // Raw pointers because these are just QI of mInputStream.
  nsICloneableInputStream* mWeakCloneableInputStream;
  nsIIPCSerializableInputStream* mWeakIPCSerializableInputStream;
  nsIAsyncInputStream* mWeakAsyncInputStream;

  nsCOMPtr<nsIInputStreamCallback> mAsyncWaitCallback;

  nsTArray<char> mCachedBuffer;

  uint64_t mBufferSize;
  uint64_t mPos;
  bool mClosed;
};

} // net namespace
} // mozilla namespace

#endif // PartiallySeekableInputStream_h