diff -r 000000000000 -r 2b3e5ec03512 servlib/routing/ProphetBundleList.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlib/routing/ProphetBundleList.cc Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,134 @@ +/* + * 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 "ProphetBundleList.h" + +namespace dtn +{ + +BundleRef +ProphetBundleList::NULL_BUNDLE("ProphetBundleList"); + +ProphetBundleList::ProphetBundleList(prophet::Repository::BundleCoreRep* core) + : list_(core) {} + +ProphetBundleList::~ProphetBundleList() +{ + clear(); +} + +void +ProphetBundleList::add(const BundleRef& b) +{ + ProphetBundle* pb = new ProphetBundle(b); + if (!list_.add(pb)) + delete pb; +} + +void +ProphetBundleList::add(const prophet::Bundle* b) +{ + if (list_.add(b)) + return; + + prophet::Bundle* pb = const_cast(b); + delete pb; +} + +void +ProphetBundleList::del(const BundleRef& b) +{ + const_iterator i; + if (find(b->dest().str(), + b->creation_ts().seconds_, + b->creation_ts().seqno_, i)) + { + prophet::Bundle* bundle = const_cast(*i); + list_.del(*i); + delete bundle; + } +} + +void +ProphetBundleList::del(const prophet::Bundle* b) +{ + prophet::Bundle* bundle = const_cast(b); + list_.del(bundle); + delete bundle; +} + +const prophet::Bundle* +ProphetBundleList::find(const std::string& dst, + u_int creation_ts, + u_int seqno) const +{ + const_iterator i; + if (find(dst,creation_ts,seqno,i)) + return *i; + return NULL; +} + +const BundleRef& +ProphetBundleList::find_ref(const prophet::Bundle* b) const +{ + if (b != NULL) + { + const_iterator i; + if (find(b->destination_id(), + b->creation_ts(), + b->sequence_num(),i)) + return dynamic_cast(*i)->ref(); + } + return NULL_BUNDLE; +} + +void +ProphetBundleList::clear() +{ + while (!list_.empty()) + { + prophet::Bundle* b = const_cast( + list_.get_bundles().front()); + list_.del(b); + // clean up memory from Facade wrapper + delete b; + } +} + +bool +ProphetBundleList::find(const std::string& dst, + u_int creation_ts, u_int seqno, const_iterator& i) const +{ + i = list_.get_bundles().begin(); + while (i != list_.get_bundles().end()) + { + if ((*i)->creation_ts() == creation_ts && + (*i)->sequence_num() == seqno && + (*i)->destination_id() == dst) break; + i++; + } + + if (i == list_.get_bundles().end()) return false; + + return ((*i)->creation_ts() == creation_ts && + (*i)->sequence_num() == seqno && + (*i)->destination_id() == dst); +} + +}; // namespace dtn