diff -r 000000000000 -r 2b3e5ec03512 servlib/bundling/GbofId.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlib/bundling/GbofId.cc Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,155 @@ +/* Copyright 2004-2006 BBN Technologies Corporation + * + * 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. + * + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "GbofId.h" +#include + +// GBOFID -- Global Bundle Or Fragment ID + +namespace oasys { + +//---------------------------------------------------------------------- +template<> +const char* +InlineFormatter +::format(const dtn::GbofId& id) +{ + if (! id.is_fragment_) { + buf_.appendf("<%s, %llu.%llu>", + id.source_.c_str(), + id.creation_ts_.seconds_, + id.creation_ts_.seqno_); + } else { + buf_.appendf("<%s, %llu.%llu, FRAG len %u offset %u>", + id.source_.c_str(), + id.creation_ts_.seconds_, + id.creation_ts_.seqno_, + id.frag_length_, id.frag_offset_); + } + return buf_.c_str(); +} +} // namespace oasys + +namespace dtn { + +//---------------------------------------------------------------------- +GbofId::GbofId() +{ +} + +//---------------------------------------------------------------------- +GbofId::GbofId(EndpointID source, + BundleTimestamp creation_ts, + bool is_fragment, + u_int32_t frag_length, + u_int32_t frag_offset) + : source_(source), + creation_ts_(creation_ts), + is_fragment_(is_fragment), + frag_length_(frag_length), + frag_offset_(frag_offset) +{ +} + +//---------------------------------------------------------------------- +GbofId::~GbofId() +{ +} + +//---------------------------------------------------------------------- +bool +GbofId::equals(const GbofId& id) const +{ + if (creation_ts_.seconds_ == id.creation_ts_.seconds_ && + creation_ts_.seqno_ == id.creation_ts_.seqno_ && + is_fragment_ == id.is_fragment_ && + (!is_fragment_ || + (frag_length_ == id.frag_length_ && frag_offset_ == id.frag_offset_)) && + source_.equals(id.source_)) + { + return true; + } else { + return false; + } +} + +//---------------------------------------------------------------------- +bool +GbofId::operator<(const GbofId& other) const +{ + if (source_ < other.source_) return true; + if (other.source_ < source_) return false; + + if (creation_ts_ < other.creation_ts_) return true; + if (creation_ts_ > other.creation_ts_) return false; + + if (is_fragment_ && !other.is_fragment_) return true; + if (!is_fragment_ && other.is_fragment_) return false; + + if (is_fragment_) { + if (frag_length_ < other.frag_length_) return true; + if (other.frag_length_ < frag_length_) return false; + + if (frag_offset_ < other.frag_offset_) return true; + if (other.frag_offset_ < frag_offset_) return false; + } + + return false; // all equal +} + +//---------------------------------------------------------------------- +bool +GbofId::equals(EndpointID source, + BundleTimestamp creation_ts, + bool is_fragment, + u_int32_t frag_length, + u_int32_t frag_offset) const +{ + if (creation_ts_.seconds_ == creation_ts.seconds_ && + creation_ts_.seqno_ == creation_ts.seqno_ && + is_fragment_ == is_fragment && + (!is_fragment || + (frag_length_ == frag_length && frag_offset_ == frag_offset)) && + source_.equals(source)) + { + return true; + } else { + return false; + } +} + +//---------------------------------------------------------------------- +std::string +GbofId::str() const +{ + std::ostringstream oss; + + oss << source_.str() << "," + << creation_ts_.seconds_ << "," + << creation_ts_.seqno_ << "," + << is_fragment_ << "," + << frag_length_ << "," + << frag_offset_; + + return oss.str(); +} + +} // namespace dtn