22#include "mythprotomonitor.h"
23#include "mythprotorecorder.h"
24#include "../private/debug.h"
25#include "../private/socket.h"
26#include "../private/os/threads/latch.h"
27#include "../private/builtin.h"
39ProtoMonitor::ProtoMonitor(
const std::string& server,
unsigned port)
45ProtoMonitor::ProtoMonitor(
const std::string& server,
unsigned port,
bool frontend)
51bool ProtoMonitor::Open()
55 if (!OpenConnection(PROTO_MONITOR_RCVBUF))
58 if (m_protoVersion >= 88)
71void ProtoMonitor::Close()
78bool ProtoMonitor::IsOpen()
82 return ProtoMonitor::Open();
83 return ProtoBase::IsOpen();
86bool ProtoMonitor::Announce75()
88 OS::WriteLock lock(*m_latch);
90 std::string cmd(
"ANN Monitor ");
91 cmd.append(m_socket->GetMyHostName()).append(
" 0");
92 if (!SendCommand(cmd.c_str()))
96 if (!
ReadField(field) || !IsMessageOK(field))
105bool ProtoMonitor::Announce88()
107 OS::WriteLock lock(*m_latch);
109 std::string cmd((m_frontend ?
"ANN Frontend " :
"ANN Monitor "));
110 cmd.append(m_socket->GetMyHostName()).append(
" 0");
111 if (!SendCommand(cmd.c_str()))
115 if (!
ReadField(field) || !IsMessageOK(field))
124ProtoRecorderPtr ProtoMonitor::GetRecorderFromNum75(
int rnum)
128 ProtoRecorderPtr recorder;
129 std::string hostname;
132 OS::WriteLock lock(*m_latch);
135 std::string cmd(
"GET_RECORDER_FROM_NUM");
136 cmd.append(PROTO_STR_SEPARATOR);
137 int32_to_string((int32_t)rnum, &buf);
138 cmd.append(buf.data);
140 if (!SendCommand(cmd.c_str()))
143 if (!
ReadField(hostname) || hostname ==
"nohost")
145 if (!
ReadField(field) || string_to_uint16(field.c_str(), &port))
148 DBG(DBG_DEBUG,
"%s: open recorder %d (%s:%u)\n", __FUNCTION__, (
int)rnum, hostname.c_str(), (
unsigned)port);
149 recorder.reset(
new ProtoRecorder(rnum, hostname, port));
152 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
157bool ProtoMonitor::QueryFreeSpaceSummary75(int64_t *total, int64_t *used)
161 OS::WriteLock lock(*m_latch);
164 std::string cmd(
"QUERY_FREE_SPACE_SUMMARY");
166 if (!SendCommand(cmd.c_str()))
169 if (!
ReadField(field) || string_to_int64(field.c_str(), total))
171 if (!
ReadField(field) || string_to_int64(field.c_str(), used))
176 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
181std::string ProtoMonitor::GetSetting75(
const std::string& hostname,
const std::string& setting)
185 OS::WriteLock lock(*m_latch);
188 std::string cmd(
"QUERY_SETTING ");
189 cmd.append(hostname).append(
" ").append(setting);
191 if (!SendCommand(cmd.c_str()))
199 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
205bool ProtoMonitor::SetSetting75(
const std::string& hostname,
const std::string& setting,
const std::string& value)
209 OS::WriteLock lock(*m_latch);
212 std::string cmd(
"SET_SETTING ");
213 cmd.append(hostname).append(
" ").append(setting).append(
" ").append(value);
215 if (!SendCommand(cmd.c_str()))
218 if (!
ReadField(field) || !IsMessageOK(field))
223 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
228bool ProtoMonitor::QueryGenpixmap75(
const Program& program)
232 OS::WriteLock lock(*m_latch);
235 std::string cmd(
"QUERY_GENPIXMAP2");
236 cmd.append(PROTO_STR_SEPARATOR).append(
"do_not_care").append(PROTO_STR_SEPARATOR);
237 MakeProgramInfo(program, field);
240 if (!SendCommand(cmd.c_str()))
243 if (!
ReadField(field) || !IsMessageOK(field))
248 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
253bool ProtoMonitor::DeleteRecording75(
const Program& program,
bool force,
bool forget)
258 OS::WriteLock lock(*m_latch);
261 std::string cmd(
"DELETE_RECORDING ");
262 uint32_to_string(program.channel.chanId, &buf);
263 cmd.append(buf.data).append(
" ");
264 time_to_iso8601utc(program.recording.startTs, &buf);
265 cmd.append(buf.data).append(
" ");
267 cmd.append(
"FORCE ");
269 cmd.append(
"NO_FORCE ");
271 cmd.append(
"FORGET");
273 cmd.append(
"NO_FORGET");
275 if (!SendCommand(cmd.c_str()))
280 DBG(DBG_DEBUG,
"%s: succeeded (%s)\n", __FUNCTION__, program.fileName.c_str());
283 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
288bool ProtoMonitor::UndeleteRecording75(
const Program& program)
292 OS::WriteLock lock(*m_latch);
295 std::string cmd(
"UNDELETE_RECORDING");
296 cmd.append(PROTO_STR_SEPARATOR);
297 MakeProgramInfo(program, field);
300 if (!SendCommand(cmd.c_str()))
305 DBG(DBG_DEBUG,
"%s: succeeded (%s)\n", __FUNCTION__, program.fileName.c_str());
308 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
313bool ProtoMonitor::StopRecording75(
const Program& program)
318 OS::WriteLock lock(*m_latch);
321 std::string cmd(
"STOP_RECORDING");
322 cmd.append(PROTO_STR_SEPARATOR);
323 MakeProgramInfo(program, field);
326 if (!SendCommand(cmd.c_str()))
329 if (!
ReadField(field) || string_to_int32(field.c_str(), &num) || num < 0)
331 DBG(DBG_DEBUG,
"%s: succeeded (%s)\n", __FUNCTION__, program.fileName.c_str());
334 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
339bool ProtoMonitor::CancelNextRecording75(
int rnum,
bool cancel)
344 OS::WriteLock lock(*m_latch);
347 std::string cmd(
"QUERY_RECORDER ");
348 int32_to_string(rnum, &buf);
349 cmd.append(buf.data).append(PROTO_STR_SEPARATOR);
350 cmd.append(
"CANCEL_NEXT_RECORDING").append(PROTO_STR_SEPARATOR);
351 cmd.append((cancel ?
"1" :
"0"));
353 if (!SendCommand(cmd.c_str()))
356 if (!
ReadField(field) || !IsMessageOK(field))
358 DBG(DBG_DEBUG,
"%s: succeeded\n", __FUNCTION__);
361 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
366StorageGroupFilePtr ProtoMonitor::QuerySGFile75(
const std::string& hostname,
const std::string& sgname,
const std::string& filename)
370 StorageGroupFilePtr sgfile;
372 OS::WriteLock lock(*m_latch);
375 std::string cmd(
"QUERY_SG_FILEQUERY");
376 cmd.append(PROTO_STR_SEPARATOR);
377 cmd.append(hostname).append(PROTO_STR_SEPARATOR);
378 cmd.append(sgname).append(PROTO_STR_SEPARATOR);
379 cmd.append(filename);
381 if (!SendCommand(cmd.c_str()))
383 sgfile.reset(
new StorageGroupFile());
387 if (!
ReadField(field) || string_to_int64(field.c_str(), &tmpi))
389 sgfile->lastModified = (time_t)tmpi;
390 if (!
ReadField(field) || string_to_int64(field.c_str(), &(sgfile->size)))
392 sgfile->hostName = hostname;
393 sgfile->storageGroup = sgname;
395 DBG(DBG_DEBUG,
"%s: succeeded (%s)\n", __FUNCTION__, sgfile->fileName.c_str());
398 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
404MarkListPtr ProtoMonitor::GetCutList75(
const Program& program)
409 MarkListPtr list(
new MarkList);
411 OS::WriteLock lock(*m_latch);
414 std::string cmd(
"QUERY_CUTLIST ");
415 uint32_to_string(program.channel.chanId, &buf);
416 cmd.append(buf.data).append(
" ");
417 int64_to_string(program.recording.startTs, &buf);
418 cmd.append(buf.data);
420 if (!SendCommand(cmd.c_str()))
423 if (!
ReadField(field) || string_to_int32(field.c_str(), &nb))
430 MarkPtr mark = MarkPtr(
new Mark());
431 if (!
ReadField(field) || string_to_int8(field.c_str(), (int8_t*)&(mark->markType)))
433 if (!
ReadField(field) || string_to_int64(field.c_str(), &(mark->markValue)))
435 list->push_back(mark);
439 DBG(DBG_DEBUG,
"%s: succeeded (%s)\n", __FUNCTION__, program.fileName.c_str());
442 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
447MarkListPtr ProtoMonitor::GetCommBreakList75(
const Program& program)
452 MarkListPtr list(
new MarkList);
454 OS::WriteLock lock(*m_latch);
457 std::string cmd(
"QUERY_COMMBREAK ");
458 uint32_to_string(program.channel.chanId, &buf);
459 cmd.append(buf.data).append(
" ");
460 int64_to_string(program.recording.startTs, &buf);
461 cmd.append(buf.data);
463 if (!SendCommand(cmd.c_str()))
466 if (!
ReadField(field) || string_to_int32(field.c_str(), &nb))
473 MarkPtr mark = MarkPtr(
new Mark());
474 if (!
ReadField(field) || string_to_int8(field.c_str(), (int8_t*)&(mark->markType)))
476 if (!
ReadField(field) || string_to_int64(field.c_str(), &(mark->markValue)))
478 list->push_back(mark);
482 DBG(DBG_DEBUG,
"%s: succeeded (%s)\n", __FUNCTION__, program.fileName.c_str());
485 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
490bool ProtoMonitor::BlockShutdown75()
494 OS::WriteLock lock(*m_latch);
497 std::string cmd(
"BLOCK_SHUTDOWN");
499 if (!SendCommand(cmd.c_str()))
502 if (!
ReadField(field) || !IsMessageOK(field))
504 DBG(DBG_DEBUG,
"%s: succeeded\n", __FUNCTION__);
507 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
512bool ProtoMonitor::AllowShutdown75()
516 OS::WriteLock lock(*m_latch);
519 std::string cmd(
"ALLOW_SHUTDOWN");
521 if (!SendCommand(cmd.c_str()))
524 if (!
ReadField(field) || !IsMessageOK(field))
526 DBG(DBG_DEBUG,
"%s: succeeded\n", __FUNCTION__);
529 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
534std::vector<int> ProtoMonitor::GetFreeCardIdList75()
537 std::vector<int> ids;
540 OS::WriteLock lock(*m_latch);
543 std::string cmd(
"GET_FREE_RECORDER_LIST");
545 if (!SendCommand(cmd.c_str()))
548 while (m_msgConsumed < m_msgLength)
550 if (!
ReadField(field) || string_to_int32(field.c_str(), &rnum))
552 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
560 DBG(DBG_DEBUG,
"%s: succeeded (%u)\n", __FUNCTION__, (
unsigned)ids.size());
564CardInputListPtr ProtoMonitor::GetFreeInputs75()
566 CardInputListPtr list = CardInputListPtr(
new CardInputList());
567 std::vector<int> cardList = GetFreeCardIdList75();
568 for (std::vector<int>::const_iterator cardIt = cardList.begin(); cardIt != cardList.end(); ++cardIt)
570 bool succeeded =
false;
574 OS::WriteLock lock(*m_latch);
577 std::string cmd(
"QUERY_RECORDER ");
578 int32_to_string((int32_t)(*cardIt), &buf);
579 cmd.append(buf.data);
580 cmd.append(PROTO_STR_SEPARATOR);
581 cmd.append(
"GET_FREE_INPUTS");
583 if (!SendCommand(cmd.c_str()))
586 while (m_msgConsumed < m_msgLength)
588 CardInputPtr input(
new CardInput());
591 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
593 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
595 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
597 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
599 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
601 list->push_back(input);
611CardInputListPtr ProtoMonitor::GetFreeInputs79()
613 CardInputListPtr list = CardInputListPtr(
new CardInputList());
614 std::vector<int> cardList = GetFreeCardIdList75();
615 for (std::vector<int>::const_iterator cardIt = cardList.begin(); cardIt != cardList.end(); ++cardIt)
617 bool succeeded =
false;
621 OS::WriteLock lock(*m_latch);
624 std::string cmd(
"QUERY_RECORDER ");
625 int32_to_string((int32_t)(*cardIt), &buf);
626 cmd.append(buf.data);
627 cmd.append(PROTO_STR_SEPARATOR);
628 cmd.append(
"GET_FREE_INPUTS");
630 if (!SendCommand(cmd.c_str()))
633 while (m_msgConsumed < m_msgLength)
635 CardInputPtr input(
new CardInput());
638 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
640 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
642 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
644 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
646 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
656 list->push_back(input);
666CardInputListPtr ProtoMonitor::GetFreeInputs81()
668 CardInputListPtr list = CardInputListPtr(
new CardInputList());
669 std::vector<int> cardList = GetFreeCardIdList75();
670 for (std::vector<int>::const_iterator cardIt = cardList.begin(); cardIt != cardList.end(); ++cardIt)
672 bool succeeded =
false;
676 OS::WriteLock lock(*m_latch);
679 std::string cmd(
"QUERY_RECORDER ");
680 int32_to_string((int32_t)(*cardIt), &buf);
681 cmd.append(buf.data);
682 cmd.append(PROTO_STR_SEPARATOR);
683 cmd.append(
"GET_FREE_INPUTS");
685 if (!SendCommand(cmd.c_str()))
688 while (m_msgConsumed < m_msgLength)
690 CardInputPtr input(
new CardInput());
693 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
695 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
697 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
699 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
701 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
713 list->push_back(input);
723CardInputListPtr ProtoMonitor::GetFreeInputs87(
int rnum)
725 CardInputListPtr list = CardInputListPtr(
new CardInputList());
729 OS::WriteLock lock(*m_latch);
732 std::string cmd(
"GET_FREE_INPUT_INFO ");
733 int32_to_string((int32_t)rnum, &buf);
734 cmd.append(buf.data);
736 if (!SendCommand(cmd.c_str()))
739 while (m_msgConsumed < m_msgLength)
741 CardInputPtr input(
new CardInput());
744 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
746 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
748 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
750 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
752 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
764 list->push_back(input);
770CardInputListPtr ProtoMonitor::GetFreeInputs89(
int rnum)
772 CardInputListPtr list = CardInputListPtr(
new CardInputList());
776 OS::WriteLock lock(*m_latch);
779 std::string cmd(
"GET_FREE_INPUT_INFO ");
780 int32_to_string((int32_t)rnum, &buf);
781 cmd.append(buf.data);
783 if (!SendCommand(cmd.c_str()))
786 while (m_msgConsumed < m_msgLength)
788 CardInputPtr input(
new CardInput());
791 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
793 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
795 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
797 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
799 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
813 list->push_back(input);
819CardInputListPtr ProtoMonitor::GetFreeInputs90(
int rnum)
821 CardInputListPtr list = CardInputListPtr(
new CardInputList());
825 OS::WriteLock lock(*m_latch);
828 std::string cmd(
"GET_FREE_INPUT_INFO ");
829 int32_to_string((int32_t)rnum, &buf);
830 cmd.append(buf.data);
832 if (!SendCommand(cmd.c_str()))
835 while (m_msgConsumed < m_msgLength)
837 CardInputPtr input(
new CardInput());
840 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
842 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
844 input->cardId = input->inputId;
847 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
849 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
863 list->push_back(input);
869CardInputListPtr ProtoMonitor::GetFreeInputs91(
int rnum)
871 CardInputListPtr list = CardInputListPtr(
new CardInputList());
875 OS::WriteLock lock(*m_latch);
878 std::string cmd(
"GET_FREE_INPUT_INFO ");
879 int32_to_string((int32_t)rnum, &buf);
880 cmd.append(buf.data);
882 if (!SendCommand(cmd.c_str()))
885 while (m_msgConsumed < m_msgLength)
887 CardInputPtr input(
new CardInput());
890 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
892 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
894 input->cardId = input->inputId;
895 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
897 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
909 list->push_back(input);
bool m_tainted
Connection has hung since last reset.
bool ReadField(std::string &field)
bool m_hang
Connection hang: while true allow retry.
This is the main namespace that encloses all public classes.