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/. */
7 #ifndef mozilla_dom_quota_filestreams_h__
8 #define mozilla_dom_quota_filestreams_h__
15 #include "mozilla/AlreadyAddRefed.h"
16 #include "mozilla/RefPtr.h"
17 #include "mozilla/dom/quota/CommonMetadata.h"
18 #include "mozilla/dom/quota/PersistenceType.h"
19 #include "mozilla/dom/quota/QuotaObject.h"
20 #include "nsFileStreams.h"
21 #include "nsISupports.h"
30 namespace mozilla::dom::quota
{
34 template <class FileStreamBase
>
35 class FileQuotaStream
: public FileStreamBase
{
37 // nsFileStreamBase override
45 FileQuotaStream(PersistenceType aPersistenceType
,
46 const OriginMetadata
& aOriginMetadata
,
47 Client::Type aClientType
)
48 : mPersistenceType(aPersistenceType
),
49 mOriginMetadata(aOriginMetadata
),
50 mClientType(aClientType
),
51 mDeserialized(false) {}
54 : mPersistenceType(PERSISTENCE_TYPE_INVALID
),
55 mClientType(Client::TYPE_MAX
),
56 mDeserialized(true) {}
58 ~FileQuotaStream() { Close(); }
60 // nsFileStreamBase override
61 virtual nsresult
DoOpen() override
;
63 PersistenceType mPersistenceType
;
64 OriginMetadata mOriginMetadata
;
65 Client::Type mClientType
;
66 RefPtr
<QuotaObject
> mQuotaObject
;
67 const bool mDeserialized
;
70 template <class FileStreamBase
>
71 class FileQuotaStreamWithWrite
: public FileQuotaStream
<FileStreamBase
> {
73 // nsFileStreamBase override
75 Write(const char* aBuf
, uint32_t aCount
, uint32_t* _retval
) override
;
78 FileQuotaStreamWithWrite(PersistenceType aPersistenceType
,
79 const OriginMetadata
& aOriginMetadata
,
80 Client::Type aClientType
)
81 : FileQuotaStream
<FileStreamBase
>(aPersistenceType
, aOriginMetadata
,
84 FileQuotaStreamWithWrite() = default;
87 class FileInputStream
: public FileQuotaStream
<nsFileInputStream
> {
89 NS_INLINE_DECL_REFCOUNTING_INHERITED(FileInputStream
,
90 FileQuotaStream
<nsFileInputStream
>)
92 FileInputStream(PersistenceType aPersistenceType
,
93 const OriginMetadata
& aOriginMetadata
,
94 Client::Type aClientType
)
95 : FileQuotaStream
<nsFileInputStream
>(aPersistenceType
, aOriginMetadata
,
99 virtual ~FileInputStream() { Close(); }
102 class FileOutputStream
: public FileQuotaStreamWithWrite
<nsFileOutputStream
> {
104 NS_INLINE_DECL_REFCOUNTING_INHERITED(
105 FileOutputStream
, FileQuotaStreamWithWrite
<nsFileOutputStream
>);
107 FileOutputStream(PersistenceType aPersistenceType
,
108 const OriginMetadata
& aOriginMetadata
,
109 Client::Type aClientType
)
110 : FileQuotaStreamWithWrite
<nsFileOutputStream
>(
111 aPersistenceType
, aOriginMetadata
, aClientType
) {}
114 virtual ~FileOutputStream() { Close(); }
117 // FileRandomAccessStream type is serializable, but only in a restricted
118 // manner. The type is only safe to serialize in the parent process and only
119 // when the type hasn't been previously deserialized. So the type can be
120 // serialized in the parent process and desrialized in a child process or it
121 // can be serialized in the parent process and deserialized in the parent
122 // process as well (non-e10s mode). The same type can never be
123 // serialized/deserialized more than once.
124 class FileRandomAccessStream
125 : public FileQuotaStreamWithWrite
<nsFileRandomAccessStream
> {
127 NS_INLINE_DECL_REFCOUNTING_INHERITED(
128 FileRandomAccessStream
,
129 FileQuotaStreamWithWrite
<nsFileRandomAccessStream
>)
131 FileRandomAccessStream(PersistenceType aPersistenceType
,
132 const OriginMetadata
& aOriginMetadata
,
133 Client::Type aClientType
)
134 : FileQuotaStreamWithWrite
<nsFileRandomAccessStream
>(
135 aPersistenceType
, aOriginMetadata
, aClientType
) {}
137 FileRandomAccessStream() = default;
139 // nsFileRandomAccessStream override
141 // Serialize this FileRandomAccessStream. This method works only in the
142 // parent process and only with streams which haven't been previously
144 mozilla::ipc::RandomAccessStreamParams
Serialize(
145 nsIInterfaceRequestor
* aCallbacks
) override
;
147 // Deserialize this FileRandomAccessStream. This method works in both the
149 bool Deserialize(mozilla::ipc::RandomAccessStreamParams
& aParams
) override
;
152 virtual ~FileRandomAccessStream() { Close(); }
155 Result
<MovingNotNull
<nsCOMPtr
<nsIInputStream
>>, nsresult
> CreateFileInputStream(
156 PersistenceType aPersistenceType
, const OriginMetadata
& aOriginMetadata
,
157 Client::Type aClientType
, nsIFile
* aFile
, int32_t aIOFlags
= -1,
158 int32_t aPerm
= -1, int32_t aBehaviorFlags
= 0);
160 Result
<MovingNotNull
<nsCOMPtr
<nsIOutputStream
>>, nsresult
>
161 CreateFileOutputStream(PersistenceType aPersistenceType
,
162 const OriginMetadata
& aOriginMetadata
,
163 Client::Type aClientType
, nsIFile
* aFile
,
164 int32_t aIOFlags
= -1, int32_t aPerm
= -1,
165 int32_t aBehaviorFlags
= 0);
167 Result
<MovingNotNull
<nsCOMPtr
<nsIRandomAccessStream
>>, nsresult
>
168 CreateFileRandomAccessStream(PersistenceType aPersistenceType
,
169 const OriginMetadata
& aOriginMetadata
,
170 Client::Type aClientType
, nsIFile
* aFile
,
171 int32_t aIOFlags
= -1, int32_t aPerm
= -1,
172 int32_t aBehaviorFlags
= 0);
174 } // namespace mozilla::dom::quota
176 #endif /* mozilla_dom_quota_filestreams_h__ */