RDK Documentation (Open Sourced RDK Components)
Filter.cpp
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2016 RDK Management
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18 */
19 
20 
21 
22 /**
23 * @defgroup trm
24 * @{
25 * @defgroup qtapp
26 * @{
27 **/
28 
29 
30 #include <list>
31 #include <string>
32 
33 #include "trm/TRM.h"
34 #include "trm/TunerState.h"
35 #include "trm/TunerReservation.h"
36 #include "Tuner.h"
37 #include "Filter.h"
38 #include "Manager.h"
39 
40 
41 TRM_BEGIN_NAMESPACE
42 template<>
43 
44 Tuner::IdList & Filter<ByTunerId>(const std::string &tunerId, Tuner::IdList &tuners)
45 {
46  return Filter_ByTunerId(tunerId, tuners);
47 }
48 
49 template<>
50 Tuner::IdList & Filter<ByTunerState>(const Enum<TunerState> &state, Tuner::IdList &tuners)
51 {
52  return Filter_ByTunerState(state, tuners);
53 }
54 
55 template<>
56 Tuner::IdList & Filter<ByTunerLocator>(const std::string &serviceLocator, Tuner::IdList &tuners)
57 {
58  return Filter_ByTunerLocator(serviceLocator, tuners);
59 }
60 
61 template<>
62 Tuner::IdList & Filter<ByTunerEndBefore>(const uint64_t &endTime, Tuner::IdList &tuners)
63 {
64  return Filter_ByTunerEndBefore(endTime, tuners, Activity::kRecord);
65 }
66 
67 template<>
68 TunerReservation::TokenList & Filter<ByActivity>(const Enum<Activity> &activity, TunerReservation::TokenList &reservations)
69 {
70  return Filter_ByActivity(activity, reservations);
71 
72 }
73 
74 template<>
75 TunerReservation::TokenList & Filter<ByStartAfter>(const uint64_t &startTime, TunerReservation::TokenList &reservations)
76 {
77  return Filter_ByStartAfter(startTime, reservations);
78 
79 }
80 
81 template<>
82 TunerReservation::TokenList & Filter<ByReservationEndBefore>(const uint64_t &endTime, TunerReservation::TokenList &reservations)
83 {
84  return Filter_ByReservationEndBefore(endTime, reservations);
85 }
86 
87 template<>
88 TunerReservation::TokenList & Filter<ByToken>(const std::string &token, TunerReservation::TokenList &reservations)
89 {
90  return Filter_ReservationByToken(token, reservations);
91 }
92 
93 template<>
94 TunerReservation::TokenList & Filter<ByDevice>(const std::string &device, TunerReservation::TokenList &reservations)
95 {
96  return Filter_ReservationByDevice(device, reservations);
97 }
98 
99 template<>
100 TunerReservation::TokenList & Filter<ByInConflict>(const bool &inConflict, TunerReservation::TokenList &reservations)
101 {
102  return Filter_ReservationByAttribute(inConflict, reservations);
103 }
104 
105 template<>
106 TunerReservation::TokenList & Filter<ByReservationLocator>(const std::string &serviceLocator, TunerReservation::TokenList &reservations)
107 {
108  return Filter_ByReservationLocator(serviceLocator, reservations);
109 }
110 
111 template<>
112 TunerReservation::TokenList & Filter<ByReservationState>(const int &state, TunerReservation::TokenList &reservations)
113 {
114  std::cout << "Filter<ByReservationState>" << std::endl;
115 
116  return Filter_ByReservationState(state, reservations);
117 }
118 
119 Tuner::IdList & Filter_ByTunerId(const std::string &tunerId, Tuner::IdList &tuners)
120 {
121  std::cout << "Filter Reservations ByTunerId" << std::endl;
122  Tuner::IdList::iterator it = tuners.begin();
123  while(it != tuners.end()) {
124  const Tuner &tuner = Manager::getInstance().getTuner(*it);
125  if (tuner.getId().compare(tunerId) != 0) {
126  it = tuners.erase(it);
127  }
128  else {
129  it++;
130  }
131  }
132 
133  Assert(tuners.size() <= 1);
134  return tuners;
135 }
136 
137 Tuner::IdList & Filter_ByTunerState(const Enum<TunerState> &state, Tuner::IdList &tuners)
138 {
139  std::cout << "Filter Tuners ByTunerState " << tuners.size() << std::endl;
140  Tuner::IdList::iterator it = tuners.begin();
141  while(it != tuners.end()) {
142  std::cout << "checking tuner id " << *it << std::endl;
143  const Tuner &tuner = Manager::getInstance().getTuner(*it);
144  if (!(tuner.getState().getState() == state)) {
145  it = tuners.erase(it);
146  }
147  else {
148  it++;
149  }
150  }
151  std::cout << "After Filter has " << tuners.size() << " left " << std::endl;
152  return tuners;
153 }
154 
155 Tuner::IdList & Filter_ByTunerLocator(const std::string &serviceLocator, Tuner::IdList &tuners)
156 {
157  std::cout << "Filter Tuners ByServiceLocator" << std::endl;
158  Tuner::IdList::iterator it = tuners.begin();
159  while (it != tuners.end()) {
160  const Tuner &tuner = Manager::getInstance().getTuner(*it);
161  if ((!tuner.getServiceLocator().empty()) && (tuner.getServiceLocator().compare(serviceLocator) != 0)) {
162  it = tuners.erase(it);
163  }
164  else {
165  it++;
166  }
167  }
168  return tuners;
169 }
170 
171 Tuner::IdList & Filter_ByTunerEndBefore(const uint64_t &endTime, Tuner::IdList &tuners, const Activity &activity)
172 {
173  /*
174  * Find out the latest expiration time on a tuner is prior to the endTime.
175  */
176  std::cout << "Filter Reservations By ByEndBefore on Tuners" << std::endl;
177 
178  Tuner::IdList::iterator it = tuners.begin();
179  while (it != tuners.end()) {
180  bool beyondEndTime = false;
181  TunerReservation::TokenList reservationTokens;
182  Manager::getInstance().getReservationTokens(reservationTokens, *it);
183  TunerReservation::TokenList::iterator itt = reservationTokens.begin();
184  while (itt != reservationTokens.end()) {
185  TunerReservation &reservation = Manager::getInstance().getReservation(*itt);
186  if ((reservation.getActivity() == activity) &&
187  ((reservation.getStartTime() + reservation.getDuration()) > endTime)) {
188  beyondEndTime = true;
189  }
190 
191  itt++;
192  }
193 
194  if (beyondEndTime) {
195  std::cout << "Tuner " << Manager::getInstance().getTuner(*it).getId() << " goes beyond endTime " << endTime << std::endl;
196  it = tuners.erase(it);
197  }
198  else {
199  it++;
200  }
201  }
202  return tuners;
203 }
204 
205 TunerReservation::TokenList & Filter_ByActivity(const Enum<Activity> &activity, TunerReservation::TokenList &reservations)
206 {
207  std::cout << "Filter Reservations By Activity start" << std::endl;
208  TunerReservation::TokenList::iterator it = reservations.begin();
209  while (it != reservations.end()) {
210  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
211  if (!(reservation.getActivity().getActivity() == activity)) {
212  it = reservations.erase(it);
213  }
214  else {
215  it++;
216  }
217  }
218 
219  std::cout << "Filter Reservations By DONE" << std::endl;
220 
221  return reservations;
222 }
223 
224 TunerReservation::TokenList & Filter_ByStartAfter(const uint64_t &startTime, TunerReservation::TokenList &reservations)
225 {
226  std::cout << "Filter Reservations By ByStartAfter" << std::endl;
227  TunerReservation::TokenList::iterator it = reservations.begin();
228  while (it != reservations.end()) {
229  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
230  if (reservation.getStartTime() <= startTime) {
231  it = reservations.erase(it);
232  }
233  else {
234  it++;
235  }
236  }
237  return reservations;
238 }
239 
240 TunerReservation::TokenList & Filter_ByReservationEndBefore(const uint64_t &endTime, TunerReservation::TokenList &reservations)
241 {
242  std::cout << "Filter Reservations By ByEndBefore on Reservations" << std::endl;
243  TunerReservation::TokenList::iterator it = reservations.begin();
244  while (it != reservations.end()) {
245  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
246  if ((reservation.getStartTime() + reservation.getDuration()) > endTime) {
247  it = reservations.erase(it);
248  }
249  else {
250  it++;
251  }
252  }
253  return reservations;
254 }
255 
256 TunerReservation::TokenList & Filter_ReservationByToken(const std::string &token, TunerReservation::TokenList &reservations)
257 {
258  std::cout << "Filter Reservations By ByToken" << std::endl;
259  TunerReservation::TokenList::iterator it = reservations.begin();
260  while (it != reservations.end()) {
261  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
262  if (reservation.getReservationToken().compare(token) != 0) {
263  it = reservations.erase(it);
264  }
265  else {
266  it++;
267  }
268  }
269  return reservations;
270 }
271 
272 TunerReservation::TokenList & Filter_ReservationByDevice(const std::string &device, TunerReservation::TokenList &reservations)
273 {
274  {
275  TunerReservation::TokenList::iterator it;
276  for (it = reservations.begin(); it != reservations.end(); it++) {
277  std::cout << "Start with reservation " << (*it) << std::endl;
278  }
279  }
280  std::cout << "Filter Reservations By ByDevice " << reservations.size() << std::endl;
281  TunerReservation::TokenList::iterator it = reservations.begin();
282  while (it != reservations.end()) {
283  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
284 
285  if (reservation.getDevice().compare(device) != 0) {
286  it = reservations.erase(it);
287  }
288  else {
289  it++;
290  }
291  }
292  return reservations;
293 }
294 
295 TunerReservation::TokenList & Filter_ReservationByAttribute(const bool &inConflict, TunerReservation::TokenList &reservations)
296 {
297  {
298  TunerReservation::TokenList::iterator it;
299  for (it = reservations.begin(); it != reservations.end(); it++) {
300  std::cout << "Start with reservation " << (*it) << std::endl;
301  }
302  }
303  std::cout << "Filter Reservations By ByInConflict " << reservations.size() << std::endl;
304  TunerReservation::TokenList::iterator it = reservations.begin();
305  while (it != reservations.end()) {
306 
307  if ((inConflict) && (!Manager::getInstance().isPendingConflict((*it)))) {
308  it = reservations.erase(it);
309  }
310  else if((!inConflict) && (Manager::getInstance().isPendingConflict((*it)))) {
311  it = reservations.erase(it);
312  }
313  else {
314  it++;
315  }
316  }
317  return reservations;
318 }
319 
320 TunerReservation::TokenList & Filter_ByReservationLocator(const std::string &serviceLocator, TunerReservation::TokenList &reservations)
321 {
322  std::cout << "Filter Reservations By ByServiceLocator" << std::endl;
323  TunerReservation::TokenList::iterator it = reservations.begin();
324  while (it != reservations.end()) {
325  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
326  if (reservation.getServiceLocator().compare(serviceLocator) != 0) {
327  it = reservations.erase(it);
328  }
329  else {
330  it++;
331  }
332  }
333  return reservations;
334 }
335 
336 TunerReservation::TokenList & Filter_ByReservationState(int state, TunerReservation::TokenList &reservations)
337 {
338  std::cout << "Filter Reservations " << reservations.size() << " By State " << state << std::endl;
339  TunerReservation::TokenList::iterator it = reservations.begin();
340  while (it != reservations.end()) {
341  const TunerReservation &reservation = Manager::getInstance().getReservation(*it);
342  if (reservation.state != state) {
343  std::cout << "Removing reservation " << reservation.getReservationToken() << " for being in state " << reservation.state << std::endl;
344  it = reservations.erase(it);
345  }
346  else {
347  it++;
348  }
349  }
350  return reservations;
351 }
352 
353 TRM_END_NAMESPACE
354 
355 
356 
357 /** @} */
358 /** @} */
TRM::TunerReservationBase::getReservationToken
const std::string & getReservationToken(void) const
This function is used to return the unique token generated when a reservation is created.
Definition: TunerReservation.cpp:83
Tuner
Definition: Tuner.h:43