aboutsummaryrefslogtreecommitdiffstats
path: root/app/taskmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'app/taskmanager.cpp')
-rw-r--r--app/taskmanager.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/app/taskmanager.cpp b/app/taskmanager.cpp
new file mode 100644
index 0000000..1b913d0
--- /dev/null
+++ b/app/taskmanager.cpp
@@ -0,0 +1,103 @@
+#include <QJsonArray>
+#include <QJsonObject>
+#include <QtDebug>
+#include <QString>
+#include <unistd.h>
+#include <iostream>
+#include <QtCore>
+#include "taskmanager.h"
+
+TaskManager::TaskManager(QObject* parent) : QObject(parent) {
+ connect(&m_socket, SIGNAL(textMessageReceived(QString)), this, SLOT(onSocketTextReceived(QString)));
+}
+
+void TaskManager::open(const QUrl &bindingAddress) {
+ m_socket.open(bindingAddress);
+ timer = new QTimer();
+ connect(timer, SIGNAL(timeout()), this, SLOT(callService()));
+ timer->start(3000);
+}
+
+void TaskManager::callService() {
+ QJsonArray msg;
+ msg.append(2); // Call
+ msg.append(QString::number(m_nextCallId));
+ msg.append(QString("taskmanager/get_process_list"));
+ msg.append(QJsonValue());
+ m_nextCallId++;
+
+ QJsonDocument value;
+ value.setArray(msg);
+
+ m_socket.sendTextMessage(value.toJson(QJsonDocument::Compact));
+}
+
+void TaskManager::onSocketTextReceived(QString msg)
+{
+
+ QJsonDocument doc = QJsonDocument::fromJson(msg.toUtf8());
+ QJsonArray arr = doc.array();
+
+ switch(arr[0].toInt()) {
+ case 3: // RetOK
+ case 4: // RetErr
+ ProcessResponse(arr[0].toInt() == 3, arr[2]);
+ break;
+ }
+}
+
+void TaskManager::ProcessResponse(bool r, const QJsonValue& val)
+{
+ std::vector<ProcInfo> procs;
+
+ if (r) {
+ QJsonObject ret_val = val.toObject();
+ QJsonObject response = ret_val["response"].toObject();
+ QJsonArray processes = response["processes"].toArray();
+
+ for(auto it = processes.constBegin(); it != processes.constEnd(); ++it)
+ {
+ ProcInfo Proc(it->toObject());
+ procs.push_back(Proc);
+ }
+ }
+
+ int flag;
+ if(m_procinfos.empty()){
+ for(auto it = procs.begin(); it != procs.end(); ++it){ // if m_procinfos is empty then this is first call
+ emit addProcess(it->cmd(), it->tid(), it->euid(), it->scpu(), it->ucpu(), it->resident_memory(), it->state());
+ }
+ } else {
+ for(auto it = procs.begin(); it != procs.end(); ++it){ // loop through procs, it = procs element (ProcInfo obj)
+ flag = 0;
+ for(auto it2 = m_procinfos.begin(); it2 != m_procinfos.end(); ++it2){ // loop through m_procinfos, it2 m_procinfos element (ProcInfo obj)
+ // if(*it == *it2){ // if the same ID exists in both vectors
+ if(it->tid() == it2->tid()){
+ if(it->cmd() == it2->cmd()){ // if the name is still the same
+ if(!(it == it2)){ // if the same process has new data
+ emit updateProcess(it->cmd(), it->tid(), it->euid(), it->scpu(), it->ucpu(), it->resident_memory(), it->state());
+ m_procinfos.erase(it2);
+ flag = 1;
+ break;
+ }
+ } else { // process in m_procinfos has died and a new one has its ID
+ qDebug() << "The process ID has been reused for another process";
+ emit updateProcess(it->cmd(), it->tid(), it->euid(), it->scpu(), it->ucpu(), it->resident_memory(), it->state());
+ m_procinfos.erase(it2);
+ flag = 1;
+ }
+ }
+ }
+ if(flag == 0){ // if no ID was found in old vector; that means it's a new process
+ qDebug() << it->cmd() << " process has been added";
+ emit addProcess(it->cmd(), it->tid(), it->euid(), it->scpu(), it->ucpu(), it->resident_memory(), it->state());
+ }
+ }
+ for(auto it2 = m_procinfos.begin(); it2 != m_procinfos.end(); ++it2){ // remaining processes in m_procinfos are all dead
+ qDebug() << "Dead processes are removed";
+ qDebug() << it2->cmd();
+ emit removeProcess(it2->tid());
+ }
+ }
+ m_procinfos = procs;
+}