virtual void run(void) { threadRegister("Reconnect"); if (gCoreContext->GetMasterHostPrefix().isEmpty()) gCoreContext->dispatch(MythEvent(QString("RECONNECT_FAILURE"))); else gCoreContext->dispatch(MythEvent(QString("RECONNECT_SUCCESS"))); threadDeregister(); }
QDateTime HouseKeeperTask::UpdateLastRun(QDateTime last) { if (m_scope != kHKInst) { MSqlQuery query(MSqlQuery::InitCon()); if (!query.isConnected()) return last; if (m_lastRun == MythDate::fromTime_t(0)) { // not previously set, perform insert if (m_scope == kHKGlobal) query.prepare("INSERT INTO housekeeping (tag, lastrun)" " VALUES (:TAG, :TIME)"); else query.prepare("INSERT INTO housekeeping" " ( tag, hostname, lastrun)" " VALUES (:TAG, :HOST, :TIME)"); } else { // previously set, perform update if (m_scope == kHKGlobal) query.prepare("UPDATE housekeeping SET lastrun=:TIME" " WHERE tag = :TAG" " AND hostname IS NULL"); else query.prepare("UPDATE housekeeping SET lastrun=:TIME" " WHERE tag = :TAG" " AND hostname = :HOST"); } if (m_scope == kHKGlobal) LOG(VB_GENERAL, LOG_DEBUG, QString("Updating global run time for %1").arg(m_dbTag)); else LOG(VB_GENERAL, LOG_DEBUG, QString("Updating local run time for %1").arg(m_dbTag)); if (m_scope == kHKLocal) query.bindValue(":HOST", gCoreContext->GetHostName()); query.bindValue(":TAG", m_dbTag); query.bindValue(":TIME", MythDate::as_utc(last)); if (!query.exec()) MythDB::DBError("HouseKeeperTask::updateLastRun", query); } m_lastRun = last; m_confirm = false; QString msg = QString("HOUSE_KEEPER_RUNNING %1 %2 %3") .arg(gCoreContext->GetHostName()).arg(m_dbTag) .arg(MythDate::toString(last, MythDate::ISODate)); gCoreContext->SendEvent(MythEvent(msg)); return last; }
void AlarmNotifyThread::run() { RunProlog(); while (!m_stop) { // get the alarm status for all monitors if (ZMClient::get()->connected() && ZMClient::get()->updateAlarmStates()) { // at least one monitor changed state for (int x = 0; x < ZMClient::get()->getMonitorCount(); x++) { Monitor *mon = ZMClient::get()->getMonitorAt(x); if (mon->previousState != mon->state && (mon->state == ALARM || (mon->state == ALERT && mon->previousState != ALARM))) { // have notifications been turned on for this monitor? if (mon->showNotifications) { // we can't show a popup from the AlarmNotifyThread so send // a message to ZMClient to do it for us gCoreContext->dispatch(MythEvent(QString("ZONEMINDER_NOTIFICATION %1").arg(mon->id))); } } } } usleep(999999); } RunEpilog(); }
/*! \brief Deletes images/dirs \details Removes images/dirs from Photographs storage group and image database. Dirs will only be deleted if empty. Synchronises thumbnail cache and broadcasts a 'db changed' event. Only fails if nothing is deleted. \param fileIds Csv list of dir/file ids \return QStringList Error message or "OK" */ QStringList ImageHandler::HandleDelete(QString fileIds) { // Get subtree of files ImageDbWriter db; ImageList images, dirs; db.ReadDbTree(images, dirs, fileIds.split(",")); // Remove files from filesystem first ImageSg::getInstance()->RemoveFiles(images); // ... then dirs, which should now be empty ImageSg::getInstance()->RemoveFiles(dirs); // Fail if nothing deleted if (images.isEmpty() && dirs.isEmpty()) return QStringList("ERROR") << "Delete failed"; // Update Db db.RemoveFromDB(images + dirs); // Clean up thumbnails & update clients // Thumb generator now owns the image objects QStringList mesg = ImageThumb::getInstance()->DeleteThumbs(images, dirs); // Notify clients of deleted ids, images, thumbs gCoreContext->SendEvent(MythEvent("IMAGE_DB_CHANGED", mesg)); return QStringList("OK"); }
void RatingSettings::slotSave(void) { gCoreContext->SaveSetting("IntelliRatingWeight", m_ratingWeight->GetValue()); gCoreContext->SaveSetting("IntelliPlayCountWeight", m_playCountWeight->GetValue()); gCoreContext->SaveSetting("IntelliLastPlayWeight", m_lastPlayWeight->GetValue()); gCoreContext->SaveSetting("IntelliRandomWeight", m_randomWeight->GetValue()); gCoreContext->dispatch(MythEvent(QString("MUSIC_SETTINGS_CHANGED RATING_SETTINGS"))); Close(); }
void RemoteSendMessage(const QString &message) { if (gCoreContext->IsBackend()) { gCoreContext->dispatch(MythEvent(message)); return; } QStringList strlist( "MESSAGE" ); strlist << message; gCoreContext->SendReceiveStringList(strlist); }
void VisualizationSettings::slotSave(void) { int changeOnSongChange = (m_changeOnSongChange->GetCheckState() == MythUIStateType::Full) ? 1 : 0; gCoreContext->SaveSetting("VisualCycleOnSongChange", changeOnSongChange); int randomizeorder = (m_randomizeOrder->GetCheckState() == MythUIStateType::Full) ? 1 : 0; gCoreContext->SaveSetting("VisualRandomize", randomizeorder); gCoreContext->SaveSetting("VisualScaleWidth", m_scaleWidth->GetIntValue()); gCoreContext->SaveSetting("VisualScaleHeight", m_scaleHeight->GetIntValue()); gCoreContext->dispatch(MythEvent(QString("MUSIC_SETTINGS_CHANGED VISUALIZATION_SETTINGS"))); Close(); }
/*! \brief Notify listeners of mode & progress \param mode Mode to broadcast */ void ImageScanThread::BroadcastStatus(QString mode) { QStringList status; { // Release lock before sending message QMutexLocker locker(&m_mutexProgress); status << mode << QString::number(m_progressCount) << QString::number(m_progressTotalCount); } MythEvent me = MythEvent("IMAGE_SCAN_STATUS", status); gCoreContext->SendEvent(me); }
/*! \brief Change name of an image/dir \details Renames image/dir in Photographs storage group, synchronises image database and thumbnail cache and notifies clients. A new thumbnail will be generated by next client request. \param id File/dir id \param newBase New filename \return QStringList Error message or "OK" */ QStringList ImageHandler::HandleRename(QString id, QString newBase) { // Sanity check new name if (newBase.isEmpty() || newBase.contains("/") || newBase.contains("\\")) return QStringList("ERROR") << "Invalid name"; // Find image in DB ImageDbWriter db; ImageList images, dirs; db.ReadDbItemsById(images, id); // Either single id not found or multiple comma-delimited ids received if (images.size() != 1) { LOG(VB_FILE, LOG_NOTICE, QString("Image: Image %1 not found in Db").arg(id)); qDeleteAll(images); return QStringList("ERROR") << "Unknown File"; } // Get filepath for solitary image ImageItem *im = images[0]; QString absFilename = ImageSg::getInstance()->GetFilePath(im); if (absFilename.isEmpty()) { delete im; return QStringList("ERROR") << "File not found"; } // Rename file QFileInfo info = QFileInfo(absFilename); QDir dir = info.absoluteDir(); QString newName = im->IsDirectory() ? newBase : QString("%1.%2").arg(newBase, info.suffix()); if (!dir.rename(im->m_name, newName)) { LOG(VB_FILE, LOG_ERR, QString("Image: Rename of %1 -> %2 failed") .arg(im->m_name, newName)); delete im; return QStringList("ERROR") << "Rename failed"; } LOG(VB_FILE, LOG_DEBUG, QString("Image: Renamed %1 -> %2") .arg(im->m_fileName, newName)); ImageList dummy; if (im->IsDirectory()) { // Cleanup thumbdir/thumbnails // Thumb generator now owns the image object QStringList mesg = ImageThumb::getInstance()->DeleteThumbs(dummy, images); // Notify clients of deleted ids, images, thumbs gCoreContext->SendEvent(MythEvent("IMAGE_DB_CHANGED", mesg)); // Dir name change affects path of all sub-dirs & files and their thumbs QStringList scan; scan << "IMAGE_SCAN" << "START"; return ImageScan::getInstance()->HandleScanRequest(scan); } // Retain old image for cleanup ImageItem *newIm = new ImageItem(*im); // Update db newIm->m_name = newName; newIm->m_fileName = QDir::cleanPath(QDir(newIm->m_path).filePath(newName)); db.UpdateDbFile(newIm); delete newIm; // Clean up thumbnail // Thumb generator now owns the images objects QStringList mesg = ImageThumb::getInstance()->DeleteThumbs(images, dummy); // Item is modified, not deleted mesg.swap(0,1); // New thumbnail will be created by client request // Notify clients of changed image & thumbnail gCoreContext->SendEvent(MythEvent("IMAGE_DB_CHANGED", mesg)); return QStringList("OK"); }