15 #include <QTextStream>
16 #include <QElapsedTimer>
28 #define LOC QString("ChanImport: ")
58 "WHERE videosource.sourceid = :SOURCEID");
64 else if (query.
next())
66 lcnOffset = query.
value(0).toUInt();
69 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
70 QString(
"Logical Channel Number offset:%1")
77 bool _delete,
bool insert,
bool save,
78 bool fta_only,
bool lcn_only,
bool complete_only,
79 bool full_channel_search,
80 bool remove_duplicates,
84 m_isInteractive(interactive),
90 m_completeOnly(complete_only),
91 m_fullChannelSearch(full_channel_search),
92 m_removeDuplicates(remove_duplicates),
94 m_serviceRequirements(service_requirements)
108 if (_transports.empty())
114 LOG(VB_GENERAL, LOG_INFO,
LOC + (channels ?
116 QString(
"Found %1 channels")
118 "No new channels to process") :
119 "No channels to process.."));
123 msg = tr(
"Failed to find any channels.");
125 msg = tr(
"Found %n channel(s)",
"", channels);
127 msg = tr(
"Failed to find any new channels!");
138 "No new channels to process" :
139 "No channels to process..");
153 QTextStream ssMsg(&msg);
159 const char *desired {
"all" };
163 desired =
"tv+radio";
164 ssMsg << Qt::endl << Qt::endl;
165 ssMsg <<
"Scan parameters:" << Qt::endl;
166 ssMsg <<
"Desired Services : " << desired << Qt::endl;
167 ssMsg <<
"Unencrypted Only : " << (
m_ftaOnly ?
"yes" :
"no") << Qt::endl;
168 ssMsg <<
"Logical Channel Numbers only: " << (
m_lcnOnly ?
"yes" :
"no") << Qt::endl;
169 ssMsg <<
"Complete scan data required : " << (
m_completeOnly ?
"yes" :
"no") << Qt::endl;
170 ssMsg <<
"Full search for old channels: " << (
m_fullChannelSearch ?
"yes" :
"no") << Qt::endl;
175 if (!transports.empty())
178 ssMsg <<
"Transport list before processing (" << transports.size() <<
"):" << Qt::endl;
183 ssMsg <<
"Channel list before processing (";
187 LOG(VB_GENERAL, LOG_INFO,
LOC + msg);
201 if (!duplicates.empty())
205 ssMsg <<
"Discarded duplicate transports (" << duplicates.size() <<
"):" << Qt::endl;
207 ssMsg <<
"Discarded duplicate channels (" <<
SimpleCountChannels(duplicates) <<
"):" << Qt::endl;
208 ssMsg <<
FormatChannels(duplicates).toLatin1().constData() << Qt::endl;
209 LOG(VB_CHANSCAN, LOG_INFO,
LOC + msg);
233 if (!db_trans.empty())
236 ssMsg <<
"Transports with channels in DB but not in scan (";
237 ssMsg << db_trans.size() <<
"):" << Qt::endl;
248 ssMsg <<
"Channel list after compare with database (";
258 std::copy(db_trans.cbegin(), db_trans.cend(), std::back_inserter(trans));
280 LOG(VB_GENERAL, LOG_INFO,
LOC + msg);
317 std::vector<uint> off_air_list;
318 QMap<uint,bool> deleted;
321 for (
size_t i = 0; i < transports.size(); ++i)
324 for (
size_t j = 0; j < transports[i].m_channels.size(); ++j)
333 off_air_list.push_back(i<<16|j);
338 off_air_transports.push_back(transport_copy);
341 if (off_air_list.empty())
345 std::cout << std::endl <<
"Off-air channels (" <<
SimpleCountChannels(off_air_transports) <<
"):" << std::endl;
347 std::cout <<
FormatChannels(off_air_transports, &infoA).toLatin1().constData() << std::endl;
352 QString msg = tr(
"Found %n off-air channel(s).",
"", off_air_list.size());
361 for (
uint item : off_air_list)
364 int j = item & 0xFFFF;
366 transports[i].m_channels[j].m_channelId);
367 deleted[item] =
true;
372 for (
uint item : off_air_list)
375 int j = item & 0xFFFF;
376 int chanid = transports[i].m_channels[j].m_channelId;
395 for (
size_t i = 0; i < transports.size(); ++i)
397 newlist.push_back(transports[i]);
398 newlist.back().m_channels.clear();
399 for (
size_t j = 0; j < transports[i].m_channels.size(); ++j)
401 if (!deleted.contains(i<<16|j))
403 newlist.back().m_channels.push_back(
404 transports[i].m_channels[j]);
409 transports = newlist;
410 return deleted.size();
417 "SELECT mplexid FROM dtv_multiplex "
418 "WHERE sourceid = :SOURCEID1 AND "
422 " WHERE sourceid = :SOURCEID2)");
431 QString msg = tr(
"Found %n unused transport(s).",
"", query.
size());
432 LOG(VB_GENERAL, LOG_INFO,
LOC + msg);
436 if (query.
size() == 0)
446 "DELETE FROM dtv_multiplex "
447 "WHERE sourceid = :SOURCEID1 AND "
451 " WHERE sourceid = :SOURCEID2)");
463 LOG(VB_GENERAL, LOG_INFO,
LOC +
"Manual delete of transport not implemented");
494 QString msg = tr(
"Found %n old %1 channel(s).",
"", old_chan)
503 QString msg = tr(
"Found %n new %1 channel(s).",
"", new_chan)
531 QString msg = tr(
"Found %n conflicting old %1 channel(s).",
540 QString msg = tr(
"Found %n new conflicting %1 channel(s).",
549 QTextStream ssMsg(&msg);
551 if (!updated.empty())
553 ssMsg << Qt::endl << Qt::endl;
554 ssMsg <<
"Updated old transports (" << updated.size() <<
"):" << Qt::endl;
561 if (!skipped_updates.empty())
564 ssMsg <<
"Skipped old channels (" <<
SimpleCountChannels(skipped_updates) <<
"):" << Qt::endl;
567 if (!inserted.empty())
573 if (!skipped_inserts.empty())
576 ssMsg <<
"Skipped new channels (" <<
SimpleCountChannels(skipped_inserts) <<
"):" << Qt::endl;
588 ssMsg <<
GetSummary(ninfo, nstats).toLatin1().constData();
590 LOG(VB_GENERAL, LOG_INFO,
LOC + msg);
614 bool cancel_all =
false;
619 for (
const auto & transport : transports)
625 for (
size_t j = 0; j < transport.m_channels.size(); ++j)
667 bool conflicting =
false;
676 bool ok_done =
false;
716 bool inserted =
false;
758 if (!transport.m_iptvTuning.GetDataURL().isEmpty())
760 transport.m_iptvTuning);
783 next_list.push_back(new_transport);
786 skipped_list.push_back(skipped_transport);
789 inserted_list.push_back(inserted_transport);
818 for (
const auto & transport : transports)
824 for (
size_t j = 0; j < transport.m_channels.size(); ++j)
842 bool conflicting =
false;
861 bool updated =
false;
923 next_list.push_back(new_transport);
926 skipped_list.push_back(skipped_transport);
929 updated_list.push_back(updated_transport);
952 transport_copy = transport;
968 if (!transports.empty())
969 tuner_type = transports[0].m_tunerType;
974 uint freq_mult = (is_dvbs) ? 1 : 1000;
976 std::vector<bool> ignore;
977 ignore.resize(transports.size());
978 for (
size_t i = 0; i < transports.size(); ++i)
983 for (
size_t j = i+1; j < transports.size(); ++j)
985 if (!transports[i].IsEqual(
986 tuner_type, transports[j], 500 * freq_mult))
991 for (
size_t k = 0; k < transports[j].m_channels.size(); ++k)
993 bool found_same =
false;
994 for (
size_t l = 0; l < transports[i].m_channels.size(); ++l)
996 if (transports[j].m_channels[k].IsSameChannel(
997 transports[i].m_channels[l]))
1000 transports[i].m_channels[l].ImportExtraInfo(
1001 transports[j].m_channels[k]);
1005 transports[i].m_channels.push_back(transports[j].m_channels[k]);
1007 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
1008 QString(
"Transport on same frequency:") +
FormatTransport(transports[j]));
1011 no_dups.push_back(transports[i]);
1013 transports = no_dups;
1028 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
1029 QString(
"Number of transports:%1").arg(transports.size()));
1032 std::vector<bool> ignore;
1033 ignore.resize(transports.size());
1034 for (
size_t i = 0; i < transports.size(); ++i)
1037 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
"Transport " +
1042 for (
size_t j = i+1; j < transports.size(); ++j)
1045 bool found_same =
true;
1046 bool found_diff =
true;
1049 LOG(VB_CHANSCAN, LOG_DEBUG,
LOC +
"Comparing transport A " +
1051 LOG(VB_CHANSCAN, LOG_DEBUG,
LOC +
"Comparing transport B " +
1054 for (
size_t k = 0; found_same && k < tb.
m_channels.size(); ++k)
1068 if (found_same && !found_diff)
1070 size_t lowss = transports[i].m_signalStrength < transports[j].m_signalStrength ? i : j;
1071 ignore[lowss] =
true;
1072 duplicates.push_back(transports[lowss]);
1074 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
"Duplicate transports found:");
1083 no_dups.push_back(transports[i]);
1087 transports = no_dups;
1095 for (
auto & transport : transports)
1098 for (
auto & channel : transport.m_channels)
1100 if (
m_ftaOnly && channel.m_isEncrypted &&
1104 if (require_a && channel.m_isDataService)
1107 if (require_av && channel.m_isAudioService)
1111 if (
m_lcnOnly && channel.m_chanNum.isEmpty())
1114 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"No LCN: %1").arg(msg));
1120 !(channel.m_inPat &&
1124 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"Not in PAT/PMT: %1").arg(msg));
1130 channel.m_atscMajorChannel == 0 &&
1131 channel.m_atscMinorChannel == 0 &&
1132 (!channel.m_inPat ||
1135 (channel.m_patTsId !=
1136 channel.m_sdtTsId)))
1139 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"Not in PAT/PMT/SDT: %1").arg(msg));
1147 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"No name: %1").arg(msg));
1152 if (channel.m_inChannelsConf &&
1153 !(channel.m_inPat ||
1160 filtered.push_back(channel);
1162 transport.m_channels = filtered;
1168 QMap<uint64_t, bool> rs;
1171 for (
auto & transport : transports)
1173 for (
auto & channel : transport.m_channels)
1175 if (channel.m_oldOrigNetId > 0)
1177 uint64_t key = ((uint64_t)channel.m_oldOrigNetId << 32) | (channel.m_oldTsId << 16) | channel.m_oldServiceId;
1184 for (
auto & transport : transports)
1187 for (
auto & channel : transport.m_channels)
1189 uint64_t key = ((uint64_t)channel.m_origNetId << 32) | (channel.m_sdtTsId << 16) | channel.m_serviceId;
1190 if (rs.value(key,
false))
1193 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"Relocated: %1").arg(msg));
1196 filtered.push_back(channel);
1198 transport.m_channels = filtered;
1205 QMap<qlonglong, uint> map_sid_scn;
1206 QMap<qlonglong, uint> map_sid_lcn;
1207 QMap<uint, qlonglong> map_lcn_sid;
1209 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"Process DVB Channel Numbers"));
1210 for (
auto & transport : transports)
1212 for (
auto & channel : transport.m_channels)
1214 LOG(VB_CHANSCAN, LOG_DEBUG,
LOC + QString(
"Channel onid:%1 sid:%2 lcn:%3 scn:%4")
1215 .arg(channel.m_origNetId).arg(channel.m_serviceId).arg(channel.m_logicalChannel)
1216 .arg(channel.m_simulcastChannel));
1217 qlonglong key = ((qlonglong)channel.m_origNetId<<32) | channel.m_serviceId;
1218 if (channel.m_logicalChannel > 0)
1220 map_sid_lcn[key] = channel.m_logicalChannel;
1221 map_lcn_sid[channel.m_logicalChannel] = key;
1223 if (channel.m_simulcastChannel > 0)
1225 map_sid_scn[key] = channel.m_simulcastChannel;
1243 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"Process Simulcast Channel Numbers"));
1245 QMap<qlonglong, uint>::iterator it;
1246 for (it = map_sid_scn.begin(); it != map_sid_scn.end(); ++it)
1249 qlonglong key_hd = it.key();
1251 uint lcn_sd = scn_hd;
1252 uint lcn_hd = map_sid_lcn[key_hd];
1254 qlonglong key_sd = map_lcn_sid[lcn_sd];
1256 map_sid_lcn[key_sd] = lcn_hd;
1257 map_sid_lcn[key_hd] = lcn_sd;
1258 map_lcn_sid[lcn_hd] = key_sd;
1259 map_lcn_sid[lcn_sd] = key_hd;
1264 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"Process Logical Channel Numbers"));
1265 for (
auto & transport : transports)
1267 for (
auto & channel : transport.m_channels)
1269 if (channel.m_chanNum.isEmpty())
1271 qlonglong key = ((qlonglong)channel.m_origNetId<<32) | channel.m_serviceId;
1272 QMap<qlonglong, uint>::const_iterator it = map_sid_lcn.constFind(key);
1273 if (it != map_sid_lcn.cend())
1275 channel.m_chanNum = QString::number(*it +
m_lcnOffset);
1276 LOG(VB_CHANSCAN, LOG_DEBUG,
LOC +
1277 QString(
"Final channel sid:%1 channel %2")
1278 .arg(channel.m_serviceId).arg(channel.m_chanNum));
1282 LOG(VB_CHANSCAN, LOG_DEBUG,
LOC +
1283 QString(
"Final channel sid:%1 NO channel number")
1284 .arg(channel.m_serviceId));
1289 LOG(VB_CHANSCAN, LOG_DEBUG,
LOC +
1290 QString(
"Final channel sid:%1 has already channel number %2")
1291 .arg(channel.m_serviceId).arg(channel.m_chanNum));
1308 int found_in_same_transport = 0;
1309 int found_in_other_transport = 0;
1310 int found_nowhere = 0;
1313 if (!transports.empty())
1314 tuner_type = transports[0].m_tunerType;
1320 uint freq_mult = (is_dvbs) ? 1 : 1000;
1325 "FROM dtv_multiplex "
1326 "WHERE sourceid = :SOURCEID "
1328 "ORDER BY mplexid");
1337 QMap<uint,bool> found_in_scan;
1338 while (query.
next())
1342 if (db_transport.
FillFromDB(tuner_type, mplexid))
1350 bool found_transport =
false;
1351 QMap<uint,bool> found_in_database;
1354 for (
size_t ist = 0; ist < transports.size(); ++ist)
1357 if (scan_transport.
IsEqual(tuner_type, db_transport, 500 * freq_mult,
true))
1359 found_transport =
true;
1361 for (
size_t jdc = 0; jdc < db_transport.
m_channels.size(); ++jdc)
1363 if (!found_in_database[jdc])
1366 for (
size_t ksc = 0; ksc < scan_transport.
m_channels.size(); ++ksc)
1368 if (!found_in_scan[(ist<<16)+ksc])
1373 found_in_same_transport++;
1374 found_in_database[jdc] =
true;
1375 found_in_scan[(ist<<16)+ksc] =
true;
1392 for (
size_t ist = 0; ist < transports.size(); ++ist)
1395 for (
size_t jdc = 0; jdc < db_transport.
m_channels.size(); ++jdc)
1397 if (!found_in_database[jdc])
1400 for (
size_t ksc = 0; ksc < scan_transport.
m_channels.size(); ++ksc)
1402 if (!found_in_scan[(ist<<16)+ksc])
1407 found_in_other_transport++;
1408 found_in_database[jdc] =
true;
1409 found_in_scan[(ist<<16)+ksc] =
true;
1423 if (found_transport)
1426 tmp.m_channels.clear();
1428 for (
size_t idc = 0; idc < db_transport.
m_channels.size(); ++idc)
1430 if (!found_in_database[idc])
1437 if (!
tmp.m_channels.empty())
1438 not_in_scan.push_back(
tmp);
1441 LOG(VB_GENERAL, LOG_INFO,
LOC +
1442 QString(
"Old channels found in same transport: %1")
1443 .arg(found_in_same_transport));
1444 LOG(VB_GENERAL, LOG_INFO,
LOC +
1445 QString(
"Old channels found in other transport: %1")
1446 .arg(found_in_other_transport));
1447 LOG(VB_GENERAL, LOG_INFO,
LOC +
1448 QString(
"Old channels not found (off-air): %1")
1449 .arg(found_nowhere));
1457 for (
auto & transport : transports)
1459 for (
auto & chan : transport.m_channels)
1461 if (((chan.m_couldBeOpencable && (chan.m_siStandard ==
"mpeg")) ||
1462 chan.m_isOpencable) && !chan.m_inVct)
1464 chan.m_siStandard =
"opencable";
1474 for (
const auto & transport : transports)
1476 for (
const auto & chan : transport.m_channels)
1479 if (chan.m_isEncrypted)
1481 if (chan.m_siStandard ==
"atsc")
info.m_atscChannels[enc] += 1;
1482 if (chan.m_siStandard ==
"dvb")
info.m_dvbChannels[enc] += 1;
1483 if (chan.m_siStandard ==
"mpeg")
info.m_mpegChannels[enc] += 1;
1484 if (chan.m_siStandard ==
"opencable")
info.m_scteChannels[enc] += 1;
1485 if (chan.m_siStandard ==
"ntsc")
info.m_ntscChannels[enc] += 1;
1486 if (chan.m_siStandard !=
"ntsc")
1488 ++
info.m_progNumCnt[chan.m_serviceId];
1491 if (chan.m_siStandard ==
"atsc")
1493 ++
info.m_atscNumCnt[(chan.m_atscMajorChannel << 16) |
1494 (chan.m_atscMinorChannel)];
1495 ++
info.m_atscMinCnt[chan.m_atscMinorChannel];
1496 ++
info.m_atscMajCnt[chan.m_atscMajorChannel];
1498 if (chan.m_siStandard ==
"ntsc")
1500 ++
info.m_atscNumCnt[(chan.m_atscMajorChannel << 16) |
1501 (chan.m_atscMinorChannel)];
1515 for (
const auto & transport : transports)
1517 for (
const auto & chan : transport.m_channels)
1520 (
info.m_progNumCnt[chan.m_serviceId] == 1) ? 1 : 0;
1522 (
info.m_chanNumCnt[
map_str(chan.m_chanNum)] == 1) ? 1 : 0;
1524 if (chan.m_siStandard ==
"atsc")
1527 (
info.m_atscNumCnt[(chan.m_atscMajorChannel << 16) |
1528 (chan.m_atscMinorChannel)] == 1) ? 1 : 0;
1530 (
info.m_atscMinCnt[(chan.m_atscMinorChannel)] == 1) ? 1 : 0;
1533 info.m_atscMajCnt[chan.m_atscMajorChannel]);
1551 QTextStream ssMsg(&msg);
1555 QString si_standard = (chan.
m_siStandard==
"opencable") ?
1558 if (si_standard ==
"atsc" || si_standard ==
"scte")
1560 ssMsg << (QString(
"%1:%2:%3-%4:%5:%6=%7=%8:%9")
1568 .arg(si_standard)).toLatin1().constData();
1570 else if (si_standard ==
"dvb")
1572 ssMsg << (QString(
"%1:%2:%3:%4:%5:%6=%7:%8")
1578 .arg(si_standard)).toLatin1().constData();
1582 ssMsg << (QString(
"%1:%2:%3:%4:%5")
1586 .arg(si_standard)).toLatin1().constData();
1592 msg = msg.leftJustified(72);
1597 << (QString(
"cnt(pnum:%1,channum:%2)")
1600 ).toLatin1().constData();
1605 (QString(
":atsc_cnt(tot:%1,minor:%2)")
1606 .arg(
info->m_atscNumCnt[
1610 ).toLatin1().constData();
1633 QTextStream ssMsg(&msg);
1635 QString si_standard = (chan.
m_siStandard==
"opencable") ?
1638 if (si_standard ==
"atsc" || si_standard ==
"scte")
1640 if (si_standard ==
"atsc")
1648 ssMsg << (QString(
"%1-%2")
1654 ssMsg << (QString(
"%1-%2")
1660 ssMsg << (QString(
" (%1)")
1661 .arg(chan.
m_callSign)).toLatin1().constData();
1663 else if (si_standard ==
"dvb")
1665 ssMsg << (QString(
"%1 (%2 %3)")
1667 .arg(chan.
m_netId)).toLatin1().constData();
1671 ssMsg << (QString(
"%1-%2")
1673 .toLatin1().constData();
1677 ssMsg << (QString(
"%1-%2")
1679 .toLatin1().constData();
1690 struct less_than_key
1698 std::sort(transports.begin(), transports.end(), less_than_key());
1702 for (
auto & transport : transports)
1704 auto fmt_chan = [transport,
info](
const QString & m,
const auto & chan)
1706 msg = std::accumulate(transport.m_channels.cbegin(), transport.m_channels.cend(),
1717 QTextStream ssMsg(&msg);
1719 ssMsg << QString(
" onid:%1").arg(transport.
m_networkID);
1729 struct less_than_key
1737 std::sort(transports.begin(), transports.end(), less_than_key());
1739 auto fmt_trans = [](
const QString& msg,
const auto & transport)
1741 return std::accumulate(transports.cbegin(), transports.cend(),
1742 QString(), fmt_trans);
1749 QString msg = tr(
"Channels: FTA Enc Dec\n") +
1750 QString(
"ATSC %1 %2 %3\n")
1751 .arg(
info.m_atscChannels[0],3)
1752 .arg(
info.m_atscChannels[1],3)
1753 .arg(
info.m_atscChannels[2],3) +
1754 QString(
"DVB %1 %2 %3\n")
1755 .arg(
info.m_dvbChannels [0],3)
1756 .arg(
info.m_dvbChannels [1],3)
1757 .arg(
info.m_dvbChannels [2],3) +
1758 QString(
"SCTE %1 %2 %3\n")
1759 .arg(
info.m_scteChannels[0],3)
1760 .arg(
info.m_scteChannels[1],3)
1761 .arg(
info.m_scteChannels[2],3) +
1762 QString(
"MPEG %1 %2 %3\n")
1763 .arg(
info.m_mpegChannels[0],3)
1764 .arg(
info.m_mpegChannels[1],3)
1765 .arg(
info.m_mpegChannels[2],3) +
1766 QString(
"NTSC %1\n")
1767 .arg(
info.m_ntscChannels[0],3) +
1768 tr(
"Unique: prog %1 atsc %2 atsc minor %3 channum %4\n")
1771 tr(
"Max atsc major count: %1")
1837 new_chan = old_chan = 0;
1838 for (
const auto & transport : transports)
1840 for (
const auto& chan : transport.m_channels)
1844 if (chan.m_channelId)
1856 auto add_count = [](
int count,
const auto & transport)
1857 {
return count + transport.m_channels.size(); };
1858 return std::accumulate(transports.cbegin(), transports.cend(),
1879 static QMutex s_lastFreeLock;
1880 static QMap<uint,uint> s_lastFreeChanNumMap;
1888 for (
char suffix =
'A'; suffix <=
'Z'; ++suffix)
1896 QMutexLocker locker(&s_lastFreeLock);
1898 for (last_free_chan_num++; ; ++last_free_chan_num)
1900 chanNum = QString::number(last_free_chan_num);
1904 s_lastFreeChanNumMap[chan.
m_sourceId] = last_free_chan_num;
1932 auto *deleteDialog =
1935 if (deleteDialog->Create())
1937 deleteDialog->AddButton(tr(
"Delete All"));
1938 deleteDialog->AddButton(tr(
"Set all invisible"));
1940 deleteDialog->AddButton(tr(
"Ignore All"));
1942 [
this](
const QString & ,
int result)
1962 std::cout << msg.toLatin1().constData()
1964 << tr(
"Do you want to:").toLatin1().constData()
1966 << tr(
"1. Delete All").toLatin1().constData()
1968 << tr(
"2. Set all invisible").toLatin1().constData()
1971 << tr(
"4. Ignore All").toLatin1().constData()
1978 uint val = QString(ret.c_str()).toUInt(&ok);
1979 if (ok && (val == 1 || val == 2 || val == 4))
1989 std::cout << tr(
"Please enter either 1, 2 or 4:")
1990 .toLatin1().constData() << std::endl;
2020 auto *insertDialog =
2023 if (insertDialog->Create())
2025 insertDialog->AddButton(tr(
"Insert All"));
2026 insertDialog->AddButton(tr(
"Insert Manually"));
2027 insertDialog->AddButton(tr(
"Ignore All"));
2029 [
this](
const QString & ,
int result)
2049 std::cout << msg.toLatin1().constData()
2051 << tr(
"Do you want to:").toLatin1().constData()
2053 << tr(
"1. Insert All").toLatin1().constData()
2055 << tr(
"2. Insert Manually").toLatin1().constData()
2057 << tr(
"3. Ignore All").toLatin1().constData()
2064 uint val = QString(ret.c_str()).toUInt(&ok);
2065 if (ok && (1 <= val) && (val <= 3))
2073 std::cout << tr(
"Please enter either 1, 2, or 3:")
2074 .toLatin1().constData() << std::endl;
2105 auto *updateDialog =
2108 if (updateDialog->Create())
2110 updateDialog->AddButton(tr(
"Update All"));
2111 updateDialog->AddButton(tr(
"Ignore All"));
2113 [
this](
const QString& ,
int result)
2132 std::cout << msg.toLatin1().constData()
2134 << tr(
"Do you want to:").toLatin1().constData()
2136 << tr(
"1. Update All").toLatin1().constData()
2138 << tr(
"2. Update Manually").toLatin1().constData()
2140 << tr(
"3. Ignore All").toLatin1().constData()
2147 uint val = QString(ret.c_str()).toUInt(&ok);
2148 if (ok && (1 <= val) && (val <= 3))
2156 std::cout << tr(
"Please enter either 1, 2, or 3:")
2157 .toLatin1().constData() << std::endl;
2165 const QString& title,
2166 const QString& message, QString &text)
2186 popupStack = parent->
GetStack(
"popup stack");
2188 "manualchannelpopup");
2190 if (popup->Create())
2192 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"OK"), 0 == dmc);
2193 popup->AddButtonD(tr(
"Edit"), 1 == dmc);
2194 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"Cancel"), 2 == dmc);
2195 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"Cancel All"), 3 == dmc);
2197 [
this](
const QString & ,
int result)
2228 tr(
"Please enter a unique channel number."),
2230 if (textEdit->Create())
2233 [
this,&text](QString result)
2236 text = std::move(result);
2255 case 0: rval =
kOCTOk;
break;
2265 const QString& title,
2266 const QString& message, QString &text)
2287 popupStack = parent->
GetStack(
"popup stack");
2289 "resolvechannelpopup");
2291 if (popup->Create())
2293 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"OK"), 0 == dmc);
2294 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"OK All"), 1 == dmc);
2295 popup->AddButtonD(tr(
"Edit"), 2 == dmc);
2296 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"Cancel"), 3 == dmc);
2297 popup->AddButtonD(QCoreApplication::translate(
"(Common)",
"Cancel All"), 4 == dmc);
2299 [
this](
const QString & ,
int result)
2329 tr(
"Please enter a unique channel number."),
2331 if (textEdit->Create())
2334 [
this,&text](QString result)
2337 text = std::move(result);
2357 case 0: rval =
kOCTOk;
break;
2371 QString msg = tr(
"Channel %1 has channel number %2 but that is already in use.")
2383 msg2 += tr(
"Please enter a unique channel number.");
2387 msg2 += tr(
"Default value is %1.").arg(val);
2389 tr(
"Channel Importer"),
2405 std::cout << msg.toLatin1().constData() << std::endl;
2407 QString cancelStr = QCoreApplication::translate(
"(Common)",
2408 "Cancel").toLower();
2409 QString cancelAllStr = QCoreApplication::translate(
"(Common)",
2410 "Cancel All").toLower();
2411 QString msg2 = tr(
"Please enter a non-conflicting channel number "
2412 "(or type '%1' to skip, '%2' to skip all):")
2413 .arg(cancelStr, cancelAllStr);
2417 std::cout << msg2.toLatin1().constData() << std::endl;
2420 QString val = QString(sret.c_str());
2421 if (val.toLower() == cancelStr)
2426 if (val.toLower() == cancelAllStr)
2449 QString msg = tr(
"You chose to manually insert channel %1.")
2460 msg2 += tr(
"Please enter a unique channel number.");
2464 msg2 += tr(
"Default value is %1").arg(val);
2466 tr(
"Channel Importer"),
2483 std::cout << msg.toLatin1().constData() << std::endl;
2485 QString cancelStr = QCoreApplication::translate(
"(Common)",
"Cancel").toLower();
2486 QString cancelAllStr = QCoreApplication::translate(
"(Common)",
"Cancel All").toLower();
2489 QString msg2 = tr(
"Please enter a non-conflicting channel number "
2490 "(or type '%1' to skip, '%2' to skip all): ")
2491 .arg(cancelStr, cancelAllStr);
2495 std::cout << msg2.toLatin1().constData() << std::endl;
2498 QString val = QString(sret.c_str());
2499 if (val.toLower() == cancelStr)
2504 if (val.toLower() == cancelAllStr)
2533 bool ok = (num.length() >= 1);
2534 ok = ok && ((num[0] >=
'0') && (num[0] <=
'9'));