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_