Ticket #2084: 2084-2103-v1.patch

File 2084-2103-v1.patch, 8.9 KB (added by danielk, 14 years ago)

fix

  • libs/libmythtv/cardutil.h

     
    9797            (rawtype != "CRC_IP");
    9898    }
    9999
     100    static bool         IsUnscanable(const QString &rawtype)
     101    {
     102        return
     103            (rawtype == "FIREWIRE")  || (rawtype == "DBOX2") ||
     104            (rawtype == "CRC_IP");
     105    }
     106
    100107    static int          GetCardID(const QString &videodevice,
    101108                                  QString hostname = QString::null);
    102109    static uint         GetChildCardID(uint cardid);
  • libs/libmythtv/sourceutil.h

     
    1414    static bool    GetListingsLoginData(uint sourceid,
    1515                                        QString &grabber, QString &userid,
    1616                                        QString &passwd,  QString &lineupid);
    17     static bool    IsAnalog(uint sourceid);
    18     static bool    UpdateChannelsFromListings(uint sourceid);
     17    static bool    IsEncoder(uint sourceid);
     18    static bool    IsUnscanable(uint sourceid);
     19    static bool    UpdateChannelsFromListings(
     20        uint sourceid, QString cardtype = QString::null);
    1921};
    2022
    2123#endif //_SOURCEUTIL_H_
  • libs/libmythtv/videosource.cpp

     
    16891689void CardInput::channelScanner(void)
    16901690{
    16911691    uint srcid = sourceid->getValue().toUInt();
     1692    uint crdid = cardid->getValue().toUInt();
    16921693
    16931694#ifdef USING_BACKEND
    16941695    uint num_channels_before = SourceUtil::GetChannelCount(srcid);
    16951696
    16961697    save(); // save info for scanner.
    16971698
     1699    QString cardtype = CardUtil::GetRawCardType(crdid, srcid);
     1700    if (CardUtil::IsUnscanable(cardtype))
     1701    {
     1702        VERBOSE(VB_IMPORTANT, QString("Sorry, %1 cards do not "
     1703                                      "yet support scanning.").arg(cardtype));
     1704        return;
     1705    }
     1706
    16981707    ScanWizard scanwizard(srcid);
    16991708    scanwizard.exec(false,true);
    17001709
     
    17151724void CardInput::sourceFetch(void)
    17161725{
    17171726    uint srcid = sourceid->getValue().toUInt();
     1727    uint child = childid->getValue().toUInt();
     1728    uint crdid = (child) ? child : cardid->getValue().toUInt();
    17181729
    17191730    uint num_channels_before = SourceUtil::GetChannelCount(srcid);
    17201731
    1721     SourceUtil::UpdateChannelsFromListings(srcid);
     1732    if (cardid && srcid)
     1733    {
     1734        QString cardtype = CardUtil::GetRawCardType(crdid, 0);
    17221735
     1736        if (!CardUtil::IsUnscanable(cardtype) &&
     1737            !CardUtil::IsEncoder(cardtype)    &&
     1738            !num_channels_before)
     1739        {
     1740            VERBOSE(VB_IMPORTANT, "Skipping channel fetch, you need to "
     1741                    "scan for channels first.");
     1742            return;
     1743        }
     1744
     1745        SourceUtil::UpdateChannelsFromListings(srcid, cardtype);
     1746    }
     1747
    17231748    if (SourceUtil::GetChannelCount(srcid))
    17241749        startchan->SetSourceID(QString::number(srcid));       
    17251750    if (num_channels_before)
  • libs/libmythtv/sourceutil.cpp

     
    7474        "WHERE sourceid = :SOURCEID");
    7575    query.bindValue(":SOURCEID", sourceid);
    7676
    77     if (!query.exec() && !query.isActive())
     77    if (!query.exec() || !query.isActive())
    7878    {
    7979        MythContext::DBError("SourceUtil::GetListingsLoginData()", query);
    8080        return false;
     
    9191    return true;
    9292}
    9393
    94 bool SourceUtil::IsAnalog(uint sourceid)
     94static QStringList get_cardtypes(uint sourceid)
    9595{
    96     bool analog = true;
    97     MSqlQuery query(MSqlQuery::DDCon());
     96    QStringList list;
     97
     98    MSqlQuery query(MSqlQuery::InitCon());
    9899    query.prepare(
    99100        "SELECT cardtype "
    100101        "FROM capturecard, cardinput "
     
    102103        "      cardinput.sourceid = :SOURCEID");
    103104    query.bindValue(":SOURCEID", sourceid);
    104105
    105     bool has_any = false;
    106     if (query.exec() && query.next())
     106    if (!query.exec() || !query.isActive())
     107        MythContext::DBError("get_cardtypes()", query);
     108    else
    107109    {
    108         has_any = true;
    109         do
    110             analog &= CardUtil::IsEncoder(query.value(0).toString().upper());
    111         while (query.next());
     110        while (query.next())
     111            list += query.value(0).toString().upper();
    112112    }
    113113
    114     if (has_any)
    115         return analog;
     114    return list;
     115}
    116116
     117bool SourceUtil::IsEncoder(uint sourceid)
     118{
     119    bool encoder = true;
     120
     121    QStringList types = get_cardtypes(sourceid);
     122    QStringList::const_iterator it = types.begin();
     123    for (; it != types.end(); ++it)
     124        encoder &= CardUtil::IsEncoder(*it);
     125
     126    // Source is connected, go by card types for type determination
     127    if (!types.empty())
     128        return encoder;
     129
    117130    // Try looking at channels if source is not connected,
     131    MSqlQuery query(MSqlQuery::InitCon());
    118132    query.prepare(
    119133        "SELECT atsc_minor_chan, serviceid "
    120134        "FROM channel "
    121135        "WHERE sourceid = :SOURCEID");
    122136    query.bindValue(":SOURCEID", sourceid);
    123     if (query.exec() && query.next())
     137
     138    if (!query.exec() || !query.isActive())
     139        MythContext::DBError("SourceUtil::IsEncoder", query);
     140    else
    124141    {
    125         do
    126             analog &= !query.value(0).toInt() && !query.value(1).toInt();
    127         while (query.next());
     142        while (query.next())
     143            encoder &= !query.value(0).toInt() && !query.value(1).toInt();
    128144    }
    129145
    130     return analog;
     146    return encoder;
    131147}
    132148
    133 bool SourceUtil::UpdateChannelsFromListings(uint sourceid)
     149bool SourceUtil::IsUnscanable(uint sourceid)
    134150{
    135     myth_system(QString("mythfilldatabase --only-update-channels "
    136                         "--sourceid %1").arg(sourceid));
     151    bool unscanable = false;
     152    QStringList types = get_cardtypes(sourceid);
     153    QStringList::const_iterator it = types.begin();
     154    for (; it != types.end(); ++it)
     155        unscanable &= CardUtil::IsUnscanable(*it);
     156
     157    return types.empty() || unscanable;
     158}
     159
     160bool SourceUtil::UpdateChannelsFromListings(uint sourceid, QString cardtype)
     161{
     162    QString cmd = "mythfilldatabase --only-update-channels ";
     163    if (sourceid)
     164        cmd += QString("--sourceid %1 ").arg(sourceid);
     165    if (!cardtype.isEmpty())
     166        cmd += QString("--cardtype %1 ").arg(cardtype);
     167
     168    myth_system(cmd);
     169                       
    137170    return true;
    138171}
  • programs/mythfilldatabase/filldata.cpp

     
    3737#include "channelutil.h"
    3838#include "programinfo.h"
    3939#include "frequencytables.h"
    40 #include "channelutil.h"
     40#include "cardutil.h"
    4141#include "sourceutil.h"
    4242#include "remoteutil.h"
    4343
     
    7676QString lastdduserid;
    7777DataDirectProcessor ddprocessor;
    7878QString graboptions = "";
     79QString cardtype = QString::null;
    7980
    8081class ChanInfo
    8182{
     
    818819
    819820    bool insert_channels = channel_updates;
    820821    if (!insert_channels)
    821         insert_channels = (SourceUtil::IsAnalog(source.id) &&
    822                            !remove_new_channels);
     822    {
     823        bool isEncoder, isUnscanable;
     824        if (cardtype.isEmpty())
     825        {
     826            isEncoder    = SourceUtil::IsEncoder(source.id);
     827            isUnscanable = SourceUtil::IsUnscanable(source.id);
     828        }
     829        else
     830        {
     831            isEncoder    = CardUtil::IsEncoder(cardtype);
     832            isUnscanable = CardUtil::IsUnscanable(cardtype);
     833        }
     834        insert_channels = (isEncoder || isUnscanable) && !remove_new_channels;
     835    }
    823836
    824837    int new_channels = DataDirectProcessor::UpdateChannelsSafe(
    825838        source.id, insert_channels);
     
    863876    ddprocessor.SetPassword(source.password);
    864877
    865878    bool ok    = ddprocessor.GrabFullLineup(
    866         source.lineupid, true, SourceUtil::IsAnalog(source.id));
     879        source.lineupid, true, SourceUtil::IsEncoder(source.id));
    867880    logged_in  = source.userid;
    868881    raw_lineup = source.id;
    869882
     
    34223435
    34233436            sourceid = QString(a.argv()[++argpos]).toInt();
    34243437        }
     3438        else if (!strcmp(a.argv()[argpos], "--cardtype"))
     3439        {
     3440            if (!sourceid)
     3441            {
     3442                printf("--cardtype option must follow a --sourceid option\n");
     3443                return FILLDB_EXIT_INVALID_CMDLINE;
     3444            }
     3445
     3446            if (((argpos + 1) >= a.argc()))
     3447            {
     3448                printf("missing parameter for --cardtype option\n");
     3449                return FILLDB_EXIT_INVALID_CMDLINE;
     3450            }
     3451
     3452            cardtype = QString(a.argv()[++argpos]).stripWhiteSpace().upper();
     3453        }
    34253454        else if (!strcmp(a.argv()[argpos], "--max-days"))
    34263455        {
    34273456            if (((argpos + 1) >= a.argc()))