Ticket #6552: 6552-v1.patch

File 6552-v1.patch, 7.5 KB (added by danielk, 11 years ago)
  • programs/mythbackend/playbacksock.h

     
    7878    void CancelNextRecording(int capturecardnum, bool cancel);
    7979
    8080  private:
    81     bool SendReceiveStringList(QStringList &strlist);
     81    bool SendReceiveStringList(QStringList &strlist, uint min_reply_length = 0);
    8282
    8383    MythSocket *sock;
    8484    QString hostname;
  • programs/mythbackend/playbacksock.cpp

     
    1 #include <qstringlist.h>
     1#include <QStringList>
    22
    3 #include <iostream>
    4 
    53using namespace std;
    64
    75#include "playbacksock.h"
     
    6462    return false;
    6563}
    6664
    67 bool PlaybackSock::SendReceiveStringList(QStringList &strlist)
     65bool PlaybackSock::SendReceiveStringList(
     66    QStringList &strlist, uint min_reply_length)
    6867{
     68    bool ok = false;
     69
    6970    sock->Lock();
    7071    sock->UpRef();
    7172
    72     sockLock.lock();
    73     expectingreply = true;
     73    {
     74        QMutexLocker locker(&sockLock);
     75        expectingreply = true;
    7476
    75     sock->writeStringList(strlist);
    76     bool ok = sock->readStringList(strlist);
     77        sock->writeStringList(strlist);
     78        ok = sock->readStringList(strlist);
    7779
    78     while (ok && strlist[0] == "BACKEND_MESSAGE")
    79     {
    80         // oops, not for us
    81         QString message = strlist[1];
    82         strlist.pop_front(); strlist.pop_front();
     80        while (ok && strlist[0] == "BACKEND_MESSAGE")
     81        {
     82            // oops, not for us
     83            if (strlist.size() >= 2)
     84            {
     85                QString message = strlist[1];
     86                strlist.pop_front();
     87                strlist.pop_front();
     88                MythEvent me(message, strlist);
     89                gContext->dispatch(me);
     90            }
    8391
    84         MythEvent me(message, strlist);
    85         gContext->dispatch(me);
     92            ok = sock->readStringList(strlist);
     93        }
    8694
    87         ok = sock->readStringList(strlist);
     95        expectingreply = false;
    8896    }
    8997
    90     expectingreply = false;
    91     sockLock.unlock();
    92 
    9398    sock->Unlock();
    9499    sock->DownRef();
    95100
    96     return ok;
     101    if (!ok)
     102    {
     103        VERBOSE(VB_IMPORTANT,
     104                "PlaybackSock::SendReceiveStringList(): No response.");
     105        return false;
     106    }
     107
     108    if (min_reply_length && ((uint)strlist.size() < min_reply_length))
     109    {
     110        VERBOSE(VB_IMPORTANT,
     111                "PlaybackSock::SendReceiveStringList(): Response too short");
     112        return false;
     113    }
     114
     115    return true;
    97116}
    98117
    99118/** \brief Tells a slave to go to sleep
     
    102121{
    103122    QStringList strlist( QString("GO_TO_SLEEP") );
    104123
    105     SendReceiveStringList(strlist);
    106 
    107     return (strlist[0] == "OK");
     124    return SendReceiveStringList(strlist, 1) && (strlist[0] == "OK");
    108125}
    109126
    110127/**
     
    125142    QStringList strlist( QString("CHECK_RECORDING") );
    126143    pginfo->ToStringList(strlist);
    127144
    128     SendReceiveStringList(strlist);
     145    if (SendReceiveStringList(strlist, 1))
     146        return strlist[0].toInt();
    129147
    130     return strlist[0].toInt();
     148    return 0;
    131149}
    132150
    133151int PlaybackSock::StopRecording(const ProgramInfo *pginfo)
     
    135153    QStringList strlist( QString("STOP_RECORDING"));
    136154    pginfo->ToStringList(strlist);
    137155
    138     SendReceiveStringList(strlist);
     156    if (SendReceiveStringList(strlist, 1))
     157        return strlist[0].toInt();
    139158
    140     return strlist[0].toInt();
     159    return 0;
    141160}
    142161
    143162int PlaybackSock::DeleteRecording(const ProgramInfo *pginfo, bool forceMetadataDelete)
     
    151170
    152171    pginfo->ToStringList(strlist);
    153172
    154     SendReceiveStringList(strlist);
     173    if (SendReceiveStringList(strlist, 1))
     174        return strlist[0].toInt();
    155175
    156     return strlist[0].toInt();
     176    return 0;
    157177}
    158178
    159179bool PlaybackSock::FillProgramInfo(ProgramInfo *pginfo, QString &playbackhost)
     
    162182    strlist << playbackhost;
    163183    pginfo->ToStringList(strlist);
    164184
    165     SendReceiveStringList(strlist);
     185    if (SendReceiveStringList(strlist))
     186        return pginfo->FromStringList(strlist, 0);
    166187
    167     return pginfo->FromStringList(strlist, 0);
     188    return false;
    168189}
    169190
    170191QStringList PlaybackSock::GetSGFileList(QString &host, QString &groupname,
     
    244265    strlist << QString::number(0); // don't check slaves
    245266    pginfo->ToStringList(strlist);
    246267
    247     SendReceiveStringList(strlist);
     268    if (SendReceiveStringList(strlist, 2))
     269    {
     270        pginfo->pathname = strlist[1];
     271        return strlist[0].toInt();
     272    }
    248273
    249     bool exists = strlist[0].toInt();
    250     pginfo->pathname = strlist[1];
    251     return exists;
     274    return false;
    252275}
    253276
    254277bool PlaybackSock::IsBusy(
     
    259282    strlist << "IS_BUSY";
    260283    strlist << QString::number(time_buffer);
    261284
    262     SendReceiveStringList(strlist);
     285    if (!SendReceiveStringList(strlist, 1))
     286    {
     287        VERBOSE(VB_IMPORTANT, LOC_ERR + "IsBusy: " +
     288                QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) +
     289                " gave us no response.");
     290    }
    263291
    264292    QStringList::const_iterator it = strlist.begin();
    265293    bool state = (*it).toInt();
     
    287315    QStringList strlist( QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) );
    288316    strlist << "GET_STATE";
    289317
    290     SendReceiveStringList(strlist);
     318    if (!SendReceiveStringList(strlist, 1))
     319    {
     320        VERBOSE(VB_IMPORTANT, LOC_ERR + "GetEncoderState: " +
     321                QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) +
     322                " gave us no response.");
    291323
    292     int state = strlist[0].toInt();
    293     return state;
     324        return kState_Error;
     325    }
     326
     327    return strlist[0].toInt();
    294328}
    295329
    296330long long PlaybackSock::GetMaxBitrate(int capturecardnum)
     
    298332    QStringList strlist( QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) );
    299333    strlist << "GET_MAX_BITRATE";
    300334
    301     SendReceiveStringList(strlist);
     335    if (SendReceiveStringList(strlist, 2))
     336        return decodeLongLong(strlist, 0);
    302337
    303     long long ret = decodeLongLong(strlist, 0);
    304     return ret;
     338    return 20200000LL; // Peek bit rate for HD-PVR
    305339}
    306340
    307341/** \fn *PlaybackSock::GetRecording(int)
     
    317351
    318352    strlist << "GET_CURRENT_RECORDING";
    319353
    320     SendReceiveStringList(strlist);
     354    if (!SendReceiveStringList(strlist))
     355        return NULL;
    321356
    322357    ProgramInfo *info = new ProgramInfo();
    323358    if (!info->FromStringList(strlist, 0))
     
    335370    strlist << "MATCHES_RECORDING";
    336371    pginfo->ToStringList(strlist);
    337372
    338     SendReceiveStringList(strlist);
     373    if (SendReceiveStringList(strlist, 1))
     374        return (bool) strlist[0].toInt();
    339375
    340     bool ret = strlist[0].toInt();
    341     return ret;
     376    return false;
    342377}
    343378
    344379RecStatusType PlaybackSock::StartRecording(int capturecardnum,
     
    348383    strlist << "START_RECORDING";
    349384    pginfo->ToStringList(strlist);
    350385
    351     SendReceiveStringList(strlist);
     386    if (SendReceiveStringList(strlist, 1))
     387        return RecStatusType(strlist[0].toInt());
    352388
    353     return RecStatusType(strlist[0].toInt());
     389    return rsUnknown;
    354390}
    355391
    356392void PlaybackSock::RecordPending(int capturecardnum, const ProgramInfo *pginfo,
     
    373409    strlist << QString::number(rate);
    374410    strlist << QString::number(notifyFrontend);
    375411
    376     SendReceiveStringList(strlist);
     412    if (SendReceiveStringList(strlist, 1))
     413        return strlist[0].toInt();
    377414
    378     int ret = strlist[0].toInt();
    379     return ret;
     415    return -1;
    380416}
    381417
    382418void PlaybackSock::SetNextLiveTVDir(int capturecardnum, QString dir)