summaryrefslogtreecommitdiff
path: root/implementation/routing/src/eventgroupinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/routing/src/eventgroupinfo.cpp')
-rw-r--r--implementation/routing/src/eventgroupinfo.cpp86
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());
}