blob: f0c5b172e4acbae7b4dff75b97536c1945ee6875 [file] [log] [blame]
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014, Regents of the University of California.
shockjiange9c1ab92014-07-21 12:02:52 -07004 *
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -07005 * This file is part of NDNS (Named Data Networking Domain Name Service).
6 * See AUTHORS.md for complete list of NDNS authors and contributors.
7 *
8 * NDNS is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
shockjiange9c1ab92014-07-21 12:02:52 -070018 */
19
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070020#include "response.hpp"
shockjiange9c1ab92014-07-21 12:02:52 -070021
22
23namespace ndn {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070024namespace ndns {
shockjiange9c1ab92014-07-21 12:02:52 -070025
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070026Response::Response()
27{
shockjiange9c1ab92014-07-21 12:02:52 -070028}
29
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070030Response::~Response()
31{
shockjiange9c1ab92014-07-21 12:02:52 -070032}
33
34
shockjiange9c1ab92014-07-21 12:02:52 -070035Data
36Response::toWire() const
37{
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070038 Name name = this->m_queryName;
39 name.append(this->m_serial);
shockjiange9c1ab92014-07-21 12:02:52 -070040
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070041 Data data(name);
shockjiange9c1ab92014-07-21 12:02:52 -070042
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070043 data.setFreshnessPeriod(this->m_freshness);
shockjiange9c1ab92014-07-21 12:02:52 -070044
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070045 string content = "";
shockjiange9c1ab92014-07-21 12:02:52 -070046
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070047 size_t totalLen = 0;
48 Block block = Block();
49 block.push_back
50 (nonNegativeIntegerBlock
51 (tlv::ndns::Type, static_cast<unsigned long>(this->m_responseType))
52 );
shockjiange9c1ab92014-07-21 12:02:52 -070053
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070054 block.push_back
55 (nonNegativeIntegerBlock
56 (tlv::ndns::Fressness, this->m_freshness.count())
57 );
shockjiange9c1ab92014-07-21 12:02:52 -070058
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070059 Block block2 = Block(tlv::ndns::ContentBlob);
60 block2.push_back
61 (nonNegativeIntegerBlock
62 (tlv::ndns::NumberOfRRData, this->m_numberOfRR)
63 );
shockjiange9c1ab92014-07-21 12:02:52 -070064
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070065 for (int i=0; i<this->m_numberOfRR; i++)
66 {
67 RR rr = m_rrs[i];
68 block2.push_back(rr.toWire());
69 }
shockjiange9c1ab92014-07-21 12:02:52 -070070
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070071 block.push_back(block2);
shockjiange9c1ab92014-07-21 12:02:52 -070072
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070073 return data;
shockjiange9c1ab92014-07-21 12:02:52 -070074
75}
76
77void
78Response::fromWire(const Interest &interest, const Data &data)
79{
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070080 Name dataName;
81 dataName = data.getName();
shockjiange9c1ab92014-07-21 12:02:52 -070082
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070083 int qtflag = -1;
84 size_t len = dataName.size();
85 for (size_t i=0; i<len; i++)
shockjiange9c1ab92014-07-21 12:02:52 -070086 {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070087 string comp = dataName.get(i).toEscapedString();
88 if (comp == ndn::toString(QueryType::DNS) || comp == ndn::toString(QueryType::DNS_R))
89 {
90 qtflag = i;
91 break;
92 }
shockjiange9c1ab92014-07-21 12:02:52 -070093 }//for
94
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070095 if (qtflag == -1)
shockjiange9c1ab92014-07-21 12:02:52 -070096 {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070097 cerr<<"There is no QueryType in the Interest Name: "<<dataName<<endl;
98 return;
shockjiange9c1ab92014-07-21 12:02:52 -070099 }
100
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700101 this->m_queryName = dataName.getPrefix(-1);
shockjiange9c1ab92014-07-21 12:02:52 -0700102
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700103 string last = dataName.get(len-1).toEscapedString();
104 if (ndn::toRRType(last) == RRType::UNKNOWN)
shockjiange9c1ab92014-07-21 12:02:52 -0700105 {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700106 this->m_serial = "";
shockjiange9c1ab92014-07-21 12:02:52 -0700107 } else
108 {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700109 this->m_serial = last;
shockjiange9c1ab92014-07-21 12:02:52 -0700110 }
111
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700112 Block block = data.getContent();
113 this->m_numberOfRR = readNonNegativeInteger(block.get(tlv::ndns::NumberOfRRData));
shockjiange9c1ab92014-07-21 12:02:52 -0700114
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700115 Block block2 = block.get(tlv::ndns::ContentBlob);
116 for (int i=0; i<this->m_numberOfRR; i++)
shockjiange9c1ab92014-07-21 12:02:52 -0700117 {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700118 Block block3 = block2.get(tlv::ndns::RRData);
119 RR rr;
120 rr.fromWire(block3);
121 m_rrs.push_back(rr);
shockjiange9c1ab92014-07-21 12:02:52 -0700122 }
123
124}
125
126
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700127} // namespace ndns
128} // namespace ndn