Ticket #13472: 20190724-keep-channum-ok-all.patch
File 20190724-keep-channum-ok-all.patch, 14.1 KB (added by , 18 months ago) |
---|
-
mythtv/libs/libmythtv/channelscan/channelimporter.cpp
diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp index 243c8e2cc2..2ce66a2b4a 100644
a b ScanDTVTransportList ChannelImporter::InsertChannels( 388 388 ScanDTVTransportList next_list; 389 389 390 390 bool ignore_rest = false; 391 bool ok_all = false; 391 392 392 393 // insert all channels with non-conflicting channum 393 394 // and complete tuning information. … … ScanDTVTransportList ChannelImporter::InsertChannels( 481 482 if (m_is_interactive && !asked && 482 483 (conflicting || (kChannelTypeConflictingFirst <= type))) 483 484 { 484 OkCancelType rc = 485 QueryUserResolve(info, transports[i], chan); 486 487 conflicting = true; 488 if (kOCTCancelAll == rc) 489 ignore_rest = true; 490 else if (kOCTOk == rc) 491 conflicting = false; 485 bool ok_done = false; 486 if (ok_all) 487 { 488 QString val = ComputeSuggestedChannelNum(chan); 489 bool ok = CheckChannelNumber(val, chan); 490 if (ok) 491 { 492 chan.m_chan_num = val; 493 conflicting = false; 494 ok_done = true; 495 } 496 } 497 if (!ok_done) 498 { 499 OkCancelType rc = 500 QueryUserResolve(info, transports[i], chan); 501 502 conflicting = true; 503 if (kOCTCancelAll == rc) 504 { 505 ignore_rest = true; 506 } 507 else if (kOCTOk == rc) 508 { 509 conflicting = false; 510 } 511 else if (kOCTOkAll == rc) 512 { 513 conflicting = false; 514 ok_all = true; 515 } 516 } 492 517 } 493 518 494 519 if (conflicting) … … ScanDTVTransportList ChannelImporter::UpdateChannels( 635 660 { 636 661 bool conflicting = false; 637 662 663 if (m_keep_channel_numbers) 664 { 665 ChannelUtil::UpdateChannelNumberFromDB(chan); 666 } 638 667 if (chan.m_chan_num.isEmpty() || renameChannels || 639 668 ChannelUtil::IsConflicting( 640 669 chan.m_chan_num, chan.m_source_id, chan.m_channel_id)) … … bool ChannelImporter::IsType( 1251 1280 (chan.m_atsc_minor_channel)] == 1)); 1252 1281 1253 1282 case kDVBNonConflicting: 1254 return ((chan.m_si_standard == "dvb") &&1255 (info.m_prognum_cnt[chan.m_service_id] == 1) );1283 return ((chan.m_si_standard == "dvb") /* && 1284 (info.m_prognum_cnt[chan.m_service_id] == 1) */); 1256 1285 1257 1286 case kMPEGNonConflicting: 1258 1287 return ((chan.m_si_standard == "mpeg") && … … void ChannelImporter::CountChannels( 1324 1353 * with an existing channel number. If so, fall back to incrementing a 1325 1354 * per-source number to find an unused value. 1326 1355 * 1327 * \param info Unused.1328 * \param transport Unused.1329 1356 * \param chan Info describing a channel 1330 1357 * \return Returns a simple name for the channel. 1331 1358 */ 1332 1359 QString ChannelImporter::ComputeSuggestedChannelNum( 1333 const ChannelImporterBasicStats &/*info*/,1334 const ScanDTVTransport &/*transport*/,1335 1360 const ChannelInsertInfo &chan) 1336 1361 { 1337 1362 static QMutex last_free_lock; … … OkCancelType ChannelImporter::ShowManualChannelPopup( 1657 1682 ((2 == dc) ? kOCTCancel : kOCTCancelAll); 1658 1683 } 1659 1684 1685 OkCancelType ChannelImporter::ShowResolveChannelPopup( 1686 MythMainWindow *parent, const QString& title, 1687 const QString& message, QString &text) 1688 { 1689 int dc = -1; 1690 MythScreenStack *popupStack = parent->GetStack("popup stack"); 1691 MythDialogBox *popup = new MythDialogBox(title, message, popupStack, 1692 "resolvechannelpopup"); 1693 1694 if (popup->Create()) 1695 { 1696 popup->AddButton(QCoreApplication::translate("(Common)", "OK")); 1697 popup->AddButton(QCoreApplication::translate("(Common)", "OK All")); 1698 popup->AddButton(tr("Edit")); 1699 popup->AddButton(QCoreApplication::translate("(Common)", "Cancel")); 1700 popup->AddButton(QCoreApplication::translate("(Common)", "Cancel All")); 1701 QObject::connect(popup, &MythDialogBox::Closed, 1702 [&](const QString & /*resultId*/, int result) 1703 { 1704 dc = result; 1705 m_eventLoop.quit(); 1706 }); 1707 popupStack->AddScreen(popup); 1708 m_eventLoop.exec(); 1709 } 1710 else 1711 { 1712 delete popup; 1713 popup = nullptr; 1714 } 1715 1716 // Choice "Edit" 1717 if (2 == dc) 1718 { 1719 MythTextInputDialog *textEdit = 1720 new MythTextInputDialog(popupStack, 1721 tr("Please enter a unique channel number."), 1722 FilterNone, false, text); 1723 if (textEdit->Create()) 1724 { 1725 QObject::connect(textEdit, &MythTextInputDialog::haveResult, 1726 [&](QString result) 1727 { 1728 dc = 0; 1729 text = std::move(result); 1730 }); 1731 QObject::connect(textEdit, &MythTextInputDialog::Exiting, 1732 [&]() 1733 { 1734 m_eventLoop.quit(); 1735 }); 1736 1737 popupStack->AddScreen(textEdit); 1738 m_eventLoop.exec(); 1739 } 1740 else 1741 delete textEdit; 1742 } 1743 1744 OkCancelType rval = kOCTCancel; 1745 switch (dc) { 1746 case 0: rval = kOCTOk; break; 1747 case 1: rval = kOCTOkAll; break; 1748 case 2: rval = kOCTCancel; break; // "Edit" is done already 1749 case 3: rval = kOCTCancel; break; 1750 case 4: rval = kOCTCancelAll; break; 1751 } 1752 return rval; 1753 } 1754 1660 1755 OkCancelType ChannelImporter::QueryUserResolve( 1661 1756 const ChannelImporterBasicStats &info, 1662 1757 const ScanDTVTransport &transport, … … OkCancelType ChannelImporter::QueryUserResolve( 1678 1773 msg2 += "\n"; 1679 1774 msg2 += tr("Please enter a unique channel number."); 1680 1775 1681 QString val = ComputeSuggestedChannelNum( info, transport,chan);1776 QString val = ComputeSuggestedChannelNum(chan); 1682 1777 msg2 += "\n"; 1683 1778 msg2 += tr("Default value is %1.").arg(val); 1684 ret = Show ManualChannelPopup(1779 ret = ShowResolveChannelPopup( 1685 1780 GetMythMainWindow(), tr("Channel Importer"), 1686 1781 msg2, val); 1687 1782 1688 if (kOCTOk != ret )1783 if (kOCTOk != ret && kOCTOkAll != ret) 1689 1784 break; // user canceled.. 1690 1785 1691 bool ok = (val.length() >= 1); 1692 ok = ok && ((val[0] >= '0') && (val[0] <= '9')); 1693 ok = ok && !ChannelUtil::IsConflicting( 1694 val, chan.m_source_id, chan.m_channel_id); 1695 1696 chan.m_chan_num = (ok) ? val : chan.m_chan_num; 1786 bool ok = CheckChannelNumber(val, chan); 1697 1787 if (ok) 1788 { 1789 chan.m_chan_num = val; 1698 1790 break; 1791 } 1699 1792 } 1700 1793 } 1701 1794 else if (m_is_interactive) … … OkCancelType ChannelImporter::QueryUserResolve( 1727 1820 break; // user canceled.. 1728 1821 } 1729 1822 1730 bool ok = (val.length() >= 1); 1731 ok = ok && ((val[0] >= '0') && (val[0] <= '9')); 1732 ok = ok && !ChannelUtil::IsConflicting( 1733 val, chan.m_source_id, chan.m_channel_id); 1734 1735 chan.m_chan_num = (ok) ? val : chan.m_chan_num; 1823 bool ok = CheckChannelNumber(val, chan); 1736 1824 if (ok) 1737 1825 { 1826 chan.m_chan_num = val; 1738 1827 ret = kOCTOk; 1739 1828 break; 1740 1829 } … … OkCancelType ChannelImporter::QueryUserInsert( 1762 1851 msg2 += " "; 1763 1852 msg2 += tr("Please enter a unique channel number."); 1764 1853 1765 QString val = ComputeSuggestedChannelNum( info, transport,chan);1854 QString val = ComputeSuggestedChannelNum(chan); 1766 1855 msg2 += " "; 1767 1856 msg2 += tr("Default value is %1").arg(val); 1768 1857 ret = ShowManualChannelPopup( … … OkCancelType ChannelImporter::QueryUserInsert( 1772 1861 if (kOCTOk != ret) 1773 1862 break; // user canceled.. 1774 1863 1775 bool ok = (val.length() >= 1); 1776 ok = ok && ((val[0] >= '0') && (val[0] <= '9')); 1777 ok = ok && !ChannelUtil::IsConflicting( 1778 val, chan.m_source_id, chan.m_channel_id); 1779 1780 chan.m_chan_num = (ok) ? val : chan.m_chan_num; 1864 bool ok = CheckChannelNumber(val, chan); 1781 1865 if (ok) 1782 1866 { 1867 chan.m_chan_num = val; 1783 1868 ret = kOCTOk; 1784 1869 break; 1785 1870 } … … OkCancelType ChannelImporter::QueryUserInsert( 1816 1901 break; // user canceled.. 1817 1902 } 1818 1903 1819 bool ok = (val.length() >= 1); 1820 ok = ok && ((val[0] >= '0') && (val[0] <= '9')); 1821 ok = ok && !ChannelUtil::IsConflicting( 1822 val, chan.m_source_id, chan.m_channel_id); 1823 1824 chan.m_chan_num = (ok) ? val : chan.m_chan_num; 1904 bool ok = CheckChannelNumber(val, chan); 1825 1905 if (ok) 1826 1906 { 1907 chan.m_chan_num = val; 1827 1908 ret = kOCTOk; 1828 1909 break; 1829 1910 } … … OkCancelType ChannelImporter::QueryUserInsert( 1832 1913 1833 1914 return ret; 1834 1915 } 1916 1917 // Check validity of a new channel number. 1918 // The channel number is not a number but it is a string that starts with a digit. 1919 // The channel number should not yet exist in this video source. 1920 // 1921 bool ChannelImporter::CheckChannelNumber( 1922 const QString &num, 1923 const ChannelInsertInfo &chan) 1924 { 1925 bool ok = (num.length() >= 1); 1926 ok = ok && ((num[0] >= '0') && (num[0] <= '9')); 1927 ok = ok && !ChannelUtil::IsConflicting( 1928 num, chan.m_source_id, chan.m_channel_id); 1929 return ok; 1930 } 1931 No newline at end of file -
mythtv/libs/libmythtv/channelscan/channelimporter.h
diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.h b/mythtv/libs/libmythtv/channelscan/channelimporter.h index a433dcbd30..0017535694 100644
a b typedef enum { 27 27 kOCTCancelAll = -1, 28 28 kOCTCancel = +0, 29 29 kOCTOk = +1, 30 kOCTOkAll = +2, 30 31 } OkCancelType; 31 32 32 33 class ChannelImporterBasicStats … … class MTV_PUBLIC ChannelImporter 182 183 ChannelInsertInfo &chan); 183 184 184 185 static QString ComputeSuggestedChannelNum( 185 const ChannelImporterBasicStats &info,186 const ScanDTVTransport &transport,187 186 const ChannelInsertInfo &chan); 188 187 189 188 OkCancelType ShowManualChannelPopup( 190 189 MythMainWindow *parent, const QString& title, 191 190 const QString& message, QString &text); 192 191 192 OkCancelType ShowResolveChannelPopup( 193 MythMainWindow *parent, const QString& title, 194 const QString& message, QString &text); 195 193 196 static void FixUpOpenCable(ScanDTVTransportList &transports); 194 197 195 198 static ChannelImporterBasicStats CollectStats( … … class MTV_PUBLIC ChannelImporter 226 229 const ChannelImporterBasicStats &info, 227 230 ChannelType type, uint &new_chan, uint &old_chan); 228 231 232 static bool CheckChannelNumber( 233 const QString &num, 234 const ChannelInsertInfo &chan); 235 229 236 private: 230 237 bool m_use_gui; 231 238 bool m_is_interactive; … … class MTV_PUBLIC ChannelImporter 238 245 bool m_lcn_only; 239 246 /// Only services with complete scandata desired post scan? 240 247 bool m_complete_only; 248 /// Keep existing channel numbers on channel update 249 bool m_keep_channel_numbers {true}; 241 250 /// To pass information IPTV channel scan succeeded 242 251 bool m_success {false}; 243 252 /// Services desired post scan -
mythtv/libs/libmythtv/channelutil.cpp
diff --git a/mythtv/libs/libmythtv/channelutil.cpp b/mythtv/libs/libmythtv/channelutil.cpp index 607df001ee..05f0df06b3 100644
a b bool ChannelUtil::UpdateChannel(uint db_mplexid, 1626 1626 return true; 1627 1627 } 1628 1628 1629 void ChannelUtil::UpdateChannelNumberFromDB(ChannelInsertInfo &chan) 1630 { 1631 MSqlQuery query(MSqlQuery::InitCon()); 1632 query.prepare( 1633 "SELECT channum " 1634 "FROM channel " 1635 "WHERE chanid = :ID"); 1636 query.bindValue(":ID", chan.m_channel_id); 1637 1638 if (!query.exec()) 1639 { 1640 MythDB::DBError("UpdateChannelNumberFromDB", query); 1641 return; 1642 } 1643 1644 if (query.next()) 1645 { 1646 QString channum = query.value(0).toString(); 1647 1648 if (!channum.isEmpty()) 1649 { 1650 chan.m_chan_num = channum; 1651 } 1652 } 1653 } 1654 1629 1655 void ChannelUtil::UpdateInsertInfoFromDB(ChannelInsertInfo &chan) 1630 1656 { 1631 1657 MSqlQuery query(MSqlQuery::InitCon()); -
mythtv/libs/libmythtv/channelutil.h
diff --git a/mythtv/libs/libmythtv/channelutil.h b/mythtv/libs/libmythtv/channelutil.h index 792563f8f1..d611db34ac 100644
a b class MTV_PUBLIC ChannelUtil 147 147 uint channel_id, const IPTVTuningData &tuning); 148 148 149 149 static void UpdateInsertInfoFromDB(ChannelInsertInfo &chan); 150 static void UpdateChannelNumberFromDB(ChannelInsertInfo &chan); 150 151 151 152 static bool DeleteChannel(uint channel_id); 152 153