blob: c7071dfbb8147c911b5ba1ad275427a86b548fd2 [file] [log] [blame]
Weiqi Shi098f91c2014-07-23 17:41:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyevc0e26582017-08-13 21:16:49 -04002/*
Alexander Afanasyev42290b22017-03-09 12:58:29 -08003 * Copyright (c) 2014-2017, Regents of the University of California.
Weiqi Shi098f91c2014-07-23 17:41:35 -07004 *
5 * This file is part of NDN repo-ng (Next generation of NDN repository).
6 * See AUTHORS.md for complete list of repo-ng authors and contributors.
7 *
8 * repo-ng 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 * repo-ng 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 * repo-ng, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef REPO_HANDLES_WATCH_HANDLE_HPP
21#define REPO_HANDLES_WATCH_HANDLE_HPP
22
23#include "base-handle.hpp"
24
25#include <queue>
26
27namespace repo {
28
29using std::map;
30using std::pair;
31using std::queue;
32using namespace ndn::time;
33/**
34 * @brief WatchHandle provides a different way for repo to insert data.
35 *
36 * Repo keeps sending interest to request the data with same prefix,
Weiqi Shi098f91c2014-07-23 17:41:35 -070037 * but with different exclude selectors(updated every time). Repo will stop
Weiqi Shi098f91c2014-07-23 17:41:35 -070038 * watching the prefix until a command interest tell it to stop, the total
Weiqi Shi098f91c2014-07-23 17:41:35 -070039 * amount of sent interests reaches a specific number or time out.
40 */
41class WatchHandle : public BaseHandle
42{
43
44public:
45 class Error : public BaseHandle::Error
46 {
47 public:
48 explicit
49 Error(const std::string& what)
50 : BaseHandle::Error(what)
51 {
52 }
53 };
54
55
56public:
57 WatchHandle(Face& face, RepoStorage& storageHandle, KeyChain& keyChain,
Junxiao Shi047a6fb2017-06-08 16:16:05 +000058 Scheduler& scheduler, Validator& validator);
Weiqi Shi098f91c2014-07-23 17:41:35 -070059
60 virtual void
61 listen(const Name& prefix);
62
63private: // watch-insert command
64 /**
65 * @brief handle watch commands
66 */
67 void
68 onInterest(const Name& prefix, const Interest& interest);
69
70 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -040071 onValidated(const Interest& interest, const Name& prefix);
Weiqi Shi098f91c2014-07-23 17:41:35 -070072
73 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -040074 onValidationFailed(const Interest& interest, const ValidationError& error);
Weiqi Shi098f91c2014-07-23 17:41:35 -070075
Weiqi Shi098f91c2014-07-23 17:41:35 -070076private: // data fetching
77 /**
78 * @brief fetch data and send next interest
79 */
80 void
Alexander Afanasyev42290b22017-03-09 12:58:29 -080081 onData(const Interest& interest, const Data& data, const Name& name);
Weiqi Shi098f91c2014-07-23 17:41:35 -070082
83 /**
84 * @brief handle when fetching one data timeout
85 */
86 void
87 onTimeout(const Interest& interest, const Name& name);
88
89 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -040090 onDataValidated(const Interest& interest, const Data& data, const Name& name);
Weiqi Shi098f91c2014-07-23 17:41:35 -070091
92 /**
93 * @brief failure of validation
94 */
95 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -040096 onDataValidationFailed(const Interest& interest, const Data& data,
97 const ValidationError& error, const Name& name);
Weiqi Shi098f91c2014-07-23 17:41:35 -070098
99
100 void
101 processWatchCommand(const Interest& interest, RepoCommandParameter& parameter);
102
103 void
104 watchStop(const Name& name);
105
106private: // watch state check command
107 /**
108 * @brief handle watch check command
109 */
110 void
111 onCheckInterest(const Name& prefix, const Interest& interest);
112
113 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -0400114 onCheckValidated(const Interest& interest, const Name& prefix);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700115
116 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -0400117 onCheckValidationFailed(const Interest& interest, const ValidationError& error);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700118
119private: // watch stop command
120 /**
121 * @brief handle watch stop command
122 */
123 void
124 onStopInterest(const Name& prefix, const Interest& interest);
125
126 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -0400127 onStopValidated(const Interest& interest, const Name& prefix);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700128
129 void
Alexander Afanasyevc0e26582017-08-13 21:16:49 -0400130 onStopValidationFailed(const Interest& interest, const ValidationError& error);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700131
132private:
133 void
134 negativeReply(const Interest& interest, int statusCode);
135
136 void
137 deferredDeleteProcess(const Name& name);
138
139 void
140 deleteProcess(const Name& name);
141
142 bool
143 onRunning(const Name& name);
144
145private:
Junxiao Shi047a6fb2017-06-08 16:16:05 +0000146 Validator& m_validator;
Weiqi Shi098f91c2014-07-23 17:41:35 -0700147
148 map<Name, std::pair<RepoCommandResponse, bool> > m_processes;
149 int64_t m_interestNum;
150 int64_t m_maxInterestNum;
151 milliseconds m_interestLifetime;
152 milliseconds m_watchTimeout;
153 ndn::time::steady_clock::TimePoint m_startTime;
154 int64_t m_size;
155};
156
157} // namespace repo
158
Alexander Afanasyev42290b22017-03-09 12:58:29 -0800159#endif // REPO_HANDLES_WATCH_HANDLE_HPP