Ticket #3422: 3422.patch

File 3422.patch, 8.2 KB (added by robthebob, 13 years ago)
  • programs/mythbackend/mainserver.cpp

     
    520520    }
    521521    else if (command == "LOCK_TUNER")
    522522    {
    523         HandleLockTuner(pbs);
     523        if (tokens.size() == 1)
     524            HandleLockTuner(pbs);
     525        else if (tokens.size() == 2)
     526            HandleLockTuner(tokens[1].toInt(), pbs);
     527        else
     528            VERBOSE(VB_IMPORTANT, "Bad LOCK_TUNER query");
    524529    }
    525530    else if (command == "FREE_TUNER")
    526531    {
     
    23192324
    23202325void MainServer::HandleLockTuner(PlaybackSock *pbs)
    23212326{
     2327    VERBOSE(VB_GENERAL, "MainServer::HandleLockTuner()");
     2328   
    23222329    MythSocket *pbssock = pbs->getSocket();
    23232330    QString pbshost = pbs->getHostname();
    23242331
     
    23992406    SendResponse(pbssock, strlist);
    24002407}
    24012408
     2409void MainServer::HandleLockTuner(int cardid, PlaybackSock *pbs)
     2410{
     2411    MythSocket *pbssock = pbs->getSocket();
     2412    QString pbshost = pbs->getHostname();
     2413
     2414    QStringList strlist;
     2415    int retval;
     2416   
     2417    EncoderLink *encoder = NULL;
     2418    QString enchost;
     2419   
     2420    VERBOSE(VB_GENERAL, "MainServer::HandleLockTuner(cardid) " +
     2421                QString("Requested encoder: %1").arg(cardid));
     2422   
     2423   
     2424    QMap<int, EncoderLink *>::Iterator iter = encoderList->find(cardid);
     2425    if (iter == encoderList->end())
     2426    {
     2427        VERBOSE(VB_IMPORTANT, "MainServer::HandleLockTuner() " +
     2428                QString("Unknown encoder: %1").arg(cardid));
     2429    }
     2430    else
     2431    {
     2432        encoder = iter.data();
     2433       
     2434        if (encoder->IsLocal()) {
     2435            VERBOSE(VB_IMPORTANT, "Encoder found to be local");
     2436            enchost = gContext->GetHostName();
     2437        }
     2438        else
     2439            enchost = encoder->GetHostName();
     2440           
     2441       
     2442        if (!(enchost == pbshost) ||
     2443            (!encoder->IsConnected()) ||
     2444            (encoder->IsBusy()) ||
     2445            (encoder->IsTunerLocked()))
     2446        {
     2447            VERBOSE(VB_IMPORTANT, "Encoder set to NULL");
     2448            encoder = NULL;
     2449        }
     2450    }
     2451
     2452    if (encoder)
     2453    {
     2454        VERBOSE(VB_IMPORTANT, "Attempting to Lock Tuner");
     2455        retval = encoder->LockTuner();
     2456
     2457        VERBOSE(VB_IMPORTANT, "Lock Tuner returned: " + QString("%1").arg(retval));
     2458        if (retval != -1)
     2459        {
     2460            QString msg = QString("Cardid %1 LOCKed for external use on %2.")
     2461                                  .arg(retval).arg(pbshost);
     2462            VERBOSE(VB_GENERAL, msg);
     2463
     2464            MSqlQuery query(MSqlQuery::InitCon());
     2465            query.prepare("SELECT videodevice, audiodevice, "
     2466                          "vbidevice "
     2467                          "FROM capturecard "
     2468                          "WHERE cardid = :CARDID ;");
     2469            query.bindValue(":CARDID", retval);
     2470
     2471            if (query.exec() && query.isActive() && query.size())
     2472            {
     2473                // Success
     2474                query.next();
     2475                strlist << QString::number(retval)
     2476                        << query.value(0).toString()
     2477                        << query.value(1).toString()
     2478                        << query.value(2).toString();
     2479
     2480                if (m_sched)
     2481                    m_sched->Reschedule(0);
     2482
     2483                SendResponse(pbssock, strlist);
     2484                return;
     2485            }
     2486            else
     2487            {
     2488                cerr << "mainserver.o: Failed querying the db for a videodevice"
     2489                     << endl;
     2490            }
     2491        }
     2492        else
     2493        {
     2494            VERBOSE(VB_IMPORTANT, "MainServer::HandleLockTuner(cardid) " +
     2495                QString("Tuner already locked: %1").arg(cardid));
     2496            // Tuner already locked
     2497            strlist << "-2" << "" << "" << "";
     2498            SendResponse(pbssock, strlist);
     2499            return;
     2500        }
     2501    }
     2502    VERBOSE(VB_IMPORTANT, "MainServer::HandleLockTuner(cardid) " +
     2503                QString("Returning -1: %1").arg(cardid));
     2504    strlist << "-1" << "" << "" << "";
     2505    SendResponse(pbssock, strlist);
     2506}
     2507
    24022508void MainServer::HandleFreeTuner(int cardid, PlaybackSock *pbs)
    24032509{
    24042510    MythSocket *pbssock = pbs->getSocket();
  • programs/mythbackend/mainserver.h

     
    112112    void HandleRemoteEncoder(QStringList &slist, QStringList &commands,
    113113                             PlaybackSock *pbs);
    114114    void HandleLockTuner(PlaybackSock *pbs);
     115    void HandleLockTuner(int cardid, PlaybackSock *pbs);
    115116    void HandleFreeTuner(int cardid, PlaybackSock *pbs);
    116117    void HandleCutMapQuery(const QString &chanid, const QString &starttime,
    117118                           PlaybackSock *pbs, bool commbreak);
  • libs/libmythui/myththemedmenu.cpp

     
    11#include <qapplication.h>
    22#include <qimage.h>
    33#include <qdir.h>
     4#include <qregexp.h>
    45
    56#include <iostream>
    67#include <cmath>
     
    20222023            if (cardid == -2)
    20232024                VERBOSE(VB_IMPORTANT, QString("MythThemedMenuPrivate: Card %1 is "
    20242025                                              "already locked").arg(cardid));
     2026           
     2027            MythDialogBox *error_dialog = new MythDialogBox(
     2028                QString("\n\nAll tuners are currently in use. If you want to watch "
     2029                        "TV, you can cancel one of the in-progress recordings from "
     2030                        "the delete menu"),
     2031                parent->GetScreenStack(),
     2032                "NoTunerError");
     2033            error_dialog->Create();
     2034            error_dialog->AddButton("OK");
     2035            parent->GetScreenStack()->AddScreen(error_dialog);
     2036        }
     2037    }
     2038    else if (action.left(11) == "EXECSOURCE ")
     2039    {
     2040        QString rest = action.right(action.length() - 11).stripWhiteSpace();
     2041        int cmdStart = rest.find(QRegExp("\\s"));
     2042       
     2043        QStringList strlist = QString("LOCK_TUNER %1").arg(rest.left(cmdStart).toInt());
     2044        int requestedId = rest.left(cmdStart));
     2045       
     2046        VERBOSE(VB_IMPORTANT, QString("MythThemedMenuPrivate: Requesting Card %1 ").arg(requestedId);
     2047       
     2048        gContext->SendReceiveStringList(strlist);
     2049        int cardid = strlist[0].toInt();
     2050
     2051        VERBOSE(VB_IMPORTANT, QString("MythThemedMenuPrivate: Given Card %1 ").arg(cardid));
     2052       
     2053        if (cardid == requestedId)
     2054        {
     2055            rest = rest.right(rest.length() - cmdStart); // Remove cardid selector
     2056            rest = rest.sprintf(rest,
     2057                                (const char*)strlist[1],
     2058                                (const char*)strlist[2],
     2059                                (const char*)strlist[3]);
     2060
     2061            myth_system(rest);
     2062
     2063            strlist = QString("FREE_TUNER %1").arg(cardid);
     2064            gContext->SendReceiveStringList(strlist);
     2065            QString ret = strlist[0];
     2066        }
     2067        else
     2068        {
     2069            if (cardid == -2)
     2070                VERBOSE(VB_IMPORTANT, QString("MythThemedMenuPrivate: Card %1 is "
     2071                                              "already locked").arg(cardid));
    20252072           
    2026 #if 0
    2027             DialogBox *error_dialog = new DialogBox(gContext->GetMainWindow(),
    2028                     "\n\nAll tuners are currently in use. If you want to watch "
    2029                     "TV, you can cancel one of the in-progress recordings from "
    2030                     "the delete menu");
     2073            MythDialogBox *error_dialog = new MythDialogBox(
     2074                QString("\n\nThe requested tuner is currently in use. "
     2075                        "If you require access, you can cancel the appropriate "
     2076                        "in-progress recording."),
     2077                parent->GetScreenStack(),
     2078                "NoTunerError");
     2079            error_dialog->Create();
    20312080            error_dialog->AddButton("OK");
    2032             error_dialog->exec();
    2033             delete error_dialog;
    2034 #endif
     2081            parent->GetScreenStack()->AddScreen(error_dialog);
    20352082        }
    20362083    }
    20372084    else if (action.left(5) == "MENU ")