diff -r 000000000000 -r 2b3e5ec03512 servlib/routing/ProphetNodeList.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlib/routing/ProphetNodeList.cc Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,138 @@ +/* + * Copyright 2007 Baylor University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "ProphetNodeList.h" + +namespace dtn +{ + +ProphetNodeList::ProphetNodeList() +{ +} + +ProphetNodeList::~ProphetNodeList() +{ + clear(); +} + +void +ProphetNodeList::load(const prophet::Node* n) +{ + log_debug_p("/dtn/route/nodelist","load"); + iterator i; + ASSERT(n != NULL); + ASSERT(! find(n->dest_id(), i)); + + log_debug_p("/dtn/route/nodelist", + "add new node for %s (age %u pv %.2f flags %s%s%s)", + n->dest_id(), + n->age(), + n->p_value(), + n->relay() ? "R" : "-", + n->custody() ? "C" : "-", + n->internet_gw() ? "I" : "-"); + // create and insert new object + ProphetNode* a = new ProphetNode(*n); + // internally and in ProphetStorage + list_.insert(i,a); +} + +void +ProphetNodeList::update(const prophet::Node* n) +{ + log_debug_p("/dtn/route/nodelist","update"); + iterator i; + ASSERT(n != NULL); + if (! find(n->dest_id(), i)) + { + log_debug_p("/dtn/route/nodelist", + "add new node for %s",n->dest_id()); + // create and insert new object + ProphetNode* a = new ProphetNode(*n); + // internally and in ProphetStorage + list_.insert(i,a); + ProphetStore::instance()->add(a); + } + else + { + log_debug_p("/dtn/route/nodelist", + "update existing node for %s",n->dest_id()); + // update existing + ProphetNode* a = static_cast(*i); + a->set_pvalue( n->p_value() ); + ProphetStore::instance()->update(a); + } +} + +void +ProphetNodeList::del(const prophet::Node* n) +{ + iterator i; + ASSERT(n != NULL); + if (find(n->dest_id(), i)) + { + // remove from list and from ProphetStorage + ProphetNode* a = static_cast(*i); + list_.erase(i); + ProphetStore::instance()->del(a); + delete a; + } +} + +const prophet::Node* +ProphetNodeList::find(const std::string& dest_id) const +{ + iterator i; + ProphetNodeList* me = const_cast(this); + if (me == NULL) return NULL; + if (me->find(dest_id,i)) + return *i; + return NULL; +} + +void +ProphetNodeList::clone(prophet::Table* nodes, + const prophet::NodeParams* params) +{ + if (nodes == NULL || params == NULL) return; + + std::list list(list_.begin(),list_.end()); + nodes->assign(list,params); +} + +void +ProphetNodeList::clear() +{ + while (!list_.empty()) + { + delete list_.front(); + list_.pop_front(); + } +} + +bool +ProphetNodeList::find(const std::string& dest_id, iterator& i) +{ + i = list_.begin(); + while (i != list_.end() && (*i)->dest_id() < dest_id) + i++; + return (i != list_.end() && (*i)->dest_id() == dest_id); +} + +}; // namespace dtn