Welcome to mirror list, hosted at ThFree Co, Russian Federation.

purchase.hpp « map - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: dde8bc40d3291b255cbf4b657aa716f0d7f87610 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#pragma once

#include "base/thread_checker.hpp"

#include <atomic>
#include <functional>
#include <string>
#include <vector>

enum class SubscriptionType
{
  RemoveAds
};

class SubscriptionListener
{
public:
  virtual ~SubscriptionListener() = default;
  virtual void OnSubscriptionChanged(SubscriptionType type, bool isActive) = 0;
};

class Purchase
{
public:
  using InvalidTokenHandler = std::function<void()>;

  explicit Purchase(InvalidTokenHandler && onInvalidToken);
  void RegisterSubscription(SubscriptionListener * listener);
  bool IsSubscriptionActive(SubscriptionType type) const;

  void SetSubscriptionEnabled(SubscriptionType type, bool isEnabled);

  enum class ValidationCode
  {
    // Do not change the order.
    Verified,    // Purchase is verified.
    NotVerified, // Purchase is not verified.
    ServerError, // Server error during validation.
    AuthError,   // Authentication error during validation.
  };

  struct ValidationInfo
  {
    std::string m_serverId;
    std::string m_vendorId;
    std::string m_receiptData;

    // We do not check serverId here, because it can be empty in some cases.
    bool IsValid() const { return !m_vendorId.empty() && !m_receiptData.empty(); }
  };

  using ValidationCallback = std::function<void(ValidationCode, ValidationInfo const &)>;
  using StartTransactionCallback = std::function<void(bool success, std::string const & serverId,
                                                      std::string const & vendorId)>;

  void SetValidationCallback(ValidationCallback && callback);
  void Validate(ValidationInfo const & validationInfo, std::string const & accessToken);

  void SetStartTransactionCallback(StartTransactionCallback && callback);
  void StartTransaction(std::string const & serverId, std::string const & vendorId,
                        std::string const & accessToken);

private:
  void ValidateImpl(std::string const & url, ValidationInfo const & validationInfo,
                    std::string const & accessToken, bool startTransaction,
                    uint8_t attemptIndex, uint32_t waitingTimeInSeconds);

  struct RemoveAdsSubscriptionData
  {
    std::atomic<bool> m_isActive;
    std::string m_subscriptionId;
  };
  RemoveAdsSubscriptionData m_removeAdsSubscriptionData;

  std::vector<SubscriptionListener *> m_listeners;

  ValidationCallback m_validationCallback;
  StartTransactionCallback m_startTransactionCallback;
  InvalidTokenHandler m_onInvalidToken;

  ThreadChecker m_threadChecker;
};