00001 #include <qstringlist.h>
00002
00003 #include <iostream>
00004
00005 using namespace std;
00006
00007 #include "playbacksock.h"
00008 #include "programinfo.h"
00009 #include "server.h"
00010 #include "mainserver.h"
00011
00012 #include "libmyth/mythcontext.h"
00013 #include "libmyth/util.h"
00014 #include "libmythtv/inputinfo.h"
00015
00016 PlaybackSock::PlaybackSock(MainServer *parent, MythSocket *lsock,
00017 QString lhostname, bool wantevents)
00018 {
00019 m_parent = parent;
00020 QString localhostname = gContext->GetHostName();
00021
00022 refCount = 0;
00023
00024 sock = lsock;
00025 hostname = lhostname;
00026 events = wantevents;
00027 ip = "";
00028 backend = false;
00029 expectingreply = false;
00030
00031 disconnected = false;
00032 blockshutdown = true;
00033
00034 if (hostname == localhostname)
00035 local = true;
00036 else
00037 local = false;
00038 }
00039
00040 PlaybackSock::~PlaybackSock()
00041 {
00042 sock->DownRef();
00043 }
00044
00045 void PlaybackSock::UpRef(void)
00046 {
00047 QMutexLocker locker(&refLock);
00048 refCount++;
00049 }
00050
00051 bool PlaybackSock::DownRef(void)
00052 {
00053 QMutexLocker locker(&refLock);
00054
00055 refCount--;
00056 if (refCount < 0)
00057 {
00058 m_parent->DeletePBS(this);
00059 return true;
00060 }
00061 return false;
00062 }
00063
00064 bool PlaybackSock::SendReceiveStringList(QStringList &strlist)
00065 {
00066 sock->Lock();
00067 sock->UpRef();
00068
00069 sockLock.lock();
00070 expectingreply = true;
00071
00072 sock->writeStringList(strlist);
00073 bool ok = sock->readStringList(strlist);
00074
00075 while (ok && strlist[0] == "BACKEND_MESSAGE")
00076 {
00077
00078 QString message = strlist[1];
00079 strlist.pop_front(); strlist.pop_front();
00080
00081 MythEvent me(message, strlist);
00082 gContext->dispatch(me);
00083
00084 ok = sock->readStringList(strlist);
00085 }
00086
00087 expectingreply = false;
00088 sockLock.unlock();
00089
00090 sock->Unlock();
00091 sock->DownRef();
00092
00093 return ok;
00094 }
00095
00099 void PlaybackSock::GetDiskSpace(QStringList &o_strlist)
00100 {
00101 QStringList strlist = QString("QUERY_FREE_SPACE");
00102
00103 SendReceiveStringList(strlist);
00104
00105 o_strlist += strlist;
00106
00107 }
00108
00109 int PlaybackSock::CheckRecordingActive(const ProgramInfo *pginfo)
00110 {
00111 QStringList strlist = QString("CHECK_RECORDING");
00112 pginfo->ToStringList(strlist);
00113
00114 SendReceiveStringList(strlist);
00115
00116 return strlist[0].toInt();
00117 }
00118
00119 int PlaybackSock::StopRecording(const ProgramInfo *pginfo)
00120 {
00121 QStringList strlist = QString("STOP_RECORDING");
00122 pginfo->ToStringList(strlist);
00123
00124 SendReceiveStringList(strlist);
00125
00126 return strlist[0].toInt();
00127 }
00128
00129 int PlaybackSock::DeleteRecording(const ProgramInfo *pginfo, bool forceMetadataDelete)
00130 {
00131 QStringList strlist;
00132
00133 if (forceMetadataDelete)
00134 strlist = QString("FORCE_DELETE_RECORDING");
00135 else
00136 strlist = QString("DELETE_RECORDING");
00137
00138 pginfo->ToStringList(strlist);
00139
00140 SendReceiveStringList(strlist);
00141
00142 return strlist[0].toInt();
00143 }
00144
00145 void PlaybackSock::FillProgramInfo(ProgramInfo *pginfo, QString &playbackhost)
00146 {
00147 QStringList strlist = QString("FILL_PROGRAM_INFO");
00148 strlist << playbackhost;
00149 pginfo->ToStringList(strlist);
00150
00151 SendReceiveStringList(strlist);
00152
00153 pginfo->FromStringList(strlist, 0);
00154 }
00155
00156 QStringList PlaybackSock::GenPreviewPixmap(const ProgramInfo *pginfo)
00157 {
00158 QStringList strlist = QString("QUERY_GENPIXMAP");
00159 pginfo->ToStringList(strlist);
00160
00161 SendReceiveStringList(strlist);
00162
00163 return strlist;
00164 }
00165
00166 QStringList PlaybackSock::GenPreviewPixmap(const ProgramInfo *pginfo,
00167 bool time_fmt_sec,
00168 long long time,
00169 const QString &outputFile,
00170 const QSize &outputSize)
00171 {
00172 QStringList strlist = "QUERY_GENPIXMAP";
00173 pginfo->ToStringList(strlist);
00174 strlist.push_back(time_fmt_sec ? "s" : "f");
00175 encodeLongLong(strlist, time);
00176 strlist.push_back((outputFile.isEmpty()) ? "<EMPTY>" : outputFile);
00177 strlist.push_back(QString::number(outputSize.width()));
00178 strlist.push_back(QString::number(outputSize.height()));
00179
00180 SendReceiveStringList(strlist);
00181
00182 return strlist;
00183 }
00184
00185 QDateTime PlaybackSock::PixmapLastModified(const ProgramInfo *pginfo)
00186 {
00187 QStringList strlist = QString("QUERY_PIXMAP_LASTMODIFIED");
00188 pginfo->ToStringList(strlist);
00189
00190 SendReceiveStringList(strlist);
00191
00192 QDateTime datetime;
00193 if (!strlist.empty() && strlist[0] != "BAD")
00194 {
00195 uint timet = strlist[0].toUInt();
00196 datetime.setTime_t(timet);
00197 }
00198 return datetime;
00199 }
00200
00201 bool PlaybackSock::CheckFile(ProgramInfo *pginfo)
00202 {
00203 QStringList strlist = "QUERY_CHECKFILE";
00204 strlist << QString::number(0);
00205 pginfo->ToStringList(strlist);
00206
00207 SendReceiveStringList(strlist);
00208
00209 bool exists = strlist[0].toInt();
00210 pginfo->pathname = strlist[1];
00211 return exists;
00212 }
00213
00214 bool PlaybackSock::IsBusy(
00215 int capturecardnum, InputInfo *busy_input, int time_buffer)
00216 {
00217 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00218
00219 strlist << "IS_BUSY";
00220 strlist << QString::number(time_buffer);
00221
00222 SendReceiveStringList(strlist);
00223
00224 QStringList::const_iterator it = strlist.begin();
00225 bool state = (*it).toInt();
00226 if (busy_input)
00227 {
00228 it++;
00229 busy_input->FromStringList(it, strlist.end());
00230 }
00231
00232 return state;
00233 }
00234
00239 int PlaybackSock::GetEncoderState(int capturecardnum)
00240 {
00241 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00242 strlist << "GET_STATE";
00243
00244 SendReceiveStringList(strlist);
00245
00246 int state = strlist[0].toInt();
00247 return state;
00248 }
00249
00250 long long PlaybackSock::GetMaxBitrate(int capturecardnum)
00251 {
00252 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00253 strlist << "GET_MAX_BITRATE";
00254
00255 SendReceiveStringList(strlist);
00256
00257 long long ret = decodeLongLong(strlist, 0);
00258 return ret;
00259 }
00260
00267 ProgramInfo *PlaybackSock::GetRecording(int capturecardnum)
00268 {
00269 QStringList strlist = QString("QUERY_REMOTEENCODER %1")
00270 .arg(capturecardnum);
00271
00272 strlist << "GET_CURRENT_RECORDING";
00273
00274 SendReceiveStringList(strlist);
00275
00276 ProgramInfo *info = new ProgramInfo();
00277 info->FromStringList(strlist, 0);
00278 return info;
00279 }
00280
00281 bool PlaybackSock::EncoderIsRecording(int capturecardnum, const ProgramInfo *pginfo)
00282 {
00283 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00284 strlist << "MATCHES_RECORDING";
00285 pginfo->ToStringList(strlist);
00286
00287 SendReceiveStringList(strlist);
00288
00289 bool ret = strlist[0].toInt();
00290 return ret;
00291 }
00292
00293 RecStatusType PlaybackSock::StartRecording(int capturecardnum,
00294 const ProgramInfo *pginfo)
00295 {
00296 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00297 strlist << "START_RECORDING";
00298 pginfo->ToStringList(strlist);
00299
00300 SendReceiveStringList(strlist);
00301
00302 return RecStatusType(strlist[0].toInt());
00303 }
00304
00305 void PlaybackSock::RecordPending(int capturecardnum, const ProgramInfo *pginfo,
00306 int secsleft, bool hasLater)
00307 {
00308 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00309 strlist << "RECORD_PENDING";
00310 strlist << QString::number(secsleft);
00311 strlist << QString::number(hasLater);
00312 pginfo->ToStringList(strlist);
00313
00314 SendReceiveStringList(strlist);
00315 }
00316
00317 int PlaybackSock::SetSignalMonitoringRate(int capturecardnum,
00318 int rate, int notifyFrontend)
00319 {
00320 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00321 strlist << "SET_SIGNAL_MONITORING_RATE";
00322 strlist << QString::number(rate);
00323 strlist << QString::number(notifyFrontend);
00324
00325 SendReceiveStringList(strlist);
00326
00327 int ret = strlist[0].toInt();
00328 return ret;
00329 }
00330
00331 void PlaybackSock::SetNextLiveTVDir(int capturecardnum, QString dir)
00332 {
00333 QStringList strlist =
00334 QString("SET_NEXT_LIVETV_DIR %1 %2").arg(capturecardnum).arg(dir);
00335
00336 SendReceiveStringList(strlist);
00337 }
00338
00339 vector<InputInfo> PlaybackSock::GetFreeInputs(int capturecardnum,
00340 const vector<uint> &excluded_cardids)
00341 {
00342 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(capturecardnum);
00343 strlist << "GET_FREE_INPUTS";
00344
00345 for (uint i = 0; i < excluded_cardids.size(); i++)
00346 strlist << QString::number(excluded_cardids[i]);
00347
00348 SendReceiveStringList(strlist);
00349
00350 vector<InputInfo> list;
00351
00352 QStringList::const_iterator it = strlist.begin();
00353 if ((it == strlist.end()) || (*it == "EMPTY_LIST"))
00354 return list;
00355
00356 while (it != strlist.end())
00357 {
00358 InputInfo info;
00359 if (!info.FromStringList(it, strlist.end()))
00360 break;
00361 list.push_back(info);
00362 }
00363
00364 return list;
00365 }
00366
00367 void PlaybackSock::CancelNextRecording(int capturecardnum, bool cancel)
00368 {
00369 QStringList strlist = QString("QUERY_REMOTEENCODER %1")
00370 .arg(capturecardnum);
00371
00372 strlist << "CANCEL_NEXT_RECORDING";
00373 strlist << QString::number(cancel);
00374
00375 SendReceiveStringList(strlist);
00376 }
00377
00378