blob: 1c021c57ed35210e91c836b268d93f279da98b72 [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 "query.hpp"
shockjiang99ad3892014-08-03 14:56:13 -070021#include "ndns-label.hpp"
shockjiange9c1ab92014-07-21 12:02:52 -070022namespace ndn {
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070023namespace ndns {
shockjiange9c1ab92014-07-21 12:02:52 -070024
25Query::Query()
shockjiang99ad3892014-08-03 14:56:13 -070026 : m_forwardingHint("/")
27 , m_queryType(QUERY_DNS)
shockjianga5ae48c2014-07-27 23:21:41 -070028 , m_interestLifetime(time::milliseconds(4000))
29 , m_rrType(RR::NS)
shockjiange9c1ab92014-07-21 12:02:52 -070030{
shockjiange9c1ab92014-07-21 12:02:52 -070031}
32
shockjiang99ad3892014-08-03 14:56:13 -070033Query::~Query()
34{
shockjiange9c1ab92014-07-21 12:02:52 -070035}
36
shockjiang99ad3892014-08-03 14:56:13 -070037bool Query::fromInterest(const Name &name, const Interest &interest)
shockjianga5ae48c2014-07-27 23:21:41 -070038{
39 return fromInterest(interest);
40}
41
shockjiang99ad3892014-08-03 14:56:13 -070042bool Query::fromInterest(const Interest& interest)
shockjiange9c1ab92014-07-21 12:02:52 -070043{
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070044 Name interestName;
45 interestName = interest.getName();
shockjiange9c1ab92014-07-21 12:02:52 -070046
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070047 int qtflag = -1;
shockjiang99ad3892014-08-03 14:56:13 -070048 int zoneStart = -1;
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070049 size_t len = interestName.size();
shockjiange9c1ab92014-07-21 12:02:52 -070050
shockjiang99ad3892014-08-03 14:56:13 -070051 for (size_t i = 0; i < len; i++) {
52 ndn::Name::Component comp = interestName.get(i);
53 //if (comp == ndn::ndns::label::ForwardingHintLabel) {
54 if (comp == ndn::ndns::label::ForwardingHintComp) {
55 zoneStart = i;
56 } else if (comp == ndn::ndns::label::QueryDNSComp || comp == ndn::ndns::label::QueryDNSRComp ) {
57 qtflag = i;
58 break;
shockjiange9c1ab92014-07-21 12:02:52 -070059 }
shockjiang99ad3892014-08-03 14:56:13 -070060 } //for
61
62 if (qtflag == -1) {
63 std::cerr << "There is no QueryType in the Interest Name: " << interestName
64 << std::endl;
65 return false;
66 }
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070067 this->m_queryType = toQueryType(interestName.get(qtflag).toUri());
shockjiang99ad3892014-08-03 14:56:13 -070068 this->m_rrType = RR::toRRType(interestName.get(len - 1).toUri());
69 if (zoneStart == -1) {
70 this->m_authorityZone = interestName.getPrefix(qtflag); //the DNS/DNS-R is not included
71 } else {
72 this->m_forwardingHint = interestName.getPrefix(zoneStart);
73 this->m_authorityZone = interestName.getSubName(zoneStart+1, qtflag-zoneStart-1);
74 }
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070075 this->m_interestLifetime = interest.getInterestLifetime();
shockjiang99ad3892014-08-03 14:56:13 -070076 this->m_rrLabel = interestName.getSubName(qtflag + 1, len - qtflag - 2);
shockjianga5ae48c2014-07-27 23:21:41 -070077 return true;
shockjiange9c1ab92014-07-21 12:02:52 -070078}
79
shockjiang99ad3892014-08-03 14:56:13 -070080Interest Query::toInterest() const
shockjiange9c1ab92014-07-21 12:02:52 -070081{
shockjiang99ad3892014-08-03 14:56:13 -070082 Name name;
83 if (m_forwardingHint != Name("/")) {
84 name = m_forwardingHint;
85 name.append(ndn::ndns::label::ForwardingHintLabel);
86 //std::cout<<"add forwarding---------------------------:"<<name.toUri()<<std::endl;
87 } else {
88 //std::cout<<"do not add forwarding---------------------------:"<<std::endl;
89 }
90
91 name.append(this->m_authorityZone);
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070092 name.append(toString(this->m_queryType));
93 name.append(this->m_rrLabel);
shockjianga5ae48c2014-07-27 23:21:41 -070094 name.append(RR::toString(this->m_rrType));
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070095 Selectors selector;
96 //selector.setMustBeFresh(true);
shockjiange9c1ab92014-07-21 12:02:52 -070097
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -070098 Interest interest = Interest(name, selector, -1, this->m_interestLifetime);
99 return interest;
shockjiange9c1ab92014-07-21 12:02:52 -0700100}
101
Alexander Afanasyev6e3d1ac2014-07-21 12:47:49 -0700102} // namespace ndns
103} // namespace ndn