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_quota_filestreams_h__
8 #define mozilla_dom_quota_filestreams_h__
9 
10 #include "QuotaCommon.h"
11 
12 #include "nsFileStreams.h"
13 
14 #include "PersistenceType.h"
15 #include "QuotaObject.h"
16 
17 BEGIN_QUOTA_NAMESPACE
18 
19 template <class FileStreamBase>
20 class FileQuotaStream : public FileStreamBase
21 {
22 public:
23   // nsFileStreamBase override
24   NS_IMETHOD
25   SetEOF() override;
26 
27   NS_IMETHOD
28   Close() override;
29 
30 protected:
FileQuotaStream(PersistenceType aPersistenceType,const nsACString & aGroup,const nsACString & aOrigin)31   FileQuotaStream(PersistenceType aPersistenceType, const nsACString& aGroup,
32                   const nsACString& aOrigin)
33   : mPersistenceType(aPersistenceType), mGroup(aGroup), mOrigin(aOrigin)
34   { }
35 
36   // nsFileStreamBase override
37   virtual nsresult
38   DoOpen() override;
39 
40   PersistenceType mPersistenceType;
41   nsCString mGroup;
42   nsCString mOrigin;
43   RefPtr<QuotaObject> mQuotaObject;
44 };
45 
46 template <class FileStreamBase>
47 class FileQuotaStreamWithWrite : public FileQuotaStream<FileStreamBase>
48 {
49 public:
50   // nsFileStreamBase override
51   NS_IMETHOD
52   Write(const char* aBuf, uint32_t aCount, uint32_t* _retval) override;
53 
54 protected:
FileQuotaStreamWithWrite(PersistenceType aPersistenceType,const nsACString & aGroup,const nsACString & aOrigin)55   FileQuotaStreamWithWrite(PersistenceType aPersistenceType,
56                            const nsACString& aGroup, const nsACString& aOrigin)
57   : FileQuotaStream<FileStreamBase>(aPersistenceType, aGroup, aOrigin)
58   { }
59 };
60 
61 class FileInputStream : public FileQuotaStream<nsFileInputStream>
62 {
63 public:
64   NS_DECL_ISUPPORTS_INHERITED
65 
66   static already_AddRefed<FileInputStream>
67   Create(PersistenceType aPersistenceType, const nsACString& aGroup,
68          const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags = -1,
69          int32_t aPerm = -1, int32_t aBehaviorFlags = 0);
70 
71 private:
FileInputStream(PersistenceType aPersistenceType,const nsACString & aGroup,const nsACString & aOrigin)72   FileInputStream(PersistenceType aPersistenceType, const nsACString& aGroup,
73                   const nsACString& aOrigin)
74   : FileQuotaStream<nsFileInputStream>(aPersistenceType, aGroup, aOrigin)
75   { }
76 
~FileInputStream()77   virtual ~FileInputStream() {
78     Close();
79   }
80 };
81 
82 class FileOutputStream : public FileQuotaStreamWithWrite<nsFileOutputStream>
83 {
84 public:
85   NS_DECL_ISUPPORTS_INHERITED
86 
87   static already_AddRefed<FileOutputStream>
88   Create(PersistenceType aPersistenceType, const nsACString& aGroup,
89          const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags = -1,
90          int32_t aPerm = -1, int32_t aBehaviorFlags = 0);
91 
92 private:
FileOutputStream(PersistenceType aPersistenceType,const nsACString & aGroup,const nsACString & aOrigin)93   FileOutputStream(PersistenceType aPersistenceType, const nsACString& aGroup,
94                    const nsACString& aOrigin)
95   : FileQuotaStreamWithWrite<nsFileOutputStream>(aPersistenceType, aGroup,
96                                                  aOrigin)
97   { }
98 
~FileOutputStream()99   virtual ~FileOutputStream() {
100     Close();
101   }
102 };
103 
104 class FileStream : public FileQuotaStreamWithWrite<nsFileStream>
105 {
106 public:
107   NS_DECL_ISUPPORTS_INHERITED
108 
109   static already_AddRefed<FileStream>
110   Create(PersistenceType aPersistenceType, const nsACString& aGroup,
111          const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags = -1,
112          int32_t aPerm = -1, int32_t aBehaviorFlags = 0);
113 
114 private:
FileStream(PersistenceType aPersistenceType,const nsACString & aGroup,const nsACString & aOrigin)115   FileStream(PersistenceType aPersistenceType, const nsACString& aGroup,
116              const nsACString& aOrigin)
117   : FileQuotaStreamWithWrite<nsFileStream>(aPersistenceType, aGroup, aOrigin)
118   { }
119 
~FileStream()120   virtual ~FileStream() {
121     Close();
122   }
123 };
124 
125 END_QUOTA_NAMESPACE
126 
127 #endif /* mozilla_dom_quota_filestreams_h__ */
128