Dripline-Cpp  v2.4.2
Dripline Implementation in C++
endpoint.hh
Go to the documentation of this file.
1 /*
2  * endpoint.hh
3  *
4  * Created on: Aug 14, 2018
5  * Author: N.S. Oblath
6  */
7 
8 #ifndef DRIPLINE_ENDPOINT_HH_
9 #define DRIPLINE_ENDPOINT_HH_
10 
11 #include "message.hh"
12 #include "return_codes.hh"
13 
14 namespace dripline
15 {
16 
96  {
97  public:
98  endpoint( const std::string& a_name );
99  endpoint( const endpoint& a_orig );
100  endpoint( endpoint&& a_orig );
101  virtual ~endpoint();
102 
103  endpoint& operator=( const endpoint& a_orig );
104  endpoint& operator=( endpoint&& a_orig );
105 
106  public:
107  mv_referrable( std::string, name );
108 
109  mv_referrable( service_ptr_t, service );
110 
111  public:
112  //**************************
113  // Direct message submission
114  //**************************
115 
117  reply_ptr_t submit_request_message( const request_ptr_t a_request );
118 
120  void submit_reply_message( const reply_ptr_t a_reply );
121 
123  void submit_alert_message( const alert_ptr_t a_alert );
124 
125  public:
126  //*************************
127  // Default message handlers
128  //*************************
129 
131  virtual reply_ptr_t on_request_message( const request_ptr_t a_request );
132 
135  virtual void on_reply_message( const reply_ptr_t a_reply );
136 
139  virtual void on_alert_message( const alert_ptr_t a_alert );
140 
141  public:
142  //*************************
143  // Default request handlers
144  //*************************
145 
146  // Override the relevant function to implement use of that type of message
147 
148  virtual reply_ptr_t do_run_request( const request_ptr_t a_request );
149  virtual reply_ptr_t do_get_request( const request_ptr_t a_request );
150  virtual reply_ptr_t do_set_request( const request_ptr_t a_request );
151  virtual reply_ptr_t do_cmd_request( const request_ptr_t a_request );
152 
157  void sort_message( const message_ptr_t a_request );
158 
159  private:
160  //**************************
161  // Initial request functions
162  //**************************
163 
164  // Do not override
165  // Authentication is checked as necessary, and then request handlers are called
166 
167  reply_ptr_t __do_run_request( const request_ptr_t a_request );
168  reply_ptr_t __do_get_request( const request_ptr_t a_request );
169  reply_ptr_t __do_set_request( const request_ptr_t a_request );
170  reply_ptr_t __do_cmd_request( const request_ptr_t a_request );
171 
172  protected:
173  virtual void send_reply( reply_ptr_t a_reply ) const;
174 
175  public:
176  //******************
177  // Lockout functions
178  //******************
179 
181  uuid_t enable_lockout( const scarab::param_node& a_tag );
183  uuid_t enable_lockout( const scarab::param_node& a_tag, uuid_t a_key );
184  bool disable_lockout( const uuid_t& a_key, bool a_force = false );
185  bool is_locked() const;
186  bool check_key( const uuid_t& a_key ) const;
187 
188  protected:
190  bool authenticate( const uuid_t& a_key ) const;
191 
192  mv_referrable( scarab::param_node, lockout_tag );
193  mv_accessible( uuid_t, lockout_key );
194 
195  private:
196  //*****************
197  // Request handlers
198  //*****************
199 
200  reply_ptr_t handle_lock_request( const request_ptr_t a_request );
201  reply_ptr_t handle_unlock_request( const request_ptr_t a_request );
202  reply_ptr_t handle_is_locked_request( const request_ptr_t a_request );
203  reply_ptr_t handle_set_condition_request( const request_ptr_t a_request );
204  reply_ptr_t handle_ping_request( const request_ptr_t a_request );
205 
207  virtual reply_ptr_t __do_handle_set_condition_request( const request_ptr_t a_request );
208 
209  };
210 
212  {
213  return a_request->reply( dl_resource_error(), "Unhandled request type: OP_RUN" );
214  }
215 
217  {
218  return a_request->reply( dl_resource_error(), "Unhandled request type: OP_GET" );
219  }
220 
222  {
223  return a_request->reply( dl_resource_error(), "Unhandled request type: OP_SET" );
224  }
225 
227  {
228  return a_request->reply( dl_resource_error(), "Unhandled request type: OP_CMD" );
229  }
230 
231  inline uuid_t endpoint::enable_lockout( const scarab::param_node& a_tag )
232  {
233  return enable_lockout( a_tag, generate_random_uuid() );
234  }
235 
236  inline bool endpoint::is_locked() const
237  {
238  return ! f_lockout_key.is_nil();
239  }
240 
241  inline bool endpoint::check_key( const uuid_t& a_key ) const
242  {
243  return f_lockout_key == a_key;
244  }
245 
247  {
248  return a_request->reply( dl_success(), "No action taken (this is the default method)" );
249  }
250 
251 } /* namespace dripline */
252 
253 #endif /* DRIPLINE_ENDPOINT_HH_ */
virtual reply_ptr_t do_run_request(const request_ptr_t a_request)
Definition: endpoint.hh:211
std::shared_ptr< msg_request > request_ptr_t
Definition: dripline_fwd.hh:23
std::shared_ptr< msg_alert > alert_ptr_t
Definition: dripline_fwd.hh:25
uuid_t enable_lockout(const scarab::param_node &a_tag)
enable lockout with randomly-generated key
Definition: endpoint.hh:231
Consumer of Dripline messages on a particular queue.
Definition: service.hh:72
bool is_locked() const
Definition: endpoint.hh:236
#define DRIPLINE_API
Definition: dripline_api.hh:34
virtual reply_ptr_t do_get_request(const request_ptr_t a_request)
Definition: endpoint.hh:216
boost::uuids::uuid uuid_t
Universally-unique-identifier type containing 16 hexadecimal characters.
Definition: uuid.hh:26
bool check_key(const uuid_t &a_key) const
Definition: endpoint.hh:241
std::shared_ptr< msg_reply > reply_ptr_t
Definition: dripline_fwd.hh:24
uuid_t generate_random_uuid()
Generates a UUID containing random numbers (RNG is a Mersenne Twister)
Definition: uuid.cc:19
virtual reply_ptr_t do_set_request(const request_ptr_t a_request)
Definition: endpoint.hh:221
virtual reply_ptr_t do_cmd_request(const request_ptr_t a_request)
Definition: endpoint.hh:226
std::shared_ptr< message > message_ptr_t
Definition: dripline_fwd.hh:20
Basic Dripline object capable of receiving and acting on messages.
Definition: endpoint.hh:95
virtual reply_ptr_t __do_handle_set_condition_request(const request_ptr_t a_request)
Default set-condition: no action taken; override for different behavior.
Definition: endpoint.hh:246
std::shared_ptr< service > service_ptr_t
Definition: dripline_fwd.hh:42