summaryrefslogtreecommitdiffstats
path: root/ksysguard/gui/SensorDisplayLib/SensorLogger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ksysguard/gui/SensorDisplayLib/SensorLogger.cpp')
-rw-r--r--ksysguard/gui/SensorDisplayLib/SensorLogger.cpp437
1 files changed, 437 insertions, 0 deletions
diff --git a/ksysguard/gui/SensorDisplayLib/SensorLogger.cpp b/ksysguard/gui/SensorDisplayLib/SensorLogger.cpp
new file mode 100644
index 000000000..63cee160b
--- /dev/null
+++ b/ksysguard/gui/SensorDisplayLib/SensorLogger.cpp
@@ -0,0 +1,437 @@
+/*
+ KSysGuard, the KDE System Guard
+
+ Copyright (c) 2001 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of version 2 of the GNU General Public
+ License as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <tdeapplication.h>
+#include <kiconloader.h>
+#include <tdelocale.h>
+
+#include <ksgrd/SensorManager.h>
+#include <ksgrd/StyleEngine.h>
+
+#include <tqfile.h>
+
+#include "SensorLogger.moc"
+#include "SensorLoggerSettings.h"
+
+SLListViewItem::SLListViewItem(TQListView *parent)
+ : TQListViewItem(parent)
+{
+}
+
+LogSensor::LogSensor(TQListView *parent)
+ : timerID( NONE ), lowerLimitActive( 0 ), upperLimitActive( 0 ),
+ lowerLimit( 0 ), upperLimit( 0 )
+{
+ TQ_CHECK_PTR(parent);
+
+ monitor = parent;
+
+ lvi = new SLListViewItem(monitor);
+ TQ_CHECK_PTR(lvi);
+
+ pixmap_running = UserIcon( "running" );
+ pixmap_waiting = UserIcon( "waiting" );
+
+ lvi->setPixmap(0, pixmap_waiting);
+ lvi->setTextColor(monitor->colorGroup().text());
+
+ monitor->insertItem(lvi);
+}
+
+LogSensor::~LogSensor(void)
+{
+ if ((lvi) && (monitor))
+ delete lvi;
+}
+
+void
+LogSensor::startLogging(void)
+{
+ lvi->setPixmap(0, pixmap_running);
+ timerOn();
+}
+
+void
+LogSensor::stopLogging(void)
+{
+ lvi->setPixmap(0, pixmap_waiting);
+ lvi->setTextColor(monitor->colorGroup().text());
+ lvi->repaint();
+ timerOff();
+}
+
+void
+LogSensor::timerEvent(TQTimerEvent*)
+{
+ KSGRD::SensorMgr->sendRequest(hostName, sensorName, (KSGRD::SensorClient*) this, 42);
+}
+
+void
+LogSensor::answerReceived(int id, const TQString& answer)
+{
+ TQFile logFile(fileName);
+
+ if (!logFile.open(IO_ReadWrite | IO_Append))
+ {
+ stopLogging();
+ return;
+ }
+
+ switch (id)
+ {
+ case 42: {
+ TQTextStream stream(&logFile);
+ double value = answer.toDouble();
+
+ if (lowerLimitActive && value < lowerLimit)
+ {
+ timerOff();
+ lowerLimitActive = false;
+ lvi->setTextColor(monitor->colorGroup().foreground());
+ lvi->repaint();
+ KNotifyClient::event(monitor->winId(), "sensor_alarm", TQString("sensor '%1' at '%2' reached lower limit").arg(sensorName).arg(hostName));
+ timerOn();
+ } else if (upperLimitActive && value > upperLimit)
+ {
+ timerOff();
+ upperLimitActive = false;
+ lvi->setTextColor(monitor->colorGroup().foreground());
+ lvi->repaint();
+ KNotifyClient::event(monitor->winId(), "sensor_alarm", TQString("sensor '%1' at '%2' reached upper limit").arg(sensorName).arg(hostName));
+ timerOn();
+ }
+ TQDate date = TQDateTime::currentDateTime().date();
+ TQTime time = TQDateTime::currentDateTime().time();
+
+ stream << TQString("%1 %2 %3 %4 %5: %6\n").arg(date.shortMonthName(date.month())).arg(date.day()).arg(time.toString()).arg(hostName).arg(sensorName).arg(value);
+ }
+ }
+
+ logFile.close();
+}
+
+SensorLogger::SensorLogger(TQWidget *parent, const char *name, const TQString& title)
+ : KSGRD::SensorDisplay(parent, name, title)
+{
+ monitor = new TQListView(this, "monitor");
+ TQ_CHECK_PTR(monitor);
+
+ monitor->addColumn(i18n("Logging"));
+ monitor->addColumn(i18n("Timer Interval"));
+ monitor->addColumn(i18n("Sensor Name"));
+ monitor->addColumn(i18n("Host Name"));
+ monitor->addColumn(i18n("Log File"));
+
+ TQColorGroup cgroup = monitor->colorGroup();
+ cgroup.setColor(TQColorGroup::Text, KSGRD::Style->firstForegroundColor());
+ cgroup.setColor(TQColorGroup::Base, KSGRD::Style->backgroundColor());
+ cgroup.setColor(TQColorGroup::Foreground, KSGRD::Style->alarmColor());
+ monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
+ monitor->setSelectionMode(TQListView::NoSelection);
+
+ connect(monitor, TQ_SIGNAL(rightButtonClicked(TQListViewItem*, const TQPoint&, int)), this, TQ_SLOT(RMBClicked(TQListViewItem*, const TQPoint&, int)));
+
+ setTitle(i18n("Sensor Logger"));
+
+ logSensors.setAutoDelete(true);
+
+ setPlotterWidget(monitor);
+
+ setMinimumSize(50, 25);
+ setModified(false);
+}
+
+SensorLogger::~SensorLogger(void)
+{
+}
+
+bool
+SensorLogger::addSensor(const TQString& hostName, const TQString& sensorName, const TQString& sensorType, const TQString&)
+{
+ if (sensorType != "integer" && sensorType != "float")
+ return (false);
+
+ sld = new SensorLoggerDlg(this, "SensorLoggerDlg");
+ TQ_CHECK_PTR(sld);
+
+ if (sld->exec()) {
+ if (!sld->fileName().isEmpty()) {
+ LogSensor *sensor = new LogSensor(monitor);
+ TQ_CHECK_PTR(sensor);
+
+ sensor->setHostName(hostName);
+ sensor->setSensorName(sensorName);
+ sensor->setFileName(sld->fileName());
+ sensor->setTimerInterval(sld->timerInterval());
+ sensor->setLowerLimitActive(sld->lowerLimitActive());
+ sensor->setUpperLimitActive(sld->upperLimitActive());
+ sensor->setLowerLimit(sld->lowerLimit());
+ sensor->setUpperLimit(sld->upperLimit());
+
+ logSensors.append(sensor);
+
+ setModified(true);
+ }
+ }
+
+ delete sld;
+ sld = 0;
+
+ return (true);
+}
+
+bool
+SensorLogger::editSensor(LogSensor* sensor)
+{
+ sld = new SensorLoggerDlg(this, "SensorLoggerDlg");
+ TQ_CHECK_PTR(sld);
+
+ sld->setFileName(sensor->getFileName());
+ sld->setTimerInterval(sensor->getTimerInterval());
+ sld->setLowerLimitActive(sensor->getLowerLimitActive());
+ sld->setLowerLimit(sensor->getLowerLimit());
+ sld->setUpperLimitActive(sensor->getUpperLimitActive());
+ sld->setUpperLimit(sensor->getUpperLimit());
+
+ if (sld->exec()) {
+ if (!sld->fileName().isEmpty()) {
+ sensor->setFileName(sld->fileName());
+ sensor->setTimerInterval(sld->timerInterval());
+ sensor->setLowerLimitActive(sld->lowerLimitActive());
+ sensor->setUpperLimitActive(sld->upperLimitActive());
+ sensor->setLowerLimit(sld->lowerLimit());
+ sensor->setUpperLimit(sld->upperLimit());
+
+ setModified(true);
+ }
+ }
+
+ delete sld;
+ sld = 0;
+
+ return (true);
+}
+
+void
+SensorLogger::configureSettings()
+{
+ TQColorGroup cgroup = monitor->colorGroup();
+
+ sls = new SensorLoggerSettings(this, "SensorLoggerSettings");
+ TQ_CHECK_PTR(sls);
+
+ connect( sls, TQ_SIGNAL( applyClicked() ), TQ_SLOT( applySettings() ) );
+
+ sls->setTitle(title());
+ sls->setForegroundColor(cgroup.text());
+ sls->setBackgroundColor(cgroup.base());
+ sls->setAlarmColor(cgroup.foreground());
+
+ if (sls->exec())
+ applySettings();
+
+ delete sls;
+ sls = 0;
+}
+
+void
+SensorLogger::applySettings()
+{
+ TQColorGroup cgroup = monitor->colorGroup();
+
+ setTitle(sls->title());
+
+ cgroup.setColor(TQColorGroup::Text, sls->foregroundColor());
+ cgroup.setColor(TQColorGroup::Base, sls->backgroundColor());
+ cgroup.setColor(TQColorGroup::Foreground, sls->alarmColor());
+ monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
+
+ setModified(true);
+}
+
+void
+SensorLogger::applyStyle(void)
+{
+ TQColorGroup cgroup = monitor->colorGroup();
+
+ cgroup.setColor(TQColorGroup::Text, KSGRD::Style->firstForegroundColor());
+ cgroup.setColor(TQColorGroup::Base, KSGRD::Style->backgroundColor());
+ cgroup.setColor(TQColorGroup::Foreground, KSGRD::Style->alarmColor());
+ monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
+
+ setModified(true);
+}
+
+bool
+SensorLogger::restoreSettings(TQDomElement& element)
+{
+ TQColorGroup cgroup = monitor->colorGroup();
+
+ cgroup.setColor(TQColorGroup::Text, restoreColor(element, "textColor", TQt::green));
+ cgroup.setColor(TQColorGroup::Base, restoreColor(element, "backgroundColor", TQt::black));
+ cgroup.setColor(TQColorGroup::Foreground, restoreColor(element, "alarmColor", TQt::red));
+ monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
+
+ logSensors.clear();
+
+ TQDomNodeList dnList = element.elementsByTagName("logsensors");
+ for (uint i = 0; i < dnList.count(); i++) {
+ TQDomElement element = dnList.item(i).toElement();
+ LogSensor* sensor = new LogSensor(monitor);
+ TQ_CHECK_PTR(sensor);
+
+ sensor->setHostName(element.attribute("hostName"));
+ sensor->setSensorName(element.attribute("sensorName"));
+ sensor->setFileName(element.attribute("fileName"));
+ sensor->setTimerInterval(element.attribute("timerInterval").toInt());
+ sensor->setLowerLimitActive(element.attribute("lowerLimitActive").toInt());
+ sensor->setLowerLimit(element.attribute("lowerLimit").toDouble());
+ sensor->setUpperLimitActive(element.attribute("upperLimitActive").toInt());
+ sensor->setUpperLimit(element.attribute("upperLimit").toDouble());
+
+ logSensors.append(sensor);
+ }
+
+ SensorDisplay::restoreSettings(element);
+
+ setModified(false);
+
+ return (true);
+}
+
+bool
+SensorLogger::saveSettings(TQDomDocument& doc, TQDomElement& element, bool save)
+{
+ saveColor(element, "textColor", monitor->colorGroup().text());
+ saveColor(element, "backgroundColor", monitor->colorGroup().base());
+ saveColor(element, "alarmColor", monitor->colorGroup().foreground());
+
+ for (LogSensor* sensor = logSensors.first(); sensor != 0; sensor = logSensors.next())
+ {
+ TQDomElement log = doc.createElement("logsensors");
+ log.setAttribute("sensorName", sensor->getSensorName());
+ log.setAttribute("hostName", sensor->getHostName());
+ log.setAttribute("fileName", sensor->getFileName());
+ log.setAttribute("timerInterval", sensor->getTimerInterval());
+ log.setAttribute("lowerLimitActive", TQString("%1").arg(sensor->getLowerLimitActive()));
+ log.setAttribute("lowerLimit", TQString("%1").arg(sensor->getLowerLimit()));
+ log.setAttribute("upperLimitActive", TQString("%1").arg(sensor->getUpperLimitActive()));
+ log.setAttribute("upperLimit", TQString("%1").arg(sensor->getUpperLimit()));
+
+ element.appendChild(log);
+ }
+
+ SensorDisplay::saveSettings(doc, element);
+
+ if (save)
+ setModified(false);
+
+ return (true);
+}
+
+void
+SensorLogger::answerReceived(int, const TQString&)
+{
+ // we do not use this, since all answers are received by the LogSensors
+}
+
+void
+SensorLogger::resizeEvent(TQResizeEvent*)
+{
+ frame()->setGeometry(0, 0, this->width(), this->height());
+ monitor->setGeometry(10, 20, this->width() - 20, this->height() - 30);
+}
+
+LogSensor*
+SensorLogger::getLogSensor(TQListViewItem* item)
+{
+ for (LogSensor* sensor = logSensors.first(); sensor != 0; sensor = logSensors.next())
+ {
+ if (item == sensor->getListViewItem()) {
+ return sensor;
+ }
+ }
+
+ return NULL;
+}
+
+void
+SensorLogger::RMBClicked(TQListViewItem* item, const TQPoint& point, int)
+{
+ TQPopupMenu pm;
+ if (hasSettingsDialog())
+ pm.insertItem(i18n("&Properties"), 1);
+ pm.insertItem(i18n("&Remove Display"), 2);
+ pm.insertSeparator(-1);
+ pm.insertItem(i18n("&Remove Sensor"), 3);
+ pm.insertItem(i18n("&Edit Sensor..."), 4);
+
+ if ( !item )
+ {
+ pm.setItemEnabled( 3, false );
+ pm.setItemEnabled( 4, false );
+ }
+ else
+ {
+ LogSensor* sensor = getLogSensor(item);
+
+ if ( sensor->isLogging() )
+ pm.insertItem(i18n("St&op Logging"), 6);
+ else
+ pm.insertItem(i18n("S&tart Logging"), 5);
+ }
+
+ switch (pm.exec(point))
+ {
+ case 1:
+ configureSettings();
+ break;
+ case 2: {
+ TQCustomEvent* ev = new TQCustomEvent(TQEvent::User);
+ ev->setData(this);
+ kapp->postEvent(parent(), ev);
+ break;
+ }
+ case 3: {
+ LogSensor* sensor = getLogSensor(item);
+ if (sensor)
+ logSensors.remove(sensor);
+ break;
+ }
+ case 4: {
+ LogSensor* sensor = getLogSensor(item);
+ if (sensor)
+ editSensor(sensor);
+ break;
+ }
+ case 5: {
+ LogSensor* sensor = getLogSensor(item);
+ if (sensor)
+ sensor->startLogging();
+ break;
+ }
+ case 6: {
+ LogSensor* sensor = getLogSensor(item);
+ if (sensor)
+ sensor->stopLogging();
+ break;
+ }
+ }
+}