34 #include "Executors.h"
35 #include "Connection.h"
40 extern std::string GetDeviceId();
42 Manager &Manager::getInstance()
44 static Manager managerInstance_;
45 return managerInstance_;
48 Tuner::IdList & Manager::getTunerIds(Tuner::IdList & Ids)
51 TunerCT::const_iterator it;
52 for (it = tuners.begin(); it != tuners.end(); it++) {
53 Ids.push_back(it->first);
55 Assert(tuners.size() == Ids.size());
60 TunerReservation::TokenList & Manager::getReservationTokens(TunerReservation::TokenList &tokens, uint32_t clientId)
62 ReservationAttributesCT::iterator it = attrs.begin();
63 for (it = attrs.begin(); it != attrs.end(); it++) {
64 if ((it->second).clientId == clientId) {
65 tokens.push_back(it->first);
72 TunerReservation::TokenList & Manager::getReservationTokens(TunerReservation::TokenList &tokens,
const std::string tunerId)
75 if(!tunerId.empty()) {
76 getTuner(tunerId).getReservationTokens(tokens);
78 Log() <<
"getReservationTokens from tuner " << tunerId <<
" return " << tokens.size() << std::endl;
82 TunerReservation::TokenList & Manager::getReservationTokens(TunerReservation::TokenList &tokens,
const Tuner::IdList & tunerIds)
84 Tuner::IdList::const_iterator it;
85 for (it = tunerIds.begin(); it != tunerIds.end(); it++) {
86 getTuner(*it).getReservationTokens(tokens);
93 void Manager::addReservation(
const TunerReservation & reservation,
const std::string &tunerId)
95 Log() <<
"vManager Adding Reservation " << reservation.getReservationToken() <<
" To tuner " << tunerId << std::endl;
97 getTuner(tunerId).addReservation((reservation));
100 PreStartTimerCT::iterator it = preStartTimers.find(reservation.getReservationToken());
101 Assert(it == preStartTimers.end());
105 StartTimerCT::iterator it = startTimers.find(reservation.getReservationToken());
106 Assert(it == startTimers.end());
110 ExpireTimerCT::iterator it = expireTimers.find(reservation.getReservationToken());
111 Assert(it == expireTimers.end());
114 preStartTimers.insert (std::pair<std::string, ReservationPreStartTimerTask>(
115 reservation.getReservationToken(),
118 startTimers.insert (std::pair<std::string, ReservationStartTimerTask>(
119 reservation.getReservationToken(),
123 expireTimers.insert (std::pair<std::string, ReservationExpirationTimerTask>(
124 reservation.getReservationToken(),
126 setTimer(reservation);
131 void Manager::setReservationAttributes(
const std::string &token,
const ReservationAttributes &attr)
133 Log() <<
"setReservationAttributes for " << token;
134 ReservationAttributesCT::iterator it = attrs.find(token);
135 if (it == attrs.end()) {
136 attrs.insert (std::pair<std::string, ReservationAttributes>(token, attr));
143 ReservationAttributes & Manager::getReservationAttributes(
const std::string &token)
145 ReservationAttributesCT::iterator it = attrs.find(token);
147 if (it == attrs.end()) {
155 void Manager::releaseReservation(
const std::string &reservationToken,
bool notifyClient)
157 Log() <<
"vManager Releasing Reservation " << reservationToken << std::endl;
159 TunerReservation &reservation = getReservation(reservationToken);
160 std::string serviceLocator = reservation.getServiceLocator();
161 Activity activity = reservation.getActivity();
163 cancelPreStartTimer(reservationToken);
164 cancelStartTimer(reservationToken);
165 cancelExpireTimer(reservationToken);
167 preStartTimers.erase(reservationToken);
168 startTimers.erase(reservationToken);
169 expireTimers.erase(reservationToken);
172 ReservationAttributesCT::iterator itt = attrs.find(reservationToken);
173 uint32_t clientId = 0;
174 if(itt != attrs.end()) {
175 clientId = (*itt).second.clientId;
176 attrs.erase(reservationToken);
179 Log() <<
"cannot find ReservationAttributes for " << reservationToken;
181 throw ItemNotFoundException();
184 getTuner(getParent(reservationToken)).releaseReservation(reservationToken);
187 emit reservationReleased(clientId, activity, reservationToken, serviceLocator);
189 emit reservationUpdated();
194 TunerReservation & Manager::getReservation(
const std::string &reservationToken)
197 TunerCT::iterator itt;
198 for (itt = tuners.begin(); itt != tuners.end(); itt++) {
199 TunerReservation::TokenList tokens;
201 itt->second.getReservationTokens(tokens);
202 TunerReservation::TokenList::iterator itr;
203 for (itr = tokens.begin(); itr != tokens.end(); itr++) {
205 if (itr->compare(reservationToken) == 0) {
206 return itt->second.getReservation(reservationToken);
210 Log() <<
"Throw ItemNotFoundException from Manager::getReservation()" << std::endl;
211 throw ItemNotFoundException();
214 const std::string & Manager::getParent(
const std::string &reservationToken)
216 TunerCT::iterator itt;
217 for (itt = tuners.begin(); itt != tuners.end(); itt++) {
218 TunerReservation::TokenList tokens;
219 itt->second.getReservationTokens(tokens);
220 TunerReservation::TokenList::iterator itr;
221 for (itr = tokens.begin(); itr != tokens.end(); itr++) {
222 if (itr->compare(reservationToken) == 0) {
223 Log() <<
"Parent is " << itt->second.getId() << std::endl;
224 return itt->second.getId();
228 throw ItemNotFoundException();
231 Tuner & Manager::getTuner(
const std::string &tunerId)
233 TunerCT::iterator it = tuners.find(tunerId);
234 if (it == tuners.end()) {
235 throw ItemNotFoundException();
243 void Manager::addPendingRequest(PendingRequestProcessor *request_,
int timeout)
245 PendingRequestProcessor &request = *request_;
246 Log() <<
"Manager::addPendingRequest " << request.getUUID() <<
" " << (
void *)&request << std::endl;
248 pendingRequests.push_back(&request);
252 PedingRequestTimerCT::iterator it = pendingRequestTimers.find(request.getUUID());
253 if (it == pendingRequestTimers.end()) {
255 pendingRequestTimers.insert (std::pair<std::string, PendingRequestTimeoutTimerTask>(
260 PedingRequestTimerCT::iterator it = pendingRequestTimers.find(request.getUUID());
261 Assert(it != pendingRequestTimers.end());
263 task.getTimer().schedule(task, timeout,
false);
264 Log() <<
"Pending Request " << request.getUUID() <<
" Add Timer " << task.getTimer().getToken() << std::endl;
273 bool Manager::isPendingConflict(
const std::string &reservationToken)
276 std::list<PendingRequestProcessor *>::iterator it = pendingRequests.begin();
277 while(it != pendingRequests.end() && !found) {
278 if ((*it)->getType() == PendingRequestProcessor::PendingReserveTunerConflicts)
280 PendingReserveTunerConflictProcessor &pendingRequest = *(
static_cast<PendingReserveTunerConflictProcessor *
>(*it));
281 std::list<TunerReservation>::iterator itt = (pendingRequest).notification.getConflicts().begin();
282 while(itt != (pendingRequest).notification.getConflicts().end() && !found) {
283 if (reservationToken.compare((*itt).getReservationToken()) == 0) {
295 bool Manager::isPendingRequest(
const std::string &uuid)
297 std::list<PendingRequestProcessor *>::iterator it = pendingRequests.begin();
298 while(it != pendingRequests.end()) {
299 if ((**it).getUUID().compare(uuid) == 0) {
305 return (it != pendingRequests.end());
308 PendingRequestProcessor & Manager::getPendingRequest(
const std::string &uuid)
310 std::list<PendingRequestProcessor *>::iterator it = pendingRequests.begin();
311 while(it != pendingRequests.end()) {
312 if ((**it).getUUID().compare(uuid) == 0) {
318 if (it == pendingRequests.end()) {
319 Log() <<
"Throw ItemNotFoundException from Manager::getPendingRequest() for " << uuid << std::endl;
320 throw ItemNotFoundException();
326 void Manager::removePendingRequest(
const std::string &uuid)
328 Log() <<
"Manager::removePendingRequest " << uuid << std::endl;
330 std::list<PendingRequestProcessor *>::iterator it = pendingRequests.begin();
331 while(it != pendingRequests.end()) {
332 if ((**it).getUUID().compare(uuid) == 0) {
333 cancelPendingTimer(uuid);
334 pendingRequestTimers.erase(uuid);
335 it = pendingRequests.erase(it);
341 if(it == pendingRequests.end()) {
346 void Manager::onReservationReleased(uint32_t clientId, Activity activity, std::string reservationToken, std::string serviceLocator)
348 Log() <<
"Manager::onReservationReleased from client " << std::hex << clientId <<
349 " for activity " << (
const char *)activity.getActivity() <<
" for serviceLocator " << serviceLocator << std::endl;
352 void Manager::onReservationUpdated(
void)
354 Log() <<
"Manager::onReservationUpdated has pending:" <<pendingRequests.size() <<std::endl;
355 std::list<std::string> timedoutPending;
356 if (pendingRequests.size()) {
360 std::list<PendingRequestProcessor *>::iterator it = pendingRequests.begin();
361 while(it != pendingRequests.end()) {
362 if ((*it)->getType() == PendingRequestProcessor::PendingReserveTunerConflicts) {
363 bool grantConflict =
false;
365 PendingReserveTunerConflictProcessor &pendingRequest = *(
static_cast<PendingReserveTunerConflictProcessor *
>(*it));
366 const TunerReservation &liveReservationAtConflict = pendingRequest.notification.getTunerReservation();
368 const TunerReservation &liveReservationNow = Manager::getReservation(liveReservationAtConflict.getReservationToken());
369 if (pendingRequest.notification.getConflicts().size() == 1) {
370 if (liveReservationNow.getServiceLocator().compare(pendingRequest.notification.getConflicts().begin()->getServiceLocator()) == 0) {
371 Log() <<
"Manager::onReservationUpdated conflicting live token "
372 << liveReservationAtConflict.getReservationToken()
373 <<
" has updated from "
374 << liveReservationAtConflict.getServiceLocator()
376 << liveReservationNow.getServiceLocator()
378 grantConflict =
true;
382 Log() <<
"Manager::onReservationUpdated detected conflicts mismatch " << pendingRequest.notification.getConflicts().size() << std::endl;
387 Log() <<
"Manager::onReservationUpdated conflicting live token has expired " << liveReservationAtConflict.getReservationToken() << std::endl;
388 grantConflict =
true;
393 Log() <<
"Manager::onReservationUpdated pending conflict is effectively timedout :" << liveReservationAtConflict.getReservationToken() << std::endl;
394 pendingRequest.timeout();
395 timedoutPending.push_back(pendingRequest.getUUID());
398 Log() <<
"Manager::onReservationUpdated pending conflict is already removed" << std::endl;
406 if (timedoutPending.size()) {
407 std::list<std::string>::iterator it = timedoutPending.begin();
408 while(it != timedoutPending.end()) {
409 PendingRequestProcessor &pending = Manager::getInstance().getPendingRequest(*it);
410 removePendingRequest(*it);
417 void Manager::onNotifyTunerStatesUpdate(NotifyTunerStatesUpdate update)
419 Log() <<
"Manager::onNotifyTunerStatesUpdate" << std::endl;
422 Manager::Manager(
void)
426 for (
int i = 0; i < kNumOfTuners; i++) {
427 std::string
id =
"TunerId-" + IntToString(i) +
"";
428 Log() << Timestamp <<
"====================Addings TunerId " <<
id << std::endl;
429 tuners.insert ( std::pair<std::string,Tuner>(
id,
Tuner(
id)) );
432 setLocalTuner(
"TunerId-0");
433 QObject::connect(
this, SIGNAL(reservationReleased(uint32_t, Activity, std::string, std::string)),
this, SLOT(onReservationReleased(uint32_t, Activity, std::string, std::string)));
434 QObject::connect(
this, SIGNAL(cancelLiveResponse(CancelLiveResponse, ReserveTuner,
const std::string)),
this, SLOT(onCancelLiveResponse(CancelLiveResponse, ReserveTuner,
const std::string)));
435 QObject::connect(
this, SIGNAL(notifyTunerStatesUpdate(NotifyTunerStatesUpdate)),
this, SLOT(onNotifyTunerStatesUpdate(NotifyTunerStatesUpdate)));
436 QObject::connect(
this, SIGNAL(reservationUpdated(
void)),
this, SLOT(onReservationUpdated(
void)), Qt::QueuedConnection);
437 QObject::connect(
this, SIGNAL(timerDeleted(
void*)),
this, SLOT(onTimerDeleted(
void*)), Qt::QueuedConnection);
441 void Manager::setTimer(
const TunerReservation &reservation)
444 PreStartTimerCT::iterator it = preStartTimers.find(reservation.getReservationToken());
445 Assert(it != preStartTimers.end());
447 task.getTimer().schedule(task, reservation.getStartTime() - 250,
true);
449 Log() <<
"Reservation " << reservation.getReservationToken() <<
" Add Pre-Start Timer " << task.getTimer().getToken() << std::endl;
453 StartTimerCT::iterator it = startTimers.find(reservation.getReservationToken());
454 Assert(it != startTimers.end());
456 task.getTimer().schedule(task, reservation.getStartTime(),
true);
458 Log() <<
"Reservation " << reservation.getReservationToken() <<
" Add Start Timer " << task.getTimer().getToken() << std::endl;
462 ExpireTimerCT::iterator it = expireTimers.find(reservation.getReservationToken());
463 Assert(it != expireTimers.end());
465 task.getTimer().schedule(task, reservation.getExpirationTime());
467 Log() <<
"Reservation " << reservation.getReservationToken() <<
" Add Expire Timer " << task.getTimer().getToken() << std::endl;
471 void Manager::cancelStartTimer(
const std::string &reservationToken)
473 StartTimerCT::iterator it = startTimers.find(reservationToken);
474 if(it != startTimers.end()) {
476 task.getTimer().cancel();
477 emit timerDeleted((
void *)(&task.getTimer()));
484 void Manager::cancelPreStartTimer(
const std::string &reservationToken)
486 PreStartTimerCT::iterator it = preStartTimers.find(reservationToken);
487 if(it != preStartTimers.end()) {
489 task.getTimer().cancel();
490 emit timerDeleted((
void *)(&task.getTimer()));
497 void Manager::cancelExpireTimer(
const std::string &reservationToken)
499 ExpireTimerCT::iterator it = expireTimers.find(reservationToken);
500 if(it != expireTimers.end()) {
502 task.getTimer().cancel();
503 emit timerDeleted((
void *)(&task.getTimer()));
506 Log() <<
"cancelExpireTimer cannot find timer for token " << reservationToken << std::endl;
507 throw ItemNotFoundException();
511 void Manager::adjustExpireTimer(
const std::string &reservationToken)
514 TunerReservation &reservation = Manager::getInstance().getReservation(reservationToken);
515 ExpireTimerCT::iterator it = expireTimers.find(reservationToken);
516 if(it != expireTimers.end()) {
517 Log() <<
"adjustExpireTimer adjusting expire timer " << reservationToken << std::endl;
519 task.getTimer().cancel();
520 task.getTimer().schedule(task, reservation.getExpirationTime());
526 Log() <<
"adjustExpireTimer cannot find timer or token, may expried already " << reservationToken << std::endl;
530 void Manager::cancelPendingTimer(
const std::string &reservationToken)
532 PedingRequestTimerCT::iterator it = pendingRequestTimers.find(reservationToken);
533 if(it != pendingRequestTimers.end()) {
535 task.getTimer().cancel();
537 delete (&task.getTimer());
544 void Manager::prepareRecordHandover(
const std::string &tunerId,
const std::string &reservationToken)
551 if (getTuner(tunerId).getState().getState() == TunerState::kHybrid) {
553 std::string liveToken=
"";
554 std::string recordToken=
"";
555 std::string recordLocator=
"";
556 std::string liveLocator=
"";
557 std::string nextRecordLocator=
"";
559 TunerReservation::TokenList tokens;
560 Manager::getInstance().getReservationTokens(tokens, tunerId);
562 TunerReservation::TokenList::const_iterator it = tokens.begin();
563 while (it != tokens.end()) {
564 if (getReservation(*it).state == TunerReservation::ACTIVE) {
565 if (getReservation(*it).getActivity().getActivity() == Activity::kRecord) {
566 recordLocator = getReservation(*it).getServiceLocator();
569 if (getReservation(*it).getActivity().getActivity() == Activity::kLive) {
570 liveLocator = getReservation(*it).getServiceLocator();
578 Assert(!recordLocator.empty());
579 Assert(!liveLocator.empty());
580 Assert(liveLocator.compare(recordLocator) == 0);
582 nextRecordLocator = Manager::getInstance().getReservation(reservationToken).getServiceLocator();
583 Assert(Manager::getInstance().getReservation(reservationToken).getActivity() == Activity::kRecord);
584 Assert(!nextRecordLocator.empty());
586 if (liveLocator.compare(nextRecordLocator) != 0) {
587 Log() <<
"Hybrid tuner is on : LIVE + RECORD [ " << liveLocator
588 <<
" ] and is about to switch to RECORD [" << nextRecordLocator <<
" ]\r\n";
590 Log() <<
"Pre-Syncing...Target Tuner for recording is not yet on record channel now, need to cancel tune, so send a real a cancelLive" << std::endl;
591 CancelLive cancelLive(GenerateUUID(),
594 std::vector<uint8_t> out;
595 SerializeMessage(cancelLive,Connection::kRecorderClientId, out);
596 ::serverInstance->getConnection(Connection::kRecorderClientId).sendAsync(out);
599 catch (ConnectionNotFoundException) {
609 Log() <<
"Tuner " << tunerId <<
" is pre-sync'd in " << (
const char *) getTuner(tunerId).getState().getState() <<
" state \r\n";
612 void Manager::syncHybrid(
const std::string &tunerId,
const std::string &reservationToken)
614 if (getTuner(tunerId).getState().getState() == TunerState::kHybrid) {
616 std::string recordLocator=
"";
617 TunerReservation::TokenList tokens;
618 Manager::getInstance().getReservationTokens(tokens, tunerId);
620 TunerReservation::TokenList::const_iterator it = tokens.begin();
621 while (it != tokens.end()) {
622 if (getReservation(*it).state == TunerReservation::ACTIVE) {
623 if (getReservation(*it).getActivity().getActivity() == Activity::kRecord) {
624 recordLocator = getReservation(*it).getServiceLocator();
632 Assert(!recordLocator.empty());
635 while (it != tokens.end()) {
636 if (getReservation(*it).state == TunerReservation::ACTIVE) {
637 if (getReservation(*it).getActivity().getActivity() == Activity::kLive) {
638 std::string liveLocator = getReservation(*it).getServiceLocator();
639 if (liveLocator.compare(recordLocator) != 0) {
640 Log() <<
"Synchronization is needed in hybrid mode : LIVE[ " << liveLocator
641 <<
" ] vs RECORD [" << recordLocator <<
" ]\r\n";
643 getReservation(*it).setServiceLocator(recordLocator);
644 if (getReservation(*it).getCustomAttributes() != NULL) {
645 Log() <<
"Resetting custome attributes to NULL " << std::endl;
646 extern void delete_ReservationCustomAttributes(
void *p);
647 delete_ReservationCustomAttributes((
void *)getReservation(*it).getCustomAttributes());
648 getReservation(*it).setCustomAttributes(NULL);
650 std::vector<uint8_t> out;
651 SerializeMessage(NotifyTunerReservationUpdate(GenerateUUID(), getReservation(*it)), getReservationAttributes(*it).getClientId(), out);
652 Log() <<
"Sending the message:RL: " << std::endl;
653 ::serverInstance->getConnection(getReservationAttributes(*it).getClientId()).sendAsync(out);
654 emit reservationUpdated();
657 catch (ConnectionNotFoundException) {
671 Log() <<
"Tuner " << tunerId <<
" is sync'd in " << (
const char *) getTuner(tunerId).getState().getState() <<
" state \r\n";
674 void Manager::startReservation(
const std::string &reservationToken)
677 TunerReservation &reservation = getReservation(reservationToken);
679 if (reservation.getActivity() == Activity::kLive) {
681 Log() <<
"TRM Request PRETUNE " << reservation.getServiceLocator() << std::endl;
682 std::vector<uint8_t> out;
684 if (reservation.getActivity().getDetail(
"ppv").compare(
"true") != 0) {
685 SerializeMessage(NotifyTunerPretune(GenerateUUID(), reservation.getServiceLocator()), Connection::kTunerAgentId, out);
686 ::serverInstance->getConnection(Connection::kTunerAgentId).sendAsync(out);
690 Log() <<
"Do not Pretune for PPV Channel " << reservation.getServiceLocator() << std::endl;
693 catch(ConnectionNotFoundException &e) {
694 Log() <<
"Tuner Agent is not connected " << std::endl;
697 emit reservationUpdated();
700 NotifyTunerStatesUpdate Manager::getTunerStatesUpdate(
void)
702 NotifyTunerStatesUpdate notifyTunerStatesUpdate(GenerateUUID());
703 Tuner::IdList tunerIds;
705 Manager::getInstance().getTunerIds(tunerIds);
706 Tuner::IdList::const_iterator tidIT = tunerIds.begin();
707 for (tidIT = tunerIds.begin(); tidIT != tunerIds.end(); tidIT++) {
708 DetailedTunerState detailedTunerState;
709 const Tuner &tuner = Manager::getInstance().getTuner(*tidIT);
710 Log() <<
"Adding detailedTunerState for Tuner "
711 << *tidIT <<
"State= "
712 << (
const char *)tuner.getState().getState() <<
"locator=" << tuner.getServiceLocator() << std::endl;
715 TunerReservation::TokenList tokens;
717 Manager::getInstance().getTuner(*tidIT).getReservationTokens(tokens);
718 TunerReservation::TokenList::const_iterator itt;
719 for (itt=tokens.begin(); itt != tokens.end(); itt++) {
720 const TunerReservation &reservation = Manager::getInstance().getReservation(*itt);
721 if (reservation.state == TunerReservation::ACTIVE) {
722 SafeAssert(reservation.getServiceLocator() == tuner.getServiceLocator(
false));
723 detailedTunerState.addTunerOwner(((
const char *)reservation.getActivity().getActivity()), reservation.getDevice());
724 Log() <<
"Tuner " << *tidIT <<
"has activity " << ((
const char *)reservation.getActivity().getActivity())
725 <<
"owned by " << reservation.getDevice() << std::endl;
726 detailedTunerState.setState((
const char *)tuner.getState().getState(), tuner.getServiceLocator());
731 if (getLocalTuner().compare(*tidIT) == 0) {
732 Log() <<
"LocalTuner " << getLocalTuner() <<
"set reservedDeviceId" << std::endl;
733 detailedTunerState.setReservedDeviceId(GetDeviceId());
735 notifyTunerStatesUpdate.addTunerDetailedState(*tidIT, detailedTunerState);
738 return notifyTunerStatesUpdate;
741 void Manager::onCancelLiveResponse(
const CancelLiveResponse response,
const ReserveTuner request,
const std::string parentId)
744 Log() <<
"Manager::onCancelLiveResponse from client "
745 <<
" for activity " << (
const char *) Activity::kLive
746 <<
" for serviceLocator " << response.getServiceLocator()
747 <<
" for UUID " << response.getUUID() <<
" for Tuner " << parentId << std::endl;
749 Execute(exec, parentId);
752 std::string Manager::getLocalTuner(
void)
757 void Manager::setLocalTuner(
const std::string &tunerId)
759 this->localTuner = tunerId;
762 void Manager::onTimerDeleted(
void *ptr)
764 delete ((
Timer *)ptr);
767 bool PendingCancelRecordingProcessor::timeout()
769 CancelRecordingResponse response(request.getUUID(), request.getReservationToken());
770 response.getStatus() +=
"Cancellation Timedout, assuming cancelled=false\r\n";
771 response.getStatus() = ResponseStatus::kOk;
772 response.setCanceled(
false);
774 std::vector<uint8_t> out;
775 SerializeMessage(response, clientId, out);
776 ::serverInstance->getConnection(clientId).sendAsync(out);
781 bool PendingReserveTunerConflictProcessor::timeout()
783 bool recordingCancelled =
false;
785 Assert(
this == &Manager::getInstance().getPendingRequest(getUUID()));
786 Assert(request.getTunerReservation().getActivity().getActivity() == Activity::kRecord);
787 Assert(notification.getConflicts().size() == 1);
789 TunerReservation &conflict = *notification.getConflicts().begin();
791 Assert(conflict.getActivity().getActivity() == Activity::kRecord);
792 Assert(notification.getTunerReservation().getActivity().getActivity() == Activity::kLive);
796 TunerReservation::TokenList tokens;
798 Manager::getInstance().getReservationTokens(tokens, parentId);
800 if ((tokens.size() == 1)) {
802 if (Manager::getInstance().getReservation(*tokens.begin()).getActivity().getDetail(
"eas").compare(
"true") == 0) {
803 Log() <<
"The current Live channel " <<
804 Manager::getInstance().getReservation(*tokens.begin()).getServiceLocator() <<
805 " is EAS channel" << std::endl;
806 if (request.getTunerReservation().getServiceLocator().compare(Manager::getInstance().getReservation(*tokens.begin()).getServiceLocator()) != 0) {
807 Log() <<
"The recording channel " <<
808 request.getTunerReservation().getServiceLocator() <<
809 "is not EAS channel, cancel Recording " << std::endl;
810 ReserveTunerResponse response(request.getUUID());
811 response.getStatus() +=
"Cancel Recording For EAS\r\n";
812 response.getStatus() = ResponseStatus::kInsufficientResource;
814 std::vector<uint8_t> out;
815 SerializeMessage(response, Connection::kRecorderClientId, out);
816 ::serverInstance->getConnection(Connection::kRecorderClientId).sendAsync(out);
818 recordingCancelled =
true;
821 Log() <<
"The recording channel " <<
822 request.getTunerReservation().getServiceLocator() <<
823 "is EAS channel, allow Recording " << std::endl;
828 if (!recordingCancelled) {
830 if ((Manager::getInstance().getReservation(*tokens.begin()).getActivity().getActivity() == Activity::kLive)) {
831 Log() <<
"PendingReserveTunerConflictProcessor " << getUUID() <<
" Timedout...Cancel LIVE first before grating Record " << std::endl;
832 Assert(notification.getConflicts().size() == 1);
834 if (Manager::getInstance().getReservation(*tokens.begin()).getServiceLocator().compare(request.getTunerReservation().getServiceLocator()) != 0) {
835 Log() <<
"Target Tuner for recording is not on record channel now, so need to cancel tune, so send a real a cancel" << std::endl;
836 CancelLive cancelLive(GenerateUUID(),
837 Manager::getInstance().getReservation(*tokens.begin()).getServiceLocator(),
838 Manager::getInstance().getReservation(*tokens.begin()).getReservationToken());
840 const int CANCEL_LIVE_TIMEOUT_MS = (10000);
842 std::vector<uint8_t> out;
843 SerializeMessage(cancelLive,Connection::kRecorderClientId, out);
844 ::serverInstance->getConnection(Connection::kRecorderClientId).sendAsync(out);
847 Manager::getInstance().addPendingRequest(
new PendingCancelLiveProcessor(Connection::kTrmClientId, cancelLive, request, parentId), CANCEL_LIVE_TIMEOUT_MS);
852 Log() <<
"Target Tuner for recording is on record channel now, no need to cancel tune, so fake a cancel success and start Recording" << std::endl;
853 PendingCancelLiveProcessor fakeCancelProcessor(Connection::kTrmClientId, cancelLive, request, parentId);
854 fakeCancelProcessor.timeout();
857 CancelLive cancelLive(GenerateUUID(),
858 notification.getTunerReservation().getServiceLocator(),
859 notification.getTunerReservation().getReservationToken());
860 Log() <<
"Target Tuner for recording is on record channel now, or it is on its way to the recoridng chanel." << std::endl;
861 const int CANCEL_LIVE_TIMEOUT_MS = (10000);
863 std::vector<uint8_t> out;
864 SerializeMessage(cancelLive,Connection::kRecorderClientId, out);
865 ::serverInstance->getConnection(Connection::kRecorderClientId).sendAsync(out);
868 Manager::getInstance().addPendingRequest(
new PendingCancelLiveProcessor(Connection::kTrmClientId, cancelLive, request, parentId), CANCEL_LIVE_TIMEOUT_MS);
873 catch (ConnectionNotFoundException &e) {
874 Log() <<
"No Recorder alive, ignore " << std::endl;
878 Log() <<
"Target Tuner for recording is already recording" << std::endl;
883 else if (tokens.size() == 2) {
886 Assert(Manager::getInstance().getTuner(parentId).getState().getState() == TunerState::kHybrid);
887 Log() <<
"Target Tuner for recording is still recording , cannot cancel tune, so fake a cancel success and grant Recording" << std::endl;
888 CancelLive cancelLive(GenerateUUID(), Manager::getInstance().getReservation(*tokens.begin()).getServiceLocator(), Manager::getInstance().getReservation(*tokens.begin()).getReservationToken());
889 PendingCancelLiveProcessor fakeCancelProcessor(Connection::kTrmClientId, cancelLive, request, parentId);
890 fakeCancelProcessor.timeout();
892 else if (tokens.size() == 0) {
893 Log() <<
"Target Tuner for recording is free now, no need to cancel live, so fake a cancel success and grant Recording" << std::endl;
894 Assert(Manager::getInstance().getTuner(parentId).getState().getState() == TunerState::kFree);
895 CancelLive cancelLive(GenerateUUID(),
896 request.getTunerReservation().getServiceLocator(),
898 PendingCancelLiveProcessor fakeCancelProcessor(Connection::kTrmClientId, cancelLive, request, parentId);
899 fakeCancelProcessor.timeout();
902 Log() <<
"Incorrect token number " << tokens.size() << std::endl;
910 bool PendingCancelLiveProcessor::timeout()
913 emit Manager::getInstance().cancelLiveResponse(CancelLiveResponse(
914 cancelLiveRequest.getUUID(),
915 ResponseStatus(ResponseStatus::kOk,
"Assuming cancellation success upon timeout"),
916 cancelLiveRequest.getReservationToken(),
917 cancelLiveRequest.getServiceLocator(),
918 true), reserveRequest, parentId);