/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "PersistenceType.h" #include #include "nsIFile.h" #include "nsLiteralString.h" #include "nsString.h" namespace mozilla::dom::quota { namespace { constexpr auto kPersistentCString = "persistent"_ns; constexpr auto kTemporaryCString = "temporary"_ns; constexpr auto kDefaultCString = "default"_ns; constexpr auto kPrivateCString = "private"_ns; constexpr auto kPermanentString = u"permanent"_ns; constexpr auto kTemporaryString = u"temporary"_ns; constexpr auto kDefaultString = u"default"_ns; constexpr auto kPrivateString = u"private"_ns; static_assert(PERSISTENCE_TYPE_PERSISTENT == 0 && PERSISTENCE_TYPE_TEMPORARY == 1 && PERSISTENCE_TYPE_DEFAULT == 2 && PERSISTENCE_TYPE_PRIVATE == 3 && PERSISTENCE_TYPE_INVALID == 4, "Incorrect enum values!"); template struct PersistenceTypeTraits; template <> struct PersistenceTypeTraits { template static T To(); static bool From(const nsACString& aString) { return aString == kPersistentCString; } static bool From(const int32_t aInt32) { return aInt32 == 0; } static bool From(nsIFile& aFile) { nsAutoString leafName; MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); return leafName == kPermanentString; } }; template <> nsLiteralCString PersistenceTypeTraits::To() { return kPersistentCString; } template <> struct PersistenceTypeTraits { template static T To(); static bool From(const nsACString& aString) { return aString == kTemporaryCString; } static bool From(const int32_t aInt32) { return aInt32 == 1; } static bool From(nsIFile& aFile) { nsAutoString leafName; MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); return leafName == kTemporaryString; } }; template <> nsLiteralCString PersistenceTypeTraits::To() { return kTemporaryCString; } template <> struct PersistenceTypeTraits { template static T To(); static bool From(const nsACString& aString) { return aString == kDefaultCString; } static bool From(const int32_t aInt32) { return aInt32 == 2; } static bool From(nsIFile& aFile) { nsAutoString leafName; MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); return leafName == kDefaultString; } }; template <> nsLiteralCString PersistenceTypeTraits::To() { return kDefaultCString; } template <> struct PersistenceTypeTraits { template static T To(); static bool From(const nsACString& aString) { return aString == kPrivateCString; } static bool From(const int32_t aInt32) { return aInt32 == 3; } static bool From(nsIFile& aFile) { nsAutoString leafName; MOZ_ALWAYS_SUCCEEDS(aFile.GetLeafName(leafName)); return leafName == kPrivateString; } }; template <> nsLiteralCString PersistenceTypeTraits::To() { return kPrivateCString; } template Maybe TypeTo_impl(const PersistenceType aPersistenceType) { switch (aPersistenceType) { case PERSISTENCE_TYPE_PERSISTENT: return Some(PersistenceTypeTraits::To()); case PERSISTENCE_TYPE_TEMPORARY: return Some(PersistenceTypeTraits::To()); case PERSISTENCE_TYPE_DEFAULT: return Some(PersistenceTypeTraits::To()); case PERSISTENCE_TYPE_PRIVATE: return Some(PersistenceTypeTraits::To()); default: return Nothing(); } } template Maybe TypeFrom_impl(T& aData) { if (PersistenceTypeTraits::From(aData)) { return Some(PERSISTENCE_TYPE_PERSISTENT); } if (PersistenceTypeTraits::From(aData)) { return Some(PERSISTENCE_TYPE_TEMPORARY); } if (PersistenceTypeTraits::From(aData)) { return Some(PERSISTENCE_TYPE_DEFAULT); } if (PersistenceTypeTraits::From(aData)) { return Some(PERSISTENCE_TYPE_PRIVATE); } return Nothing(); } void BadPersistenceType() { MOZ_CRASH("Bad persistence type value!"); } } // namespace bool IsValidPersistenceType(const PersistenceType aPersistenceType) { switch (aPersistenceType) { case PERSISTENCE_TYPE_PERSISTENT: case PERSISTENCE_TYPE_TEMPORARY: case PERSISTENCE_TYPE_DEFAULT: case PERSISTENCE_TYPE_PRIVATE: return true; default: return false; } } bool IsBestEffortPersistenceType(const PersistenceType aPersistenceType) { switch (aPersistenceType) { case PERSISTENCE_TYPE_TEMPORARY: case PERSISTENCE_TYPE_DEFAULT: case PERSISTENCE_TYPE_PRIVATE: return true; case PERSISTENCE_TYPE_PERSISTENT: case PERSISTENCE_TYPE_INVALID: default: return false; } } nsLiteralCString PersistenceTypeToString( const PersistenceType aPersistenceType) { const auto maybeString = TypeTo_impl(aPersistenceType); if (maybeString.isNothing()) { BadPersistenceType(); } return maybeString.value(); } Maybe PersistenceTypeFromString(const nsACString& aString, const fallible_t&) { return TypeFrom_impl(aString); } PersistenceType PersistenceTypeFromString(const nsACString& aString) { const auto maybePersistenceType = TypeFrom_impl(aString); if (maybePersistenceType.isNothing()) { BadPersistenceType(); } return maybePersistenceType.value(); } Maybe PersistenceTypeFromInt32(const int32_t aInt32, const fallible_t&) { return TypeFrom_impl(aInt32); } Maybe PersistenceTypeFromFile(nsIFile& aFile, const fallible_t&) { return TypeFrom_impl(aFile); } std::array ComplementaryPersistenceTypes( const PersistenceType aPersistenceType) { MOZ_ASSERT(aPersistenceType == PERSISTENCE_TYPE_DEFAULT || aPersistenceType == PERSISTENCE_TYPE_TEMPORARY || aPersistenceType == PERSISTENCE_TYPE_PRIVATE); if (aPersistenceType == PERSISTENCE_TYPE_TEMPORARY) { return {PERSISTENCE_TYPE_DEFAULT, PERSISTENCE_TYPE_PRIVATE}; } if (aPersistenceType == PERSISTENCE_TYPE_DEFAULT) { return {PERSISTENCE_TYPE_TEMPORARY, PERSISTENCE_TYPE_PRIVATE}; } return {PERSISTENCE_TYPE_DEFAULT, PERSISTENCE_TYPE_TEMPORARY}; } } // namespace mozilla::dom::quota