void PreviewGeneratorQueue::GetPreviewImage( const ProgramInfo &pginfo, const QSize &outputsize, const QString &outputfile, long long time, bool in_seconds, QString token) { if (!s_pgq) return; if (pginfo.GetPathname().isEmpty() || pginfo.GetBasename() == pginfo.GetPathname()) { return; } QStringList extra; pginfo.ToStringList(extra); extra += token; extra += QString::number(outputsize.width()); extra += QString::number(outputsize.height()); extra += outputfile; extra += QString::number(time); extra += (in_seconds ? "1" : "0"); MythEvent *e = new MythEvent("GET_PREVIEW", extra); QCoreApplication::postEvent(s_pgq, e); }
bool RemoteFillProgramInfo(ProgramInfo &pginfo, const QString &playbackhost) { QStringList strlist( "FILL_PROGRAM_INFO" ); strlist << playbackhost; pginfo.ToStringList(strlist); if (gCoreContext->SendReceiveStringList(strlist)) { ProgramInfo tmp(strlist); if (tmp.HasPathname() || tmp.GetChanID()) { pginfo = tmp; return true; } } return false; }
bool PlaybackSock::FillProgramInfo(ProgramInfo &pginfo, const QString &playbackhost) { QStringList strlist( QString("FILL_PROGRAM_INFO") ); strlist << playbackhost; pginfo.ToStringList(strlist); if (SendReceiveStringList(strlist)) { ProgramInfo tmp(strlist); if (tmp.HasPathname() || tmp.GetChanID()) { pginfo.clone(tmp, true); return true; } } return false; }
/// Download preview & get timestamp if newer than cachefile's /// last modified time, otherwise just get the timestamp QDateTime RemoteGetPreviewIfModified( const ProgramInfo &pginfo, const QString &cachefile) { QString loc("RemoteGetPreviewIfModified: "); QDateTime cacheLastModified; QFileInfo cachefileinfo(cachefile); if (cachefileinfo.exists()) cacheLastModified = cachefileinfo.lastModified(); QStringList strlist("QUERY_PIXMAP_GET_IF_MODIFIED"); strlist << ((cacheLastModified.isValid()) ? // unix secs, UTC QString::number(cacheLastModified.toTime_t()) : QString("-1")); strlist << QString::number(200 * 1024); // max size of preview file pginfo.ToStringList(strlist); if (!gCoreContext->SendReceiveStringList(strlist) || strlist.isEmpty() || strlist[0] == "ERROR") { LOG(VB_GENERAL, LOG_ERR, loc + "Remote error" + ((strlist.size() >= 2) ? (":\n\t\t\t" + strlist[1]) : "")); return QDateTime(); } if (strlist[0] == "WARNING") { LOG(VB_NETWORK, LOG_WARNING, loc + "Remote warning" + ((strlist.size() >= 2) ? (":\n\t\t\t" + strlist[1]) : "")); return QDateTime(); } QDateTime retdatetime; qlonglong timet = strlist[0].toLongLong(); if (timet >= 0) retdatetime = MythDate::fromTime_t(timet); if (strlist.size() < 4) { return retdatetime; } size_t length = strlist[1].toULongLong(); quint16 checksum16 = strlist[2].toUInt(); QByteArray data = QByteArray::fromBase64(strlist[3].toLatin1()); if ((size_t) data.size() < length) { // (note data.size() may be up to 3 bytes longer after decoding LOG(VB_GENERAL, LOG_ERR, loc + QString("Preview size check failed %1 < %2") .arg(data.size()).arg(length)); return QDateTime(); } data.resize(length); if (checksum16 != qChecksum(data.constData(), data.size())) { LOG(VB_GENERAL, LOG_ERR, loc + "Preview checksum failed"); return QDateTime(); } QString pdir(cachefile.section("/", 0, -2)); QDir cfd(pdir); if (!cfd.exists() && !cfd.mkdir(pdir)) { LOG(VB_GENERAL, LOG_ERR, loc + QString("Unable to create remote cache directory '%1'") .arg(pdir)); return QDateTime(); } QFile file(cachefile); if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) { LOG(VB_GENERAL, LOG_ERR, loc + QString("Unable to open cached preview file for writing '%1'") .arg(cachefile)); return QDateTime(); } off_t offset = 0; size_t remaining = length; uint failure_cnt = 0; while ((remaining > 0) && (failure_cnt < 5)) { ssize_t written = file.write(data.data() + offset, remaining); if (written < 0) { failure_cnt++; usleep(50000); continue; } failure_cnt = 0; offset += written; remaining -= written; } if (remaining) { LOG(VB_GENERAL, LOG_ERR, loc + QString("Failed to write cached preview file '%1'") .arg(cachefile)); file.resize(0); // in case unlink fails.. file.remove(); // closes fd return QDateTime(); } file.close(); return retdatetime; }