diff options
Diffstat (limited to 'implementation/routing/src/eventgroupinfo.cpp')
-rw-r--r-- | implementation/routing/src/eventgroupinfo.cpp | 86 |
1 files changed, 74 insertions, 12 deletions
diff --git a/implementation/routing/src/eventgroupinfo.cpp b/implementation/routing/src/eventgroupinfo.cpp index 0d098e4..1380969 100644 --- a/implementation/routing/src/eventgroupinfo.cpp +++ b/implementation/routing/src/eventgroupinfo.cpp @@ -1,20 +1,24 @@ -// Copyright (C) 2014-2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +// Copyright (C) 2014-2016 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) // 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/. +#include <algorithm> + #include <vsomeip/constants.hpp> + #include "../include/eventgroupinfo.hpp" +#include "../../endpoints/include/endpoint_definition.hpp" namespace vsomeip { eventgroupinfo::eventgroupinfo() - : major_(DEFAULT_MAJOR), ttl_(DEFAULT_TTL), is_multicast_(false) { + : major_(DEFAULT_MAJOR), ttl_(DEFAULT_TTL) { } eventgroupinfo::eventgroupinfo(major_version_t _major, ttl_t _ttl) - : major_(_major), ttl_(_ttl), is_multicast_(false) { + : major_(_major), ttl_(_ttl) { } eventgroupinfo::~eventgroupinfo() { @@ -37,23 +41,24 @@ void eventgroupinfo::set_ttl(ttl_t _ttl) { } bool eventgroupinfo::is_multicast() const { - return is_multicast_; + return address_.is_multicast(); } bool eventgroupinfo::get_multicast(boost::asio::ip::address &_address, uint16_t &_port) const { - if (is_multicast_) { + + if (address_.is_multicast()) { _address = address_; _port = port_; + return true; } - return is_multicast_; + return false; } void eventgroupinfo::set_multicast(const boost::asio::ip::address &_address, uint16_t _port) { address_ = _address; port_ = _port; - is_multicast_ = true; } const std::set<std::shared_ptr<event> > eventgroupinfo::get_events() const { @@ -68,20 +73,77 @@ void eventgroupinfo::remove_event(std::shared_ptr<event> _event) { events_.erase(_event); } -const std::set<std::shared_ptr<endpoint_definition> > eventgroupinfo::get_targets() const { +const std::list<eventgroupinfo::target_t> eventgroupinfo::get_targets() const { return targets_; } -bool eventgroupinfo::add_target(std::shared_ptr<endpoint_definition> _target) { +uint32_t eventgroupinfo::get_unreliable_target_count(){ + uint32_t _count(0); + for (auto i = targets_.begin(); i != targets_.end(); i++) { + if (!i->endpoint_->is_reliable()) { + _count++; + } + } + return _count; +} + +void eventgroupinfo::add_multicast_target(const eventgroupinfo::target_t &_multicast_target) { + if (std::find(multicast_targets_.begin(), multicast_targets_.end(), _multicast_target) + == multicast_targets_.end()) { + multicast_targets_.push_back(_multicast_target); + } +} + +void eventgroupinfo::clear_multicast_targets() { + multicast_targets_.clear(); +} + +const std::list<eventgroupinfo::target_t> eventgroupinfo::get_multicast_targets() const { + return multicast_targets_; +} + +bool eventgroupinfo::add_target(const eventgroupinfo::target_t &_target) { std::size_t its_size = targets_.size(); - targets_.insert(_target); + if (std::find(targets_.begin(), targets_.end(), _target) == targets_.end()) { + targets_.push_back(_target); + } + return (its_size != targets_.size()); +} + +bool eventgroupinfo::add_target(const eventgroupinfo::target_t &_target, const eventgroupinfo::target_t &_subscriber) { + std::size_t its_size = targets_.size(); + if (std::find(targets_.begin(), targets_.end(), _subscriber) == targets_.end()) { + targets_.push_back(_subscriber); + } + if (its_size != targets_.size()) { + add_multicast_target(_target); + } return (its_size != targets_.size()); } +bool eventgroupinfo::update_target( + const std::shared_ptr<endpoint_definition> &_target, + const std::chrono::high_resolution_clock::time_point &_expiration) { + for (auto i = targets_.begin(); i != targets_.end(); i++) { + if (i->endpoint_ == _target) { + i->expiration_ = _expiration; + return true; + } + } + return false; +} + bool eventgroupinfo::remove_target( - std::shared_ptr<endpoint_definition> _target) { + const std::shared_ptr<endpoint_definition> &_target) { std::size_t its_size = targets_.size(); - targets_.erase(_target); + + for (auto i = targets_.begin(); i != targets_.end(); i++) { + if (i->endpoint_ == _target) { + targets_.erase(i); + break; + } + } + return (its_size != targets_.size()); } |