blob: 11ce6d52f456f83d66571ce60618d4ab92f1e629 [file] [log] [blame]
Jiewen Tan7a56d1c2015-01-26 23:26:51 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014-2015, The University of Memphis,
4 * 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/>.
20 **/
21
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 {
34namespace tlv {
35
36/**
37 * @brief Data abstraction for CoordinateLsa
38 *
39 * CoordinateLsa := COORDINATE-LSA-TYPE TLV-LENGTH
40 * LsaInfo
41 * HyperbolicRadius
42 * HyperbolicAngle
43 *
44 * @sa http://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
45 */
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
92 double
93 getHyperbolicAngle() const
94 {
95 return m_hyperbolicAngle;
96 }
97
98 CoordinateLsa&
99 setHyperbolicAngle(double hyperbolicAngle)
100 {
101 m_hyperbolicAngle = hyperbolicAngle;
102 m_wire.reset();
103 return *this;
104 }
105
Alexander Afanasyevf9f39102015-12-01 17:43:40 -0800106 template<ndn::encoding::Tag TAG>
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800107 size_t
Alexander Afanasyevf9f39102015-12-01 17:43:40 -0800108 wireEncode(ndn::EncodingImpl<TAG>& block) const;
Jiewen Tan7a56d1c2015-01-26 23:26:51 -0800109
110 const ndn::Block&
111 wireEncode() const;
112
113 void
114 wireDecode(const ndn::Block& wire);
115
116private:
117 LsaInfo m_lsaInfo;
118 double m_hyperbolicRadius;
119 double m_hyperbolicAngle;
120
121 mutable ndn::Block m_wire;
122};
123
124std::ostream&
125operator<<(std::ostream& os, const CoordinateLsa& coordinateLsa);
126
127} // namespace tlv
128} // namespace nlsr
129
130#endif // NLSR_TLV_COORDINATE_LSA_HPP