1 // Copyright (C) 2019 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
2 // This Source Code Form is subject to the terms of the Mozilla Public
3 // License, v. 2.0. If a copy of the MPL was not distributed with this
4 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 
6 #ifndef VSOMEIP_COMPAT_APPLICATION_IMPL_HPP_
7 #define VSOMEIP_COMPAT_APPLICATION_IMPL_HPP_
8 
9 #include <map>
10 #include <mutex>
11 
12 #include <compat/vsomeip/application.hpp>
13 
14 namespace vsomeip_v3 {
15 class application;
16 } // namespace vsomeip_v3
17 
18 namespace vsomeip {
19 
20 class application_impl
21         : public application {
22 public:
23     application_impl(const std::string &_name);
24     ~application_impl();
25 
26     const std::string & get_name() const;
27     client_t get_client() const;
28 
29     void set_configuration(
30             const std::shared_ptr<configuration> _configuration);
31 
32     bool init();
33     void start();
34     void stop();
35 
36     void offer_service(service_t _service, instance_t _instance,
37             major_version_t _major, minor_version_t _minor);
38     void stop_offer_service(service_t _service, instance_t _instance,
39             major_version_t _major, minor_version_t _minor);
40 
41     void offer_event(service_t _service, instance_t _instance, event_t _event,
42             const std::set<eventgroup_t> &_eventgroups, bool _is_field);
43     void stop_offer_event(service_t _service, instance_t _instance,
44             event_t _event);
45 
46     void request_service(service_t _service, instance_t _instance,
47             major_version_t _major, minor_version_t _minor,
48             bool _use_exclusive_proxy);
49     void release_service(service_t _service, instance_t _instance);
50 
51     void request_event(service_t _service, instance_t _instance,
52             event_t _event, const std::set<eventgroup_t> &_eventgroups,
53             bool _is_field);
54     void release_event(service_t _service, instance_t _instance,
55             event_t _event);
56 
57     void subscribe(service_t _service, instance_t _instance,
58             eventgroup_t _eventgroup, major_version_t _major,
59             subscription_type_e _subscription_type,
60             event_t _event);
61     void unsubscribe(service_t _service, instance_t _instance,
62             eventgroup_t _eventgroup);
63 
64     bool is_available(service_t _service, instance_t _instance,
65             major_version_t _major, minor_version_t _minor) const;
66 
67     void send(std::shared_ptr<message> _message, bool _flush);
68     void notify(service_t _service, instance_t _instance,
69                 event_t _event, std::shared_ptr<payload> _payload) const;
70     void notify_one(service_t _service, instance_t _instance,
71                 event_t _event, std::shared_ptr<payload> _payload,
72                 client_t _client) const;
73 
74     void register_state_handler(state_handler_t _handler);
75     void unregister_state_handler();
76 
77     void register_message_handler(service_t _service,
78             instance_t _instance, method_t _method,
79             message_handler_t _handler);
80     void unregister_message_handler(service_t _service,
81             instance_t _instance, method_t _method);
82 
83     void register_availability_handler(service_t _service,
84             instance_t _instance, availability_handler_t _handler,
85             major_version_t _major, minor_version_t _minor);
86     void unregister_availability_handler(service_t _service,
87             instance_t _instance,
88             major_version_t _major, minor_version_t _minor);
89 
90     void register_subscription_handler(service_t _service,
91             instance_t _instance, eventgroup_t _eventgroup,
92             subscription_handler_t _handler);
93     void unregister_subscription_handler(service_t _service,
94                 instance_t _instance, eventgroup_t _eventgroup);
95 
96     void register_subscription_error_handler(service_t _service,
97             instance_t _instance, eventgroup_t _eventgroup,
98             error_handler_t _handler);
99     void unregister_subscription_error_handler(service_t _service,
100                 instance_t _instance, eventgroup_t _eventgroup);
101 
102     void clear_all_handler();
103 
104     bool is_routing() const;
105 
106     void offer_event(service_t _service,
107             instance_t _instance, event_t _event,
108             const std::set<eventgroup_t> &_eventgroups,
109             bool _is_field,
110             std::chrono::milliseconds _cycle,
111             bool _change_resets_cycle,
112             const epsilon_change_func_t &_epsilon_change_func);
113 
114     void notify(service_t _service, instance_t _instance,
115             event_t _event, std::shared_ptr<payload> _payload,
116             bool _force) const;
117 
118     void notify_one(service_t _service, instance_t _instance,
119             event_t _event, std::shared_ptr<payload> _payload,
120             client_t _client, bool _force) const;
121 
122     bool are_available(available_t &_available,
123             service_t _service, instance_t _instance,
124             major_version_t _major, minor_version_t _minor) const;
125 
126     void notify(service_t _service, instance_t _instance,
127             event_t _event, std::shared_ptr<payload> _payload,
128             bool _force, bool _flush) const;
129 
130     void notify_one(service_t _service, instance_t _instance,
131                 event_t _event, std::shared_ptr<payload> _payload,
132                 client_t _client, bool _force, bool _flush) const;
133 
134     void set_routing_state(routing_state_e _routing_state);
135 
136     void unsubscribe(service_t _service, instance_t _instance,
137             eventgroup_t _eventgroup, event_t _event);
138 
139     void register_subscription_status_handler(service_t _service,
140             instance_t _instance, eventgroup_t _eventgroup, event_t _event,
141             subscription_status_handler_t _handler);
142 
143     void register_subscription_status_handler(service_t _service,
144             instance_t _instance, eventgroup_t _eventgroup, event_t _event,
145             subscription_status_handler_t _handler, bool _is_selective);
146 
147     void get_offered_services_async(
148             offer_type_e _offer_type, offered_services_handler_t _handler);
149 
150     void set_watchdog_handler(
151             watchdog_handler_t _handler, std::chrono::seconds _interval);
152 
153     virtual void register_async_subscription_handler(
154             service_t _service, instance_t _instance, eventgroup_t _eventgroup,
155             async_subscription_handler_t _handler);
156 
157     virtual void set_offer_acceptance_required(
158             ip_address_t _address, const std::string _path, bool _enable);
159 
160     virtual offer_acceptance_map_type_t get_offer_acceptance_required();
161 
162     virtual void register_offer_acceptance_handler(
163             offer_acceptance_handler_t _handler);
164 
165     virtual void register_reboot_notification_handler(
166             reboot_notification_handler_t _handler);
167 
168     virtual void register_routing_ready_handler(
169             routing_ready_handler_t _handler);
170 
171     virtual void register_routing_state_handler(
172             routing_state_handler_t _handler);
173 
174     virtual bool update_service_configuration(
175             service_t _service, instance_t _instance,
176             std::uint16_t _port, bool _reliable,
177             bool _magic_cookies_enabled, bool _offer);
178 
179     virtual void update_security_policy_configuration(
180             uint32_t _uid, uint32_t _gid,
181             std::shared_ptr<policy> _policy, std::shared_ptr<payload> _payload,
182             security_update_handler_t _handler);
183 
184     virtual void remove_security_policy_configuration(
185             uint32_t _uid, uint32_t _gid, security_update_handler_t _handler);
186 
187 private:
188     bool is_selective_event(
189             vsomeip::service_t _service, vsomeip::instance_t _instance,
190             const std::set<vsomeip::eventgroup_t> &_eventgroups);
191 
192 private:
193     std::shared_ptr<vsomeip_v3::application> impl_;
194 
195     std::map<service_t,
196         std::map<instance_t, std::set<eventgroup_t> > > eventgroups_;
197     std::mutex eventgroups_mutex_;
198 };
199 
200 } // namespace vsomeip
201 
202 #endif // VSOMEIP_COMPAT_APPLICATION_IMPL_HPP_
203