Line data Source code
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 "mozilla/Attributes.h"
11 : #include "mozilla/ErrorResult.h"
12 : #include "mozilla/Move.h"
13 : #include "mozilla/dom/BaseBlobImpl.h"
14 :
15 : namespace mozilla {
16 : namespace dom {
17 :
18 : class MultipartBlobImpl final : public BaseBlobImpl
19 : {
20 : public:
21 : NS_DECL_ISUPPORTS_INHERITED
22 :
23 : // Create as a file
24 : static already_AddRefed<MultipartBlobImpl>
25 : Create(nsTArray<RefPtr<BlobImpl>>&& aBlobImpls,
26 : const nsAString& aName,
27 : const nsAString& aContentType,
28 : ErrorResult& aRv);
29 :
30 : // Create as a blob
31 : static already_AddRefed<MultipartBlobImpl>
32 : Create(nsTArray<RefPtr<BlobImpl>>&& aBlobImpls,
33 : const nsAString& aContentType,
34 : ErrorResult& aRv);
35 :
36 : // Create as a file to be later initialized
37 0 : explicit MultipartBlobImpl(const nsAString& aName)
38 0 : : BaseBlobImpl(aName, EmptyString(), UINT64_MAX),
39 0 : mIsFromNsIFile(false)
40 : {
41 0 : }
42 :
43 : // Create as a blob to be later initialized
44 0 : MultipartBlobImpl()
45 0 : : BaseBlobImpl(EmptyString(), UINT64_MAX),
46 0 : mIsFromNsIFile(false)
47 : {
48 0 : }
49 :
50 : void InitializeBlob(ErrorResult& aRv);
51 :
52 : void InitializeBlob(const Sequence<Blob::BlobPart>& aData,
53 : const nsAString& aContentType,
54 : bool aNativeEOL,
55 : ErrorResult& aRv);
56 :
57 : nsresult InitializeChromeFile(nsIFile* aData,
58 : const nsAString& aType,
59 : const nsAString& aName,
60 : bool aLastModifiedPassed,
61 : int64_t aLastModified,
62 : bool aIsFromNsIFile);
63 :
64 : virtual already_AddRefed<BlobImpl>
65 : CreateSlice(uint64_t aStart, uint64_t aLength,
66 : const nsAString& aContentType,
67 : ErrorResult& aRv) override;
68 :
69 0 : virtual uint64_t GetSize(ErrorResult& aRv) override
70 : {
71 0 : return mLength;
72 : }
73 :
74 : virtual void GetInternalStream(nsIInputStream** aInputStream,
75 : ErrorResult& aRv) override;
76 :
77 0 : virtual const nsTArray<RefPtr<BlobImpl>>* GetSubBlobImpls() const override
78 : {
79 0 : return mBlobImpls.Length() ? &mBlobImpls : nullptr;
80 : }
81 :
82 : virtual void GetMozFullPathInternal(nsAString& aFullPath,
83 : ErrorResult& aRv) const override;
84 :
85 : virtual nsresult
86 : SetMutable(bool aMutable) override;
87 :
88 : void SetName(const nsAString& aName)
89 : {
90 : mName = aName;
91 : }
92 :
93 : virtual bool MayBeClonedToOtherThreads() const override;
94 :
95 : protected:
96 0 : MultipartBlobImpl(nsTArray<RefPtr<BlobImpl>>&& aBlobImpls,
97 : const nsAString& aName,
98 : const nsAString& aContentType)
99 0 : : BaseBlobImpl(aName, aContentType, UINT64_MAX),
100 0 : mBlobImpls(Move(aBlobImpls)),
101 0 : mIsFromNsIFile(false)
102 : {
103 0 : }
104 :
105 0 : MultipartBlobImpl(nsTArray<RefPtr<BlobImpl>>&& aBlobImpls,
106 : const nsAString& aContentType)
107 0 : : BaseBlobImpl(aContentType, UINT64_MAX),
108 0 : mBlobImpls(Move(aBlobImpls)),
109 0 : mIsFromNsIFile(false)
110 : {
111 0 : }
112 :
113 0 : virtual ~MultipartBlobImpl() {}
114 :
115 : void SetLengthAndModifiedDate(ErrorResult& aRv);
116 :
117 : nsTArray<RefPtr<BlobImpl>> mBlobImpls;
118 : bool mIsFromNsIFile;
119 : };
120 :
121 : } // dom namespace
122 : } // mozilla namespace
123 :
124 : #endif // mozilla_dom_MultipartBlobImpl_h
|