blob: 603c119aec8c673d1befdaf7ba2ad950f715cdd4 [file] [log] [blame]
Jiewen Tan7a56d1c2015-01-26 23:26:51 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev67758b12018-03-06 18:36:44 -05002/*
3 * Copyright (c) 2014-2018, The University of Memphis,
Jiewen Tan7a56d1c2015-01-26 23:26:51 -08004 * Regents of the University of California,
5 * Arizona Board of Regents.
6 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Alexander Afanasyev67758b12018-03-06 18:36:44 -050020 */
Jiewen Tan7a56d1c2015-01-26 23:26:51 -080021
22#ifndef NLSR_TLV_COORDINATE_LSA_HPP
23#define NLSR_TLV_COORDINATE_LSA_HPP
24
25#include "lsa-info.hpp"
26
27#include <ndn-cxx/util/time.hpp>
28#include <ndn-cxx/encoding/block.hpp>
29#include <ndn-cxx/encoding/encoding-buffer.hpp>
30#include <ndn-cxx/encoding/tlv.hpp>
31#include <ndn-cxx/name.hpp>
32
33namespace nlsr {
Nick G97e34942016-07-11 14:46:27 -050034namespace tlv {
Jiewen Tan7a56d1c2015-01-26 23:26:51 -080035
Nick G97e34942016-07-11 14:46:27 -050036/*!
37 \brief Data abstraction for CoordinateLsa
38
39 CoordinateLsa := COORDINATE-LSA-TYPE TLV-LENGTH
40 LsaInfo
41 HyperbolicRadius
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -060042 HyperbolicAngle+
Nick G97e34942016-07-11 14:46:27 -050043
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -060044 \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
Jiewen Tan7a56d1c2015-01-26 23:26:51 -080045 */
46class CoordinateLsa
47{
48public:
49 class Error : public ndn::tlv::Error
50 {
51 public:
52 explicit
53 Error(const std::string& what)
54 : ndn::tlv::Error(what)
55 {
56 }
57 };
58
59 CoordinateLsa();
60
61 explicit
62 CoordinateLsa(const ndn::Block& block);
63
64 const LsaInfo&
65 getLsaInfo() const
66 {
67 return m_lsaInfo;
68 }
69
70 CoordinateLsa&
71 setLsaInfo(const LsaInfo& lsaInfo)
72 {
73 m_lsaInfo = lsaInfo;
74 m_wire.reset();
75 return *this;
76 }
77
78 double
79 getHyperbolicRadius() const
80 {
81 return m_hyperbolicRadius;
82 }
83
84 CoordinateLsa&
85 setHyperbolicRadius(double hyperbolicRadius)
86 {
87 m_hyperbolicRadius = hyperbolicRadius;
88 m_wire.reset();
89 return *this;
90 }
91
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -060092 const std::vector<double>
Jiewen Tan7a56d1c2015-01-26 23:26:51 -080093 getHyperbolicAngle() const
94 {
95 return m_hyperbolicAngle;
96 }
97
98 CoordinateLsa&
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -060099 setHyperbolicAngle(const std::vector<double>& hyperbolicAngle)
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800100 {
101 m_hyperbolicAngle = hyperbolicAngle;
102 m_wire.reset();
103 return *this;
104 }
105
Nick Gordond0a7df32017-05-30 16:44:34 -0500106 /*! \brief Encodes the hyperbolic coordinates and some info using the method in TAG.
107 *
108 * This function will TLV-format the hyperbolic coordinates objects and some LSA
109 * info using the implementation speciifed by TAG. Usually this is
110 * called with an estimator first to guess how long the buffer needs
111 * to be, then with an encoder to do the real work. This process is
112 * automated by the other wireEncode.
113 * \sa CoordinateLsa::wireEncode()
114 */
Alexander Afanasyevf9f39102015-12-01 17:43:40 -0800115 template<ndn::encoding::Tag TAG>
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800116 size_t
Alexander Afanasyevf9f39102015-12-01 17:43:40 -0800117 wireEncode(ndn::EncodingImpl<TAG>& block) const;
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800118
Nick Gordond0a7df32017-05-30 16:44:34 -0500119 /*! \brief Create a TLV encoding of this object.
120 *
121 * Create a block containing the TLV encoding of this object. That
122 * involves two steps: estimating the size that the information will
123 * take up, and then creating a buffer of that size and encoding the
124 * information into it. Both steps are accomplished by
125 * CoordinateLsa::wireEncode(ndn::EncodingImpl<TAG>&)
126 */
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800127 const ndn::Block&
128 wireEncode() const;
129
Nick Gordond0a7df32017-05-30 16:44:34 -0500130 /*! \brief Populate this object by decoding the one contained in the
131 * given block.
132 */
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800133 void
134 wireDecode(const ndn::Block& wire);
135
136private:
137 LsaInfo m_lsaInfo;
138 double m_hyperbolicRadius;
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600139 std::vector<double> m_hyperbolicAngle;
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800140
141 mutable ndn::Block m_wire;
142};
143
Alexander Afanasyev67758b12018-03-06 18:36:44 -0500144NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(CoordinateLsa);
145
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800146std::ostream&
147operator<<(std::ostream& os, const CoordinateLsa& coordinateLsa);
148
149} // namespace tlv
150} // namespace nlsr
151
152#endif // NLSR_TLV_COORDINATE_LSA_HPP