Review fixes

This commit is contained in:
r.kuznetsov 2019-06-19 09:03:50 +03:00 committed by Aleksandr Zatsepin
parent 10f69437ac
commit 8d4ee84b7b
2 changed files with 23 additions and 21 deletions

View file

@ -9,6 +9,7 @@
#include "base/assert.hpp"
#include "base/logging.hpp"
#include "base/stl_helpers.hpp"
#include "base/visitor.hpp"
#include "std/target_os.hpp"
@ -42,7 +43,7 @@ uint8_t constexpr kMaxAttemptIndex = 2;
std::string GetSubscriptionId(SubscriptionType type)
{
return coding::SHA1::CalculateBase64ForString(GetPlatform().UniqueClientId() +
kSubscriptionSuffix[static_cast<size_t>(type)]);
kSubscriptionSuffix[base::Underlying(type)]);
}
std::string GetDeviceId()
@ -52,7 +53,7 @@ std::string GetDeviceId()
std::string GetSubscriptionKey(SubscriptionType type)
{
return kSubscriptionId + kSubscriptionSuffix[static_cast<size_t>(type)];
return kSubscriptionId + kSubscriptionSuffix[base::Underlying(type)];
}
std::string ValidationUrl()
@ -115,16 +116,17 @@ struct ValidationResult
Purchase::Purchase(InvalidTokenHandler && onInvalidToken)
: m_onInvalidToken(std::move(onInvalidToken))
{
for (size_t i = 0; i < static_cast<size_t>(SubscriptionType::Count); ++i)
for (size_t i = 0; i < base::Underlying(SubscriptionType::Count); ++i)
{
auto const t = static_cast<SubscriptionType>(i);
std::string id;
if (GetPlatform().GetSecureStorage().Load(GetSubscriptionKey(t), id))
m_subscriptionData[t].m_subscriptionId = id;
m_subscriptionData[t].m_isActive =
(GetSubscriptionId(t) == m_subscriptionData[t].m_subscriptionId);
std::string id;
UNUSED_VALUE(GetPlatform().GetSecureStorage().Load(GetSubscriptionKey(t), id));
auto const sid = GetSubscriptionId(t);
m_subscriptionData.emplace_back(std::make_unique<SubscriptionData>(id == sid, sid));
}
CHECK_EQUAL(m_subscriptionData.size(), base::Underlying(SubscriptionType::Count), ());
}
void Purchase::RegisterSubscription(SubscriptionListener * listener)
@ -149,24 +151,19 @@ void Purchase::SetStartTransactionCallback(StartTransactionCallback && callback)
bool Purchase::IsSubscriptionActive(SubscriptionType type) const
{
CHECK(type != SubscriptionType::Count, ());
auto const it = m_subscriptionData.find(type);
return it != m_subscriptionData.end() && it->second.m_isActive;
return m_subscriptionData[base::Underlying(type)]->m_isActive;
}
void Purchase::SetSubscriptionEnabled(SubscriptionType type, bool isEnabled)
{
CHECK(type != SubscriptionType::Count, ());
m_subscriptionData[type].m_isActive = isEnabled;
auto & data = m_subscriptionData[base::Underlying(type)];
data->m_isActive = isEnabled;
if (isEnabled)
{
auto const id = GetSubscriptionId(type);
m_subscriptionData[type].m_subscriptionId = id;
GetPlatform().GetSecureStorage().Save(GetSubscriptionKey(type), id);
}
GetPlatform().GetSecureStorage().Save(GetSubscriptionKey(type), data->m_subscriptionId);
else
{
GetPlatform().GetSecureStorage().Remove(GetSubscriptionKey(type));
}
for (auto & listener : m_listeners)
listener->OnSubscriptionChanged(type, isEnabled);

View file

@ -5,6 +5,7 @@
#include <atomic>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>
#include <vector>
@ -69,14 +70,18 @@ private:
std::string const & accessToken, bool startTransaction,
uint8_t attemptIndex, uint32_t waitingTimeInSeconds);
// This structure is used in multithreading environment, so
// fields must be either constant or atomic.
struct SubscriptionData
{
std::atomic<bool> m_isActive;
std::string m_subscriptionId;
std::string const m_subscriptionId;
SubscriptionData() : m_isActive(false) {}
SubscriptionData(bool isActive, std::string const & id)
: m_isActive(isActive), m_subscriptionId(id)
{}
};
std::map<SubscriptionType, SubscriptionData> m_subscriptionData;
std::vector<std::unique_ptr<SubscriptionData>> m_subscriptionData;
std::vector<SubscriptionListener *> m_listeners;