PersistenceType.cpp (7131B)
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 #include "PersistenceType.h" 8 9 #include "nsIFile.h" 10 #include "nsLiteralString.h" 11 #include "nsString.h" 12 13 namespace mozilla::dom::quota { 14 15 namespace { 16 17 constexpr auto kPersistentCString = "persistent"_ns; 18 constexpr auto kTemporaryCString = "temporary"_ns; 19 constexpr auto kDefaultCString = "default"_ns; 20 constexpr auto kPrivateCString = "private"_ns; 21 22 constexpr auto kPermanentString = u"permanent"_ns; 23 constexpr auto kTemporaryString = u"temporary"_ns; 24 constexpr auto kDefaultString = u"default"_ns; 25 constexpr auto kPrivateString = u"private"_ns; 26 27 static_assert(PERSISTENCE_TYPE_PERSISTENT == 0 && 28 PERSISTENCE_TYPE_TEMPORARY == 1 && 29 PERSISTENCE_TYPE_DEFAULT == 2 && 30 PERSISTENCE_TYPE_PRIVATE == 3 && 31 PERSISTENCE_TYPE_INVALID == 4, 32 "Incorrect enum values!"); 33 34 template <PersistenceType type> 35 struct PersistenceTypeTraits; 36 37 template <> 38 struct PersistenceTypeTraits<PERSISTENCE_TYPE_PERSISTENT> { 39 template <typename T> 40 static T To(); 41 42 static bool From(const nsACString& aString) { 43 return aString == kPersistentCString; 44 } 45 46 static bool From(const int32_t aInt32) { return aInt32 == 0; } 47 48 static bool From(nsIFile& aFile) { 49 nsAutoString leafName; 50 MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); 51 return leafName == kPermanentString; 52 } 53 }; 54 55 template <> 56 nsLiteralCString 57 PersistenceTypeTraits<PERSISTENCE_TYPE_PERSISTENT>::To<nsLiteralCString>() { 58 return kPersistentCString; 59 } 60 61 template <> 62 struct PersistenceTypeTraits<PERSISTENCE_TYPE_TEMPORARY> { 63 template <typename T> 64 static T To(); 65 66 static bool From(const nsACString& aString) { 67 return aString == kTemporaryCString; 68 } 69 70 static bool From(const int32_t aInt32) { return aInt32 == 1; } 71 72 static bool From(nsIFile& aFile) { 73 nsAutoString leafName; 74 MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); 75 return leafName == kTemporaryString; 76 } 77 }; 78 79 template <> 80 nsLiteralCString 81 PersistenceTypeTraits<PERSISTENCE_TYPE_TEMPORARY>::To<nsLiteralCString>() { 82 return kTemporaryCString; 83 } 84 85 template <> 86 struct PersistenceTypeTraits<PERSISTENCE_TYPE_DEFAULT> { 87 template <typename T> 88 static T To(); 89 90 static bool From(const nsACString& aString) { 91 return aString == kDefaultCString; 92 } 93 94 static bool From(const int32_t aInt32) { return aInt32 == 2; } 95 96 static bool From(nsIFile& aFile) { 97 nsAutoString leafName; 98 MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); 99 return leafName == kDefaultString; 100 } 101 }; 102 103 template <> 104 nsLiteralCString 105 PersistenceTypeTraits<PERSISTENCE_TYPE_DEFAULT>::To<nsLiteralCString>() { 106 return kDefaultCString; 107 } 108 109 template <> 110 struct PersistenceTypeTraits<PERSISTENCE_TYPE_PRIVATE> { 111 template <typename T> 112 static T To(); 113 114 static bool From(const nsACString& aString) { 115 return aString == kPrivateCString; 116 } 117 118 static bool From(const int32_t aInt32) { return aInt32 == 3; } 119 120 static bool From(nsIFile& aFile) { 121 nsAutoString leafName; 122 MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); 123 return leafName == kPrivateString; 124 } 125 }; 126 127 template <> 128 nsLiteralCString 129 PersistenceTypeTraits<PERSISTENCE_TYPE_PRIVATE>::To<nsLiteralCString>() { 130 return kPrivateCString; 131 } 132 133 template <typename T> 134 Maybe<T> TypeTo_impl(const PersistenceType aPersistenceType) { 135 switch (aPersistenceType) { 136 case PERSISTENCE_TYPE_PERSISTENT: 137 return Some(PersistenceTypeTraits<PERSISTENCE_TYPE_PERSISTENT>::To<T>()); 138 139 case PERSISTENCE_TYPE_TEMPORARY: 140 return Some(PersistenceTypeTraits<PERSISTENCE_TYPE_TEMPORARY>::To<T>()); 141 142 case PERSISTENCE_TYPE_DEFAULT: 143 return Some(PersistenceTypeTraits<PERSISTENCE_TYPE_DEFAULT>::To<T>()); 144 145 case PERSISTENCE_TYPE_PRIVATE: 146 return Some(PersistenceTypeTraits<PERSISTENCE_TYPE_PRIVATE>::To<T>()); 147 148 default: 149 return Nothing(); 150 } 151 } 152 153 template <typename T> 154 Maybe<PersistenceType> TypeFrom_impl(T& aData) { 155 if (PersistenceTypeTraits<PERSISTENCE_TYPE_PERSISTENT>::From(aData)) { 156 return Some(PERSISTENCE_TYPE_PERSISTENT); 157 } 158 159 if (PersistenceTypeTraits<PERSISTENCE_TYPE_TEMPORARY>::From(aData)) { 160 return Some(PERSISTENCE_TYPE_TEMPORARY); 161 } 162 163 if (PersistenceTypeTraits<PERSISTENCE_TYPE_DEFAULT>::From(aData)) { 164 return Some(PERSISTENCE_TYPE_DEFAULT); 165 } 166 167 if (PersistenceTypeTraits<PERSISTENCE_TYPE_PRIVATE>::From(aData)) { 168 return Some(PERSISTENCE_TYPE_PRIVATE); 169 } 170 171 return Nothing(); 172 } 173 174 void BadPersistenceType() { MOZ_CRASH("Bad persistence type value!"); } 175 176 } // namespace 177 178 bool IsValidPersistenceType(const PersistenceType aPersistenceType) { 179 switch (aPersistenceType) { 180 case PERSISTENCE_TYPE_PERSISTENT: 181 case PERSISTENCE_TYPE_TEMPORARY: 182 case PERSISTENCE_TYPE_DEFAULT: 183 case PERSISTENCE_TYPE_PRIVATE: 184 return true; 185 186 default: 187 return false; 188 } 189 } 190 191 bool IsBestEffortPersistenceType(const PersistenceType aPersistenceType) { 192 switch (aPersistenceType) { 193 case PERSISTENCE_TYPE_TEMPORARY: 194 case PERSISTENCE_TYPE_DEFAULT: 195 case PERSISTENCE_TYPE_PRIVATE: 196 return true; 197 198 case PERSISTENCE_TYPE_PERSISTENT: 199 case PERSISTENCE_TYPE_INVALID: 200 default: 201 return false; 202 } 203 } 204 205 nsLiteralCString PersistenceTypeToString( 206 const PersistenceType aPersistenceType) { 207 const auto maybeString = TypeTo_impl<nsLiteralCString>(aPersistenceType); 208 if (maybeString.isNothing()) { 209 BadPersistenceType(); 210 } 211 return maybeString.value(); 212 } 213 214 Maybe<PersistenceType> PersistenceTypeFromString(const nsACString& aString, 215 const fallible_t&) { 216 return TypeFrom_impl(aString); 217 } 218 219 PersistenceType PersistenceTypeFromString(const nsACString& aString) { 220 const auto maybePersistenceType = TypeFrom_impl(aString); 221 if (maybePersistenceType.isNothing()) { 222 BadPersistenceType(); 223 } 224 return maybePersistenceType.value(); 225 } 226 227 Maybe<PersistenceType> PersistenceTypeFromInt32(const int32_t aInt32, 228 const fallible_t&) { 229 return TypeFrom_impl(aInt32); 230 } 231 232 Maybe<PersistenceType> PersistenceTypeFromFile(nsIFile& aFile, 233 const fallible_t&) { 234 return TypeFrom_impl(aFile); 235 } 236 237 std::array<PersistenceType, 2> ComplementaryPersistenceTypes( 238 const PersistenceType aPersistenceType) { 239 MOZ_ASSERT(aPersistenceType == PERSISTENCE_TYPE_DEFAULT || 240 aPersistenceType == PERSISTENCE_TYPE_TEMPORARY || 241 aPersistenceType == PERSISTENCE_TYPE_PRIVATE); 242 243 if (aPersistenceType == PERSISTENCE_TYPE_TEMPORARY) { 244 return {PERSISTENCE_TYPE_DEFAULT, PERSISTENCE_TYPE_PRIVATE}; 245 } 246 247 if (aPersistenceType == PERSISTENCE_TYPE_DEFAULT) { 248 return {PERSISTENCE_TYPE_TEMPORARY, PERSISTENCE_TYPE_PRIVATE}; 249 } 250 251 return {PERSISTENCE_TYPE_DEFAULT, PERSISTENCE_TYPE_TEMPORARY}; 252 } 253 254 } // namespace mozilla::dom::quota