blob: f34b1fb8cefb631c2142aa39497475391596f586 [file] [log] [blame]
Weiqi Shi098f91c2014-07-23 17:41:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
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,
37 *
38 * but with different exclude selectors(updated every time). Repo will stop
39 *
40 * watching the prefix until a command interest tell it to stop, the total
41 *
42 * amount of sent interests reaches a specific number or time out.
43 */
44class WatchHandle : public BaseHandle
45{
46
47public:
48 class Error : public BaseHandle::Error
49 {
50 public:
51 explicit
52 Error(const std::string& what)
53 : BaseHandle::Error(what)
54 {
55 }
56 };
57
58
59public:
60 WatchHandle(Face& face, RepoStorage& storageHandle, KeyChain& keyChain,
61 Scheduler& scheduler, ValidatorConfig& validator);
62
63 virtual void
64 listen(const Name& prefix);
65
66private: // watch-insert command
67 /**
68 * @brief handle watch commands
69 */
70 void
71 onInterest(const Name& prefix, const Interest& interest);
72
73 void
Wentao Shanga8f3c402014-10-30 14:03:27 -070074 onValidated(const std::shared_ptr<const Interest>& interest, const Name& prefix);
Weiqi Shi098f91c2014-07-23 17:41:35 -070075
76 void
Wentao Shanga8f3c402014-10-30 14:03:27 -070077 onValidationFailed(const std::shared_ptr<const Interest>& interest, const std::string& reason);
Weiqi Shi098f91c2014-07-23 17:41:35 -070078
79 void
80 onRegistered(const Name& prefix);
81
82 void
83 onRegisterFailed(const Name& prefix, const std::string& reason);
84
85private: // data fetching
86 /**
87 * @brief fetch data and send next interest
88 */
89 void
Alexander Afanasyev42290b22017-03-09 12:58:29 -080090 onData(const Interest& interest, const Data& data, const Name& name);
Weiqi Shi098f91c2014-07-23 17:41:35 -070091
92 /**
93 * @brief handle when fetching one data timeout
94 */
95 void
96 onTimeout(const Interest& interest, const Name& name);
97
98 void
Wentao Shanga8f3c402014-10-30 14:03:27 -070099 onDataValidated(const Interest& interest, const std::shared_ptr<const Data>& data,
Weiqi Shi098f91c2014-07-23 17:41:35 -0700100 const Name& name);
101
102 /**
103 * @brief failure of validation
104 */
105 void
Wentao Shanga8f3c402014-10-30 14:03:27 -0700106 onDataValidationFailed(const Interest& interest, const std::shared_ptr<const Data>& data,
Weiqi Shi098f91c2014-07-23 17:41:35 -0700107 const std::string& reason, const Name& name);
108
109
110 void
111 processWatchCommand(const Interest& interest, RepoCommandParameter& parameter);
112
113 void
114 watchStop(const Name& name);
115
116private: // watch state check command
117 /**
118 * @brief handle watch check command
119 */
120 void
121 onCheckInterest(const Name& prefix, const Interest& interest);
122
123 void
Wentao Shanga8f3c402014-10-30 14:03:27 -0700124 onCheckValidated(const std::shared_ptr<const Interest>& interest, const Name& prefix);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700125
126 void
Wentao Shanga8f3c402014-10-30 14:03:27 -0700127 onCheckValidationFailed(const std::shared_ptr<const Interest>& interest,
128 const std::string& reason);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700129
130private: // watch stop command
131 /**
132 * @brief handle watch stop command
133 */
134 void
135 onStopInterest(const Name& prefix, const Interest& interest);
136
137 void
Wentao Shanga8f3c402014-10-30 14:03:27 -0700138 onStopValidated(const std::shared_ptr<const Interest>& interest, const Name& prefix);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700139
140 void
Wentao Shanga8f3c402014-10-30 14:03:27 -0700141 onStopValidationFailed(const std::shared_ptr<const Interest>& interest,
142 const std::string& reason);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700143
144private:
145 void
146 negativeReply(const Interest& interest, int statusCode);
147
148 void
149 deferredDeleteProcess(const Name& name);
150
151 void
152 deleteProcess(const Name& name);
153
154 bool
155 onRunning(const Name& name);
156
157private:
158
159 ValidatorConfig& m_validator;
160
161 map<Name, std::pair<RepoCommandResponse, bool> > m_processes;
162 int64_t m_interestNum;
163 int64_t m_maxInterestNum;
164 milliseconds m_interestLifetime;
165 milliseconds m_watchTimeout;
166 ndn::time::steady_clock::TimePoint m_startTime;
167 int64_t m_size;
168};
169
170} // namespace repo
171
Alexander Afanasyev42290b22017-03-09 12:58:29 -0800172#endif // REPO_HANDLES_WATCH_HANDLE_HPP