summaryrefslogtreecommitdiff
path: root/src/components/policy/src/policy/include/policy/update_status_manager.h
blob: 2fb0a2b18baa808bdb1f5fea260ace32f371ea3b (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#ifndef SRC_COMPONENTS_POLICY_INCLUDE_POLICY_UPDATE_STATUS_MANAGER_H
#define SRC_COMPONENTS_POLICY_INCLUDE_POLICY_UPDATE_STATUS_MANAGER_H

#include "policy/policy_types.h"
#include "utils/lock.h"
#include "utils/timer_thread.h"
#include "utils/threads/thread.h"
#include "utils/threads/thread_delegate.h"
#include "utils/conditional_variable.h"
#include "utils/lock.h"
#include "utils/logger.h"
#include "utils/macro.h"

namespace policy {

class PolicyListener;

class UpdateStatusManager {
 public:
  /**
   * @brief Constructor
   */
  UpdateStatusManager();

  ~UpdateStatusManager();

  /**
   * @brief Sets listener pointer
   * @param listener Pointer to policy listener implementation
   */
  void set_listener(PolicyListener* listener);

  /**
   * @brief Update status hanlder for PTS sending out
   * @param update_timeout Timeout for waiting of incoming PTU
   */
  void OnUpdateSentOut(uint32_t update_timeout);

  /**
   * @brief Update status handler for PTU waiting timeout
   */
  void OnUpdateTimeoutOccurs();

  /**
   * @brief Update status handler for valid PTU receiving
   */
  void OnValidUpdateReceived();

  /**
   * @brief Update status handler for wrong PTU receiving
   */
  void OnWrongUpdateReceived();

  /**
   * @brief Update status handler for reset PT to default state
   * @param is_update_required Update necessity flag
   */
  void OnResetDefaultPT(bool is_update_required);

  /**
   * @brief Update status handler for restarting retry sequence
   */
  void OnResetRetrySequence();

  /**
   * @brief Update status handler on new application registering
   */
  void OnNewApplicationAdded();

  /**
   * @brief Update status handler for policy initialization
   * @param is_update_required Update necessity flag
   */
  void OnPolicyInit(bool is_update_required);

  /**
   * @brief IsUpdateRequired allows to distiguish if update is required
   *
   * @return  true if update required.
   */
  bool IsUpdateRequired() const;

  /**
   * @brief IsUpdatePending allows to distinguish if update is in pending mode.
   *
   * @return true if update is in pending mode.
   */
  bool IsUpdatePending() const;

  /**
   * @brief ScheduleUpdate allows to schedule next update.
   * It will change state to Update_Needed, that's is.
   */
  void ScheduleUpdate();

  /**
   * @brief ResetUpdateSchedule allows to reset all scheduled updates.
   */
  void ResetUpdateSchedule();

  /**
   * @brief StringifiedUpdateStatus allows to obtain update status as a string.
   *
   * @return stringified update status.
   */
  std::string StringifiedUpdateStatus() const;

  /**
   * @brief Status handler on applications search started
   */
  void OnAppsSearchStarted();

  /**
   * @brief Status handler on applications search completed
   */
  void OnAppsSearchCompleted();

  /**
   * @brief Returns status is application search in progress
   * @return true, if in progress, otherwise - false
   */
  bool IsAppsSearchInProgress();

private:
  /*
   * @brief Sets flag for update progress
   *
   * @param value
   */
  void set_exchange_in_progress(bool value);

  /*
   * @brief Sets flag for pending update
   *
   * @param value
   */
  void set_exchange_pending(bool value);

  /*
   * @brief Sets flag for update necessity
   *
   * @param value
   */
  void set_update_required(bool value);

  /**
   * @brief Check update status and notify HMI on changes
   */
  void CheckUpdateStatus();

private:

  /**
   * @brief Returns current policy update status
   * @return
   */
  PolicyTableStatus GetUpdateStatus() const;

  PolicyListener* listener_;
  bool exchange_in_progress_;
  bool update_required_;
  bool update_scheduled_;
  bool exchange_pending_;
  bool apps_search_in_progress_;
  sync_primitives::Lock exchange_in_progress_lock_;
  sync_primitives::Lock update_required_lock_;
  sync_primitives::Lock exchange_pending_lock_;
  sync_primitives::Lock apps_search_in_progress_lock_;
  /**
   * @brief Last status of policy table update
   */
  PolicyTableStatus last_update_status_;

  class UpdateThreadDelegate: public threads::ThreadDelegate {

  public:
    UpdateThreadDelegate(UpdateStatusManager* update_status_manager);
    ~UpdateThreadDelegate();
    virtual void threadMain();
    virtual void exitThreadMain();
    void updateTimeOut(const uint32_t timeout_ms);

    volatile uint32_t                                timeout_;
    volatile bool                                    stop_flag_;
    sync_primitives::Lock                            state_lock_;
    sync_primitives::ConditionalVariable             termination_condition_;
    UpdateStatusManager*                             update_status_manager_;
  };

  UpdateThreadDelegate*                              update_status_thread_delegate_;
  threads::Thread*                                   thread_;
};

}

#endif // SRC_COMPONENTS_POLICY_INCLUDE_POLICY_UPDATE_STATUS_MANAGER_H