tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

FileSystemWritableFileStream.h (4559B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=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
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef DOM_FS_FILESYSTEMWRITABLEFILESTREAM_H_
      8 #define DOM_FS_FILESYSTEMWRITABLEFILESTREAM_H_
      9 
     10 #include "mozilla/AlreadyAddRefed.h"
     11 #include "mozilla/MozPromise.h"
     12 #include "mozilla/dom/FlippedOnce.h"
     13 #include "mozilla/dom/PFileSystemManager.h"
     14 #include "mozilla/dom/WritableStream.h"
     15 #include "mozilla/dom/quota/ForwardDecls.h"
     16 
     17 class nsIGlobalObject;
     18 class nsIRandomAccessStream;
     19 
     20 namespace mozilla {
     21 
     22 template <typename T>
     23 class Buffer;
     24 class ErrorResult;
     25 class TaskQueue;
     26 
     27 namespace ipc {
     28 class RandomAccessStreamParams;
     29 }
     30 
     31 namespace dom {
     32 
     33 class ArrayBufferViewOrArrayBufferOrBlobOrUTF8StringOrWriteParams;
     34 class Blob;
     35 class FileSystemManager;
     36 class FileSystemWritableFileStreamChild;
     37 class OwningArrayBufferViewOrArrayBufferOrBlobOrUSVString;
     38 class Promise;
     39 class StrongWorkerRef;
     40 
     41 namespace fs {
     42 class FileSystemThreadSafeStreamOwner;
     43 }
     44 
     45 class FileSystemWritableFileStream final : public WritableStream {
     46 public:
     47  using WriteDataPromise =
     48      MozPromise<Maybe<int64_t>, CopyableErrorResult, /* IsExclusive */ true>;
     49 
     50  static Result<RefPtr<FileSystemWritableFileStream>, nsresult> Create(
     51      const nsCOMPtr<nsIGlobalObject>& aGlobal,
     52      RefPtr<FileSystemManager>& aManager,
     53      mozilla::ipc::RandomAccessStreamParams&& aStreamParams,
     54      RefPtr<FileSystemWritableFileStreamChild> aActor,
     55      const fs::FileSystemEntryMetadata& aMetadata);
     56 
     57  NS_DECL_ISUPPORTS_INHERITED
     58  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(FileSystemWritableFileStream,
     59                                           WritableStream)
     60 
     61  void LastRelease() override;
     62 
     63  void ClearActor();
     64 
     65  class Command;
     66  RefPtr<Command> CreateCommand();
     67 
     68  bool IsCommandActive() const;
     69 
     70  bool IsOpen() const;
     71 
     72  bool IsFinishing() const;
     73 
     74  bool IsDone() const;
     75 
     76  [[nodiscard]] RefPtr<BoolPromise> BeginAbort();
     77 
     78  [[nodiscard]] RefPtr<BoolPromise> BeginClose();
     79 
     80  [[nodiscard]] RefPtr<BoolPromise> OnDone();
     81 
     82  already_AddRefed<Promise> Write(JSContext* aCx, JS::Handle<JS::Value> aChunk,
     83                                  ErrorResult& aError);
     84 
     85  // WebIDL Boilerplate
     86  JSObject* WrapObject(JSContext* aCx,
     87                       JS::Handle<JSObject*> aGivenProto) override;
     88 
     89  // WebIDL Interface
     90  MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> Write(
     91      const ArrayBufferViewOrArrayBufferOrBlobOrUTF8StringOrWriteParams& aData,
     92      ErrorResult& aError);
     93 
     94  MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> Seek(uint64_t aPosition,
     95                                                    ErrorResult& aError);
     96 
     97  MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> Truncate(uint64_t aSize,
     98                                                        ErrorResult& aError);
     99 
    100 private:
    101  class CloseHandler;
    102 
    103  FileSystemWritableFileStream(
    104      const nsCOMPtr<nsIGlobalObject>& aGlobal,
    105      RefPtr<FileSystemManager>& aManager,
    106      mozilla::ipc::RandomAccessStreamParams&& aStreamParams,
    107      RefPtr<FileSystemWritableFileStreamChild> aActor,
    108      already_AddRefed<TaskQueue> aTaskQueue,
    109      const fs::FileSystemEntryMetadata& aMetadata);
    110 
    111  virtual ~FileSystemWritableFileStream();
    112 
    113  [[nodiscard]] RefPtr<BoolPromise> BeginFinishing(bool aShouldAbort);
    114 
    115  RefPtr<WriteDataPromise> Write(
    116      ArrayBufferViewOrArrayBufferOrBlobOrUTF8StringOrWriteParams& aData);
    117 
    118  template <typename T>
    119  RefPtr<Int64Promise> Write(const T& aData, const Maybe<uint64_t> aPosition);
    120 
    121  RefPtr<Int64Promise> WriteImpl(nsCOMPtr<nsIInputStream> aInputStream,
    122                                 const Maybe<uint64_t> aPosition);
    123 
    124  RefPtr<BoolPromise> Seek(uint64_t aPosition);
    125 
    126  RefPtr<BoolPromise> Truncate(uint64_t aSize);
    127 
    128  nsresult EnsureStream();
    129 
    130  void NoteFinishedCommand();
    131 
    132  [[nodiscard]] RefPtr<BoolPromise> Finish();
    133 
    134  RefPtr<FileSystemManager> mManager;
    135 
    136  RefPtr<FileSystemWritableFileStreamChild> mActor;
    137 
    138  RefPtr<TaskQueue> mTaskQueue;
    139 
    140  RefPtr<fs::FileSystemThreadSafeStreamOwner> mStreamOwner;
    141 
    142  RefPtr<StrongWorkerRef> mWorkerRef;
    143 
    144  mozilla::ipc::RandomAccessStreamParams mStreamParams;
    145 
    146  fs::FileSystemEntryMetadata mMetadata;
    147 
    148  RefPtr<CloseHandler> mCloseHandler;
    149 
    150  MozPromiseHolder<BoolPromise> mFinishPromiseHolder;
    151 
    152  bool mCommandActive;
    153 };
    154 
    155 }  // namespace dom
    156 }  // namespace mozilla
    157 
    158 #endif  // DOM_FS_FILESYSTEMWRITABLEFILESTREAM_H_