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