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
|
// Copyright (C) 2014 BMW Group
// Author: Lutz Bichler (lutz.bichler@bmw.de)
// 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/.
#ifndef VSOMEIP_APPLICATION_IMPL_HPP
#define VSOMEIP_APPLICATION_IMPL_HPP
#include <map>
#include <string>
#include <boost/asio/signal_set.hpp>
#include <vsomeip/application.hpp>
#include "../../routing/include/routing_manager_host.hpp"
namespace vsomeip {
class configuration;
class logger;
class routing_manager;
class routing_manager_stub;
class application_impl: public application,
public routing_manager_host,
public std::enable_shared_from_this<application_impl> {
public:
application_impl(const std::string &_name);
~application_impl();
bool init();
void start();
void stop();
void offer_service(service_t _service, instance_t _instance,
major_version_t _major, minor_version_t _minor, ttl_t _ttl);
void stop_offer_service(service_t _service, instance_t _instance);
// Consume services
void request_service(service_t _service, instance_t _instance,
major_version_t _major, minor_version_t _minor, ttl_t _ttl);
void release_service(service_t _service, instance_t _instance);
void subscribe(service_t _service, instance_t _instance,
eventgroup_t _eventgroup, major_version_t _major, ttl_t _ttl);
void unsubscribe(service_t _service, instance_t _instance,
eventgroup_t _eventgroup);
bool is_available(service_t _service, instance_t _instance);
void send(std::shared_ptr<message> _message, bool _flush, bool _reliable);
void notify(service_t _service, instance_t _instance, event_t _event,
std::shared_ptr<payload> _payload) const;
void register_event_handler(event_handler_t _handler);
void unregister_event_handler();
void register_message_handler(service_t _service, instance_t _instance,
method_t _method, message_handler_t _handler);
void unregister_message_handler(service_t _service, instance_t _instance,
method_t _method);
void register_availability_handler(service_t _service, instance_t _instance,
availability_handler_t _handler);
void unregister_availability_handler(service_t _service,
instance_t _instance);
// routing_manager_host
const std::string & get_name() const;
client_t get_client() const;
std::shared_ptr<configuration> get_configuration() const;
boost::asio::io_service & get_io();
void on_event(event_type_e _event);
void on_availability(service_t _service, instance_t _instance,
bool _is_available) const;
void on_message(std::shared_ptr<message> _message);
void on_error(error_code_e _error);
// service_discovery_host
routing_manager * get_routing_manager() const;
private:
void service();
inline void update_session() {
session_++;
if (0 == session_) {
session_++;
}
}
private:
client_t client_; // unique application identifier
session_t session_;
std::string name_;
std::shared_ptr<configuration> configuration_;
boost::asio::io_service io_;
// Proxy to or the Routing Manager itself
std::shared_ptr<routing_manager> routing_;
// (Non-SOME/IP) Event handler
event_handler_t handler_;
// Method/Event (=Member) handlers
std::map<service_t,
std::map<instance_t, std::map<method_t, message_handler_t> > > members_;
// Availability handlers
std::map<service_t, std::map<instance_t, availability_handler_t> > availability_;
// Signals
boost::asio::signal_set signals_;
};
} // namespace vsomeip
#endif // VSOMEIP_APPLICATION_IMPL_HPP
|