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 mozilla_dom_MultipartBlobImpl_h 8 #define mozilla_dom_MultipartBlobImpl_h 9 10 #include <utility> 11 12 #include "Blob.h" 13 #include "mozilla/Attributes.h" 14 #include "mozilla/Maybe.h" 15 #include "mozilla/dom/BaseBlobImpl.h" 16 17 namespace mozilla { 18 class ErrorResult; 19 20 namespace dom { 21 22 // This is just a sentinel value to be sure that we don't call 23 // SetLengthAndModifiedDate more than once. 24 constexpr int64_t MULTIPARTBLOBIMPL_UNKNOWN_LAST_MODIFIED = INT64_MAX; 25 constexpr uint64_t MULTIPARTBLOBIMPL_UNKNOWN_LENGTH = UINT64_MAX; 26 27 class MultipartBlobImpl final : public BaseBlobImpl { 28 public: 29 NS_INLINE_DECL_REFCOUNTING_INHERITED(MultipartBlobImpl, BaseBlobImpl) 30 31 // Create as a file 32 static already_AddRefed<MultipartBlobImpl> Create( 33 nsTArray<RefPtr<BlobImpl>>&& aBlobImpls, const nsAString& aName, 34 const nsAString& aContentType, bool aCrossOriginIsolated, 35 ErrorResult& aRv); 36 37 // Create as a blob 38 static already_AddRefed<MultipartBlobImpl> Create( 39 nsTArray<RefPtr<BlobImpl>>&& aBlobImpls, const nsAString& aContentType, 40 ErrorResult& aRv); 41 42 // Create as a file to be later initialized MultipartBlobImpl(const nsAString & aName)43 explicit MultipartBlobImpl(const nsAString& aName) 44 : BaseBlobImpl(aName, u""_ns, MULTIPARTBLOBIMPL_UNKNOWN_LENGTH, 45 MULTIPARTBLOBIMPL_UNKNOWN_LAST_MODIFIED) {} 46 47 // Create as a blob to be later initialized MultipartBlobImpl()48 MultipartBlobImpl() 49 : BaseBlobImpl(u""_ns, MULTIPARTBLOBIMPL_UNKNOWN_LENGTH) {} 50 51 void InitializeBlob(bool aCrossOriginIsolated, ErrorResult& aRv); 52 53 void InitializeBlob(const Sequence<Blob::BlobPart>& aData, 54 const nsAString& aContentType, bool aNativeEOL, 55 bool aCrossOriginIsolated, ErrorResult& aRv); 56 57 already_AddRefed<BlobImpl> CreateSlice(uint64_t aStart, uint64_t aLength, 58 const nsAString& aContentType, 59 ErrorResult& aRv) override; 60 GetSize(ErrorResult & aRv)61 uint64_t GetSize(ErrorResult& aRv) override { return mLength; } 62 63 void CreateInputStream(nsIInputStream** aInputStream, 64 ErrorResult& aRv) override; 65 GetSubBlobImpls()66 const nsTArray<RefPtr<BlobImpl>>* GetSubBlobImpls() const override { 67 return mBlobImpls.Length() ? &mBlobImpls : nullptr; 68 } 69 SetName(const nsAString & aName)70 void SetName(const nsAString& aName) { mName = aName; } 71 72 size_t GetAllocationSize() const override; 73 size_t GetAllocationSize( 74 FallibleTArray<BlobImpl*>& aVisitedBlobImpls) const override; 75 76 void GetBlobImplType(nsAString& aBlobImplType) const override; 77 78 void SetLastModified(int64_t aLastModified); 79 80 protected: 81 // File constructor. MultipartBlobImpl(nsTArray<RefPtr<BlobImpl>> && aBlobImpls,const nsAString & aName,const nsAString & aContentType)82 MultipartBlobImpl(nsTArray<RefPtr<BlobImpl>>&& aBlobImpls, 83 const nsAString& aName, const nsAString& aContentType) 84 : BaseBlobImpl(aName, aContentType, MULTIPARTBLOBIMPL_UNKNOWN_LENGTH, 85 MULTIPARTBLOBIMPL_UNKNOWN_LAST_MODIFIED), 86 mBlobImpls(std::move(aBlobImpls)) {} 87 88 // Blob constructor. MultipartBlobImpl(nsTArray<RefPtr<BlobImpl>> && aBlobImpls,const nsAString & aContentType)89 MultipartBlobImpl(nsTArray<RefPtr<BlobImpl>>&& aBlobImpls, 90 const nsAString& aContentType) 91 : BaseBlobImpl(aContentType, MULTIPARTBLOBIMPL_UNKNOWN_LENGTH), 92 mBlobImpls(std::move(aBlobImpls)) {} 93 94 ~MultipartBlobImpl() = default; 95 96 void SetLengthAndModifiedDate(const Maybe<bool>& aCrossOriginIsolated, 97 ErrorResult& aRv); 98 99 nsTArray<RefPtr<BlobImpl>> mBlobImpls; 100 }; 101 102 } // namespace dom 103 } // namespace mozilla 104 105 #endif // mozilla_dom_MultipartBlobImpl_h 106