summaryrefslogtreecommitdiffstats
path: root/src/dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dialog.cpp')
-rw-r--r--src/dialog.cpp103
1 files changed, 86 insertions, 17 deletions
diff --git a/src/dialog.cpp b/src/dialog.cpp
index aea2d6e..9dfff00 100644
--- a/src/dialog.cpp
+++ b/src/dialog.cpp
@@ -12,9 +12,9 @@
#include <QTemporaryFile>
#include <QUrlQuery>
-#include "unistd.h"
-#include "stdio.h"
-#include "sys/wait.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/wait.h>
#include "ui_dialog.h"
#include "sessiontreeitem.h"
@@ -95,8 +95,10 @@ Dialog::Dialog(QWidget *parent)
this->onTabButtonChanged(TAB_NATIVE);
}
- ui->chkAdminMode->setVisible(Config::isSet(Config::ALLOW_VM_EDIT));
- ui->chkAdminMode->setEnabled(false);
+ ui->chkAdminEdit->setVisible(Config::isSet(Config::ALLOW_VM_EDIT));
+ ui->chkAdminEdit->setEnabled(false);
+ ui->chkAdminCopy->setVisible(Config::isSet(Config::ALLOW_VM_EDIT));
+ ui->chkAdminCopy->setEnabled(false);
ui->btnScreenSetup->setVisible(isProcessRunning("beamergui"));
if (QApplication::screens().size() > 1) {
@@ -110,6 +112,16 @@ Dialog::Dialog(QWidget *parent)
QObject::connect(SessionsIconHolder::get(), &SessionsIconHolder::iconDownloaded,
this, &Dialog::iconDownloaded);
+ QObject::connect(ui->chkAdminCopy, &QCheckBox::toggled, [this](bool checked) {
+ if (checked) {
+ ui->chkAdminEdit->setChecked(false);
+ }
+ });
+ QObject::connect(ui->chkAdminEdit, &QCheckBox::toggled, [this](bool checked) {
+ if (checked) {
+ ui->chkAdminCopy->setChecked(false);
+ }
+ });
}
Dialog::~Dialog() {
@@ -143,6 +155,21 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index)
if (!s->prepareRun())
return;
+ bool adminMode = false;
+
+ if (anyEditModeRequested() && s->canEdit()) {
+ auto mode = s->editModeTypes();
+ adminMode = true;
+ if (ui->chkAdminEdit->isChecked() && ui->chkAdminEdit->isEnabled()) {
+ setenv("VMCHOOSER_ADMIN_TYPE", "EDIT", 1);
+ } else {
+ setenv("VMCHOOSER_ADMIN_TYPE", "COPY", 1);
+ }
+ if (Config::isSet(Config::COW_TOKEN)) {
+ setenv("VMCHOOSER_ADMIN_TOKEN", Config::get(Config::COW_TOKEN).toLocal8Bit().constData(), 1);
+ }
+ }
+
WindowManager::stopOwnInstance(true);
// These two are up here in case run-virt cares...
@@ -153,7 +180,12 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index)
setenv("PVS_AUTO_CONNECT", "FALSE", 1);
}
}
- if (ui->chkAdminMode->isEnabled() && ui->chkAdminMode->isChecked()) {
+
+ if (anyEditModeRequested() && Config::isSet(Config::ALLOW_VM_EDIT)) {
+ adminMode = true;
+ }
+
+ if (adminMode) {
setenv("VMCHOOSER_ADMIN_MODE", "TRUE", 1);
} else {
setenv("VMCHOOSER_ADMIN_MODE", "FALSE", 1);
@@ -198,6 +230,12 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index)
QApplication::instance()->quit();
}
+bool Dialog::anyEditModeRequested() const
+{
+ return (ui->chkAdminEdit->isEnabled() && ui->chkAdminEdit->isChecked())
+ || (ui->chkAdminCopy->isEnabled() && ui->chkAdminCopy->isChecked());
+}
+
void Dialog::on_treeView_expanded(const QModelIndex& index) {
if (activeTab_ != TAB_ALL_VMS)
return;
@@ -457,26 +495,42 @@ void Dialog::onCenterTimer() {
/**
* Download lecture list, news and help
*/
-void Dialog::downloadData(const QString& locationIds) {
+void Dialog::downloadData() {
QUrl listUrl(Config::isSet(Config::URL_LIST)
? Config::get(Config::URL_LIST)
: Config::get(Config::URL_BASE).append("/list"));
QUrlQuery listQuery(listUrl);
+ bool cache = true;
+ const QString& locationIds = Config::get(Config::LOCATIONS);
+ const QString& cowToken = Config::get(Config::COW_TOKEN);
if (!locationIds.isEmpty()) {
listQuery.addQueryItem("locations", locationIds);
}
+ if (!cowToken.isEmpty()) {
+ // Don't cache lecture list containing edit mode annotations
+ listQuery.addQueryItem("cow-user", cowToken);
+ cache = false;
+ }
if (Config::isSet(Config::EXAM_MODE)) {
listQuery.addQueryItem("exams", "exam-mode");
}
listUrl.setQuery(listQuery);
//
// Download lecture XML
- FileDownloader::download(listUrl, [this](QNetworkReply::NetworkError err, const QByteArray& data) {
+ FileDownloader::download(listUrl, [cache, this](QNetworkReply::NetworkError err, const QByteArray& data) {
QList<Session*> sessions;
- QDomDocument doc = toDomDocument(QStringLiteral("lecture list"), data, TEMP_PATH_XML_LIST, QStringLiteral("settings"));
+ QDomDocument doc = toDomDocument(QStringLiteral("lecture list"), data, cache ? TEMP_PATH_XML_LIST : QString(),
+ QStringLiteral("settings"));
sessions = VSession::loadFromXmlDocument(doc);
+ QString errMsg = doc.firstChildElement(QStringLiteral("settings"))
+ .firstChildElement(QStringLiteral("error")).text();
+
+ if (!errMsg.isEmpty()) {
+ ui->filterEdit->setText(errMsg);
+ }
+
this->removeStatusString(STR_LOADING);
if (sessions.isEmpty()) {
if (err == QNetworkReply::NoError) {
@@ -489,13 +543,14 @@ void Dialog::downloadData(const QString& locationIds) {
this->addItems(sessions, TAB_ALL_VMS);
bool showEdit = false; // Only show edit button if at least one lecture is editable
for (QList<Session*>::const_iterator it = sessions.begin(); it != sessions.end(); ++it) {
- if (reinterpret_cast<VSession*>(*it)->canEdit()) {
+ if ((**it).canEdit()) {
showEdit = true;
break;
}
}
if (showEdit) {
- ui->chkAdminMode->setVisible(true);
+ ui->chkAdminEdit->setVisible(true);
+ ui->chkAdminCopy->setVisible(true);
}
}
@@ -559,11 +614,16 @@ void Dialog::mousePressEvent(QMouseEvent * event) {
userInteracted_ = true;
}
+void Dialog::setAdminChecks(int mode)
+{
+ ui->chkAdminEdit->setEnabled((mode & Session::EDIT_TYPE_EDIT) != 0);
+ ui->chkAdminCopy->setEnabled((mode & Session::EDIT_TYPE_COPY) != 0);
+}
+
void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelIndex&) {
- SessionTreeItem* item =
- static_cast<SessionTreeItem*>(current.internalPointer());
+ SessionTreeItem* item = static_cast<SessionTreeItem*>(current.internalPointer());
if (item == nullptr) {
- ui->chkAdminMode->setEnabled(false);
+ setAdminChecks(0);
return;
}
@@ -571,7 +631,7 @@ void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelI
if (!s) {
qDebug() << "invalid selection";
// no valid session has been selected, do nothing
- ui->chkAdminMode->setEnabled(false);
+ setAdminChecks(0);
return;
}
@@ -588,8 +648,12 @@ void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelI
ui->label_platform->setText(vs->getAttribute("virtualizer_name", "param"));
ui->label_platform->setToolTip(vs->getAttribute("virtualizer_name", "param"));
- // TODO: This is a bug? vs->canEdit() seems completely pointless right now...
- ui->chkAdminMode->setEnabled(vs->canEdit() || Config::isSet(Config::ALLOW_VM_EDIT));
+ // If ALLOW_EDIT is false, we still might have editable sessions if the list meta data says so
+ if (Config::isSet(Config::ALLOW_VM_EDIT)) {
+ setAdminChecks(255);
+ } else {
+ setAdminChecks(s->editModeTypes());
+ }
if (vs->keywords().length() > 0) {
description = "\n\nKeywords: ";
@@ -603,6 +667,7 @@ void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelI
ui->label_os->setText(QCoreApplication::instance()->translate("Dialog", "Native Linux"));
ui->label_platform->setText("Linux");
ui->label_platform->setToolTip("");
+ setAdminChecks(0);
}
ui->label_name->setText(s->shortDescription());
ui->label_name->setToolTip(s->shortDescription());
@@ -877,6 +942,10 @@ static QDomDocument toDomDocument(const QString& what, const QByteArray& data, c
} else {
qDebug() << "No content downloaded for" << what;
}
+ // No backup file given, just return what we got
+ if (backupFile.isEmpty())
+ return doc;
+
QFile backup(backupFile);
if (doc.isNull() || !doc.hasChildNodes()) {
if (backup.open(QFile::ReadOnly)) {