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 #include "PersistenceType.h"
11 #include "nsLiteralString.h"
14 namespace mozilla::dom::quota
{
18 constexpr auto kPersistentCString
= "persistent"_ns
;
19 constexpr auto kTemporaryCString
= "temporary"_ns
;
20 constexpr auto kDefaultCString
= "default"_ns
;
21 constexpr auto kPrivateCString
= "private"_ns
;
23 constexpr auto kPermanentString
= u
"permanent"_ns
;
24 constexpr auto kTemporaryString
= u
"temporary"_ns
;
25 constexpr auto kDefaultString
= u
"default"_ns
;
26 constexpr auto kPrivateString
= u
"private"_ns
;
28 static_assert(PERSISTENCE_TYPE_PERSISTENT
== 0 &&
29 PERSISTENCE_TYPE_TEMPORARY
== 1 &&
30 PERSISTENCE_TYPE_DEFAULT
== 2 &&
31 PERSISTENCE_TYPE_PRIVATE
== 3 &&
32 PERSISTENCE_TYPE_INVALID
== 4,
33 "Incorrect enum values!");
35 template <PersistenceType type
>
36 struct PersistenceTypeTraits
;
39 struct PersistenceTypeTraits
<PERSISTENCE_TYPE_PERSISTENT
> {
43 static bool From(const nsACString
& aString
) {
44 return aString
== kPersistentCString
;
47 static bool From(const int32_t aInt32
) { return aInt32
== 0; }
49 static bool From(nsIFile
& aFile
) {
50 nsAutoString leafName
;
51 MOZ_ALWAYS_SUCCEEDS(aFile
.GetLeafName(leafName
));
52 return leafName
== kPermanentString
;
58 PersistenceTypeTraits
<PERSISTENCE_TYPE_PERSISTENT
>::To
<nsLiteralCString
>() {
59 return kPersistentCString
;
63 struct PersistenceTypeTraits
<PERSISTENCE_TYPE_TEMPORARY
> {
67 static bool From(const nsACString
& aString
) {
68 return aString
== kTemporaryCString
;
71 static bool From(const int32_t aInt32
) { return aInt32
== 1; }
73 static bool From(nsIFile
& aFile
) {
74 nsAutoString leafName
;
75 MOZ_ALWAYS_SUCCEEDS(aFile
.GetLeafName(leafName
));
76 return leafName
== kTemporaryString
;
82 PersistenceTypeTraits
<PERSISTENCE_TYPE_TEMPORARY
>::To
<nsLiteralCString
>() {
83 return kTemporaryCString
;
87 struct PersistenceTypeTraits
<PERSISTENCE_TYPE_DEFAULT
> {
91 static bool From(const nsACString
& aString
) {
92 return aString
== kDefaultCString
;
95 static bool From(const int32_t aInt32
) { return aInt32
== 2; }
97 static bool From(nsIFile
& aFile
) {
98 nsAutoString leafName
;
99 MOZ_ALWAYS_SUCCEEDS(aFile
.GetLeafName(leafName
));
100 return leafName
== kDefaultString
;
106 PersistenceTypeTraits
<PERSISTENCE_TYPE_DEFAULT
>::To
<nsLiteralCString
>() {
107 return kDefaultCString
;
111 struct PersistenceTypeTraits
<PERSISTENCE_TYPE_PRIVATE
> {
112 template <typename T
>
115 static bool From(const nsACString
& aString
) {
116 return aString
== kPrivateCString
;
119 static bool From(const int32_t aInt32
) { return aInt32
== 3; }
121 static bool From(nsIFile
& aFile
) {
122 nsAutoString leafName
;
123 MOZ_ALWAYS_SUCCEEDS(aFile
.GetLeafName(leafName
));
124 return leafName
== kPrivateString
;
130 PersistenceTypeTraits
<PERSISTENCE_TYPE_PRIVATE
>::To
<nsLiteralCString
>() {
131 return kPrivateCString
;
134 template <typename T
>
135 Maybe
<T
> TypeTo_impl(const PersistenceType aPersistenceType
) {
136 switch (aPersistenceType
) {
137 case PERSISTENCE_TYPE_PERSISTENT
:
138 return Some(PersistenceTypeTraits
<PERSISTENCE_TYPE_PERSISTENT
>::To
<T
>());
140 case PERSISTENCE_TYPE_TEMPORARY
:
141 return Some(PersistenceTypeTraits
<PERSISTENCE_TYPE_TEMPORARY
>::To
<T
>());
143 case PERSISTENCE_TYPE_DEFAULT
:
144 return Some(PersistenceTypeTraits
<PERSISTENCE_TYPE_DEFAULT
>::To
<T
>());
146 case PERSISTENCE_TYPE_PRIVATE
:
147 return Some(PersistenceTypeTraits
<PERSISTENCE_TYPE_PRIVATE
>::To
<T
>());
154 template <typename T
>
155 Maybe
<PersistenceType
> TypeFrom_impl(T
& aData
) {
156 if (PersistenceTypeTraits
<PERSISTENCE_TYPE_PERSISTENT
>::From(aData
)) {
157 return Some(PERSISTENCE_TYPE_PERSISTENT
);
160 if (PersistenceTypeTraits
<PERSISTENCE_TYPE_TEMPORARY
>::From(aData
)) {
161 return Some(PERSISTENCE_TYPE_TEMPORARY
);
164 if (PersistenceTypeTraits
<PERSISTENCE_TYPE_DEFAULT
>::From(aData
)) {
165 return Some(PERSISTENCE_TYPE_DEFAULT
);
168 if (PersistenceTypeTraits
<PERSISTENCE_TYPE_PRIVATE
>::From(aData
)) {
169 return Some(PERSISTENCE_TYPE_PRIVATE
);
175 void BadPersistenceType() { MOZ_CRASH("Bad persistence type value!"); }
179 bool IsValidPersistenceType(const PersistenceType aPersistenceType
) {
180 switch (aPersistenceType
) {
181 case PERSISTENCE_TYPE_PERSISTENT
:
182 case PERSISTENCE_TYPE_TEMPORARY
:
183 case PERSISTENCE_TYPE_DEFAULT
:
184 case PERSISTENCE_TYPE_PRIVATE
:
192 bool IsBestEffortPersistenceType(const PersistenceType aPersistenceType
) {
193 switch (aPersistenceType
) {
194 case PERSISTENCE_TYPE_TEMPORARY
:
195 case PERSISTENCE_TYPE_DEFAULT
:
196 case PERSISTENCE_TYPE_PRIVATE
:
199 case PERSISTENCE_TYPE_PERSISTENT
:
200 case PERSISTENCE_TYPE_INVALID
:
206 nsLiteralCString
PersistenceTypeToString(
207 const PersistenceType aPersistenceType
) {
208 const auto maybeString
= TypeTo_impl
<nsLiteralCString
>(aPersistenceType
);
209 if (maybeString
.isNothing()) {
210 BadPersistenceType();
212 return maybeString
.value();
215 Maybe
<PersistenceType
> PersistenceTypeFromString(const nsACString
& aString
,
217 return TypeFrom_impl(aString
);
220 PersistenceType
PersistenceTypeFromString(const nsACString
& aString
) {
221 const auto maybePersistenceType
= TypeFrom_impl(aString
);
222 if (maybePersistenceType
.isNothing()) {
223 BadPersistenceType();
225 return maybePersistenceType
.value();
228 Maybe
<PersistenceType
> PersistenceTypeFromInt32(const int32_t aInt32
,
230 return TypeFrom_impl(aInt32
);
233 Maybe
<PersistenceType
> PersistenceTypeFromFile(nsIFile
& aFile
,
235 return TypeFrom_impl(aFile
);
238 std::array
<PersistenceType
, 2> ComplementaryPersistenceTypes(
239 const PersistenceType aPersistenceType
) {
240 MOZ_ASSERT(aPersistenceType
== PERSISTENCE_TYPE_DEFAULT
||
241 aPersistenceType
== PERSISTENCE_TYPE_TEMPORARY
||
242 aPersistenceType
== PERSISTENCE_TYPE_PRIVATE
);
244 if (aPersistenceType
== PERSISTENCE_TYPE_TEMPORARY
) {
245 return {PERSISTENCE_TYPE_DEFAULT
, PERSISTENCE_TYPE_PRIVATE
};
248 if (aPersistenceType
== PERSISTENCE_TYPE_DEFAULT
) {
249 return {PERSISTENCE_TYPE_TEMPORARY
, PERSISTENCE_TYPE_PRIVATE
};
252 return {PERSISTENCE_TYPE_DEFAULT
, PERSISTENCE_TYPE_TEMPORARY
};
255 } // namespace mozilla::dom::quota