summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2020-12-20 17:03:26 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2020-12-20 17:03:26 -0500
commitae1acda913d63ec5dfedc0c7f41e71b16096a9f6 (patch)
tree37d1be69ffb3564e4ebf2fd59d09745c88adceff
parente4ed9aad8ebe35d1baec7c875962424196aecacf (diff)
downloadcmst-ae1acda913d63ec5dfedc0c7f41e71b16096a9f6.tar.bz2
cmst-ae1acda913d63ec5dfedc0c7f41e71b16096a9f6.tar.xz
cmst-ae1acda913d63ec5dfedc0c7f41e71b16096a9f6.tar.zst
New upstream version 2020.11.01.upstream/2020.11.01upstream/latest
-rw-r--r--README.md4
-rw-r--r--apps/cmstapp/cmstapp.pro2
-rw-r--r--apps/cmstapp/code/agent/agent.cpp206
-rw-r--r--apps/cmstapp/code/agent/agent.h26
-rw-r--r--apps/cmstapp/code/agent/agent_dialog.cpp2
-rw-r--r--apps/cmstapp/code/agent/agent_dialog.h2
-rwxr-xr-xapps/cmstapp/code/control_box/controlbox.cpp1245
-rwxr-xr-xapps/cmstapp/code/control_box/controlbox.h23
-rw-r--r--apps/cmstapp/code/control_box/ui/controlbox.ui1011
-rw-r--r--apps/cmstapp/code/counter/counter.cpp2
-rw-r--r--apps/cmstapp/code/counter/counter.h2
-rw-r--r--apps/cmstapp/code/gen_conf_ed/gen_conf_ed.cpp242
-rw-r--r--apps/cmstapp/code/gen_conf_ed/gen_conf_ed.h75
-rw-r--r--apps/cmstapp/code/iconman/iconman.cpp46
-rw-r--r--apps/cmstapp/code/iconman/iconman.h2
-rwxr-xr-xapps/cmstapp/code/main.cpp2
-rw-r--r--apps/cmstapp/code/notify/notify.cpp77
-rw-r--r--apps/cmstapp/code/notify/notify.h2
-rw-r--r--apps/cmstapp/code/peditor/peditor.cpp280
-rw-r--r--apps/cmstapp/code/peditor/peditor.h46
-rw-r--r--apps/cmstapp/code/peditor/ui/peditor.ui135
-rw-r--r--apps/cmstapp/code/provisioning/prov_ed.cpp206
-rw-r--r--apps/cmstapp/code/provisioning/prov_ed.h10
-rw-r--r--apps/cmstapp/code/provisioning/ui/provisioning_editor.ui100
-rwxr-xr-xapps/cmstapp/code/scrollbox/scrollbox.cpp2
-rwxr-xr-xapps/cmstapp/code/scrollbox/scrollbox.h2
-rw-r--r--apps/cmstapp/code/shared/shared.cpp74
-rw-r--r--apps/cmstapp/code/shared/shared.h10
-rw-r--r--apps/cmstapp/code/trstring/tr_strings.cpp39
-rw-r--r--apps/cmstapp/code/trstring/tr_strings.h2
-rw-r--r--apps/cmstapp/code/vpn_agent/vpnagent.cpp194
-rw-r--r--apps/cmstapp/code/vpn_agent/vpnagent.h22
-rw-r--r--apps/cmstapp/code/vpn_agent/vpnagent_dialog.cpp2
-rw-r--r--apps/cmstapp/code/vpn_agent/vpnagent_dialog.h2
-rw-r--r--apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui162
-rw-r--r--apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp475
-rw-r--r--apps/cmstapp/code/vpn_prov_ed/vpn_ed.h5
-rwxr-xr-xapps/resource.h31
-rw-r--r--apps/rootapp/code/main.cpp2
-rw-r--r--apps/rootapp/code/roothelper/roothelper.cpp26
-rw-r--r--apps/rootapp/code/roothelper/roothelper.h2
-rwxr-xr-xcmst.pro2
-rw-r--r--cmst.qrc1
-rw-r--r--misc/desktop/cmst-autostart.desktop3
-rw-r--r--misc/desktop/cmst.desktop3
-rw-r--r--text/changelog.txt56
-rw-r--r--translations/cmst_de_DE.qmbin21721 -> 22910 bytes
-rw-r--r--translations/cmst_de_DE.ts1837
-rw-r--r--translations/cmst_en_US.qmbin3593 -> 3848 bytes
-rw-r--r--translations/cmst_en_US.ts1803
-rw-r--r--translations/cmst_es_CO.ts1795
-rw-r--r--translations/cmst_es_ES.qmbin23 -> 198806 bytes
-rw-r--r--translations/cmst_es_ES.ts1483
-rw-r--r--translations/cmst_fr_FR.ts1797
-rw-r--r--translations/cmst_it_IT.ts1795
-rw-r--r--translations/cmst_nl_NL.qmbin0 -> 180490 bytes
-rw-r--r--translations/cmst_nl_NL.ts4120
-rw-r--r--translations/cmst_pl_PL.ts1795
-rw-r--r--translations/cmst_ru_RU.qmbin133459 -> 123997 bytes
-rw-r--r--translations/cmst_ru_RU.ts1828
-rw-r--r--translations/cmst_tr_TR.qmbin0 -> 203050 bytes
-rw-r--r--translations/cmst_tr_TR.ts4558
-rw-r--r--translations/cmst_zh_CN.qmbin89494 -> 84313 bytes
-rw-r--r--translations/cmst_zh_CN.ts1826
64 files changed, 21677 insertions, 7825 deletions
diff --git a/README.md b/README.md
index 540060e..0379f53 100644
--- a/README.md
+++ b/README.md
@@ -15,11 +15,11 @@ The [Wiki](https://github.com/andrew-bibb/cmst/wiki) has been started and announ
[Screen shots:](https://github.com/andrew-bibb/cmst/wiki/Screenshots) are now included in the Wiki
-There is a PKGBUILD for this project in the Arch Linux AUR.
+On Arch Linux CMST has been moved from the AUR and is now part of the community repository.
The Provisioning Editor and VPN Provisioning Editor both register a root helper to assist in editing files in directories owned by root (/var/lib/connman and /var/lib/connman-vpn). In order to use the root helper you must be a member of the proper group, and this group varies by distribution. To get the proper file for your distribution you need to provide it on the qmake line. Currently there are files for Arch Linux, Slackware, and Debian. If you are on Arch you don't actually need to supply the distro as that is the default if one is not supplied, but it is not wrong to do so.
-If you are not on Arch or don't choose to use the AUR download the release and extract the files. Then run:
+If you are not on Arch download the release and extract the files. Then run:
qmake DISTRO=xxxx
make
diff --git a/apps/cmstapp/cmstapp.pro b/apps/cmstapp/cmstapp.pro
index 96b3de2..f10de04 100644
--- a/apps/cmstapp/cmstapp.pro
+++ b/apps/cmstapp/cmstapp.pro
@@ -42,6 +42,7 @@ HEADERS += ./code/vpn_agent/vpnagent_dialog.h
HEADERS += ./code/vpn_agent/vpnagent_adaptor.h
HEADERS += ./code/vpn_agent/vpnagent_interface.h
HEADERS += ./code/shared/shared.h
+HEADERS += ./code/gen_conf_ed/gen_conf_ed.h
# forms
FORMS += ./code/control_box/ui/controlbox.ui
@@ -70,6 +71,7 @@ SOURCES += ./code/vpn_agent/vpnagent_dialog.cpp
SOURCES += ./code/vpn_agent/vpnagent_adaptor.cpp
SOURCES += ./code/vpn_agent/vpnagent_interface.cpp
SOURCES += ./code/shared/shared.cpp
+SOURCES += ./code/gen_conf_ed/gen_conf_ed.cpp
# resource files
RESOURCES += ../../cmst.qrc
diff --git a/apps/cmstapp/code/agent/agent.cpp b/apps/cmstapp/code/agent/agent.cpp
index 0742333..9de07c3 100644
--- a/apps/cmstapp/code/agent/agent.cpp
+++ b/apps/cmstapp/code/agent/agent.cpp
@@ -4,7 +4,7 @@
Code for the user agent registered on DBus. When the connman daemon
needs to communicate with the user it does so through this agent.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -34,32 +34,32 @@ DEALINGS IN THE SOFTWARE.
# include <QFile>
# include <QTextStream>
-# include "./agent.h"
-# include "../resource.h"
+# include "./agent.h"
+# include "../resource.h"
# include "./code/trstring/tr_strings.h"
-// header files generated by qmake from the xml file created by qdbuscpp2xml
+// header files generated by qmake from the xml file created by qdbuscpp2xml
# include "agent_adaptor.h"
# include "agent_interface.h"
-// defines
+// defines
# define ERROR_RETRY "net.connman.Agent.Error.Retry"
# define ERROR_CANCELED "net.connman.Agent.Error.Canceled"
# define ERROR_LAUNCHBROWSER "net.connman.Agent.Error.LaunchBrowser"
-// constructor
+// constructor
ConnmanAgent::ConnmanAgent(QObject* parent)
: QObject(parent)
-{
- // members
- uiDialog = new AgentDialog(qobject_cast<QWidget *> (this) );
- input_map.clear();
- b_loginputrequest = false;
-
- // Create Adaptor and register this Agent on the system bus.
- new AgentAdaptor(this);
- QDBusConnection::systemBus().registerObject(AGENT_OBJECT, this);
-
+{
+ // members
+ uiDialog = new AgentDialog(qobject_cast<QWidget *> (this) );
+ input_map.clear();
+ b_loginputrequest = false;
+
+ // Create Adaptor and register this Agent on the system bus.
+ new AgentAdaptor(this);
+ QDBusConnection::systemBus().registerObject(AGENT_OBJECT, this);
+
}
/////////////////////////////////////// PUBLIC Q_SLOTS////////////////////////////////
@@ -68,24 +68,24 @@ ConnmanAgent::ConnmanAgent(QObject* parent)
// tasks so don't need much here
void ConnmanAgent::Release()
{
- //qDebug() << "Agent Released";
-
- return;
+ //qDebug() << "Agent Released";
+
+ return;
}
// Called when an error has to be reported to the user. Show the
// error in a QMessageBox
void ConnmanAgent::ReportError(QDBusObjectPath path, QString s_error)
{
- (void) path;
-
- if ( QMessageBox::warning(qobject_cast<QWidget *> (parent()), tr("Connman Error"),
- tr("Connman returned the following error:<b><center>%1</b><br>Would you like to retry?").arg(TranslateStrings::cmtr(s_error)),
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::No
- ) == QMessageBox::Yes) this->sendErrorReply(ERROR_RETRY, "Going to retry the request");
-
- else return;
+ (void) path;
+
+ if ( QMessageBox::warning(qobject_cast<QWidget *> (parent()), tr("Connman Error"),
+ tr("Connman returned the following error:<b><center>%1</b><br>Would you like to retry?").arg(TranslateStrings::cmtr(s_error)),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::No
+ ) == QMessageBox::Yes) this->sendErrorReply(ERROR_RETRY, "Going to retry the request");
+
+ else return;
}
//
@@ -93,12 +93,12 @@ void ConnmanAgent::ReportError(QDBusObjectPath path, QString s_error)
// with login handling
void ConnmanAgent::RequestBrowser(QDBusObjectPath path, QString url)
{
- (void) path;
-
- // Send the url to the dialog to have the user the necessary information, return if canceled.
- if (this->uiDialog->showPage1(url) == QDialog::Rejected) this->sendErrorReply(ERROR_CANCELED,"User cancelled the dialog");
-
- return;
+ (void) path;
+
+ // Send the url to the dialog to have the user the necessary information, return if canceled.
+ if (this->uiDialog->showPage1(url) == QDialog::Rejected) this->sendErrorReply(ERROR_CANCELED,"User cancelled the dialog");
+
+ return;
}
//
@@ -106,21 +106,21 @@ void ConnmanAgent::RequestBrowser(QDBusObjectPath path, QString url)
// A dialog is displayed with the required fields enabled (non-required fields are disabled).
QVariantMap ConnmanAgent::RequestInput(QDBusObjectPath path, QMap<QString,QVariant> dict)
{
- (void) path;
-
- // Take the dict returned by DBus and extract the information we are interested in and place in input_map.
- this->createInputMap(dict);
-
- // Send our input_map to the dialog to have the user supply the necessary information
- // needed to continue. Return if canceled.
- QMap<QString,QVariant> rtn;
- rtn.clear();
- if (this->uiDialog->showPage0(input_map) == QDialog::Rejected)
- this->sendErrorReply(ERROR_CANCELED,"User cancelled the dialog");
- else
- uiDialog->createDict(rtn); // create a return dict and send it back to connman on DBus
-
- return rtn;
+ (void) path;
+
+ // Take the dict returned by DBus and extract the information we are interested in and place in input_map.
+ this->createInputMap(dict);
+
+ // Send our input_map to the dialog to have the user supply the necessary information
+ // needed to continue. Return if canceled.
+ QMap<QString,QVariant> rtn;
+ rtn.clear();
+ if (this->uiDialog->showPage0(input_map) == QDialog::Rejected)
+ this->sendErrorReply(ERROR_CANCELED,"User cancelled the dialog");
+ else
+ uiDialog->createDict(rtn); // create a return dict and send it back to connman on DBus
+
+ return rtn;
}
//
@@ -128,80 +128,80 @@ QVariantMap ConnmanAgent::RequestInput(QDBusObjectPath path, QMap<QString,QVaria
// a QMessageBox
void ConnmanAgent::Cancel()
{
- QMessageBox::information(qobject_cast<QWidget *> (parent()), tr("Agent Request Failed"),
- tr("The agent request failed before a reply was returned.") );
-
- return;
+ QMessageBox::information(qobject_cast<QWidget *> (parent()), tr("Agent Request Failed"),
+ tr("The agent request failed before a reply was returned.") );
+
+ return;
}
/////////////////////////////////////// PUBLIC FUNCTIONS ////////////////////////////////
//
-// Function to put all of input fields received via DBus:RequestInput into a
-// QMap<QString,QString> where key is the input field received and value is
-// generally blank but can be used for informational text.
+// Function to put all of input fields received via DBus:RequestInput into a
+// QMap<QString,QString> where key is the input field received and value is
+// generally blank but can be used for informational text.
//
-// If we asked to log the input request create the log file in /tmp/cmst/input_request.log
+// If we asked to log the input request create the log file in /tmp/cmst/input_request.log
void ConnmanAgent::createInputMap(const QMap<QString,QVariant>& r_map)
{
- // Initialize our data map
- input_map.clear();
-
- // QFile object for logging
- QTextStream log;
- QDir d(IPT_REQ_LOG_PATH);
- QFile logfile(d.absoluteFilePath(IPT_REQ_LOG_FILE));
- if (b_loginputrequest) {
- if (!logfile.open(QIODevice::WriteOnly | QIODevice::Text)) b_loginputrequest = false;
- else log.setDevice(&logfile);
- }
+ // Initialize our data map
+ input_map.clear();
+
+ // QFile object for logging
+ QTextStream log;
+ QDir d(IPT_REQ_LOG_PATH);
+ QFile logfile(d.absoluteFilePath(IPT_REQ_LOG_FILE));
+ if (b_loginputrequest) {
+ if (!logfile.open(QIODevice::WriteOnly | QIODevice::Text)) b_loginputrequest = false;
+ else log.setDevice(&logfile);
+ }
- // Run through the r_map getting the keys and the few values we are interested in.
- QMap<QString, QVariant>::const_iterator i = r_map.constBegin();
- while (i != r_map.constEnd()) {
-
+ // Run through the r_map getting the keys and the few values we are interested in.
+ QMap<QString, QVariant>::const_iterator i = r_map.constBegin();
+ while (i != r_map.constEnd()) {
+
// Lets see what the values contain, but first make sure we can get to them.
if (b_loginputrequest) log << "Agent: " << "Map Key = " << i.key() << "\n";
if (! i.value().canConvert<QDBusArgument>() ) return;
const QDBusArgument qdba = i.value().value<QDBusArgument>();
- if (qdba.currentType() != QDBusArgument::MapType ) {
- if (b_loginputrequest) log << "Agent: " << "Error - QDBusArgument as the value is not a MapType\n";
- return;
- }
+ if (qdba.currentType() != QDBusArgument::MapType ) {
+ if (b_loginputrequest) log << "Agent: " << "Error - QDBusArgument as the value is not a MapType\n";
+ return;
+ }
// The r_map.value() is a QDBusArgument::MapType so extract this map into a new QMap called m.
qdba.beginMap();
QMap<QString,QString> m;
- m.clear();
- if (b_loginputrequest) log << "Agent: " << "Extracting the DBusArgument Map...\n";
- while ( ! qdba.atEnd() ) {
- QString k;
- QVariant v;
- qdba.beginMapEntry();
- qdba >> k >> v;
- qdba.endMapEntry();
- m.insert(k, v.toString());
- if (b_loginputrequest) log << "{ " << k << " , " << v.toString() << "}\n";
- } // while
- qdba.endMap();
-
- // Browse through QMap m and get things we need to look at
- // Types we don' really care about. We ignore "optional" and "alternate" requirements
+ m.clear();
+ if (b_loginputrequest) log << "Agent: " << "Extracting the DBusArgument Map...\n";
+ while ( ! qdba.atEnd() ) {
+ QString k;
+ QVariant v;
+ qdba.beginMapEntry();
+ qdba >> k >> v;
+ qdba.endMapEntry();
+ m.insert(k, v.toString());
+ if (b_loginputrequest) log << "{ " << k << " , " << v.toString() << "}\n";
+ } // while
+ qdba.endMap();
+
+ // Browse through QMap m and get things we need to look at
+ // Types we don' really care about. We ignore "optional" and "alternate" requirements
// and only extract the "mandatory" and "informational" requirements with values
- if (m.contains("Requirement") ) {
- QString val = QString();
- if ( m.value("Requirement").contains("mandatory", Qt::CaseInsensitive) || m.value("Requirement").contains("informational", Qt::CaseInsensitive) ) {
- if (m.contains("Value") ) val = m.value("Value");
- } // if mandatory or informational
- // create our input_map entry
- input_map[i.key()] = val;
- } // if requirement
+ if (m.contains("Requirement") ) {
+ QString val = QString();
+ if ( m.value("Requirement").contains("mandatory", Qt::CaseInsensitive) || m.value("Requirement").contains("informational", Qt::CaseInsensitive) ) {
+ if (m.contains("Value") ) val = m.value("Value");
+ } // if mandatory or informational
+ // create our input_map entry
+ input_map[i.key()] = val;
+ } // if requirement
++i;
- } // while
-
- logfile.close();
- return;
+ } // while
+
+ logfile.close();
+ return;
}
diff --git a/apps/cmstapp/code/agent/agent.h b/apps/cmstapp/code/agent/agent.h
index 386856c..6c4f8cd 100644
--- a/apps/cmstapp/code/agent/agent.h
+++ b/apps/cmstapp/code/agent/agent.h
@@ -3,7 +3,7 @@
Code for the user agent registered on DBus. When the connman daemon
needs to communicate with the user it does so through this agent.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -28,7 +28,7 @@ DEALINGS IN THE SOFTWARE.
# ifndef CONNMANAGENT
-# define CONNMANAGENT
+# define CONNMANAGENT
# include <QObject>
# include <QString>
@@ -51,9 +51,9 @@ class ConnmanAgent : public QObject, protected QDBusContext
public:
- ConnmanAgent(QObject*);
-
- inline void setLogInputRequest(bool b) {b_loginputrequest = b;}
+ ConnmanAgent(QObject*);
+
+ inline void setLogInputRequest(bool b) {b_loginputrequest = b;}
public Q_SLOTS:
void Release();
@@ -63,14 +63,14 @@ class ConnmanAgent : public QObject, protected QDBusContext
void Cancel();
private:
- AgentDialog* uiDialog;
- QMap<QString,QString> input_map;
- bool b_loginputrequest;
-
- void createInputMap(const QMap<QString,QVariant>&);
-
- public:
- inline void setWhatsThisIcon(QIcon icon) {uiDialog->setWhatsThisIcon(icon);}
+ AgentDialog* uiDialog;
+ QMap<QString,QString> input_map;
+ bool b_loginputrequest;
+
+ void createInputMap(const QMap<QString,QVariant>&);
+
+ public:
+ inline void setWhatsThisIcon(QIcon icon) {uiDialog->setWhatsThisIcon(icon);}
};
#endif
diff --git a/apps/cmstapp/code/agent/agent_dialog.cpp b/apps/cmstapp/code/agent/agent_dialog.cpp
index b477c9b..930d60f 100644
--- a/apps/cmstapp/code/agent/agent_dialog.cpp
+++ b/apps/cmstapp/code/agent/agent_dialog.cpp
@@ -5,7 +5,7 @@ needs to communicate with the user it does so through the agent. The
agent has a QDialog as a class member, and agent_dialog.cpp manages
that dialog.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/agent/agent_dialog.h b/apps/cmstapp/code/agent/agent_dialog.h
index b58e0f0..7e95bdd 100644
--- a/apps/cmstapp/code/agent/agent_dialog.h
+++ b/apps/cmstapp/code/agent/agent_dialog.h
@@ -5,7 +5,7 @@ needs to communicate with the user it does so through the agent. The
agent has a QDialog as a class member, and agent_dialog.cpp manages
that dialog.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/control_box/controlbox.cpp b/apps/cmstapp/code/control_box/controlbox.cpp
index 0543880..94c5f56 100755
--- a/apps/cmstapp/code/control_box/controlbox.cpp
+++ b/apps/cmstapp/code/control_box/controlbox.cpp
@@ -3,7 +3,7 @@
Code to manage the primary user interface to include the QDialog the
user interfaces with and the system tray icon.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -60,6 +60,7 @@ DEALINGS IN THE SOFTWARE.
# include <QImage>
# include <QDesktopWidget>
# include <QInputDialog>
+# include <QDateTime>
# include "../resource.h"
# include "./controlbox.h"
@@ -85,7 +86,7 @@ DEALINGS IN THE SOFTWARE.
// This is really a single use button, after it is clicked all idButtons
// are deleted and recreated. Once is is clicked disable the button.
idButton::idButton(QWidget* parent, const QDBusObjectPath& id) :
- QFrame(parent)
+ QFrame(parent)
{
// margins
const int m_left = 5;
@@ -105,7 +106,7 @@ idButton::idButton(QWidget* parent, const QDBusObjectPath& id) :
QHBoxLayout* layout = new QHBoxLayout(this);
layout->setContentsMargins(m_left, m_top, m_right, m_bottom);
layout->setAlignment(Qt::AlignCenter);
- layout->addWidget(button, 0, 0);
+ layout->addWidget(button, 0);
return;
}
@@ -151,23 +152,27 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
vpn_submenu = new QMenu(tr("VPN Connections"), this);
mvsrv_menu = new QMenu(this);
settings = new QSettings(ORG, APP, this);
- notifyclient = 0;
+ notifyclient = NULL;
onlineobjectpath.clear();
+ pendingobjectpath.clear();
socketserver = new QLocalServer(this);
socketserver->removeServer(SOCKET_NAME); // remove any files that may have been left after a crash
socketserver->listen(SOCKET_NAME);
trayiconbackground = QColor();
trayicon = new QSystemTrayIcon(this);
-
+ f_connmanversion = 0.0;
+ gened = NULL;
+ proc = NULL;
iconman = new IconManager(this);
+ b_userinitiated = false;
// set a stylesheet on the tab widget - used to hide disabled tabs
- QFile f0(":/stylesheets/stylesheets/tabwidget.qss");
- if (f0.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString qss = QString(f0.readAll());
- f0.close();
- ui.tabWidget->setStyleSheet(qss);
- }
+ QFile f0(":/stylesheets/stylesheets/tabwidget.qss");
+ if (f0.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QString qss = QString(f0.readAll());
+ f0.close();
+ ui.tabWidget->setStyleSheet(qss);
+ }
// set a stylesheet on the offlinemode toolbutton. Until 2017.12 this
// was a label to display a pixmap. It is now a QToolButton, but I want the
@@ -176,16 +181,17 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
// play/pause behavior in a media player. If I advertise this is a button
// I'll get complaints that the pictures are backwards, so hide that fact
// by making it look like a label with the stylesheet.
- QFile f1(":/stylesheets/stylesheets/airplane.qss");
- if (f1.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString qss = QString(f1.readAll());
- f1.close();
- ui.toolButton_offlinemode->setStyleSheet(qss);
- }
-
+ QFile f1(":/stylesheets/stylesheets/airplane.qss");
+ if (f1.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QString qss = QString(f1.readAll());
+ f1.close();
+ ui.toolButton_offlinemode->setStyleSheet(qss);
+ }
+
// Read saved settings which will set the ui controls in the preferences tab.
this->readSettings();
-
+
+
// Set the iconmanager color
iconman->setIconColor(QColor(ui.lineEdit_colorize->text()) );
@@ -210,9 +216,9 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
QSize sz_source = this->sizeHint();
if (sz_source.width() > sz_target.width() || sz_source.height() > sz_target.height() ) {
sz_source.scale(sz_target.width() - 100, sz_target.height() - 100, Qt::KeepAspectRatio); // keep min. 100 pixels around dialog
+ resize(sz_source);
+ move((sz_target.width() - this->width()) / 2, (sz_target.height() - this->height()) / 2); // re-center if needed
}
- resize(sz_source);
- move((sz_target.width() - this->width()) / 2, (sz_target.height() - this->height()) / 2); // re-centre if needed
// set a flag if we sent a commandline option to log the connman inputrequest
agent->setLogInputRequest(parser.isSet("log-input-request"));
@@ -232,10 +238,10 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
else {
if (b_so && ui.checkBox_systemicontheme->isChecked() ) {
if (ui.lineEdit_icontheme->text().isEmpty() ) {
- if (QIcon::themeName().isEmpty() ) QIcon::setThemeName(INTERNAL_THEME);
+ if (QIcon::themeName().isEmpty() ) QIcon::setThemeName(INTERNAL_THEME);
} // if
else
- QIcon::setThemeName(ui.lineEdit_icontheme->text() );
+ QIcon::setThemeName(ui.lineEdit_icontheme->text() );
} // if
else QIcon::setThemeName(INTERNAL_THEME);
} // else
@@ -297,9 +303,9 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
}
counter_period = setval > minval ? setval : minval; // number of seconds for counter updates
- // Hide the minimize button requested
- if (parser.isSet("disable-minimize") ? true : (b_so && ui.checkBox_disableminimized->isChecked()) )
- ui.pushButton_minimize->hide();
+ // Hide the minimize button requested
+ if (parser.isSet("disable-minimize") ? true : (b_so && ui.checkBox_disableminimized->isChecked()) )
+ ui.pushButton_minimize->hide();
// operate on settings not dealt with elsewhere
ui.pushButton_provisioning_editor->setVisible(ui.checkBox_advanced->isChecked() );
@@ -309,15 +315,13 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
// Create the notifyclient.
notifyclient = new NotifyClient(this);
- // Only try to connect to the notifyclient if we actually need it
- if(this->settings->value("enable_daemon_notifications").toBool()) {
- // Make four tries; first immediately, then
- // at 1/2 second, 2 seconds and finally at 8 seconds
- this->connectNotifyClient();
- QTimer::singleShot(500, this, SLOT(connectNotifyClient()));
- QTimer::singleShot(2 * 1000, this, SLOT(connectNotifyClient()));
- QTimer::singleShot(8 * 1000, this, SLOT(connectNotifyClient()));
- }
+ // Try to connect to the notify client. Make four tries; first immediately, then
+ // at 1/2 second, 2 seconds and finally at 8 seconds. This only makes the connection
+ // the decision to use it or not is made in the function
+ this->connectNotifyClient();
+ QTimer::singleShot(500, this, SLOT(connectNotifyClient()));
+ QTimer::singleShot(2 * 1000, this, SLOT(connectNotifyClient()));
+ QTimer::singleShot(8 * 1000, this, SLOT(connectNotifyClient()));
// setup the dbus interface to connman.manager
con_manager = NULL;
@@ -334,45 +338,51 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
shared::processReply(con_manager->call(QDBus::AutoDetect, "RegisterAgent", QVariant::fromValue(QDBusObjectPath(AGENT_OBJECT))) );
// if counters are enabled connect signal to slot and register the counter
- if (parser.isSet("enable-counters") ? true : (b_so && ui.checkBox_enablecounters->isChecked()) ) {
- QList<QVariant> vlist_counter;
- vlist_counter.clear();
- vlist_counter << QVariant::fromValue(QDBusObjectPath(CNTR_OBJECT)) << counter_accuracy << counter_period;
- QDBusMessage reply = con_manager->callWithArgumentList(QDBus::AutoDetect, "RegisterCounter", vlist_counter);
- if (shared::processReply(reply) == QDBusMessage::ReplyMessage)
- connect(counter, SIGNAL(usageUpdated(QDBusObjectPath, QString, QString)), this, SLOT(counterUpdated(QDBusObjectPath, QString, QString)));
- } // enable counters
- else {
- ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.Counters), false);
- }
-
- // connect some dbus signals to our slots
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "PropertyChanged", this, SLOT(dbsPropertyChanged(QString, QDBusVariant)));
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "ServicesChanged", this, SLOT(dbsServicesChanged(QList<QVariant>, QList<QDBusObjectPath>, QDBusMessage)));
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "PeersChanged", this, SLOT(dbsPeersChanged(QList<QVariant>, QList<QDBusObjectPath>, QDBusMessage)));
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "TechnologyAdded", this, SLOT(dbsTechnologyAdded(QDBusObjectPath, QVariantMap)));
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "TechnologyRemoved", this, SLOT(dbsTechnologyRemoved(QDBusObjectPath)));
-
- // clear the counters if selected
- this->clearCounters();
-
- // VPN manager. Disable if commandline or option is set
- if (parser.isSet("disable-vpn") ? true : (b_so && ui.checkBox_disablevpn->isChecked()) ) {
- ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.VPN), false);
- ui.pushButton_vpn_editor->setDisabled(true);
- } // if parser set
- else {
- vpn_manager = new QDBusInterface(DBUS_VPN_SERVICE, DBUS_PATH, DBUS_VPN_MANAGER, QDBusConnection::systemBus(), this);
- if (! vpn_manager->isValid() ) {
- ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.VPN), false);
- ui.pushButton_vpn_editor->setDisabled(true);
- logErrors(CMST::Err_Invalid_VPN_Iface);
- }
- else {
- ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.VPN), true);
- ui.pushButton_vpn_editor->setEnabled(true);
- shared::processReply(vpn_manager->call(QDBus::AutoDetect, "RegisterAgent", QVariant::fromValue(QDBusObjectPath(VPN_AGENT_OBJECT))) );
- } // else register agent
+ if (parser.isSet("enable-counters") ? true : (b_so && ui.checkBox_enablecounters->isChecked()) ) {
+ QList<QVariant> vlist_counter;
+ vlist_counter.clear();
+ vlist_counter << QVariant::fromValue(QDBusObjectPath(CNTR_OBJECT)) << counter_accuracy << counter_period;
+ QDBusMessage reply = con_manager->callWithArgumentList(QDBus::AutoDetect, "RegisterCounter", vlist_counter);
+ if (shared::processReply(reply) == QDBusMessage::ReplyMessage)
+ connect(counter, SIGNAL(usageUpdated(QDBusObjectPath, QString, QString)), this, SLOT(counterUpdated(QDBusObjectPath, QString, QString)));
+ } // enable counters
+ else {
+ ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.Counters), false);
+ }
+
+ // connect some dbus signals to our slots
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "PropertyChanged", this, SLOT(dbsPropertyChanged(QString, QDBusVariant)));
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "ServicesChanged", this, SLOT(dbsServicesChanged(QList<QVariant>, QList<QDBusObjectPath>, QDBusMessage)));
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "PeersChanged", this, SLOT(dbsPeersChanged(QList<QVariant>, QList<QDBusObjectPath>, QDBusMessage)));
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "TechnologyAdded", this, SLOT(dbsTechnologyAdded(QDBusObjectPath, QVariantMap)));
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, DBUS_PATH, DBUS_CON_MANAGER, "TechnologyRemoved", this, SLOT(dbsTechnologyRemoved(QDBusObjectPath)));
+
+ // clear the counters if selected
+ this->clearCounters();
+
+ // find the connman version we are running
+ findConnmanVersion();
+
+ // VPN manager. Disable vpn options if commandline or option is set
+ if (parser.isSet("disable-vpn") ? true : (b_so && ui.checkBox_disablevpn->isChecked()) ) {
+ ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.VPN), false);
+ ui.pushButton_vpn_editor->setDisabled(true);
+ ui.checkBox_killswitch->setDisabled(true);
+ } // if parser set
+ else {
+ vpn_manager = new QDBusInterface(DBUS_VPN_SERVICE, DBUS_PATH, DBUS_VPN_MANAGER, QDBusConnection::systemBus(), this);
+ if (! vpn_manager->isValid() ) {
+ ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.VPN), false);
+ ui.pushButton_vpn_editor->setDisabled(true);
+ ui.checkBox_killswitch->setDisabled(true);
+ logErrors(CMST::Err_Invalid_VPN_Iface);
+ }
+ else {
+ ui.tabWidget->setTabEnabled(ui.tabWidget->indexOf(ui.VPN), true);
+ ui.pushButton_vpn_editor->setEnabled(true);
+ ui.checkBox_killswitch->setEnabled(true);
+ shared::processReply(vpn_manager->call(QDBus::AutoDetect, "RegisterAgent", QVariant::fromValue(QDBusObjectPath(VPN_AGENT_OBJECT))) );
+ } // else register agent
} // else normal vpn manager
} // else have valid connection
} // else have connected systemBus
@@ -445,7 +455,7 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
// Tray icon - disable it if we specifiy that option on the commandline or in
// the settings, otherwise set a singleshot timer to create the tray icon.
if (parser.isSet("disable-tray-icon") ? true : (b_so && ui.checkBox_disabletrayicon->isChecked()) ) {
- trayicon = NULL;
+ trayicon = NULL;
ui.checkBox_hideIcon->setDisabled(true);
this->updateDisplayWidgets();
qApp->setQuitOnLastWindowClosed(true); // not running systemtray icon so normal close
@@ -485,23 +495,24 @@ void ControlBox::aboutCMST()
QMessageBox::about(this, tr("About %1").arg(TranslateStrings::cmtr("cmst")),
tr("<center>%1 is a program to interface with the Connman daemon and to provide a system tray control."
"<br><center>Version <b>%2</b>"
- "<center>Release date: %3"
- "<center>Copyright c %4<center>by"
- "<center>Andrew J. Bibb"
- "<center>Vermont, USA"
- "<br><center><b>Translations:</b>"
- "<center>Jianfeng Zhang (Chinese)"
- "<center>sqozz (German)"
- "<center>Ilya Shestopalov (Russian)"
- "<br><center><b>Build Information:</b>"
- "<center>Compiled using QT version %5"
- /*"<center>Built %6 - %7"*/) .arg(TranslateStrings::cmtr("cmst"))
- .arg(VERSION)
- .arg(RELEASE_DATE)
- .arg(COPYRIGHT_DATE)
- .arg(QT_VERSION_STR)
- /*.arg(__DATE__)
- .arg(__TIME__)*/ );
+ "<center>Release date: %3"
+ "<center>Copyright c %4<center>by"
+ "<center>Andrew J. Bibb"
+ "<center>Vermont, USA"
+ "<br><center><b>Translations:</b>"
+ "<center>Jianfeng Zhang (Chinese)"
+ "<center>sqozz (German)"
+ "<center>Ilya Shestopalov (Russian)"
+ "<center>Heimen Stoffels (Dutch)"
+ "<center> Yaşar Çiv (Turkish)"
+ "<br><center><b>Build Information:</b>"
+ "<center>Compiled using QT version %5")
+ .arg(TranslateStrings::cmtr("cmst"))
+ .arg(VERSION)
+ .arg(RELEASE_DATE)
+ .arg(COPYRIGHT_DATE)
+ .arg(QT_VERSION_STR)
+ );
}
//
@@ -509,13 +520,13 @@ void ControlBox::aboutCMST()
void ControlBox::aboutIconSet()
{
QMessageBox::about(this, tr("About AwOken"),
- tr("<center>This program uses the <b>AwOken</b> icon set version 2.5"
- "<br><br>Released under the"
- "<br>Creative Commons"
- "<br>Attribution-Share Alike 3.0"
- "<br>Unported License"
- "<br><a href=\"url\">http://creativecommons.org/licenses/by-sa/3.0/legalcode</a>"
- ) );
+ tr("<center>This program uses the <b>AwOken</b> icon set version 2.5"
+ "<br><br>Released under the"
+ "<br>Creative Commons"
+ "<br>Attribution-Share Alike 3.0"
+ "<br>Unported License"
+ "<br><a href=\"url\">http://creativecommons.org/licenses/by-sa/3.0/legalcode</a>"
+ ) );
}
//
@@ -524,12 +535,12 @@ void ControlBox::aboutOtherArt()
{
QMessageBox::about(this, tr("About Other Artwork"),
tr("<center>This program uses artwork from <b>Freepik</b> obtained from www.flaticon.com:"
- "<br><br>Released under the Flaticon Basic License"
- "<br><a href=\"url\">https://file000.flaticon.com/downloads/license/license.pdf</a>"
- "<br><br><b>Artwork files:</b>"
- "<li>radio.png</li>"
- "<li>basic-plane.png</li>"
- ) );
+ "<br><br>Released under the Flaticon Basic License"
+ "<br><a href=\"url\">https://file000.flaticon.com/downloads/license/license.pdf</a>"
+ "<br><br><b>Artwork files:</b>"
+ "<li>radio.png</li>"
+ "<li>basic-plane.png</li>"
+ ) );
}
//
@@ -569,6 +580,7 @@ void ControlBox::updateDisplayWidgets()
this->assembleTabWireless();
this->assembleTabVPN();
this->assembleTabCounters();
+ this->assembleTabPreferences();
if (trayicon != NULL ) this->assembleTrayIcon();
ui.pushButton_movebefore->setEnabled(false);
@@ -604,6 +616,9 @@ void ControlBox::moveService(QAction* act)
list = ui.tableWidget_services->selectedItems();
if (list.isEmpty() ) return;
+ // set user initiated flag (for vpn kill switch)
+ b_userinitiated = true;
+
// apply the movebefore or moveafter message to the source object
QDBusInterface* iface_serv = new QDBusInterface(DBUS_CON_SERVICE, services_list.at(list.at(0)->row()).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
if (iface_serv->isValid() ) {
@@ -648,21 +663,23 @@ void ControlBox::enableMoveButtons(int row, int col)
// inspect the service, can only move if service is favorite, ready or online
// vpn services can be moved (I was wrong thinking they could not), see https://01.org/jira/browse/CM-620
+ // 2020.05.08 - on further consideration moving vpn services is not a good idea, disable the ability to do so
if (services_list.at(i).objmap.value("Favorite").toBool() &&
+ (services_list.at(i).objmap.value("Type").toString() != "vpn") &&
(services_list.at(i).objmap.value("State").toString() == "online" || services_list.at(i).objmap.value("State").toString() == "ready") ) {
if (i == row) {
- act->setDisabled(true); // can't move onto itself
- b_validsource = true;
+ act->setDisabled(true); // can't move onto itself
+ b_validsource = true;
}
else {
- act->setEnabled(true);
- b_validtarget = true;
+ act->setEnabled(true);
+ b_validtarget = true;
} // else
} // if
else
act->setDisabled(true);
- } // for
+ } // fog
// add a cancel option
mvsrv_menu->addSeparator();
@@ -687,8 +704,8 @@ void ControlBox::counterUpdated(const QDBusObjectPath& qdb_objpath, const QStrin
QMap<QString,QVariant> map;
for (int i =0; i < services_list.size(); ++i) {
if (services_list.at(i).objpath == qdb_objpath) {
- map = services_list.at(i).objmap;
- break;
+ map = services_list.at(i).objmap;
+ break;
} // if
} // for
ui.label_counter_service_name->setText(tr("<b>Service:</b> %1").arg(getNickName(qdb_objpath)) );
@@ -713,8 +730,8 @@ void ControlBox::connectPressed()
{
// Process wifi or vpn depending on who sent the signal
QTableWidget* qtw = NULL;
- if (sender() == ui.pushButton_connect) qtw = ui.tableWidget_wifi;
- else if (sender() == ui.pushButton_vpn_connect) qtw = ui.tableWidget_vpn;
+ if (sender() == ui.pushButton_connect) qtw = ui.tableWidget_wifi;
+ else if (sender() == ui.pushButton_vpn_connect) qtw = ui.tableWidget_vpn;
else return;
// If there is only one row select it
@@ -723,7 +740,7 @@ void ControlBox::connectPressed()
qtw->setRangeSelected(qtwsr, true);
}
- // If no row is selected then return(
+ // If no row is selected then return
QList<QTableWidgetItem*> list;
list.clear();
list = qtw->selectedItems();
@@ -733,18 +750,52 @@ void ControlBox::connectPressed()
return;
}
- // send the connect message to the service. TableWidget only allows single selection so list can only have 0 or 1 elments
- QDBusInterface* iface_serv = NULL;
+ // set the manual flag (for vpn kill switch)
+ b_userinitiated = true;
+
+ //Because of single selection mode list can only have 0 or 1 items in it.
+ if (qtw == ui.tableWidget_wifi) pendingobjectpath = wifi_list.at(list.at(0)->row()).objpath.path();
+ else if (qtw == ui.tableWidget_vpn) pendingobjectpath = vpn_list.at(list.at(0)->row()).objpath.path();
+ else pendingobjectpath.clear();
+
+ // execute external program if specified
+ if (! ui.lineEdit_beforeconnect->text().isEmpty() ) {
+ if (list.at(0)->text() == ui.comboBox_beforeconnectserviceslist->currentText() ) {
+ QString text = ui.lineEdit_beforeconnect->text();
+ text = text.simplified();
+ QStringList args = text.split(' ');
+ QString cmd = args.first();
+ args.removeFirst();
+ if (ui.checkBox_modifyservicefile->isChecked()) {
+ gened = new GEN_Editor(this);
+ gened->editInPlace(ui.comboBox_beforeconnectservicefile->currentText(), cmd, args);
+ connect (gened, SIGNAL(finished(int)), this, SLOT(requestConnection()));
+ } // program does require a root helper
+ else {
+ proc = new QProcess(this);
+ proc->start(cmd, args);
+ connect (proc, SIGNAL(finished(int)), this, SLOT(requestConnection()));
+ } // program does not require root helper
+ } // if selected service matches the one to modify
+ } // if there is a command to execute
- if (qtw == ui.tableWidget_wifi) {
- iface_serv = new QDBusInterface(DBUS_CON_SERVICE, wifi_list.at(list.at(0)->row()).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
- iface_serv->setTimeout(5);
- }
- else if (qtw == ui.tableWidget_vpn) {
- iface_serv = new QDBusInterface(DBUS_CON_SERVICE, vpn_list.at(list.at(0)->row()).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
- }
- else return; // really not needed
+ // else request the connection now
+ else requestConnection();
+
+ return;
+}
+
+//
+// Slot to actually request a connection via DBUS. Called from the connectPressed() slot
+void ControlBox::requestConnection() {
+ // only way here is when a finished() signal fires, delete the object that did it
+ if (proc) delete proc;
+ if (gened) delete gened;
+ // data member
+ QDBusInterface* iface_serv = NULL;
+
+ iface_serv = new QDBusInterface(DBUS_CON_SERVICE, pendingobjectpath, "net.connman.Service", QDBusConnection::systemBus(), this);
iface_serv->setTimeout(5); // need a short timeout to get the Agent
QDBusMessage reply = iface_serv->call(QDBus::AutoDetect, "Connect");
if (reply.errorName() != "org.freedesktop.DBus.Error.NoReply") shared::processReply(reply);
@@ -773,16 +824,16 @@ void ControlBox::disconnectPressed()
QMap<QString,QVariant> map;
if (qtw == ui.tableWidget_wifi) itemcount = wifi_list.size();
else if (qtw == ui.tableWidget_vpn) itemcount = vpn_list.size();
- else return; // line is not really needed
+ else return; // line is not really needed
for (int row = 0; row < itemcount; ++row) {
if (qtw == ui.tableWidget_wifi) map = wifi_list.at(row).objmap;
- else if (qtw == ui.tableWidget_vpn) map = vpn_list.at(row).objmap;
- else return; // line is not really needed
+ else if (qtw == ui.tableWidget_vpn) map = vpn_list.at(row).objmap;
+ else return; // line is not really needed
if (map.value("State").toString() == "online" || map.value("State").toString() == "ready" ) {
- ++cntr_connected;
- row_connected = row;
+ ++cntr_connected;
+ row_connected = row;
}
if (cntr_connected > 1 ) break;
} // for
@@ -807,6 +858,9 @@ void ControlBox::disconnectPressed()
return;
}
+ // set user initiated flag (for vpn kill switch)
+ b_userinitiated = true;
+
// Send the disconnect message to the service. TableWidget only allows single selection so list can only have 0 or 1 elments
QDBusInterface* iface_serv = NULL;
if (qtw == ui.tableWidget_wifi)
@@ -872,40 +926,40 @@ void ControlBox::dbsPropertyChanged(QString prop, QDBusVariant dbvalue)
this->sendNotifications();
} // if contains offlinemode
- // state property
+ // state property
if (prop == "State") {
// local variables
QString state = dbvalue.variant().toString();
-
+
// send notification if state is not ready or online
notifyclient->init();
notifyclient->setSummary(tr("Network Services:") );
if (state == "ready" || state == "online") {
- if (oldstate != "ready" && oldstate != "online") {
- notifyclient->setBody(tr("The system is online.") );
- notifyclient->setIcon(iconman->getIconName("state_online") );
- this->sendNotifications();
- } // if
- } // if
- else {
- notifyclient->setBody(tr("The system is offline.") );
- notifyclient->setIcon(iconman->getIconName("state_not_ready") );
- this->sendNotifications();
- } // else
-
- // execute external program if specified
- if (! ui.lineEdit_afterconnect->text().isEmpty() ) {
- if( (state == "ready" || state == "online") &&
- (oldstate != "ready" && oldstate != "online") ) {
- QString text = ui.lineEdit_afterconnect->text();
- text = text.simplified();
- QStringList args = text.split(' ');
- QString cmd = args.first();
- args.removeFirst();
- QProcess* proc = new QProcess(this);
- proc->startDetached(cmd, args);
- } // if online or ready and not online before
- } // if lineedit not empty
+ if (oldstate != "ready" && oldstate != "online") {
+ notifyclient->setBody(tr("The system is online.") );
+ notifyclient->setIcon(iconman->getIconName("state_online") );
+ this->sendNotifications();
+ } // if
+ } // if
+ else {
+ notifyclient->setBody(tr("The system is offline.") );
+ notifyclient->setIcon(iconman->getIconName("state_not_ready") );
+ this->sendNotifications();
+ } // else
+
+ // execute external program if specified
+ if (! ui.lineEdit_afterconnect->text().isEmpty() ) {
+ if( (state == "ready" || state == "online") &&
+ (oldstate != "ready" && oldstate != "online") ) {
+ QString text = ui.lineEdit_afterconnect->text();
+ text = text.simplified();
+ QStringList args = text.split(' ');
+ QString cmd = args.first();
+ args.removeFirst();
+ QProcess* proc = new QProcess(this);
+ proc->startDetached(cmd, args);
+ } // if online or ready and not online before
+ } // if lineedit not empty
} // if state change
@@ -920,12 +974,16 @@ void ControlBox::dbsPropertyChanged(QString prop, QDBusVariant dbvalue)
// of a service object changes.
void ControlBox::dbsServicesChanged(QList<QVariant> vlist, QList<QDBusObjectPath> removed, QDBusMessage msg)
{
+ // save the current service at the top of the list, used for vpn internet kill switch
+ QMap<QString,QVariant> topmap;
+ if (services_list.size() > 0) topmap = services_list.at(0).objmap;
+
// process removed services
if (! removed.isEmpty() ) {
for (int i = 0; i < services_list.count(); ++i) {
if (removed.contains(services_list.at(i).objpath) ) {
- QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, services_list.at(i).objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
- services_list.removeAt(i);
+ QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, services_list.at(i).objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
+ services_list.removeAt(i);
} // if
} // for
} // if we needed to remove something
@@ -942,28 +1000,28 @@ void ControlBox::dbsServicesChanged(QList<QVariant> vlist, QList<QDBusObjectPath
arrayElement revised_element = revised_list.at(i);
arrayElement original_element = {QDBusObjectPath(), QMap<QString,QVariant>()};
for (int j = 0; j < services_list.size(); ++j) {
- if (revised_element.objpath == services_list.at(j).objpath) {
- original_element = services_list.at(j);
- break;
- } // if
+ if (revised_element.objpath == services_list.at(j).objpath) {
+ original_element = services_list.at(j);
+ break;
+ } // if
} // j for
// merge the new elementArray into the existing
if (! original_element.objpath.path().isEmpty()) {
- QMapIterator<QString, QVariant> itr(revised_element.objmap);
- while (itr.hasNext()) {
- itr.next();
- original_element.objmap.insert(itr.key(), itr.value() );
- } // while
-
- // now insert the element into the revised list
- QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, original_element.objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
- revised_list.replace(i, original_element);
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, revised_element.objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
-
+ QMapIterator<QString, QVariant> itr(revised_element.objmap);
+ while (itr.hasNext()) {
+ itr.next();
+ original_element.objmap.insert(itr.key(), itr.value() );
+ } // while
+
+ // now insert the element into the revised list
+ QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, original_element.objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
+ revised_list.replace(i, original_element);
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, revised_element.objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
} // if original element is not empty
} // i for
+
// now copy the revised list to services_list
services_list.clear();
services_list = revised_list;
@@ -972,6 +1030,29 @@ void ControlBox::dbsServicesChanged(QList<QVariant> vlist, QList<QDBusObjectPath
// clear the counters (if selected) and update the widgets
clearCounters();
+ // see if we need to engage the vpn internet kill switch
+ // could probably animateClick the airplane mode checkbox or just call airplane mode via dBus, but I would prefer to look at each technology
+ // and power each one down.
+ if (ui.checkBox_killswitch->isChecked() && ! b_userinitiated) {
+ if (topmap.value("Type").toString() == "vpn" ) {
+ QMap<QString,QVariant> curtopmap;
+ if (services_list.size() > 0) curtopmap = services_list.at(0).objmap;
+ if (curtopmap.value("Type").toString() != "vpn") {
+ for (int i = 0; i < technologies_list.size(); ++i) {
+ if (technologies_list.at(i).objmap.value("Powered").toBool()) {
+ QDBusInterface iface_tech(DBUS_CON_SERVICE, technologies_list.at(i).objpath.path(), "net.connman.Technology", QDBusConnection::systemBus(), this);
+ shared::processReply(iface_tech.call(QDBus::AutoDetect, "SetProperty", "Powered", QVariant::fromValue(QDBusVariant(false))) );
+ } // if technology is currently powered
+ } // for each technology
+ notifyclient->init();
+ notifyclient->setSummary(tr("VPN Kill Switch Engaged"));
+ notifyclient->setBody(tr("The connection to VPN service %1 was dropped and the VPN kill switch was engaged. All network devices are powered off.").arg(topmap.value("Name").toString()));
+ this->sendNotifications();
+ } // if curtopmap type = vpn
+ } // if topmap type == vpn
+ } // if kill swich
+ b_userinitiated = false;
+
// update the widgets
updateDisplayWidgets();
@@ -1001,23 +1082,23 @@ void ControlBox::dbsPeersChanged(QList<QVariant> vlist, QList<QDBusObjectPath> r
arrayElement revised_element = revised_list.at(i);
arrayElement original_element = {QDBusObjectPath(), QMap<QString,QVariant>()};
for (int j = 0; j < peer_list.size(); ++j) {
- if (revised_element.objpath == peer_list.at(j).objpath) {
- original_element = peer_list.at(j);
- break;
- } // if
+ if (revised_element.objpath == peer_list.at(j).objpath) {
+ original_element = peer_list.at(j);
+ break;
+ } // if
} // j for
// merge the new elementArray into the existing
if (! original_element.objpath.path().isEmpty()) {
- QMapIterator<QString, QVariant> itr(revised_element.objmap);
- while (itr.hasNext()) {
- itr.next();
- b_needupdate = true;
- original_element.objmap.insert(itr.key(), itr.value() );
- } // while
-
- // now insert the element into the revised list
- revised_list.replace(i, original_element);
+ QMapIterator<QString, QVariant> itr(revised_element.objmap);
+ while (itr.hasNext()) {
+ itr.next();
+ b_needupdate = true;
+ original_element.objmap.insert(itr.key(), itr.value() );
+ } // while
+
+ // now insert the element into the revised list
+ revised_list.replace(i, original_element);
} // if original element exists
} // i for
@@ -1030,7 +1111,7 @@ void ControlBox::dbsPeersChanged(QList<QVariant> vlist, QList<QDBusObjectPath> r
if (! removed.isEmpty() ) {
for (int i = 0; i < peer_list.count(); ++i) {
if (removed.contains(peer_list.at(i).objpath) )
- peer_list.removeAt(i);
+ peer_list.removeAt(i);
} // for
} // if we needed to remove something
@@ -1136,30 +1217,30 @@ void ControlBox::dbsServicePropertyChanged(QString property, QDBusVariant dbvalu
else if (s_path == onlineobjectpath) {
onlineobjectpath.clear();
} // else if object went offline
-
+
// Send notification if vpn changed
for (int i = 0; i < vpn_list.count(); ++i) {
if (s_path == vpn_list.at(i).objpath.path() ) {
- notifyclient->init();
- if (value.toString() == "ready") {
- notifyclient->setSummary(QString(tr("VPN Engaged")) );
- notifyclient->setIcon(iconman->getIconName("connection_vpn") );
- }
- else {
- notifyclient->setSummary(QString(tr("VPN Disengaged")) );
- notifyclient->setIcon(iconman->getIconName("connection_not_ready") );
- }
- notifyclient->setBody(QString(tr("Object Path: %1")).arg(s_path) );
- notifyclient->setUrgency(Nc::UrgencyNormal);
- this->sendNotifications();
- break;
+ notifyclient->init();
+ if (value.toString() == "ready") {
+ notifyclient->setSummary(QString(tr("VPN Engaged")) );
+ notifyclient->setIcon(iconman->getIconName("connection_vpn") );
+ }
+ else {
+ notifyclient->setSummary(QString(tr("VPN Disengaged")) );
+ notifyclient->setIcon(iconman->getIconName("connection_not_ready") );
+ }
+ notifyclient->setBody(QString(tr("Object Path: %1")).arg(s_path) );
+ notifyclient->setUrgency(Nc::UrgencyNormal);
+ this->sendNotifications();
+ break;
} // if
} // for
} // if property contains State
-
+
// update the widgets
updateDisplayWidgets();
-
+
return;
}
@@ -1188,7 +1269,7 @@ void ControlBox::dbsTechnologyPropertyChanged(QString name, QDBusVariant dbvalue
// Slot to rescan all WiFi technologies. Called when ui.actionRescan
// is triggered. Action is called from rescanwifi buttons and from
-// the context menu.
+// the context menu.
// Results signaled by manager.ServicesChanged(), except for peer
// services which will be signaled by manager.PeersChanged()
void ControlBox::scanWiFi()
@@ -1200,13 +1281,13 @@ void ControlBox::scanWiFi()
for (int row = 0; row < technologies_list.size(); ++row) {
if (technologies_list.at(row).objmap.value("Type").toString() == "wifi") {
if (technologies_list.at(row).objmap.value("Powered").toBool() ) {
- setStateRescan(false);
- ui.tableWidget_services->setCurrentIndex(QModelIndex()); // first cell becomes selected once pushbutton is disabled
- qApp->processEvents(); // needed to promply disable the button
- QDBusInterface* iface_tech = new QDBusInterface(DBUS_CON_SERVICE, technologies_list.at(row).objpath.path(), "net.connman.Technology", QDBusConnection::systemBus(), this);
- iface_tech->setTimeout( 8 * 1000); // full 25 second timeout is a bit much when there is a problem
- QDBusMessage reply = iface_tech->call(QDBus::AutoDetect, "Scan");
- iface_tech->deleteLater();
+ setStateRescan(false);
+ ui.tableWidget_services->setCurrentIndex(QModelIndex()); // first cell becomes selected once pushbutton is disabled
+ qApp->processEvents(); // needed to promply disable the button
+ QDBusInterface* iface_tech = new QDBusInterface(DBUS_CON_SERVICE, technologies_list.at(row).objpath.path(), "net.connman.Technology", QDBusConnection::systemBus(), this);
+ iface_tech->setTimeout( 8 * 1000); // full 25 second timeout is a bit much when there is a problem
+ QDBusMessage reply = iface_tech->call(QDBus::AutoDetect, "Scan");
+ iface_tech->deleteLater();
} // if the wifi was powered
} // if the list item is wifi
} // for
@@ -1225,34 +1306,35 @@ void ControlBox::wifiIDPass(const QString& obj_path)
// Run through each technology looking for Wifi
for (int row = 0; row < technologies_list.size(); ++row) {
if (technologies_list.at(row).objmap.value("Type").toString() == "wifi") {
- if (technologies_list.at(row).objpath.path() == obj_path || obj_path.isEmpty() ) {
- QDBusInterface* iface_tech = new QDBusInterface(DBUS_CON_SERVICE, technologies_list.at(row).objpath.path(), "net.connman.Technology", QDBusConnection::systemBus(), this);
-
- shared::ValidatingDialog* vd01 = new shared::ValidatingDialog(this);
- vd01->setLabel(tr("<b>Technology: %1</b><p>Please enter the WiFi AP SSID that clients will<br>have to join in order to gain internet connectivity.").arg(technologies_list.at(row).objpath.path()) ),
- vd01->setValidator(CMST::ValDialog_min1ch);
- vd01->setText(technologies_list.at(row).objmap.value("TetheringIdentifier").toString() );
- if (vd01->exec() == QDialog::Accepted) {
- if (vd01->getText() != technologies_list.at(row).objmap.value("TetheringIdentifier").toString()) {
- shared::processReply(iface_tech->call(QDBus::AutoDetect, "SetProperty", "TetheringIdentifier", QVariant::fromValue(QDBusVariant(vd01->getText()))) );
- }
- } // if accepted
- vd01->deleteLater();
-
- if (! technologies_list.at(row).objmap.value("TetheringIdentifier").toString().isEmpty() ) {
- shared::ValidatingDialog* vd02 = new shared::ValidatingDialog(this);
- vd02->setLabel(tr("<b>Technology: %1</b><p>Please enter the WPA pre-shared key clients will<br>have to use in order to establish a connection.<p>PSK length: minimum of 8 characters.").arg(technologies_list.at(row).objpath.path()) );
- vd02->setValidator(CMST::ValDialog_min8ch);
- vd02->setText(technologies_list.at(row).objmap.value("TetheringPassphrase").toString() );
- if (vd02->exec() == QDialog::Accepted)
- if (vd02->getText() != technologies_list.at(row).objmap.value("TetheringPassphrase").toString() )
- shared::processReply(iface_tech->call(QDBus::AutoDetect, "SetProperty", "TetheringPassphrase", QVariant::fromValue(QDBusVariant(vd02->getText()))) );
- vd02->deleteLater();
- } // if
-
- // cleanup
- iface_tech->deleteLater();
- } // if wifi match
+ if (technologies_list.at(row).objpath.path() == obj_path || obj_path.isEmpty() ) {
+ QDBusInterface* iface_tech = new QDBusInterface(DBUS_CON_SERVICE, technologies_list.at(row).objpath.path(), "net.connman.Technology", QDBusConnection::systemBus(), this);
+
+ shared::ValidatingDialog* vd01 = new shared::ValidatingDialog(this);
+ vd01->setLabel(tr("<b>Technology: %1</b><p>Please enter the WiFi AP SSID that clients will<br>have to join in order to gain internet connectivity.").arg(technologies_list.at(row).objpath.path()) ),
+ vd01->setValidator(CMST::ValDialog_min1ch);
+ vd01->setText(technologies_list.at(row).objmap.value("TetheringIdentifier").toString() );
+ if (vd01->exec() == QDialog::Accepted) {
+ if (vd01->getText() != technologies_list.at(row).objmap.value("TetheringIdentifier").toString()) {
+ shared::processReply(iface_tech->call(QDBus::AutoDetect, "SetProperty", "TetheringIdentifier", QVariant::fromValue(QDBusVariant(vd01->getText()))) );
+ }
+ } // if accepted
+ vd01->deleteLater();
+
+ if (! technologies_list.at(row).objmap.value("TetheringIdentifier").toString().isEmpty() ) {
+ shared::ValidatingDialog* vd02 = new shared::ValidatingDialog(this);
+ vd02->setLabel(tr("<b>Technology: %1</b><p>Please enter the WPA pre-shared key clients will<br>have to use in order to establish a connection.<p>PSK length: minimum of 8 characters.").arg(technologies_list.at(row).objpath.path()) );
+ vd02->setValidator(CMST::ValDialog_min8ch);
+ vd02->setText(technologies_list.at(row).objmap.value("TetheringPassphrase").toString() );
+ if (vd02->exec() == QDialog::Accepted)
+ if (vd02->getText() != technologies_list.at(row).objmap.value("TetheringPassphrase").toString() )
+ shared::processReply(iface_tech->call(QDBus::AutoDetect, "SetProperty", "TetheringPassphrase", QVariant::fromValue(QDBusVariant(vd02->getText()))) );
+
+ vd02->deleteLater();
+ } // if
+
+ // cleanup
+ iface_tech->deleteLater();
+ } // if wifi match
} // if tech is wifi
} // for
@@ -1267,8 +1349,8 @@ void ControlBox::toggleOfflineMode(bool checked)
if ( ((q16_errors & CMST::Err_No_DBus) | (q16_errors & CMST::Err_Invalid_Con_Iface)) != 0x00 ) return;
shared::processReply(con_manager->call(QDBus::AutoDetect, "SetProperty", "OfflineMode", QVariant::fromValue(QDBusVariant(checked ? true : false))) );
-
- return;
+
+ return;
}
//
@@ -1298,6 +1380,9 @@ void ControlBox::togglePowered(QString object_id, bool checkstate)
QDBusInterface* iface_tech = new QDBusInterface(DBUS_CON_SERVICE, object_id, "net.connman.Technology", QDBusConnection::systemBus(), this);
shared::processReply(iface_tech->call(QDBus::AutoDetect, "SetProperty", "Powered", QVariant::fromValue(QDBusVariant(checkstate))) );
+ // set user initiated flag (for vpn kill switch)
+ b_userinitiated = true;
+
// cleanup
iface_tech->deleteLater();
return;
@@ -1315,9 +1400,9 @@ void ControlBox::toggleTethered(QString object_id, bool checkstate)
for (int row = 0; row < technologies_list.size(); ++row) {
if (technologies_list.at(row).objpath.path() == object_id) {
if(technologies_list.at(row).objmap.value("Type").toString() == "wifi") {
- QString sid = technologies_list.at(row).objmap.value("TetheringIdentifier").toString();
- QString spw = technologies_list.at(row).objmap.value("TetheringPassphrase").toString();
- if (sid.isEmpty() || spw.isEmpty() ) wifiIDPass(object_id);
+ QString sid = technologies_list.at(row).objmap.value("TetheringIdentifier").toString();
+ QString spw = technologies_list.at(row).objmap.value("TetheringPassphrase").toString();
+ if (sid.isEmpty() || spw.isEmpty() ) wifiIDPass(object_id);
} // if technology is wifi
} // if object_id
} // for
@@ -1406,12 +1491,12 @@ void ControlBox::wifiSubmenuTriggered(QAction* act)
QDBusInterface* iface_serv = new QDBusInterface(DBUS_CON_SERVICE, wifi_list.at(i).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
QString state = wifi_list.at(i).objmap.value("State").toString();
if (state == "online" || state == "ready") {
- shared::processReply(iface_serv->call(QDBus::AutoDetect, "Disconnect") );
+ shared::processReply(iface_serv->call(QDBus::AutoDetect, "Disconnect") );
}
else {
- iface_serv->setTimeout(5);
- QDBusMessage reply = iface_serv->call(QDBus::AutoDetect, "Connect");
- if (reply.errorName() != "org.freedesktop.DBus.Error.NoReply") shared::processReply(reply);
+ iface_serv->setTimeout(5);
+ QDBusMessage reply = iface_serv->call(QDBus::AutoDetect, "Connect");
+ if (reply.errorName() != "org.freedesktop.DBus.Error.NoReply") shared::processReply(reply);
}
iface_serv->deleteLater();
break;
@@ -1435,10 +1520,10 @@ void ControlBox::vpnSubmenuTriggered(QAction* act)
QString state = vpn_list.at(i).objmap.value("State").toString();
QDBusMessage reply;
if (state == "ready")
- reply = iface_serv->call(QDBus::AutoDetect, "Disconnect");
+ reply = iface_serv->call(QDBus::AutoDetect, "Disconnect");
else
- reply = iface_serv->call(QDBus::AutoDetect, "Connect" );
-
+ reply = iface_serv->call(QDBus::AutoDetect, "Connect" );
+
if (reply.errorName() != "org.freedesktop.DBus.Error.NoReply") shared::processReply(reply);
iface_serv->deleteLater();
break;
@@ -1511,6 +1596,29 @@ void ControlBox::getServiceDetails(int index)
rs.append(tr("Excludes:<br>&nbsp;&nbsp;%1<br>").arg(submap.value("Excludes").toStringList().join("<br>&nbsp;&nbsp;")) );
}
+ // mDNS was added in connman 1.38
+ if (f_connmanversion > 1.37f) {
+ rs.append(tr("<br><b>mDNS</b><br>"));
+ rs.append(tr("Support Enabled: %1<br>").arg(map.value("mDNS").toBool() ? tr("Yes", "mdns") : tr("No", "mdns")) );
+ } // connman version
+
+ // LastAddressConflict was added in connman 1.38
+ if (this->f_connmanversion > 1.37f) {
+ shared::extractMapData(submap, services_list.at(index).objmap.value("LastAddressConflict") );
+ if (submap.value("Timestamp").toLongLong() > 0.0) {
+ // a map for the maps embedded in submap (IPv4 and Ethernet)
+ QMap<QString,QVariant> subsubmap;
+ rs.append(tr("<br><b>Last Address Conflict</b><br>"));
+ shared::extractMapData(subsubmap, submap.value("IPv4") );
+ rs.append(tr("IP Address: %1<br>").arg(subsubmap.value("Address").toString()) );
+ shared::extractMapData(subsubmap, submap.value("Ethernet") );
+ rs.append(tr("MAC Address: %1<br>").arg(submap.value("Address").toString()) );
+ rs.append(tr("Conflict detected on: %1<br>").arg(QDateTime::fromMSecsSinceEpoch(submap.value("Timestamp").toLongLong() / 1000.0, Qt::LocalTime).toString()) );
+ rs.append(tr("Resolved: %1<br>").arg(submap.value("Resolved").toBool() ? tr("Yes", "last_address_conflict") : tr("No", "last_address_conflict")) );
+ } // if there has never been a confict
+ } // connman version
+
+
// write the text to the left display label
ui.label_details_left->setText(rs);
@@ -1549,10 +1657,10 @@ void ControlBox::getServiceDetails(int index)
// write the text to the right display label
ui.label_details_right->setText(rs);
-
+
// enable or disable the editor button
ui.pushButton_configuration->setEnabled(b_editable);
-
+
return;
}
@@ -1594,7 +1702,7 @@ void ControlBox::keyPressEvent(QKeyEvent* e)
this->hide();
return;
}
- QDialog::keyPressEvent(e);
+ QDialog::keyPressEvent(e);
}
//
@@ -1634,27 +1742,27 @@ int ControlBox::managerRescan(const int& srv)
// Access connman.manager to retrieve the data
if (srv & CMST::Manager_Technologies) {
if (! getTechnologies() ) {
- logErrors(CMST::Err_Technologies);
+ logErrors(CMST::Err_Technologies);
} // if
else {
- // connect technology signals to slots
- for (int i = 0; i < technologies_list.size(); ++i) {
- QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, technologies_list.at(i).objpath.path(), "net.connman.Technology", "PropertyChanged", this, SLOT(dbsTechnologyPropertyChanged(QString, QDBusVariant, QDBusMessage)));
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, technologies_list.at(i).objpath.path(), "net.connman.Technology", "PropertyChanged", this, SLOT(dbsTechnologyPropertyChanged(QString, QDBusVariant, QDBusMessage)));
- } // for
+ // connect technology signals to slots
+ for (int i = 0; i < technologies_list.size(); ++i) {
+ QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, technologies_list.at(i).objpath.path(), "net.connman.Technology", "PropertyChanged", this, SLOT(dbsTechnologyPropertyChanged(QString, QDBusVariant, QDBusMessage)));
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, technologies_list.at(i).objpath.path(), "net.connman.Technology", "PropertyChanged", this, SLOT(dbsTechnologyPropertyChanged(QString, QDBusVariant, QDBusMessage)));
+ } // for
} //else
} // if technolgies
if (srv & CMST::Manager_Services) {
if (! getServices() ) {
- logErrors(CMST::Err_Services);
+ logErrors(CMST::Err_Services);
} // if
- // connect service signals to slots
else {
- for (int i = 0; i < services_list.size(); ++i) {
- QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, services_list.at(i).objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
- QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, services_list.at(i).objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
- } // for
+ // connect service signals to slots
+ for (int i = 0; i < services_list.size(); ++i) {
+ QDBusConnection::systemBus().disconnect(DBUS_CON_SERVICE, services_list.at(i).objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
+ QDBusConnection::systemBus().connect(DBUS_CON_SERVICE, services_list.at(i).objpath.path(), "net.connman.Service", "PropertyChanged", this, SLOT(dbsServicePropertyChanged(QString, QDBusVariant, QDBusMessage)));
+ } // for
} // else
} // if services
@@ -1679,10 +1787,10 @@ void ControlBox::assembleTabStatus()
} // if online
else {
if (s1 == "ready") {
- ui.label_state_pix->setPixmap(iconman->getIcon("state_ready").pixmap(QSize(16,16)) );
- } // if ready
+ ui.label_state_pix->setPixmap(iconman->getIcon("state_ready").pixmap(QSize(16,16)) );
+ } // if ready
else {
- ui.label_state_pix->setPixmap(iconman->getIcon("state_not_ready").pixmap(QSize(16,16)) );
+ ui.label_state_pix->setPixmap(iconman->getIcon("state_not_ready").pixmap(QSize(16,16)) );
} // else any other state
} // else ready or any other state
s1 = TranslateStrings::cmtr(s1);
@@ -1741,14 +1849,14 @@ void ControlBox::assembleTabStatus()
idButton* qpb02 = new idButton(this, technologies_list.at(row).objpath);
connect (qpb02, SIGNAL(clickedID(QString, bool)), this, SLOT(togglePowered(QString, bool)));
if (technologies_list.at(row).objmap.value("Powered").toBool()) {
- qpb02->setText(tr("On", "powered") );
- qpb02->setIcon(QPixmap(":/icons/images/interface/golfball_green.png"));
- qpb02->setChecked(true);
+ qpb02->setText(tr("On", "powered") );
+ qpb02->setIcon(QPixmap(":/icons/images/interface/golfball_green.png"));
+ qpb02->setChecked(true);
}
else {
- qpb02->setText(tr("Off", "powered") );
- qpb02->setIcon(QPixmap(":/icons/images/interface/golfball_red.png"));
- qpb02->setChecked(false);
+ qpb02->setText(tr("Off", "powered") );
+ qpb02->setIcon(QPixmap(":/icons/images/interface/golfball_red.png"));
+ qpb02->setChecked(false);
}
ui.tableWidget_technologies->setCellWidget(row, 2, qpb02);
@@ -1761,18 +1869,18 @@ void ControlBox::assembleTabStatus()
idButton* qpb04 = new idButton(this, technologies_list.at(row).objpath);
connect (qpb04, SIGNAL(clickedID(QString, bool)), this, SLOT(toggleTethered(QString, bool)));
if (technologies_list.at(row).objmap.value("Tethering").toBool()) {
- qpb04->setText(tr("On", "tethering") );
- qpb04->setIcon(QPixmap(":/icons/images/interface/golfball_green.png"));
- qpb04->setChecked(true);
+ qpb04->setText(tr("On", "tethering") );
+ qpb04->setIcon(QPixmap(":/icons/images/interface/golfball_green.png"));
+ qpb04->setChecked(true);
}
else {
- qpb04->setText(tr("Off", "tethering") );
- qpb04->setIcon(QPixmap(":/icons/images/interface/golfball_red.png"));
- qpb04->setChecked(false);
- if (technologies_list.at(row).objmap.value("Type").toString() == "ethernet")
- qpb04->setDisabled(true);
- else
- qpb04->setEnabled(technologies_list.at(row).objmap.value("Powered").toBool() );
+ qpb04->setText(tr("Off", "tethering") );
+ qpb04->setIcon(QPixmap(":/icons/images/interface/golfball_red.png"));
+ qpb04->setChecked(false);
+ if (technologies_list.at(row).objmap.value("Type").toString() == "ethernet")
+ qpb04->setDisabled(true);
+ else
+ qpb04->setEnabled(technologies_list.at(row).objmap.value("Powered").toBool() );
}
ui.tableWidget_technologies->setCellWidget(row, 4, qpb04);
@@ -1850,14 +1958,14 @@ void ControlBox::assembleTabStatus()
// by the getServiceDetails() slot whenever the comboBox index changes.
void ControlBox::assembleTabDetails()
{
- // variables
- int newidx = 0;
- QString cursvc = QString();
-
- // if the combobox has any items in it save the nick name of the service we are viewing
- if (ui.comboBox_service->count() > 0)
- cursvc = ui.comboBox_service->currentText();
-
+ // variables
+ int newidx = 0;
+ QString cursvc = QString();
+
+ // if the combobox has any items in it save the nick name of the service we are viewing
+ if (ui.comboBox_service->count() > 0)
+ cursvc = ui.comboBox_service->currentText();
+
// initilize the page2 display widgets
ui.comboBox_service->clear();
ui.label_details_left->clear();
@@ -1870,12 +1978,11 @@ void ControlBox::assembleTabDetails()
QString ss = getNickName(services_list.at(row).objpath);
ui.comboBox_service->addItem(TranslateStrings::cmtr(ss) );
if (TranslateStrings::cmtr(ss) == cursvc)
- newidx = row;
+ newidx = row;
} // services for loop
ui.comboBox_service->setCurrentIndex(newidx);
} // services if no error
-
return;
}
@@ -1897,8 +2004,8 @@ void ControlBox::assembleTabWireless()
int i_wifipowered = 0;
for (int row = 0; row < technologies_list.size(); ++row) {
if (technologies_list.at(row).objmap.value("Type").toString() == "wifi" ) {
- ++i_wifidevices;
- if (technologies_list.at(row).objmap.value("Powered").toBool() ) ++i_wifipowered;
+ ++i_wifidevices;
+ if (technologies_list.at(row).objmap.value("Powered").toBool() ) ++i_wifipowered;
} // if census
} // for loop
ui.label_wifi_state->setText(tr(" WiFi Technologies:<br> %1 Found, %2 Powered").arg(i_wifidevices).arg(i_wifipowered) );
@@ -1920,22 +2027,22 @@ void ControlBox::assembleTabWireless()
QLabel* ql01 = new QLabel(ui.tableWidget_wifi);
if (map.value("Favorite").toBool() ) {
- ql01->setPixmap(iconman->getIcon("favorite").pixmap(QSize(16,16)) );
+ ql01->setPixmap(iconman->getIcon("favorite").pixmap(QSize(16,16)) );
}
ql01->setAlignment(Qt::AlignCenter);
ui.tableWidget_wifi->setCellWidget(rowcount, 1, ql01);
QLabel* ql02 = new QLabel(ui.tableWidget_wifi);
if (map.value("State").toString() == "online") {
- ql02->setPixmap(iconman->getIcon("state_online").pixmap(QSize(16,16)) );
+ ql02->setPixmap(iconman->getIcon("state_online").pixmap(QSize(16,16)) );
} // if online
else {
- if (map.value("State").toString() == "ready") {
- ql02->setPixmap(iconman->getIcon("state_ready").pixmap(QSize(16,16)) );
- } // if ready
- else {
- ql02->setPixmap(iconman->getIcon("wifi_tab_state_not_ready").pixmap(QSize(16,16)) );
- } // else any other state
+ if (map.value("State").toString() == "ready") {
+ ql02->setPixmap(iconman->getIcon("state_ready").pixmap(QSize(16,16)) );
+ } // if ready
+ else {
+ ql02->setPixmap(iconman->getIcon("wifi_tab_state_not_ready").pixmap(QSize(16,16)) );
+ } // else any other state
} // else ready or any other state
ql02->setAlignment(Qt::AlignCenter);
ql02->setToolTip(TranslateStrings::cmtr(map.value("State").toString()) );
@@ -1945,7 +2052,7 @@ void ControlBox::assembleTabWireless()
QTableWidgetItem* qtwi03 = new QTableWidgetItem();
QStringList sl_tr;
for (int i = 0; i < map.value("Security").toStringList().size(); ++i) {
- sl_tr << TranslateStrings::cmtr(map.value("Security").toStringList().at(i) );
+ sl_tr << TranslateStrings::cmtr(map.value("Security").toStringList().at(i) );
} // for
qtwi03->setText(sl_tr.join(',') );
qtwi03->setTextAlignment(Qt::AlignCenter);
@@ -1956,17 +2063,17 @@ void ControlBox::assembleTabWireless()
pb04->setMaximum(100);
pb04->setOrientation( Qt::Horizontal);
pb04->setValue(map.value("Strength").value<quint8>() );
- if (QColor(ui.lineEdit_colorize->text()).isValid() ) {
- QPalette pl = pb04->palette();
- pl.setColor(QPalette::Active, QPalette::Highlight, QColor(ui.lineEdit_colorize->text()) );
- pb04->setPalette(pl);
- }
+ if (QColor(ui.lineEdit_colorize->text()).isValid() ) {
+ QPalette pl = pb04->palette();
+ pl.setColor(QPalette::Active, QPalette::Highlight, QColor(ui.lineEdit_colorize->text()) );
+ pb04->setPalette(pl);
+ }
QWidget* w04 = new QWidget(ui.tableWidget_wifi);
- QHBoxLayout* l04 = new QHBoxLayout(w04);
- l04->addWidget(pb04);
- w04->setLayout(l04);
- l04->setAlignment(Qt::AlignCenter);
+ QHBoxLayout* l04 = new QHBoxLayout(w04);
+ l04->addWidget(pb04);
+ w04->setLayout(l04);
+ l04->setAlignment(Qt::AlignCenter);
l04->setContentsMargins(7, 5, 11, 5);
ui.tableWidget_wifi->setCellWidget(rowcount, 4, w04);
@@ -1986,7 +2093,7 @@ void ControlBox::assembleTabWireless()
ui.pushButton_connect->setEnabled(b_enable);
ui.pushButton_disconnect->setEnabled(b_enable);
ui.pushButton_remove->setEnabled(b_enable);
- setStateRescan(b_enable);
+ setStateRescan(b_enable);
return;
}
@@ -2030,38 +2137,38 @@ void ControlBox::assembleTabVPN()
ui.tableWidget_vpn->setCellWidget(rowcount, 1, ql01);
if (map.value("State").toString() == "association") {
- QProgressBar* pb02 = new QProgressBar(ui.tableWidget_vpn);
- pb02->setMinimum(0);
- pb02->setMaximum(0);
- pb02->setOrientation( Qt::Horizontal);
- pb02->setFormat("Connecting");
- // set the stylesheet on pb02
- QFile f0(":/stylesheets/stylesheets/vpn_connecting.qss");
- if (f0.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString qss = QString(f0.readAll());
- if (QColor(ui.lineEdit_colorize->text()).isValid() ) {
- qss = qss.left(qss.lastIndexOf('}') );
- qss.append(QString("background-color: %1;").arg(ui.lineEdit_colorize->text()) );
- qss.append('}');
- }
- f0.close();
- pb02->setStyleSheet(qss);
- }
-
- ui.tableWidget_vpn->setCellWidget(rowcount, 2, pb02);
+ QProgressBar* pb02 = new QProgressBar(ui.tableWidget_vpn);
+ pb02->setMinimum(0);
+ pb02->setMaximum(0);
+ pb02->setOrientation( Qt::Horizontal);
+ pb02->setFormat("Connecting");
+ // set the stylesheet on pb02
+ QFile f0(":/stylesheets/stylesheets/vpn_connecting.qss");
+ if (f0.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QString qss = QString(f0.readAll());
+ if (QColor(ui.lineEdit_colorize->text()).isValid() ) {
+ qss = qss.left(qss.lastIndexOf('}') );
+ qss.append(QString("background-color: %1;").arg(ui.lineEdit_colorize->text()) );
+ qss.append('}');
+ }
+ f0.close();
+ pb02->setStyleSheet(qss);
+ }
+
+ ui.tableWidget_vpn->setCellWidget(rowcount, 2, pb02);
} // if association
else {
- QLabel* ql02 = new QLabel(ui.tableWidget_vpn);
- if (map.value("State").toString() == "ready") {
- ql02->setPixmap(iconman->getIcon("state_vpn_connected").pixmap(QSize(16,16)) );
- } // if ready
- else {
- ql02->setPixmap(iconman->getIcon("state_not_ready").pixmap(QSize(16,16)) );
- } // else any other state
- ql02->setAlignment(Qt::AlignCenter);
- ql02->setToolTip(TranslateStrings::cmtr(map.value("State").toString()) );
- ql02->installEventFilter(this);
- ui.tableWidget_vpn->setCellWidget(rowcount, 2, ql02);
+ QLabel* ql02 = new QLabel(ui.tableWidget_vpn);
+ if (map.value("State").toString() == "ready") {
+ ql02->setPixmap(iconman->getIcon("state_vpn_connected").pixmap(QSize(16,16)) );
+ } // if ready
+ else {
+ ql02->setPixmap(iconman->getIcon("state_not_ready").pixmap(QSize(16,16)) );
+ } // else any other state
+ ql02->setAlignment(Qt::AlignCenter);
+ ql02->setToolTip(TranslateStrings::cmtr(map.value("State").toString()) );
+ ql02->installEventFilter(this);
+ ui.tableWidget_vpn->setCellWidget(rowcount, 2, ql02);
} // else not association
QLabel* ql03 = new QLabel(ui.tableWidget_vpn);
@@ -2107,6 +2214,40 @@ void ControlBox::assembleTabCounters()
}
//
+// Function to assemble the preferences tab of the dialog
+void ControlBox::assembleTabPreferences()
+{
+ if ( (q16_errors & CMST::Err_Services) == 0x00 ) {
+
+ // Fill in the combobox for before connect services list
+ QString curtext = ui.comboBox_beforeconnectserviceslist->currentText();
+ ui.comboBox_beforeconnectserviceslist->clear();
+ for (int row = 0; row < services_list.size(); ++row) {
+ QMap<QString,QVariant> map = services_list.at(row).objmap;
+ if (map.value("Type").toString() == "wifi" || map.value("Type").toString() == "vpn") {
+ QString ss = getNickName(services_list.at(row).objpath);
+ ui.comboBox_beforeconnectserviceslist->addItem(TranslateStrings::cmtr(ss) );
+ } // if
+ } // services for loop
+ ui.comboBox_beforeconnectserviceslist->setCurrentText(curtext);
+
+ // Fill in the combobox for before connect service files
+ curtext = ui.comboBox_beforeconnectservicefile->currentText();
+ ui.comboBox_beforeconnectservicefile->clear();
+ const QStringList dirlist = { "/var/lib/connman", "/var/lib/connman-vpn"};
+ const QStringList filters("*.cmst.config");
+ for (int i = 0; i < dirlist.size() ; ++i) {
+ QDir dir = QDir(dirlist.at(i) );
+ ui.comboBox_beforeconnectservicefile->addItems(dir.entryList(filters, QDir::Files, QDir::Name));
+ } // for loop
+ ui.comboBox_beforeconnectservicefile->setCurrentText(curtext);
+
+ } // services if no error
+
+ return;
+}
+
+//
// Function to assemble the tray icon tooltip text and picture. Called
// mainly from updateDisplayWidgets(), also from createSystemTrayIcon()
void ControlBox::assembleTrayIcon()
@@ -2116,68 +2257,57 @@ void ControlBox::assembleTrayIcon()
QIcon prelimicon;
if ( (q16_errors & CMST::Err_Properties & CMST::Err_Services) == 0x00 ) {
- // count how many services are in the ready state
- for (int i = 0; i < services_list.count(); ++i) {
- if (services_list.at(i).objmap.value("State").toString() == "ready") ++readycount;
- } // readycount for loop
if ((properties_map.value("State").toString() == "online") ||
- (properties_map.value("State").toString() == "ready" && readycount == 1) ) {
+ (properties_map.value("State").toString() == "ready") ) {
if ( (q16_errors & CMST::Err_Services) == 0x00 ) {
- QMap<QString,QVariant> submap;
- if (services_list.at(0).objmap.value("Type").toString() == "ethernet") {
- shared::extractMapData(submap, services_list.at(0).objmap.value("Ethernet") );
- stt.prepend(tr("Ethernet Connection<br>","icon_tool_tip"));
- stt.append(tr("Service: %1<br>").arg(getNickName(services_list.at(0).objpath)) );
- stt.append(tr("Interface: %1").arg(TranslateStrings::cmtr(submap.value("Interface").toString())) );
- prelimicon = iconman->getIcon("connection_wired");
- } // if wired connection
-
- else if (services_list.at(0).objmap.value("Type").toString() == "wifi") {
- stt.prepend(tr("WiFi Connection<br>","icon_tool_tip"));
- shared::extractMapData(submap, services_list.at(0).objmap.value("Ethernet") );
- stt.append(tr("SSID: %1<br>").arg(getNickName(services_list.at(0).objpath)) );
- QStringList sl_tr;
- for (int i = 0; i < services_list.at(0).objmap.value("Security").toStringList().size(); ++i) {
- sl_tr << TranslateStrings::cmtr(services_list.at(0).objmap.value("Security").toStringList().at(i) );
- } // for
- stt.append(tr("Security: %1<br>").arg(sl_tr.join(',')) );
- stt.append(tr("Strength: %1%<br>").arg(services_list.at(0).objmap.value("Strength").value<quint8>()) );
- stt.append(tr("Interface: %1").arg(TranslateStrings::cmtr(submap.value("Interface").toString())) );
- quint8 str = services_list.at(0).objmap.value("Strength").value<quint8>();
- if (str > 80 ) prelimicon = iconman->getIcon("connection_wifi_100");
- else if (str > 60 ) prelimicon = iconman->getIcon("connection_wifi_075");
- else if (str > 40 ) prelimicon = iconman->getIcon("connection_wifi_050");
- else if (str > 20 ) prelimicon = iconman->getIcon("connection_wifi_025");
- else prelimicon = iconman->getIcon("connection_wifi_000");
- } // else if wifi connection
-
- else if (services_list.at(0).objmap.value("Type").toString() == "vpn") {
- shared::extractMapData(submap, services_list.at(0).objmap.value("Provider") );
- stt.prepend(tr("VPN Connection<br>","icon_tool_tip"));
- stt.append(tr("Type: %1<br>").arg(TranslateStrings::cmtr(submap.value("Type").toString())) );
- stt.append(tr("Service: %1<br>").arg(services_list.at(0).objmap.value("Name").toString()) );
- stt.append(tr("Host: %1<br>").arg(TranslateStrings::cmtr(submap.value("Host").toString())) );
- prelimicon = iconman->getIcon("connection_vpn");
- } // else if vpn connection
+ QMap<QString,QVariant> submap;
+ if (services_list.at(0).objmap.value("Type").toString() == "ethernet") {
+ shared::extractMapData(submap, services_list.at(0).objmap.value("Ethernet") );
+ stt.prepend(tr("Ethernet Connection\n","icon_tool_tip"));
+ stt.append(tr("Service: %1\n").arg(getNickName(services_list.at(0).objpath)) );
+ stt.append(tr("Interface: %1").arg(TranslateStrings::cmtr(submap.value("Interface").toString())) );
+ prelimicon = iconman->getIcon("connection_wired");
+ } // if wired connection
+
+ else if (services_list.at(0).objmap.value("Type").toString() == "wifi") {
+ stt.prepend(tr("WiFi Connection\n","icon_tool_tip"));
+ shared::extractMapData(submap, services_list.at(0).objmap.value("Ethernet") );
+ stt.append(tr("SSID: %1\n").arg(getNickName(services_list.at(0).objpath)) );
+ QStringList sl_tr;
+ for (int i = 0; i < services_list.at(0).objmap.value("Security").toStringList().size(); ++i) {
+ sl_tr << TranslateStrings::cmtr(services_list.at(0).objmap.value("Security").toStringList().at(i) );
+ } // for
+ stt.append(tr("Security: %1\n").arg(sl_tr.join(',')) );
+ stt.append(tr("Strength: %1%\n").arg(services_list.at(0).objmap.value("Strength").value<quint8>()) );
+ stt.append(tr("Interface: %1").arg(TranslateStrings::cmtr(submap.value("Interface").toString())) );
+ quint8 str = services_list.at(0).objmap.value("Strength").value<quint8>();
+ if (str > 80 ) prelimicon = iconman->getIcon("connection_wifi_100");
+ else if (str > 60 ) prelimicon = iconman->getIcon("connection_wifi_075");
+ else if (str > 40 ) prelimicon = iconman->getIcon("connection_wifi_050");
+ else if (str > 20 ) prelimicon = iconman->getIcon("connection_wifi_025");
+ else prelimicon = iconman->getIcon("connection_wifi_000");
+ } // else if wifi connection
+ else if (services_list.at(0).objmap.value("Type").toString() == "vpn") {
+ shared::extractMapData(submap, services_list.at(0).objmap.value("Provider") );
+ stt.prepend(tr("VPN Connection\n","icon_tool_tip"));
+ stt.append(tr("Type: %1\n").arg(TranslateStrings::cmtr(submap.value("Type").toString())) );
+ stt.append(tr("Service: %1\n").arg(services_list.at(0).objmap.value("Name").toString()) );
+ stt.append(tr("Host: %1").arg(TranslateStrings::cmtr(submap.value("Host").toString())) );
+ prelimicon = iconman->getIcon("connection_vpn");
+ } // else if vpn connection
} // services if no error
} // if the state is online
- // else if state is ready
- else if (properties_map.value("State").toString() == "ready") {
- prelimicon = iconman->getIcon("connection_ready");
- stt.append(tr("Connection is in the Ready State.", "icon_tool_tip"));
- } // else if if ready
-
// else if state is failure
else if (properties_map.value("State").toString() == "failure") {
// try to reconnect if service is wifi and Favorite and if reconnect is specified
if (ui.checkBox_retryfailed->isChecked() ) {
- if (services_list.at(0).objmap.value("Type").toString() =="wifi" && services_list.at(0).objmap.value("Favorite").toBool() ) {
- QDBusInterface* iface_serv = new QDBusInterface(DBUS_CON_SERVICE, services_list.at(0).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
- shared::processReply(iface_serv->call(QDBus::AutoDetect, "Connect") );
- iface_serv->deleteLater();
- stt.append(tr("Connection is in the Failure State, attempting to reestablish the connection", "icon_tool_tip") );
- } // if wifi and favorite
+ if (services_list.at(0).objmap.value("Type").toString() =="wifi" && services_list.at(0).objmap.value("Favorite").toBool() ) {
+ QDBusInterface* iface_serv = new QDBusInterface(DBUS_CON_SERVICE, services_list.at(0).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
+ shared::processReply(iface_serv->call(QDBus::AutoDetect, "Connect") );
+ iface_serv->deleteLater();
+ stt.append(tr("Connection is in the Failure State, attempting to reestablish the connection", "icon_tool_tip") );
+ } // if wifi and favorite
} // if retry checked
prelimicon = iconman->getIcon("state_online");
stt.append(tr("Connection is in the Failure State.", "icon_tool_tip"));
@@ -2185,7 +2315,7 @@ void ControlBox::assembleTrayIcon()
// else anything else, states in this case should be "idle", "association", "configuration", or "disconnect"
else {
- prelimicon = iconman->getIcon("connection_not_ready");
+ prelimicon = iconman->getIcon("connection_not_ready");
stt.append(tr("Not Connected", "icon_tool_tip"));
} // else any other connection state
} // properties if no error
@@ -2254,44 +2384,44 @@ void ControlBox::assembleTrayIcon()
QAction* act = info_submenu->addAction(getNickName(services_list.at(j).objpath) );
if (services_list.at(j).objmap.value("Type").toString() == "ethernet" ) {
if (services_list.at(j).objmap.value("State").toString() == "online")
- act->setIcon(iconman->getIcon("connection_wired"));
+ act->setIcon(iconman->getIcon("connection_wired"));
else
- if(services_list.at(j).objmap.value("State").toString() == "ready")
- act->setIcon(iconman->getIcon("connection_ready"));
- else
- act->setIcon(iconman->getIcon("connection_not_ready"));
+ if(services_list.at(j).objmap.value("State").toString() == "ready")
+ act->setIcon(iconman->getIcon("connection_ready"));
+ else
+ act->setIcon(iconman->getIcon("connection_not_ready"));
} // if wired
else if (services_list.at(j).objmap.value("Type").toString() == "wifi" ) {
if (services_list.at(j).objmap.value("State").toString() == "online" ||
- (properties_map.value("State").toString() != "online" &&
- (services_list.at(j).objmap.value("State").toString() == "ready" && readycount == 1)) ) {
- quint8 str = services_list.at(j).objmap.value("Strength").value<quint8>();
- if (str > 80 ) act->setIcon(iconman->getIcon("connection_wifi_100") );
- else if (str > 60 ) act->setIcon(iconman->getIcon("connection_wifi_075") );
- else if (str > 40 ) act->setIcon(iconman->getIcon("connection_wifi_050") );
- else if (str > 20 ) act->setIcon(iconman->getIcon("connection_wifi_025") );
- else act->setIcon(iconman->getIcon("connection_wifi_000") );
+ (properties_map.value("State").toString() != "online" &&
+ (services_list.at(j).objmap.value("State").toString() == "ready" && readycount == 1)) ) {
+ quint8 str = services_list.at(j).objmap.value("Strength").value<quint8>();
+ if (str > 80 ) act->setIcon(iconman->getIcon("connection_wifi_100") );
+ else if (str > 60 ) act->setIcon(iconman->getIcon("connection_wifi_075") );
+ else if (str > 40 ) act->setIcon(iconman->getIcon("connection_wifi_050") );
+ else if (str > 20 ) act->setIcon(iconman->getIcon("connection_wifi_025") );
+ else act->setIcon(iconman->getIcon("connection_wifi_000") );
} // if we want to show a wifi signal symbol
else
- if(services_list.at(j).objmap.value("State").toString() == "ready")
- act->setIcon(iconman->getIcon("connection_ready"));
- else
- act->setIcon(iconman->getIcon("connection_not_ready"));
+ if(services_list.at(j).objmap.value("State").toString() == "ready")
+ act->setIcon(iconman->getIcon("connection_ready"));
+ else
+ act->setIcon(iconman->getIcon("connection_not_ready"));
} // else if wifi
else if (services_list.at(j).objmap.value("Type").toString() == "vpn" ) {
if (services_list.at(j).objmap.value("State").toString() == "ready")
- act->setIcon(iconman->getIcon("connection_vpn"));
+ act->setIcon(iconman->getIcon("connection_vpn"));
else if (services_list.at(j).objmap.value("State").toString() == "association")
- act->setIcon(iconman->getIcon("connection_vpn_acquiring"));
+ act->setIcon(iconman->getIcon("connection_vpn_acquiring"));
else
- act->setIcon(iconman->getIcon("connection_not_ready"));
+ act->setIcon(iconman->getIcon("connection_not_ready"));
} // else if vpn
else if (services_list.at(j).objmap.value("State").toString() == "ready") act->setIcon(iconman->getIcon("connection_ready"));
else if (services_list.at(j).objmap.value("State").toString() == "failure" ) act->setIcon(iconman->getIcon("connection_failure"));
- else act->setIcon(iconman->getIcon("connection_not_ready"));
+ else act->setIcon(iconman->getIcon("connection_not_ready"));
} // j for
// wifi_submenu.
@@ -2311,7 +2441,7 @@ void ControlBox::assembleTrayIcon()
QStringList sl_tr;
for (int m = 0; m < wifi_list.at(k).objmap.value("Security").toStringList().size(); ++m) {
sl_tr << TranslateStrings::cmtr(wifi_list.at(k).objmap.value("Security").toStringList().at(m) );
- } // for
+ } // for
ttstr.append(tr("Security: %1").arg(sl_tr.join(',')) );
if (wifi_list.at(k).objmap.value("Roaming").toBool() ) ttstr.append(tr("<br>Roaming"));
ttstr.append(tr("<br>Autoconnect is "));
@@ -2380,11 +2510,11 @@ void ControlBox::enableRunOnStartup(bool enabled)
QByteArray user_autostart_file_hash = hasher.result();
if (orig_file_hash == user_autostart_file_hash) {
- return;
+ return;
}
if (!user_autostart_file.remove()) {
- return;
+ return;
}
}
// Copy the autostart file (create the target directory first if needed)
@@ -2395,7 +2525,7 @@ void ControlBox::enableRunOnStartup(bool enabled)
} // if enabled
else {
if (!autostart_file_info.exists()) {
- return;
+ return;
}
user_autostart_file.remove();
}
@@ -2426,6 +2556,7 @@ void ControlBox::writeSettings()
settings->setValue("advanced", ui.checkBox_advanced->isChecked() );
settings->setValue("retry_failed", ui.checkBox_retryfailed->isChecked() );
settings->setValue("run_on_startup", ui.checkBox_runonstartup->isChecked());
+ settings->setValue("vpn_kill_switch", ui.checkBox_killswitch->isChecked());
settings->endGroup();
settings->beginGroup("LineEdits");
@@ -2453,6 +2584,10 @@ void ControlBox::writeSettings()
settings->beginGroup("ExternalPrograms");
settings->setValue("run_after_connect", ui.lineEdit_afterconnect->text() );
+ settings->setValue("modify_service_file", ui.checkBox_modifyservicefile->isChecked() );
+ settings->setValue("run_before_connect", ui.lineEdit_beforeconnect->text() );
+ settings->setValue("before_connect_service", ui.comboBox_beforeconnectserviceslist->currentText() );
+ settings->setValue("before_connect_service_file", ui.comboBox_beforeconnectservicefile->currentText() );
settings->endGroup();
return;
@@ -2477,9 +2612,10 @@ void ControlBox::readSettings()
ui.checkBox_advanced->setChecked(settings->value("advanced").toBool() );
ui.checkBox_retryfailed->setChecked(settings->value("retry_failed").toBool() );
ui.checkBox_runonstartup->setChecked(settings->value("run_on_startup").toBool());
+ ui.checkBox_killswitch->setChecked(settings->value("vpn_kill_switch").toBool());
settings->endGroup();
- settings->beginGroup("LineEdits");
+ settings->beginGroup("LineEdits");
ui.lineEdit_colorize->setText(settings->value("colorize_icons").toString() );
settings->endGroup();
@@ -2488,12 +2624,12 @@ void ControlBox::readSettings()
// Changed disable counters to enable counters. Figure out what the user wanted
// and adjust accordingly
if (settings->contains("disable_counters") ) {
- ui.checkBox_enablecounters->setChecked(! settings->value("disable_counters").toBool() );
- settings->remove("disable_counters");
- }
- else {
- ui.checkBox_enablecounters->setChecked(settings->value("enable_counters").toBool() );
- }
+ ui.checkBox_enablecounters->setChecked(! settings->value("disable_counters").toBool() );
+ settings->remove("disable_counters");
+ }
+ else {
+ ui.checkBox_enablecounters->setChecked(settings->value("enable_counters").toBool() );
+ }
ui.checkBox_disabletrayicon->setChecked(settings->value("disable_tray_icon").toBool() );
ui.checkBox_disablevpn->setChecked(settings->value("disable_vpn").toBool() );
ui.checkBox_systemicontheme->setChecked(settings->value("use_icon_theme").toBool() );
@@ -2513,8 +2649,12 @@ void ControlBox::readSettings()
settings->beginGroup("ExternalPrograms");
ui.lineEdit_afterconnect->setText(settings->value("run_after_connect").toString() );
+ ui.checkBox_modifyservicefile->setChecked(settings->value("modify_service_file").toBool() );
+ ui.lineEdit_beforeconnect->setText(settings->value("run_before_connect").toString() );
+ ui.comboBox_beforeconnectserviceslist->addItem(settings->value("before_connect_service").toString() );
+ ui.comboBox_beforeconnectservicefile->addItem(settings->value("before_connect_service_file").toString() );
+ ui.comboBox_beforeconnectservicefile->setEnabled(settings->value("modify_service_file").toBool() );
settings->endGroup();
-
return;
}
@@ -2529,68 +2669,68 @@ void ControlBox::createSystemTrayIcon()
// We still need to make sure there is a tray available
if (QSystemTrayIcon::isSystemTrayAvailable() ) {
-
- // Create the outline of the context menu. Submenu contents are defined in the
- // assembletrayIcon() function.
- trayiconmenu->clear();
- trayiconmenu->setTearOffEnabled(true);
- trayiconmenu->setToolTipsVisible(true);
- tech_submenu->setToolTipsVisible(true);
- info_submenu->setToolTipsVisible(true);
- wifi_submenu->setToolTipsVisible(true);
- vpn_submenu->setToolTipsVisible(true);
-
- trayiconmenu->addMenu(tech_submenu);
- trayiconmenu->addMenu(info_submenu);
- trayiconmenu->addMenu(wifi_submenu);
- trayiconmenu->addMenu(vpn_submenu);
- trayiconmenu->addSeparator();
-
- trayiconmenu->addAction(ui.actionRescan);
- trayiconmenu->addAction(ui.actionOffline_Mode);
- trayiconmenu->addSeparator();
-
- trayiconmenu->addAction(maximizeAction);
- trayiconmenu->addAction(minimizeAction);
- trayiconmenu->addSeparator();
- trayiconmenu->addAction(tr("Cancel"), this, SLOT(closeSystemTrayTearOffMenu()) );
- trayiconmenu->addAction(exitAction);
-
- trayicon->setContextMenu(trayiconmenu);
-
- connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
-
- // We need this if someone is running the program from the tray popup menu.
- // The main UI is fine without it, but if you call up the agent dialog and then
- // close that seems to be treated as the last window.
- qApp->setQuitOnLastWindowClosed(false);
-
- // Assemble the tray icon (set the icon to display)
- assembleTrayIcon();
-
- // QT5.3 and XFCE don't play nicely. Hammer the XFCE tray up to
- // maxtries to get a valid icon geometry.
- // QT5.4 update, may be fixed but leave option in for now
- if (b_usexfce || b_usemate) {
- const int maxtries = 125;
- int i;
- for (i = 0; i < maxtries; ++i) {
- trayicon->setVisible(true);
- //qDebug() << "icon geometry: " << trayicon->geometry();
- if ((trayicon->geometry().left() > 0 || trayicon->geometry().top() > 0) && trayicon->geometry().width() > 1) break;
- trayicon->setVisible(false);
- qApp->processEvents();
- } // hammer loop
- if (i == maxtries - 1) {
- qDebug() << QString("Failed to get a valid icon from the systemtray in %1 tries").arg(maxtries);
- ui.pushButton_minimize->setDisabled(true);
- trayicon = 0; // reinitialize the pointer
- } // if we hit the end of the loop
- } // if use xfce
-
- // Sync the visibility to the checkbox
- ui.checkBox_hideIcon->setEnabled(true);
- trayicon->setVisible(true);
+
+ // Create the outline of the context menu. Submenu contents are defined in the
+ // assembletrayIcon() function.
+ trayiconmenu->clear();
+ trayiconmenu->setTearOffEnabled(true);
+ trayiconmenu->setToolTipsVisible(true);
+ tech_submenu->setToolTipsVisible(true);
+ info_submenu->setToolTipsVisible(true);
+ wifi_submenu->setToolTipsVisible(true);
+ vpn_submenu->setToolTipsVisible(true);
+
+ trayiconmenu->addMenu(tech_submenu);
+ trayiconmenu->addMenu(info_submenu);
+ trayiconmenu->addMenu(wifi_submenu);
+ trayiconmenu->addMenu(vpn_submenu);
+ trayiconmenu->addSeparator();
+
+ trayiconmenu->addAction(ui.actionRescan);
+ trayiconmenu->addAction(ui.actionOffline_Mode);
+ trayiconmenu->addSeparator();
+
+ trayiconmenu->addAction(maximizeAction);
+ trayiconmenu->addAction(minimizeAction);
+ trayiconmenu->addSeparator();
+ trayiconmenu->addAction(tr("Cancel"), this, SLOT(closeSystemTrayTearOffMenu()) );
+ trayiconmenu->addAction(exitAction);
+
+ trayicon->setContextMenu(trayiconmenu);
+
+ connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
+
+ // We need this if someone is running the program from the tray popup menu.
+ // The main UI is fine without it, but if you call up the agent dialog and then
+ // close that seems to be treated as the last window.
+ qApp->setQuitOnLastWindowClosed(false);
+
+ // Assemble the tray icon (set the icon to display)
+ assembleTrayIcon();
+
+ // QT5.3 and XFCE don't play nicely. Hammer the XFCE tray up to
+ // maxtries to get a valid icon geometry.
+ // QT5.4 update, may be fixed but leave option in for now
+ if (b_usexfce || b_usemate) {
+ const int maxtries = 125;
+ int i;
+ for (i = 0; i < maxtries; ++i) {
+ trayicon->setVisible(true);
+ //qDebug() << "icon geometry: " << trayicon->geometry();
+ if ((trayicon->geometry().left() > 0 || trayicon->geometry().top() > 0) && trayicon->geometry().width() > 1) break;
+ trayicon->setVisible(false);
+ qApp->processEvents();
+ } // hammer loop
+ if (i == maxtries - 1) {
+ qDebug() << QString("Failed to get a valid icon from the systemtray in %1 tries").arg(maxtries);
+ ui.pushButton_minimize->setDisabled(true);
+ trayicon = 0; // reinitialize the pointer
+ } // if we hit the end of the loop
+ } // if use xfce
+
+ // Sync the visibility to the checkbox
+ ui.checkBox_hideIcon->setEnabled(true);
+ trayicon->setVisible(true);
} // if there is a systemtray available
@@ -2602,11 +2742,11 @@ void ControlBox::createSystemTrayIcon()
QMessageBox::warning(this,
QString(TranslateStrings::cmtr("cmst")) + tr(" Warning"),
tr("<center><b>Unable to find a systemtray on this machine.</b>"
- "<center><br>The program may still be used to manage your connections, but the tray icon will be disabled."
- "<center><br><br>If you are seeing this message at system start up and you know a system tray exists once the "
- "system is up, try starting with the <b>-w</b> switch and set a delay as necessary. The exact wait time will vary "
- "from system to system."
- ) );
+ "<center><br>The program may still be used to manage your connections, but the tray icon will be disabled."
+ "<center><br><br>If you are seeing this message at system start up and you know a system tray exists once the "
+ "system is up, try starting with the <b>-w</b> switch and set a delay as necessary. The exact wait time will vary "
+ "from system to system."
+ ) );
// Even if we want to be minimized we can't there is no place to minimize to.
this->showNormal();
@@ -2617,8 +2757,8 @@ void ControlBox::createSystemTrayIcon()
// sync offlinemode checkbox and action b1ased on the saved value from settings
if (settings->value("CheckBoxes/devices_off").toBool() ) {
- ui.actionOffline_Mode->trigger();
- }
+ ui.actionOffline_Mode->trigger();
+ }
// Lastly update the display widgets (since this is actually the last
// line of the constructor.)
@@ -2772,10 +2912,10 @@ void ControlBox::logErrors(const quint16& err)
q16_errors |= err;
// Log the error in the system log
- // LOG_PID Include PID with each message
+ // LOG_PID Include PID with each message
// LOG_CONS Write to console if there is a problem writing to system log
// LOG_USER User Level Message
- // LOG_ERR Error condition
+ // LOG_ERR Error condition
// LOG_WARNING Warning contition
// Defined in resource.h
// LOG_NAME Name to display in the log
@@ -2785,33 +2925,33 @@ void ControlBox::logErrors(const quint16& err)
case CMST::Err_No_DBus:
syslog(LOG_ERR, "%s", tr("Could not find a connection to the system bus").toUtf8().constData() );
QMessageBox::critical(this, tr("%1 - Critical Error").arg(TranslateStrings::cmtr("cmst")),
- tr("Unable to find a connection to the system bus.<br><br>%1 will not be able to communicate with connman.").arg(TranslateStrings::cmtr("cmst")) );
+ tr("Unable to find a connection to the system bus.<br><br>%1 will not be able to communicate with connman.").arg(TranslateStrings::cmtr("cmst")) );
break;
case CMST::Err_Invalid_Con_Iface:
syslog(LOG_ERR, "%s",tr("Could not create an interface to connman on the system bus").toUtf8().constData());
QMessageBox::critical(this, tr("%1 - Critical Error").arg(TranslateStrings::cmtr("cmst")),
- tr("Unable to create an interface to connman on the system bus.<br><br>%1 will not be able to communicate with connman.").arg(TranslateStrings::cmtr("cmst")) );
+ tr("Unable to create an interface to connman on the system bus.<br><br>%1 will not be able to communicate with connman.").arg(TranslateStrings::cmtr("cmst")) );
break;
case CMST::Err_Properties:
syslog(LOG_ERR, "%s", tr("Error reading or parsing connman.Manager.GetProperties").toUtf8().constData() );
QMessageBox::warning(this, tr("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
- tr("There was an error reading or parsing the reply from method connman.Manager.GetProperties.<br><br>It is unlikely any portion of %1 will be functional.").arg(TranslateStrings::cmtr("cmst")) );
+ tr("There was an error reading or parsing the reply from method connman.Manager.GetProperties.<br><br>It is unlikely any portion of %1 will be functional.").arg(TranslateStrings::cmtr("cmst")) );
break;
case CMST::Err_Technologies:
syslog(LOG_ERR, "%s",tr("Error reading or parsing connman.Manager.GetTechnologies").toUtf8().constData() );
QMessageBox::warning(this, tr("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
- tr("There was an error reading or parsing the reply from method connman.Manager.GetTechnologies.<br><br>Some portion of %1 may still be functional.").arg(TranslateStrings::cmtr("cmst")) );
+ tr("There was an error reading or parsing the reply from method connman.Manager.GetTechnologies.<br><br>Some portion of %1 may still be functional.").arg(TranslateStrings::cmtr("cmst")) );
break;
case CMST::Err_Services:
syslog(LOG_ERR, "%s", tr("Error reading or parsing connman.Manager.GetServices").toUtf8().constData() );
QMessageBox::warning(this, tr("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
- tr("There was an error reading or parsing the reply from method connman.Manager.GetServices.<br><br>Some portion of %1 may still be functional.").arg(TranslateStrings::cmtr("cmst")) );
+ tr("There was an error reading or parsing the reply from method connman.Manager.GetServices.<br><br>Some portion of %1 may still be functional.").arg(TranslateStrings::cmtr("cmst")) );
break;
case CMST::Err_Invalid_VPN_Iface:
- // NOTE: this error is logged to the system log only, no message is presented to the user (issue #155). Done
- // this way because it will happen when someone does not compile ConnMan with VPN support, or if they don't
- // have the connman-vpn daemon running. We're figuring this would be more than likely intentional and not an
- // error the user would need to be concerned about. If he is the error will show in the system log.
+ // NOTE: this error is logged to the system log only, no message is presented to the user (issue #155). Done
+ // this way because it will happen when someone does not compile ConnMan with VPN support, or if they don't
+ // have the connman-vpn daemon running. We're figuring this would be more than likely intentional and not an
+ // error the user would need to be concerned about. If he is the error will show in the system log.
syslog(LOG_ERR, "%s",tr("Could not create an interface to connman-vpn on the system bus").toUtf8().constData());
break;
default:
@@ -2865,24 +3005,41 @@ QString ControlBox::getNickName(const QDBusObjectPath& objpath)
if (services_list.at(i).objpath == objpath) {
QMap<QString,QVariant> submap;
if (services_list.at(i).objmap.value("Type").toString() == "ethernet") {
- shared::extractMapData(submap, services_list.at(i).objmap.value("Ethernet") );
- if (submap.value("Interface").toString().isEmpty() )
- return services_list.at(i).objmap.value("Name").toString();
- else
- return QString(TranslateStrings::cmtr(services_list.at(i).objmap.value("Name").toString()) + " [%1]").arg(submap.value("Interface").toString() );
+ shared::extractMapData(submap, services_list.at(i).objmap.value("Ethernet") );
+ if (submap.value("Interface").toString().isEmpty() )
+ return services_list.at(i).objmap.value("Name").toString();
+ else
+ return QString(TranslateStrings::cmtr(services_list.at(i).objmap.value("Name").toString()) + " [%1]").arg(submap.value("Interface").toString() );
} // if type ethernet
- else if ( services_list.at(i).objmap.value("Type").toString() == "wifi" && services_list.at(i).objmap.value("Name").toString().isEmpty() )
- return tr("[Hidden Wifi]");
- else
- return services_list.at(i).objmap.value("Name").toString();
+ else if ( services_list.at(i).objmap.value("Type").toString() == "wifi" && services_list.at(i).objmap.value("Name").toString().isEmpty() )
+ return tr("[Hidden Wifi]");
+ else
+ return services_list.at(i).objmap.value("Name").toString();
} // if objpath matches
} // for
return QString();
}
+// Function to find the version of connman running on the local machine.
+// This function stores f_connmanversion which is a float containing the
+// version. Use to enable, disable, hide features of CMST based on what is
+// availabe from connman. Set to -1.0 if not able to determine a version.
+void ControlBox::findConnmanVersion()
+
+{
+ QProcess qps;
+ bool b_ok = false;
+ qps.start("connmand -v", QStringList());
+ qps.waitForFinished();
+ f_connmanversion = qps.readAllStandardOutput().toFloat(&b_ok);
+ if (! b_ok) f_connmanversion = -1.0;
+
+ return;
+}
+
// Slot to connect to the notification client. Called from QTimers to give time for the notification server
// to start up if this program is started automatically at boot. We make four attempts at finding the
// notification server. First is in the constructor of NotifyClient, following we call the connectToServer()
@@ -2891,8 +3048,8 @@ void ControlBox::connectNotifyClient()
{
//initialize the counter
static short count = 0;
+ const short maxtries = 4; // this needs to match the tries in the constructor
++count;
-
if (count > 1 ) {
// if we have a valid notifyclient return now
if (notifyclient->isValid() )
@@ -2917,18 +3074,16 @@ void ControlBox::connectNotifyClient()
ui.label_serverstatus->setDisabled(true);
ui.groupBox_notifications->setToolTip(lab);
}
- // not successful, try again or abandon if counter is at limit
+ // not successful, try again or abandon if counter is at limit
else {
- if (count < 4) {
- ui.label_serverstatus->setText(tr("Attempt %1 of 4 looking for notification server.").arg(count));
+ if (count < maxtries) {
+ ui.label_serverstatus->setText(tr("Attempt %1 of %2 looking for notification server.").arg(count).arg(maxtries) );
} // try again
else {
- ui.label_serverstatus->setText(tr("Unable to find or connect to a Notification server."));
+ ui.label_serverstatus->setText(tr("Unable to connect to a notification server after %1 tries.").arg(count) );
ui.checkBox_notifydaemon->setChecked(false);
- ui.checkBox_notifydaemon->setEnabled(false);
+ ui.checkBox_notifydaemon->setDisabled(true);
} // else last time
- ui.groupBox_notifications->setToolTip("");
- ui.groupBox_notifications->setWhatsThis("");
} // else we don't have a valid client.
return;
@@ -2951,6 +3106,7 @@ void ControlBox::configureService()
// Create a new properties editor
PropertiesEditor* peditor = new PropertiesEditor(this, services_list.at(ui.comboBox_service->currentIndex()) );
+ if (f_connmanversion <= 1.37f) peditor->setItemEnabled(7, false);
// Set the whatsthis button icon
peditor->setWhatsThisIcon(iconman->getIcon("whats_this"));
@@ -2958,7 +3114,6 @@ void ControlBox::configureService()
// call then clean up
peditor->exec();
peditor->deleteLater();
-
return;
}
@@ -2969,7 +3124,7 @@ void ControlBox::configureService()
void ControlBox::provisionService()
{
if (qobject_cast<QPushButton*>(sender()) == ui.pushButton_provisioning_editor) {
- ProvisioningEditor* reditor = new ProvisioningEditor(this);
+ ProvisioningEditor* reditor = new ProvisioningEditor(this, f_connmanversion);
// Set the whatsthis button icon
reditor->setWhatsThisIcon(iconman->getIcon("whats_this") );
@@ -2980,7 +3135,7 @@ void ControlBox::provisionService()
}
else if (qobject_cast<QPushButton*>(sender()) == ui.pushButton_vpn_editor) {
- VPN_Editor* veditor = new VPN_Editor(this);
+ VPN_Editor* veditor = new VPN_Editor(this, f_connmanversion);
// Set the whatsthis button icon
veditor->setWhatsThisIcon(iconman->getIcon("whats_this") );
@@ -3023,11 +3178,11 @@ void ControlBox::cleanUp()
} // if counters are connected to anything
- if (vpn_manager != NULL) {
- if (vpn_manager->isValid() ) {
- shared::processReply(vpn_manager->call(QDBus::AutoDetect, "UnregisterAgent", QVariant::fromValue(QDBusObjectPath(VPN_AGENT_OBJECT))) );
- } // ivpn_manager isValid
- } // not null
+ if (vpn_manager != NULL) {
+ if (vpn_manager->isValid() ) {
+ shared::processReply(vpn_manager->call(QDBus::AutoDetect, "UnregisterAgent", QVariant::fromValue(QDBusObjectPath(VPN_AGENT_OBJECT))) );
+ } // ivpn_manager isValid
+ } // not null
} // if con_manager isValid
@@ -3061,10 +3216,10 @@ void ControlBox::iconColorChanged(const QString& col)
// Slot to set the enabled/disabled state of the rescan wifi controls
void ControlBox::setStateRescan(bool state)
{
- ui.pushButton_rescanwifi01->setEnabled(state);
- ui.pushButton_rescanwifi02->setEnabled(state);
- ui.actionRescan->setEnabled(state);
-
- return;
+ ui.pushButton_rescanwifi01->setEnabled(state);
+ ui.pushButton_rescanwifi02->setEnabled(state);
+ ui.actionRescan->setEnabled(state);
+
+ return;
}
-
+
diff --git a/apps/cmstapp/code/control_box/controlbox.h b/apps/cmstapp/code/control_box/controlbox.h
index 6e074ac..6c078fd 100755
--- a/apps/cmstapp/code/control_box/controlbox.h
+++ b/apps/cmstapp/code/control_box/controlbox.h
@@ -3,7 +3,7 @@
Code to manage the primary user interface to include the QDialog the
user interfaces with and the system tray icon.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -55,6 +55,7 @@ DEALINGS IN THE SOFTWARE.
# include "./code/notify/notify.h"
# include "./code/iconman/iconman.h"
# include "./code/vpn_agent/vpnagent.h"
+# include "./code/gen_conf_ed/gen_conf_ed.h"
// Two of the connman.Manager query functions will return an array of structures.
// This struct provides a receiving element we can use to collect the return data.
@@ -96,7 +97,7 @@ class ControlBox : public QDialog
public:
ControlBox(const QCommandLineParser&, QWidget* parent = 0);
-
+
public slots:
void aboutCMST();
void aboutIconSet();
@@ -114,11 +115,11 @@ class ControlBox : public QDialog
Ui::ControlBox ui;
quint16 q16_errors;
QMap<QString,QVariant> properties_map;
- QList<arrayElement> services_list;
- QList<arrayElement> technologies_list;
- QList<arrayElement> wifi_list;
- QList<arrayElement> peer_list;
- QList<arrayElement> vpn_list;
+ QList<arrayElement> services_list;
+ QList<arrayElement> technologies_list;
+ QList<arrayElement> wifi_list;
+ QList<arrayElement> peer_list;
+ QList<arrayElement> vpn_list;
ConnmanAgent* agent;
ConnmanVPNAgent* vpnagent;
ConnmanCounter* counter;
@@ -144,9 +145,14 @@ class ControlBox : public QDialog
bool b_usemate;
QSettings* settings;
QString onlineobjectpath;
+ QString pendingobjectpath;
QLocalServer* socketserver;
QColor trayiconbackground;
IconManager* iconman;
+ float f_connmanversion;
+ GEN_Editor* gened;
+ QProcess* proc;
+ bool b_userinitiated;
// functions
int managerRescan(const int& srv = 0);
@@ -155,6 +161,7 @@ class ControlBox : public QDialog
void assembleTabWireless();
void assembleTabVPN();
void assembleTabCounters();
+ void assembleTabPreferences();
void assembleTrayIcon();
void sendNotifications();
bool getProperties();
@@ -166,6 +173,7 @@ class ControlBox : public QDialog
QString readResourceText(const char*);
void clearCounters();
QString getNickName(const QDBusObjectPath&);
+ void findConnmanVersion();
private slots:
void updateDisplayWidgets();
@@ -174,6 +182,7 @@ class ControlBox : public QDialog
void enableMoveButtons(int,int);
void counterUpdated(const QDBusObjectPath&, const QString&, const QString&);
void connectPressed();
+ void requestConnection();
void disconnectPressed();
void removePressed();
void dbsPropertyChanged(QString,QDBusVariant);
diff --git a/apps/cmstapp/code/control_box/ui/controlbox.ui b/apps/cmstapp/code/control_box/ui/controlbox.ui
index 4c92e9d..5c1e4de 100644
--- a/apps/cmstapp/code/control_box/ui/controlbox.ui
+++ b/apps/cmstapp/code/control_box/ui/controlbox.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>689</width>
- <height>697</height>
+ <width>749</width>
+ <height>644</height>
</rect>
</property>
<property name="minimumSize">
@@ -58,39 +58,12 @@
<rect>
<x>0</x>
<y>0</y>
- <width>647</width>
+ <width>707</width>
<height>466</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="0" column="0">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="checkBox_devicesoff">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This checkbox controls the global setting for switching all radios on or off. When checked all radios are powered down.&lt;/p&gt;&lt;p&gt;When the system is In offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>All Devices &amp;Off</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0">
<widget class="QGroupBox" name="groupBox_global_properties">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;OfflineMode&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The offline mode indicates the global setting for switching all radios on or off. Changing offline mode to true results in powering down all devices. When leaving offline mode the individual policy of each device decides to switch the radio back on or not. &lt;/p&gt;&lt;p&gt;During offline mode, it is still possible to switch certain technologies manually back on. For example the limited usage of WiFi or Bluetooth devices might be allowed in some situations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@@ -99,91 +72,79 @@
<string>Global Properties</string>
</property>
<layout class="QGridLayout" name="gridLayout_16">
- <item row="2" column="1" colspan="2">
- <widget class="QLabel" name="label_offlinemode">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global setting for switching all radios on or off. When offline mode is engaged all radios are powered down.&lt;/p&gt;&lt;p&gt;While in offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>OfflineMode: Unavailable</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2" rowspan="2" colspan="4">
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>506</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
<item row="0" column="1">
- <widget class="QLabel" name="label_state">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global connection state of the system. Possible values are &amp;quot;offline&amp;quot;, &amp;quot;idle&amp;quot;, &amp;quot;ready&amp;quot;, and &amp;quot;online&amp;quot;. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>State: Unavailable</string>
- </property>
- </widget>
- </item>
- <item row="1" column="5" rowspan="2">
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>466</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_state_pix">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16</width>
- <height>16</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QToolButton" name="toolButton_offlinemode">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global setting for switching all radios on or off. When offline mode is engaged all radios are powered down.&lt;/p&gt;&lt;p&gt;While in offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
+ <layout class="QGridLayout" name="gridLayout_18">
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_offlinemode">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global setting for switching all radios on or off. When offline mode is engaged all radios are powered down.&lt;/p&gt;&lt;p&gt;While in offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>OfflineMode: Unavailable</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_state">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global connection state of the system. Possible values are &amp;quot;offline&amp;quot;, &amp;quot;idle&amp;quot;, &amp;quot;ready&amp;quot;, and &amp;quot;online&amp;quot;. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>State: Unavailable</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" alignment="Qt::AlignRight">
+ <widget class="QCheckBox" name="checkBox_devicesoff">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This checkbox controls the global setting for switching all radios on or off. When checked all radios are powered down.&lt;/p&gt;&lt;p&gt;When the system is In offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>All Devices &amp;Off</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_state_pix">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QToolButton" name="toolButton_offlinemode">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global setting for switching all radios on or off. When offline mode is engaged all radios are powered down.&lt;/p&gt;&lt;p&gt;While in offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
</item>
- <item row="2" column="0">
+ <item row="1" column="0">
<widget class="QSplitter" name="splitter01">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -234,12 +195,12 @@
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
- <attribute name="horizontalHeaderHighlightSections">
- <bool>false</bool>
- </attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>75</number>
</attribute>
+ <attribute name="horizontalHeaderHighlightSections">
+ <bool>false</bool>
+ </attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
@@ -376,12 +337,12 @@
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
- <attribute name="horizontalHeaderDefaultSectionSize">
- <number>100</number>
- </attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>75</number>
</attribute>
+ <attribute name="horizontalHeaderDefaultSectionSize">
+ <number>100</number>
+ </attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
@@ -523,7 +484,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>647</width>
+ <width>707</width>
<height>385</height>
</rect>
</property>
@@ -914,7 +875,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>647</width>
+ <width>707</width>
<height>466</height>
</rect>
</property>
@@ -954,7 +915,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>603</width>
+ <width>663</width>
<height>156</height>
</rect>
</property>
@@ -1013,7 +974,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>603</width>
+ <width>663</width>
<height>156</height>
</rect>
</property>
@@ -1080,9 +1041,9 @@
<property name="geometry">
<rect>
<x>0</x>
- <y>-112</y>
- <width>633</width>
- <height>578</height>
+ <y>-274</y>
+ <width>693</width>
+ <height>740</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_8">
@@ -1125,28 +1086,186 @@
</property>
</widget>
</item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="checkBox_killswitch">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked CMST will implement an internet kill switch for VPN connections. If a VPN connection drops while the kill switch is enabled all technologies will be powered off.&lt;/p&gt;&lt;p&gt;The way this works is the service order is monitored. If the topmost service is of type VPN and then if it changes to something other than VPN and if the change was not initiated by the user (for instance by using the &lt;span style=&quot; font-weight:600;&quot;&gt;Disconnect&lt;/span&gt; button in the VPN tab), then CMST will cycle through all technologies powering each one down in turn. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Enable VPN Internet Kill Switch</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QGroupBox" name="groupBox_systemtray">
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox_notifications">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Preferences for the system tray are in this box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the system notification daemon will popup a notify message when a significant connman related event is received.&lt;/p&gt;&lt;p&gt;Notifications can be handled by the System Tray Icon, or by a Notify daemon if one is installed. Both can not be active at the same time.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
- <string>System Tray</string>
+ <string>Notifications</string>
</property>
- <layout class="QGridLayout" name="gridLayout">
+ <layout class="QGridLayout" name="gridLayout_17">
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_serverstatus">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Server Status</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
<item row="0" column="0">
- <widget class="QCheckBox" name="checkBox_hideIcon">
+ <widget class="QCheckBox" name="checkBox_notifydaemon">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Notification Daemon</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QGroupBox" name="groupBox_preferencesinterface">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Preferences for the interface are in this box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="title">
+ <string>Interface</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_12">
+ <item row="3" column="0" colspan="2">
+ <widget class="QCheckBox" name="checkBox_resetcounters">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked an icon will not be displayed in the system tray. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Normally counters are cumulative and will retain the connect time and the TX and RX counts between boots. &lt;/p&gt;&lt;p&gt;When this box is checked the counters will reset to zero every time CMST is started, and if CMST is running everytime a Connman service is started. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
- <string>Hide Tray Icon</string>
+ <string>Reset Counters</string>
</property>
</widget>
</item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QCheckBox" name="checkBox_advanced">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked additional controls for advanced users are displayed.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Advanced Controls</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QCheckBox" name="checkBox_usestartoptions">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the Start Up Options in the right hand pane will be enabled. Start up options set in this pane will be read and used next time the program starts. Start up options are also available as command line switches and an option provided on the command line will take precedence over an option set in the right hand pane. The options in this pane are provided as a convienence to avoid the necessity of editing a systemd service or other start up file. &lt;/p&gt;&lt;p&gt;Settings are stored in&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;: ~&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;/.config/cmst/cmst.conf &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;&lt;br/&gt;This is a standard ini type text file.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Enable Start Options from GUI (right hand pane)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QCheckBox" name="checkBox_retainstate">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the state of the GUI will be restored from settings saved on disk. Settings include the geometry and position of the dialog and the current tab. &lt;/p&gt;&lt;p&gt;These settings will be used at next boot to restore the user interface to the way it was at shutdown.&lt;/p&gt;&lt;p&gt;The settings file is: ~&lt;span style=&quot; font-weight:600;&quot;&gt;/.config/cmst/cmst.conf &lt;/span&gt;&lt;br/&gt;This is a standard ini type text file.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Retain State</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QCheckBox" name="checkBox_enableinterfacetooltips">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the display of tooltips will be enabled for the interface widgets.&lt;/p&gt;&lt;p&gt;Tooltips are the small popups that appear when you hover the mouse pointer over an area of the interface. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Enable ToolTips (Interface)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
+ <item>
+ <widget class="QLineEdit" name="lineEdit_colorize">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Color in #RGB format to colorize the internal icons with.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="clearButtonEnabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolButton_colorize">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open the color selection dialog. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::UpArrow</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Internal icons can be colorized. You may select a color using the button to the left, or you may type in the #RGB color yourself.&lt;/p&gt;&lt;p&gt;If you type the entry it must have leading # sign. Example: #22aa44 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Colorize</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="groupBox_systemtray">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Preferences for the system tray are in this box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="title">
+ <string>System Tray</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox_enablesystemtraytooltips">
<property name="whatsThis">
@@ -1160,6 +1279,16 @@
</property>
</widget>
</item>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="checkBox_hideIcon">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked an icon will not be displayed in the system tray. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Hide Tray Icon</string>
+ </property>
+ </widget>
+ </item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBox_systemtraynotifications">
<property name="enabled">
@@ -1176,86 +1305,71 @@
</layout>
</widget>
</item>
- <item row="0" column="1" rowspan="4">
+ <item row="0" column="1" rowspan="3">
<widget class="QGroupBox" name="groupBox_startoptions">
<property name="enabled">
<bool>true</bool>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;These entries control various options for CMST at program start. &lt;/p&gt;&lt;p&gt;All of these options are available from the command line, and if a command line option is provided it will take precedence over these settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;These entries control various options for CMST at program start. Changing or setting these will only take effect at the next program start. &lt;/p&gt;&lt;p&gt;All of these options are available from the command line, and if a command line option is provided it will take precedence over these settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
- <string>Start Options</string>
+ <string>Start Up Options</string>
</property>
<layout class="QGridLayout" name="gridLayout_9">
- <item row="9" column="1">
- <widget class="QSpinBox" name="spinBox_counterrate">
+ <item row="10" column="1">
+ <widget class="QSpinBox" name="spinBox_faketransparency">
<property name="enabled">
<bool>false</bool>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the frequency in seconds between counter updates (default is 10 seconds). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the background color as a hex number in the format: RRGGBB.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum>
</property>
- <property name="minimum">
- <number>5</number>
+ <property name="accelerated">
+ <bool>true</bool>
</property>
<property name="maximum">
- <number>86400</number>
- </property>
- <property name="singleStep">
- <number>10</number>
+ <number>16777215</number>
</property>
- <property name="value">
- <number>10</number>
+ <property name="displayIntegerBase">
+ <number>16</number>
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="checkBox_disabletrayicon">
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="lineEdit_icontheme">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-d&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--disable-tray-icon&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
-&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disable the system tray icon.&lt;/p&gt;&lt;p&gt;May be needed for system trays not compliant with the Freedesktop.org system tray specification.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Icon theme to use. For this theme to be used it must be installed on your system. If the theme is not installed, or if you spell the name wrong CMST will fall back to using its internal icon set.&lt;/p&gt;&lt;p&gt;If this box is blank CMST will try and use the system wide icon theme (if one is defined).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- <property name="text">
- <string>Disable Tray Icon</string>
+ <property name="clearButtonEnabled">
+ <bool>true</bool>
</property>
</widget>
</item>
- <item row="8" column="0">
- <widget class="QCheckBox" name="checkBox_counterkb">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disabled because currently Connman will accept this option but will do nothing with it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="checkBox_enablecounters">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the amount of data in KB that must be transmitted before the counters update (default is 1024 KB).&lt;/p&gt;&lt;p&gt;Connman will accept this entry, but according to a comment in the Connman code the actual feature still needs to be implemented and the selection is therefore disabled.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'monospace';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'monospace'; font-weight:600;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot; font-family:'monospace';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'monospace'; font-weight:600;&quot;&gt;--enable-counters&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Enable Connman RX and TX counters. Counters are experimental in Connman and enabling them will write a large amount of data to the system logs.&lt;/p&gt;&lt;p&gt;Counters are turned off by default, and is a change from the way it was originally. Up to and including version 2017.09.19 counters were enabled by default. All versions subsequent to that counters are disabled by default.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
- <string>Counter Update KB</string>
+ <string>Enable Counters</string>
</property>
</widget>
</item>
- <item row="7" column="1">
- <widget class="QSpinBox" name="spinBox_waittime">
- <property name="enabled">
- <bool>false</bool>
- </property>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="checkBox_disabletrayicon">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the wait time in seconds before starting the system tray icon (default is 0 seconds).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="buttonSymbols">
- <enum>QAbstractSpinBox::PlusMinus</enum>
- </property>
- <property name="minimum">
- <number>1</number>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-d&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--disable-tray-icon&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
+&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disable the system tray icon.&lt;/p&gt;&lt;p&gt;May be needed for system trays not compliant with the Freedesktop.org system tray specification.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- <property name="maximum">
- <number>60</number>
+ <property name="text">
+ <string>Disable Tray Icon</string>
</property>
</widget>
</item>
@@ -1298,16 +1412,17 @@
</property>
</widget>
</item>
- <item row="3" column="0">
- <widget class="QCheckBox" name="checkBox_systemicontheme">
+ <item row="10" column="0">
+ <widget class="QCheckBox" name="checkBox_faketranparency">
<property name="toolTip">
<string/>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-i&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--icon-theme&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Use an icon theme from your system. You may specify the theme in the box at the right, or if the box is left blank CMST will try and use the system wide icon theme (if one is defined).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--fake-transparency&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
+&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Used to work around a QT bug where system tray icons display with white or black backgrounds instead of being transparent.&lt;/p&gt;&lt;p&gt;You can specify the icon background color here. Format is a hex number in the form RRGGBB. If the spedified color matches the tray background we've effectively created fake transparency. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
- <string>Use Icon Theme</string>
+ <string>Fake Transparency</string>
</property>
</widget>
</item>
@@ -1322,123 +1437,79 @@
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QCheckBox" name="checkBox_enablecounters">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'monospace';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'monospace'; font-weight:600;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot; font-family:'monospace';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'monospace'; font-weight:600;&quot;&gt;--enable-counters&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Enable Connman RX and TX counters. Counters are experimental in Connman and enabling them will write a large amount of data to the system logs.&lt;/p&gt;&lt;p&gt;Counters are turned off by default, and is a change from the way it was originally. Up to and including version 2017.09.19 counters were enabled by default. All versions subsequent to that counters are disabled by default.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Enable Counters</string>
- </property>
- </widget>
- </item>
- <item row="9" column="0">
- <widget class="QCheckBox" name="checkBox_counterseconds">
- <property name="toolTip">
- <string/>
- </property>
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--counter-update-rate&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
-&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the frequency in seconds between counter updates (default is 10 seconds). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Counter Update Rate </string>
- </property>
- </widget>
- </item>
- <item row="10" column="0">
- <widget class="QCheckBox" name="checkBox_faketranparency">
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="checkBox_systemicontheme">
<property name="toolTip">
<string/>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--fake-transparency&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
-&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Used to work around a QT bug where system tray icons display with white or black backgrounds instead of being transparent.&lt;/p&gt;&lt;p&gt;You can specify the icon background color here. Format is a hex number in the form RRGGBB. If the spedified color matches the tray background we've effectively created fake transparency. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-i&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--icon-theme&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Use an icon theme from your system. You may specify the theme in the box at the right, or if the box is left blank CMST will try and use the system wide icon theme (if one is defined).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
- <string>Fake Transparency</string>
+ <string>Use Icon Theme</string>
</property>
</widget>
</item>
- <item row="10" column="1">
- <widget class="QSpinBox" name="spinBox_faketransparency">
+ <item row="9" column="1">
+ <widget class="QSpinBox" name="spinBox_counterrate">
<property name="enabled">
<bool>false</bool>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the background color as a hex number in the format: RRGGBB.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the frequency in seconds between counter updates (default is 10 seconds). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum>
</property>
- <property name="accelerated">
- <bool>true</bool>
+ <property name="minimum">
+ <number>5</number>
</property>
<property name="maximum">
- <number>16777215</number>
+ <number>86400</number>
</property>
- <property name="displayIntegerBase">
- <number>16</number>
+ <property name="singleStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>10</number>
</property>
</widget>
</item>
- <item row="3" column="1">
- <widget class="QLineEdit" name="lineEdit_icontheme">
+ <item row="8" column="0">
+ <widget class="QCheckBox" name="checkBox_counterkb">
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disabled because currently Connman will accept this option but will do nothing with it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Icon theme to use. For this theme to be used it must be installed on your system. If the theme is not installed, or if you spell the name wrong CMST will fall back to using its internal icon set.&lt;/p&gt;&lt;p&gt;If this box is blank CMST will try and use the system wide icon theme (if one is defined).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the amount of data in KB that must be transmitted before the counters update (default is 1024 KB).&lt;/p&gt;&lt;p&gt;Connman will accept this entry, but according to a comment in the Connman code the actual feature still needs to be implemented and the selection is therefore disabled.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- <property name="clearButtonEnabled">
- <bool>true</bool>
+ <property name="text">
+ <string>Counter Update KB</string>
</property>
</widget>
</item>
- <item row="12" column="0" colspan="2">
- <widget class="QGroupBox" name="groupBox_process">
+ <item row="5" column="0">
+ <widget class="QCheckBox" name="checkBox_disableminimized">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Programs or processes to execute after various events occur.&lt;/p&gt;&lt;p&gt;If the program or process requires command line arguments provide them here just as if you were typing at a command line.&lt;/p&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;/path/to/program arg1 arg2 arg3&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-M&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--disable-minimized&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Disable the minimize button. Use when you want to have the window manager have sole control of minimizing the interface.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- <property name="title">
- <string>External Programs</string>
+ <property name="text">
+ <string>Disable Minimized</string>
</property>
- <layout class="QGridLayout" name="gridLayout_11">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the program or process to be executed after Connman enters the &amp;quot;Ready&amp;quot; or &amp;quot;Online&amp;quot; state.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>After Connect</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="lineEdit_afterconnect">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the program or process to be executed after Connman enters the &amp;quot;Ready&amp;quot; or &amp;quot;Online&amp;quot; state.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="clearButtonEnabled">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
</widget>
</item>
- <item row="13" column="0">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="checkBox_disablevpn">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--disable-vpn&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Disable VPN. This will hide the VPN tab and will also skip trying to make a connection to connman-vpn. The later is useful if your Connman was built with the --disable-vpn feature.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
+ <property name="text">
+ <string>Disable VPN</string>
</property>
- </spacer>
+ </widget>
</item>
<item row="11" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
@@ -1494,186 +1565,196 @@
</layout>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="checkBox_disablevpn">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--disable-vpn&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Disable VPN. This will hide the VPN tab and will also skip trying to make a connection to connman-vpn. The later is useful if your Connman was built with the --disable-vpn feature.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Disable VPN</string>
+ <item row="7" column="1">
+ <widget class="QSpinBox" name="spinBox_waittime">
+ <property name="enabled">
+ <bool>false</bool>
</property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QCheckBox" name="checkBox_disableminimized">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;-M&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--disable-minimized&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Disable the minimize button. Use when you want to have the window manager have sole control of minimizing the interface.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Disable Minimized</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the wait time in seconds before starting the system tray icon (default is 0 seconds).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QGroupBox" name="groupBox_notifications">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="title">
- <string>Notifications</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_17">
- <item row="0" column="1">
- <widget class="QLabel" name="label_serverstatus">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <property name="buttonSymbols">
+ <enum>QAbstractSpinBox::PlusMinus</enum>
</property>
- <property name="text">
- <string>Server Status</string>
+ <property name="minimum">
+ <number>1</number>
</property>
- <property name="wordWrap">
- <bool>true</bool>
+ <property name="maximum">
+ <number>60</number>
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QCheckBox" name="checkBox_notifydaemon">
- <property name="enabled">
- <bool>true</bool>
+ <item row="9" column="0">
+ <widget class="QCheckBox" name="checkBox_counterseconds">
+ <property name="toolTip">
+ <string/>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the system desktop notification daemon will popup a notify message when a significant connman related event is received.&lt;/p&gt;&lt;p&gt;Notifications can be handled by the System Tray Icon, or by a Notification daemon if one is installed. Both can not be active at the same time.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;--counter-update-rate&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
+&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the frequency in seconds between counter updates (default is 10 seconds). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
- <string>Notification Daemon</string>
+ <string>Counter Update Rate </string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QGroupBox" name="groupBox_preferencesinterface">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Preferences for the interface are in this box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="title">
- <string>Interface</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_12">
- <item row="3" column="0" colspan="2">
- <widget class="QCheckBox" name="checkBox_resetcounters">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Normally counters are cumulative and will retain the connect time and the TX and RX counts between boots. &lt;/p&gt;&lt;p&gt;When this box is checked the counters will reset to zero every time CMST is started, and if CMST is running everytime a Connman service is started. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Reset Counters</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QCheckBox" name="checkBox_advanced">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked additional controls for advanced users are displayed.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Advanced Controls</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="0" colspan="2">
- <widget class="QCheckBox" name="checkBox_usestartoptions">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the Start Options set here will be read and used next time the program starts. &lt;/p&gt;&lt;p&gt;Settings are stored in&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;: ~&lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-weight:600;&quot;&gt;/.config/cmst/cmst.conf &lt;/span&gt;&lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;&lt;br/&gt;This is a standard ini type text file.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Use Start Options</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QCheckBox" name="checkBox_retainstate">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the state of the GUI will be restored from settings saved on disk. Settings include the geometry and position of the dialog and the current tab. &lt;/p&gt;&lt;p&gt;These settings will be used at next boot to restore the user interface to the way it was at shutdown.&lt;/p&gt;&lt;p&gt;The settings file is: ~&lt;span style=&quot; font-weight:600;&quot;&gt;/.config/cmst/cmst.conf &lt;/span&gt;&lt;br/&gt;This is a standard ini type text file.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Retain State</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QCheckBox" name="checkBox_enableinterfacetooltips">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the display of tooltips will be enabled for the interface widgets.&lt;/p&gt;&lt;p&gt;Tooltips are the small popups that appear when you hover the mouse pointer over an area of the interface. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Enable ToolTips (Interface)</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_8">
- <item>
- <widget class="QLineEdit" name="lineEdit_colorize">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
+ <item row="3" column="1">
+ <layout class="QVBoxLayout" name="verticalLayout_14">
+ <item>
+ <widget class="QGroupBox" name="groupBox_process">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Programs or processes to execute after various events occur.&lt;/p&gt;&lt;p&gt;If the program or process requires command line arguments provide them here just as if you were typing at a command line. Example:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;/path/to/program arg1 arg2 arg3&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Two events are checked. &lt;span style=&quot; font-weight:600;&quot;&gt;Before Connecting&lt;/span&gt; events are called after the Connect button is pressed in either the Wireless or VPN tabs. The program or process in the Execute box will only be executed prior to making a connection for the service shown in the Service box. It will not be called when connecting to any other service.&lt;/p&gt;&lt;p&gt;The program or process in the &lt;span style=&quot; font-weight:600;&quot;&gt;After Connecting&lt;/span&gt; box will be called after Connman enters the ready or online state.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="title">
+ <string>External Programs</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_11">
+ <item row="0" column="0" colspan="2">
+ <widget class="QGroupBox" name="groupBox">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Color in #RGB format to colorize the internal icons with.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This area is to specify a program or process to run after a wifi or vpn service button is pressed, but before the connect method is sent to ConnMan. This is mainly used to modify a .cmst.config file which seems useful to modify certain short lived entries for openConnect vpn connections.&lt;/p&gt;&lt;p&gt;The program or process in the &lt;span style=&quot; font-weight:600;&quot;&gt;Execute&lt;/span&gt; box will only be executed prior to making a connection for the single service shown in the &lt;span style=&quot; font-weight:600;&quot;&gt;Service&lt;/span&gt; box. It will not be called when connecting to any other service. If a .cmst.config file is to be modified a check must in the &lt;span style=&quot; font-weight:600;&quot;&gt;Modify Service File&lt;/span&gt; box and the path and name of the file to be modified must be provided.&lt;/p&gt;&lt;p&gt;To modify a .cmst.config file CMST will read stdout of the program or process being called. Program output should be individual lines in KEY=VALUE format. If KEY exists in the .cmst.config file it will be replaced by the new VALUE. If KEY does not exist it will be appended. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
- <property name="clearButtonEnabled">
- <bool>true</bool>
+ <property name="title">
+ <string>Before Connecting</string>
</property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="1" column="1" colspan="2">
+ <widget class="QLineEdit" name="lineEdit_beforeconnect">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the program or process to be executed before Connman initiates a connection to the service listed in the box above. If left blank no program or process will be executed.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Execute:</string>
+ </property>
+ <property name="buddy">
+ <cstring>lineEdit_beforeconnect</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QComboBox" name="comboBox_beforeconnectserviceslist">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="whatsThis">
+ <string>Specify the service you are connecting to where you want a program or process to execute prior to initiating the connection.</string>
+ </property>
+ <property name="text">
+ <string>Service:</string>
+ </property>
+ <property name="buddy">
+ <cstring>comboBox_beforeconnectserviceslist</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <layout class="QVBoxLayout" name="verticalLayout_13">
+ <item>
+ <widget class="QCheckBox" name="checkBox_modifyservicefile">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the configuration file shown below will be modified by whatever output the program provides.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Modify Service File</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_10">
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="whatsThis">
+ <string>Service configuration file to be modified by the program.</string>
+ </property>
+ <property name="text">
+ <string>FIle: </string>
+ </property>
+ <property name="buddy">
+ <cstring>comboBox_beforeconnectservicefile</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboBox_beforeconnectservicefile">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
</widget>
</item>
- <item>
- <widget class="QToolButton" name="toolButton_colorize">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open the color selection dialog. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Enter the program or process to be executed after Connman enters the &lt;span style=&quot; font-weight:600;&quot;&gt;Ready&lt;/span&gt; or &lt;span style=&quot; font-weight:600;&quot;&gt;Online&lt;/span&gt; state. If left blank no program or process will be executed.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
- <string>...</string>
+ <string>After Connecting</string>
</property>
- <property name="arrowType">
- <enum>Qt::UpArrow</enum>
+ <property name="buddy">
+ <cstring>lineEdit_afterconnect</cstring>
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Internal icons can be colorized. You may select a color using the button to the left, or you may type in the #RGB color yourself.&lt;/p&gt;&lt;p&gt;If you type the entry it must have leading # sign. Example: #22aa44 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Colorize</string>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="lineEdit_afterconnect">
+ <property name="clearButtonEnabled">
+ <bool>true</bool>
</property>
</widget>
</item>
+ <item row="2" column="0" colspan="2">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
- </item>
- </layout>
- </widget>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
@@ -1775,7 +1856,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>537</width>
+ <width>597</width>
<height>466</height>
</rect>
</property>
@@ -1943,32 +2024,16 @@
<connection>
<sender>checkBox_advanced</sender>
<signal>clicked(bool)</signal>
- <receiver>groupBox_process</receiver>
- <slot>setVisible(bool)</slot>
- <hints>
- <hint type="sourcelabel">
- <x>80</x>
- <y>193</y>
- </hint>
- <hint type="destinationlabel">
- <x>508</x>
- <y>512</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>checkBox_advanced</sender>
- <signal>clicked(bool)</signal>
<receiver>pushButton_vpn_editor</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>134</x>
- <y>198</y>
+ <x>157</x>
+ <y>-59</y>
</hint>
<hint type="destinationlabel">
- <x>246</x>
- <y>601</y>
+ <x>245</x>
+ <y>619</y>
</hint>
</hints>
</connection>
@@ -1979,8 +2044,8 @@
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>79</x>
- <y>202</y>
+ <x>102</x>
+ <y>-59</y>
</hint>
<hint type="destinationlabel">
<x>149</x>
@@ -1995,8 +2060,8 @@
<slot>trigger()</slot>
<hints>
<hint type="sourcelabel">
- <x>82</x>
- <y>291</y>
+ <x>117</x>
+ <y>312</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
@@ -2011,8 +2076,8 @@
<slot>trigger()</slot>
<hints>
<hint type="sourcelabel">
- <x>85</x>
- <y>442</y>
+ <x>126</x>
+ <y>489</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
@@ -2027,8 +2092,8 @@
<slot>trigger()</slot>
<hints>
<hint type="sourcelabel">
- <x>173</x>
- <y>442</y>
+ <x>212</x>
+ <y>489</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
@@ -2043,12 +2108,12 @@
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>486</x>
- <y>270</y>
+ <x>501</x>
+ <y>-2</y>
</hint>
<hint type="destinationlabel">
<x>632</x>
- <y>272</y>
+ <y>0</y>
</hint>
</hints>
</connection>
@@ -2059,8 +2124,8 @@
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>182</x>
- <y>92</y>
+ <x>205</x>
+ <y>-167</y>
</hint>
<hint type="destinationlabel">
<x>492</x>
@@ -2075,12 +2140,12 @@
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>475</x>
- <y>181</y>
+ <x>501</x>
+ <y>-85</y>
</hint>
<hint type="destinationlabel">
<x>632</x>
- <y>182</y>
+ <y>-84</y>
</hint>
</hints>
</connection>
@@ -2092,11 +2157,11 @@
<hints>
<hint type="sourcelabel">
<x>501</x>
- <y>360</y>
+ <y>88</y>
</hint>
<hint type="destinationlabel">
<x>632</x>
- <y>362</y>
+ <y>90</y>
</hint>
</hints>
</connection>
@@ -2108,11 +2173,11 @@
<hints>
<hint type="sourcelabel">
<x>501</x>
- <y>300</y>
+ <y>28</y>
</hint>
<hint type="destinationlabel">
<x>632</x>
- <y>302</y>
+ <y>30</y>
</hint>
</hints>
</connection>
@@ -2124,11 +2189,11 @@
<hints>
<hint type="sourcelabel">
<x>501</x>
- <y>330</y>
+ <y>58</y>
</hint>
<hint type="destinationlabel">
<x>632</x>
- <y>332</y>
+ <y>60</y>
</hint>
</hints>
</connection>
@@ -2143,8 +2208,8 @@
<y>-1</y>
</hint>
<hint type="destinationlabel">
- <x>600</x>
- <y>64</y>
+ <x>642</x>
+ <y>106</y>
</hint>
</hints>
</connection>
@@ -2155,8 +2220,8 @@
<slot>trigger()</slot>
<hints>
<hint type="sourcelabel">
- <x>329</x>
- <y>83</y>
+ <x>369</x>
+ <y>97</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
@@ -2175,8 +2240,8 @@
<y>-1</y>
</hint>
<hint type="destinationlabel">
- <x>55</x>
- <y>151</y>
+ <x>70</x>
+ <y>134</y>
</hint>
</hints>
</connection>
@@ -2187,8 +2252,8 @@
<slot>trigger()</slot>
<hints>
<hint type="sourcelabel">
- <x>600</x>
- <y>66</y>
+ <x>642</x>
+ <y>106</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
@@ -2203,8 +2268,8 @@
<slot>trigger()</slot>
<hints>
<hint type="sourcelabel">
- <x>55</x>
- <y>151</y>
+ <x>70</x>
+ <y>134</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
@@ -2212,5 +2277,37 @@
</hint>
</hints>
</connection>
+ <connection>
+ <sender>checkBox_modifyservicefile</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>comboBox_beforeconnectservicefile</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>384</x>
+ <y>349</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>452</x>
+ <y>373</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBox_advanced</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>groupBox_process</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>103</x>
+ <y>-59</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>610</x>
+ <y>444</y>
+ </hint>
+ </hints>
+ </connection>
</connections>
</ui>
diff --git a/apps/cmstapp/code/counter/counter.cpp b/apps/cmstapp/code/counter/counter.cpp
index 5f82120..20a95a1 100644
--- a/apps/cmstapp/code/counter/counter.cpp
+++ b/apps/cmstapp/code/counter/counter.cpp
@@ -3,7 +3,7 @@
Code for the connection counter registered on DBus. When registered the
connman daemon will communicate to this object with signals.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/counter/counter.h b/apps/cmstapp/code/counter/counter.h
index fcb132b..1f8ae70 100644
--- a/apps/cmstapp/code/counter/counter.h
+++ b/apps/cmstapp/code/counter/counter.h
@@ -3,7 +3,7 @@
Code for the connection counter registered on DBus. When registered the
connman daemon will communicate to this object with signals.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/gen_conf_ed/gen_conf_ed.cpp b/apps/cmstapp/code/gen_conf_ed/gen_conf_ed.cpp
new file mode 100644
index 0000000..34963e9
--- /dev/null
+++ b/apps/cmstapp/code/gen_conf_ed/gen_conf_ed.cpp
@@ -0,0 +1,242 @@
+/****************** gen_conf_ed.cpp ***********************************
+
+Code to edit already existing config files
+
+Copyright (C) 2016-2020
+by: Andrew J. Bibb
+License: MIT
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"),to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+***********************************************************************/
+
+# include <QtCore/QDebug>
+# include <QDBusMessage>
+# include <QDBusConnection>
+# include <QDBusInterface>
+# include <QMessageBox>
+# include <QVariant>
+# include <QFileInfo>
+
+# include "./gen_conf_ed.h"
+# include "../resource.h"
+# include "./code/trstring/tr_strings.h"
+
+// Function to execute a process which may modify a /cmst/config file
+// in /var/lib/connman or /var/lib/connman-vpn. It will send a finished(int)
+// signal when completed. Exit codes:
+// negative number = this function never really executed
+// 0 = everything completed normally
+// 1 = one of the DBUS calls failed to complete
+// 2 = the external process failed to start
+// 3 = the external process returned a nonzero exit code
+//
+// Constructor
+GEN_Editor::GEN_Editor(QWidget* parent) : QWidget(parent)
+{
+
+ // data members
+ filename.clear();
+ path.clear();
+ process.clear();
+ args.clear();
+ filecontents.clear();
+ proc = NULL;
+
+ // signals and slots
+ connect(this, SIGNAL(readCompleted()), this, SLOT(executeProcess()));
+
+ return;
+ }
+
+////////////////////////////////////////////// Public Functions /////////////////////////////////////////
+//
+// Function to start the process rolling
+void GEN_Editor::editInPlace(const QString& fn, const QString& ps, const QStringList& ag)
+{
+
+ // store variables
+ filename = fn;
+ process = ps;
+ args = ag;
+
+ // Start things off. Once started it just keeps going. DBUS calls are asyncronous so most
+ // everhthing is called from signals connected to slots.
+ this->readFile();
+
+ return;
+}
+
+
+////////////////////////////////////////////// Private Functions /////////////////////////////////////////
+//
+// Function to read the config file.
+void GEN_Editor::readFile()
+{
+
+ // this class only deals with config files in /var/lib/connman or /var/lib/commman-vpn
+ if (filename.isEmpty()) return;
+ path = "/var/lib/connman";
+ if (! QFileInfo::exists(path + "/" + filename) ) {
+ path.append("-vpn");
+ if (! QFileInfo::exists(path + "/" + filename)) return;
+ }
+
+ QDBusInterface* iface_rf1 = new QDBusInterface("org.cmst.roothelper", "/", "org.cmst.roothelper", QDBusConnection::systemBus(), this);
+ QList<QVariant> vlist;
+
+ vlist.clear();
+ vlist << QVariant::fromValue(path);
+ vlist << QVariant::fromValue(filename);
+ iface_rf1->callWithCallback(QLatin1String("readFile"), vlist, this, SLOT(storeContents(const QString&)), SLOT(callbackErrorHandler(QDBusError)));
+ iface_rf1->deleteLater();
+
+ return;
+}
+
+//
+// Function to write the config file
+void GEN_Editor::writeFile()
+{
+ QDBusInterface* iface_wf1 = new QDBusInterface("org.cmst.roothelper", "/", "org.cmst.roothelper", QDBusConnection::systemBus(), this);
+ QList<QVariant> vlist;
+
+ vlist.clear();
+ vlist << QVariant::fromValue(path);
+ vlist << QVariant::fromValue(filename);
+ vlist << QVariant::fromValue(filecontents.join('\n'));
+ iface_wf1->callWithCallback(QLatin1String("saveFile"), vlist, this, SLOT(writeCompleted(qint64)), SLOT(callbackErrorHandler(QDBusError)));
+ iface_wf1->deleteLater();
+
+ return;
+}
+
+/////////////////////////////////////////////// Private Slots /////////////////////////////////////////////
+//
+// Slot to store the contenents of a file as a string
+void GEN_Editor::storeContents(const QString& data)
+{
+ // store the filecontents
+ filecontents = data.split('\n');
+ emit readCompleted();
+
+ return;
+}
+
+//
+// Slot to execute the process.
+void GEN_Editor::executeProcess()
+{
+ proc = new QProcess(this);
+ proc->start(process, args);
+ if (! proc->waitForStarted() ) {
+ emit finished(2);
+ return;
+ }
+
+ connect (proc, SIGNAL(finished(int)), this, SLOT(processExitCode(int)));
+
+ return;
+
+}
+
+//
+// Slot to process the return codes from executeProcess
+void GEN_Editor::processExitCode(int exitcode)
+{
+ if (exitcode == 0) {
+ changed = QString(proc->readAll()).split('\n');
+ editBuffer();
+ }
+ else
+ emit (finished(3));
+
+ return;
+}
+
+
+//
+// Slot to edit the buffer containing the contents of the config file. Connected to processExitCode() function
+void GEN_Editor::editBuffer()
+{
+ if (changed.size() > 0 ) {
+ for (int i = 0; i < filecontents.size(); ++i) {
+ if (filecontents.at(i).size() == 0) {
+ filecontents.removeAt(i);
+ continue;
+ }
+ for (int j = 0; j < changed.size(); ++j) {
+ if (changed.at(j).size() == 0) {
+ changed.removeAt(j);
+ continue;
+ }
+ if(filecontents.at(i).split('=').at(0).simplified() == changed.at(j).split('=').at(0).simplified()) {
+ filecontents.removeAt(i);
+ filecontents.insert(i, changed.at(j));
+ changed.removeAt(j);
+ } // if
+ }// j for
+ } // i for
+ if (changed.size() > 0) filecontents.append(changed);
+
+ this->writeFile();
+ } // if we changed something
+
+ else emit finished(0);
+
+ return;
+}
+
+//
+//
+void GEN_Editor::writeCompleted(qint64 bytes)
+{
+ // create message showing the results of the write
+ // we may or may not display it.
+ QString msg;
+
+ if (bytes < 0 )
+ msg = tr("File save failed.");
+ else {
+ if (bytes > 1024)
+ msg = tr("%L1 KB written").arg(bytes / 1024);
+ else
+ msg = tr("%L1 Bytes written").arg(bytes);
+ }
+
+ emit finished(0);
+
+ return;
+}
+
+//
+// Slot to handle errors from callWithCallback functions
+void GEN_Editor::callbackErrorHandler(QDBusError err)
+{
+ QMessageBox::critical(this,
+ QString(TranslateStrings::cmtr("cmst")) + tr(" Critical"),
+ QString(tr("<b>DBus Error Name:</b> %1<br><br><b>String:</b> %2<br><br><b>Message:</b> %3")).arg(err.name()).arg(err.errorString(err.type())).arg(TranslateStrings::cmtr(err.message()) ),
+ QMessageBox::Ok,
+ QMessageBox::Ok);
+
+ emit finished(1);
+
+ return;
+}
+
+
diff --git a/apps/cmstapp/code/gen_conf_ed/gen_conf_ed.h b/apps/cmstapp/code/gen_conf_ed/gen_conf_ed.h
new file mode 100644
index 0000000..0077dc2
--- /dev/null
+++ b/apps/cmstapp/code/gen_conf_ed/gen_conf_ed.h
@@ -0,0 +1,75 @@
+/**************************** gen_conf_ed.h ***************************
+
+Code to edit already existing config files
+
+Copyright (C) 2016-2020
+by: Andrew J. Bibb
+License: MIT
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"),to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+***********************************************************************/
+
+# ifndef GEN_CONFIG_EDITOR_H
+# define GEN_CONFIG_EDITOR_H
+
+# include <QWidget>
+# include <QString>
+# include <QStringList>
+# include <QtDBus/QtDBus>
+
+
+// Class to edit already existing config files in place
+class GEN_Editor : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ GEN_Editor(QWidget*);
+ void editInPlace(const QString&, const QString&, const QStringList&);
+
+ private:
+ // members
+ QStringList filecontents;
+ QString filename;
+ QString path;
+ QString process;
+ QStringList args;
+ QStringList changed;
+ QProcess* proc;
+
+ //functions
+ void readFile();
+ void writeFile();
+
+ private slots:
+ void storeContents(const QString&);
+ void executeProcess();
+ void processExitCode(int);
+ void editBuffer();
+ void writeCompleted(qint64);
+ void callbackErrorHandler(QDBusError);
+
+ signals:
+ void readCompleted();
+ void finished(int exitcode = -1);
+
+};
+
+
+#endif
diff --git a/apps/cmstapp/code/iconman/iconman.cpp b/apps/cmstapp/code/iconman/iconman.cpp
index f020a61..de53cdd 100644
--- a/apps/cmstapp/code/iconman/iconman.cpp
+++ b/apps/cmstapp/code/iconman/iconman.cpp
@@ -3,7 +3,7 @@
Class to manage icons and allow the user to provide substitutions based
on the the system theme.
-Copyright (C) 2015-2019
+Copyright (C) 2015-2020
by: Andrew J. Bibb
License: MIT
@@ -40,6 +40,7 @@ DEALINGS IN THE SOFTWARE.
# include <QMessageBox>
# include <QProcessEnvironment>
# include <QDirIterator>
+# include <QtGlobal>
// Constructor
IconManager::IconManager(QObject* parent) : QObject(parent)
@@ -72,22 +73,27 @@ IconManager::IconManager(QObject* parent) : QObject(parent)
QTextStream in(&f1);
QString line;
while (!in.atEnd()) {
- line = in.readLine();
- line = line.simplified();
- if (line.startsWith("[icon]", Qt::CaseInsensitive) ) {
- IconElement ie;
- QString iconame;
- do {
- line = in.readLine();
- if (line.startsWith("icon_name", Qt::CaseInsensitive) ) iconame = extractValue(line);
- else if (line.startsWith("resource", Qt::CaseInsensitive) ) ie.resource_path = extractValue(line);
- else if (line.startsWith("colorize", Qt::CaseInsensitive) ) ie.colorize = extractValue(line);
- else if (line.startsWith("fdo_name", Qt::CaseInsensitive) ) ie.fdo_name = extractValue(line);
- else if (line.startsWith("theme_names", Qt::CaseInsensitive) ) ie.theme_names = extractValue(line).split(',', QString::SkipEmptyParts) ;
- } while ( ! line.isEmpty() );
- icon_map[iconame] = ie;
- } // if [icon]
- } // while not atEnd()
+ line = in.readLine();
+ line = line.simplified();
+ if (line.startsWith("[icon]", Qt::CaseInsensitive) ) {
+ IconElement ie;
+ QString iconame;
+ do {
+ line = in.readLine();
+ if (line.startsWith("icon_name", Qt::CaseInsensitive) ) iconame = extractValue(line);
+ else if (line.startsWith("resource", Qt::CaseInsensitive) ) ie.resource_path = extractValue(line);
+ else if (line.startsWith("colorize", Qt::CaseInsensitive) ) ie.colorize = extractValue(line);
+ else if (line.startsWith("fdo_name", Qt::CaseInsensitive) ) ie.fdo_name = extractValue(line);
+ else if (line.startsWith("theme_names", Qt::CaseInsensitive) )
+ #if QT_VERSION >= 0x050e00
+ ie.theme_names = extractValue(line).split(',', Qt::SkipEmptyParts) ;
+ #else
+ ie.theme_names = extractValue(line).split(',', QString::SkipEmptyParts) ;
+ #endif
+ } while ( ! line.isEmpty() );
+ icon_map[iconame] = ie;
+ } // if [icon]
+ } // while not atEnd()
f1.close();
return;
@@ -267,11 +273,11 @@ QString IconManager::getFallback(const QString& name)
QFile f0(qrc);
if (!f0.open(QIODevice::ReadOnly | QIODevice::Text)) {
#if QT_VERSION >= 0x050400
- qCritical("Error opening resource file: %s", qUtf8Printable(qrc) );
+ qCritical("Error opening resource file: %s", qUtf8Printable(qrc) );
#else
- qCritical("Error opening resource file: %s", qPrintable(qrc) );
+ qCritical("Error opening resource file: %s", qPrintable(qrc) );
#endif
- return rtnstr;
+ return rtnstr;
}
// Look for icon in the resource file and extract the resource value
diff --git a/apps/cmstapp/code/iconman/iconman.h b/apps/cmstapp/code/iconman/iconman.h
index be45596..cad7f65 100644
--- a/apps/cmstapp/code/iconman/iconman.h
+++ b/apps/cmstapp/code/iconman/iconman.h
@@ -3,7 +3,7 @@
Class to manage icons and allow the user to provide substitutions based
on the the system theme.
-Copyright (C) 2015-2019
+Copyright (C) 2015-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/main.cpp b/apps/cmstapp/code/main.cpp
index 461199d..d37c187 100755
--- a/apps/cmstapp/code/main.cpp
+++ b/apps/cmstapp/code/main.cpp
@@ -2,7 +2,7 @@
C++ main routine.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/notify/notify.cpp b/apps/cmstapp/code/notify/notify.cpp
index e455468..818eb3a 100644
--- a/apps/cmstapp/code/notify/notify.cpp
+++ b/apps/cmstapp/code/notify/notify.cpp
@@ -3,7 +3,7 @@
Code for a notify client to interface with a desktop notification
server.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -33,6 +33,7 @@ DEALINGS IN THE SOFTWARE.
# include <QPixmap>
# include <QTemporaryFile>
# include <QFile>
+# include <QtGlobal>
# include "./notify.h"
@@ -60,8 +61,8 @@ NotifyClient::NotifyClient(QObject* parent)
if (! QDBusConnection::sessionBus().isConnected() )
qCritical("CMST - Cannot connect to the session bus.");
- // Signals and slots
- connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(cleanUp()));
+ // Signals and slots
+ connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(cleanUp()));
return;
}
@@ -82,7 +83,7 @@ void NotifyClient::connectToServer()
getCapabilities();
QDBusConnection::sessionBus().connect(DBUS_NOTIFY_SERVICE, DBUS_NOTIFY_PATH, DBUS_NOTIFY_INTERFACE, "NotificationClosed", this, SLOT(notificationClosed(quint32, quint32)));
QDBusConnection::sessionBus().connect(DBUS_NOTIFY_SERVICE, DBUS_NOTIFY_PATH, DBUS_NOTIFY_INTERFACE, "ActionInvoked", this, SLOT(actionInvoked(quint32, QString)));
- } // if connection is valid
+ } // if connection is valid
else {
notifyclient->deleteLater();
b_validconnection = false;
@@ -98,7 +99,7 @@ void NotifyClient::init()
s_icon.clear();
i_urgency = Nc::UrgencyNormal;
i_expire_timeout = -1;
- b_overwrite = true;
+ b_overwrite = false;
return;
}
@@ -173,47 +174,47 @@ void NotifyClient::sendNotification ()
// process the icon, if we are using a fallback icon create a temporary file to hold it
QTemporaryFile* tempfileicon = NULL;
if (! s_icon.isEmpty() ) {
- if (QFile::exists(s_icon) ) {
- tempfileicon = new QTemporaryFile(this);
- tempfileicon->setAutoRemove(false);
- if (tempfileicon->open() ) {
- QPixmap px = QPixmap(s_icon);
- px.save(tempfileicon->fileName(),"PNG");
- app_icon = tempfileicon->fileName().prepend("file://");
- } // if tempfileicon could be opened
- } // if s_icon exists as a disk file
+ if (QFile::exists(s_icon) ) {
+ tempfileicon = new QTemporaryFile(this);
+ tempfileicon->setAutoRemove(false);
+ if (tempfileicon->open() ) {
+ QPixmap px = QPixmap(s_icon);
+ px.save(tempfileicon->fileName(),"PNG");
+ app_icon = tempfileicon->fileName().prepend("file://");
+ } // if tempfileicon could be opened
+ } // if s_icon exists as a disk file
- // assume s_icon exists as a theme icon, don't check it here. That
- // check needs to be done in the calling program.
- else app_icon = s_icon;
- } // if s_icon is not empty
-
- QDBusReply<quint32> reply = notifyclient->call(QLatin1String("Notify"), app_name, replaces_id, app_icon, summary, body, actions, hints, expire_timeout);
+ // assume s_icon exists as a theme icon, don't check it here. That
+ // check needs to be done in the calling program.
+ else app_icon = s_icon;
+ } // if s_icon is not empty
+ QDBusReply<quint32> reply = notifyclient->call(QLatin1String("Notify"), app_name, replaces_id, app_icon, summary, body, actions, hints, expire_timeout);
if (reply.isValid() ) {
- current_id = reply.value();
+ current_id = reply.value();
if (file_map.contains(current_id) && tempfileicon != NULL) {
- if (b_overwrite) {
- file_map.value(current_id)->remove();
- delete file_map.value(current_id);
- file_map.remove(current_id);
- } // if
- else {
- tempfileicon->remove();
- delete tempfileicon;
- tempfileicon = NULL;
- } // else
- } // if contains current_id and not NULL
- if (tempfileicon != NULL) file_map[current_id] = tempfileicon;
- } // if reply is valid
+ if (b_overwrite) {
+ file_map.value(current_id)->remove();
+ delete file_map.value(current_id);
+ file_map.remove(current_id);
+ } // if
+ else {
+ tempfileicon->remove();
+ delete tempfileicon;
+ tempfileicon = NULL;
+ } // else
+ } // if contains current_id and not NULL
+ if (tempfileicon != NULL) file_map[current_id] = tempfileicon;
+ } // if reply is valid
- else
- #if QT_VERSION >= 0x050400
- qCritical("CMST - Error reply received to the Notify method: %s", qUtf8Printable(reply.error().message()) );
+ else {
+ #if QT_VERSION >= 0x050400
+ qCritical("CMST - Error reply received to the Notify method: %s", qUtf8Printable(reply.error().message()) );
#else
qCritical("CMST - Error reply received to the Notify method: %s", qPrintable(reply.error().message()) );
#endif
-
+ }
+
return;
}
diff --git a/apps/cmstapp/code/notify/notify.h b/apps/cmstapp/code/notify/notify.h
index caacc02..05f9782 100644
--- a/apps/cmstapp/code/notify/notify.h
+++ b/apps/cmstapp/code/notify/notify.h
@@ -3,7 +3,7 @@
Code for a notify client to interface with a desktop notification
server.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/peditor/peditor.cpp b/apps/cmstapp/code/peditor/peditor.cpp
index 474586e..9a5184d 100644
--- a/apps/cmstapp/code/peditor/peditor.cpp
+++ b/apps/cmstapp/code/peditor/peditor.cpp
@@ -2,7 +2,7 @@
Code to manage the Properties Editor dialog.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -45,46 +45,40 @@ PropertiesEditor::PropertiesEditor(QWidget* parent, const arrayElement& ae)
objpath = ae.objpath;
objmap = ae.objmap;
sl_ipv4_method << "dhcp" << "manual" << "off";
- sl_ipv6_method << "auto" << "manual" << "off";
- sl_ipv6_privacy << "disabled" << "enabled" << "prefered"; // misspelling prefered is necessary
- sl_proxy_method << "direct" << "auto" << "manual";
-
- // connect signals to slots
+ sl_ipv6_method << "auto" << "manual" << "off";
+ sl_ipv6_privacy << "disabled" << "enabled" << "prefered"; // misspelling prefered is necessary
+ sl_proxy_method << "direct" << "auto" << "manual";
+
+ // connect signals to slots
connect(ui.toolButton_whatsthis, SIGNAL(clicked()), this, SLOT(showWhatsThis()));
connect(ui.pushButton_resetpage, SIGNAL(clicked()), this, SLOT(resetPage()));
connect(ui.pushButton_resetall, SIGNAL(clicked()), this, SLOT(resetAll()));
connect(ui.pushButton_ok, SIGNAL(clicked()), this, SLOT(updateConfiguration()));
connect(ui.comboBox_ipv4method, SIGNAL(currentIndexChanged(int)), this, SLOT(ipv4Method(int)));
-
- // Setup comboboxes
- ui.comboBox_ipv4method->addItems(TranslateStrings::cmtr_sl(sl_ipv4_method) );
- ui.comboBox_ipv6method->addItems(TranslateStrings::cmtr_sl(sl_ipv6_method) );
- ui.comboBox_ipv6privacy->addItems(TranslateStrings::cmtr_sl(sl_ipv6_privacy) );
- ui.comboBox_proxymethod->addItems(TranslateStrings::cmtr_sl(sl_proxy_method) );
-
- // Setup the address validator and apply it to any ui QLineEdit.
- // The lev validator will validate an IP address or up to one white space character (to allow
- // editing of the line edit).
- const QString s_ip4 = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])";
- const QString s_ip6 = "(?:[0-9a-fA-F]{1,4})";
- const QString s_dom = "((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}";
-
- // QLineEdits that allow single address
- QRegularExpression rx4("\\s?|^" + s_ip4 + "(?:\\." + s_ip4 + "){3}" + "$");
- QRegularExpression rx6("\\s?|^" + s_ip6 + "(?::" + s_ip6 + "){7}" + "$");
- QRegularExpressionValidator* lev_4 = new QRegularExpressionValidator(rx4, this);
- QRegularExpressionValidator* lev_6 = new QRegularExpressionValidator(rx6, this);
- ui.lineEdit_ipv4address->setValidator(lev_4);
- ui.lineEdit_ipv4netmask->setValidator(lev_4);
- ui.lineEdit_ipv4gateway->setValidator(lev_4);
- ui.lineEdit_ipv6address->setValidator(lev_6);
- ui.lineEdit_ipv6gateway->setValidator(lev_6);
-
- // now QLineEdits that allow multiple addresses
- QRegularExpression rx46d("\\s?|((" + s_ip4 + "(?:\\." + s_ip4 + "){3}|"+ s_ip6 + "(?::" + s_ip6 + "){7}|" + s_dom + ")(\\s*[,|;|\\s]\\s*))+");
- QRegularExpressionValidator* lev_m = new QRegularExpressionValidator(rx46d, this);
- ui.lineEdit_nameservers->setValidator(lev_m);
- ui.lineEdit_timeservers->setValidator(lev_m);
+
+ // Setup comboboxes
+ ui.comboBox_ipv4method->addItems(TranslateStrings::cmtr_sl(sl_ipv4_method) );
+ ui.comboBox_ipv6method->addItems(TranslateStrings::cmtr_sl(sl_ipv6_method) );
+ ui.comboBox_ipv6privacy->addItems(TranslateStrings::cmtr_sl(sl_ipv6_privacy) );
+ ui.comboBox_proxymethod->addItems(TranslateStrings::cmtr_sl(sl_proxy_method) );
+
+ // Using the ValidatingDialog only to obtain the validator. This
+ // allows all the validating code to be in a single location.
+ // QLineEdits (validated) that allow single address
+ shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
+ vd->setValidator(CMST::ValDialog_IPv4);
+ ui.lineEdit_ipv4address->setValidator(vd->getValidator() );
+ ui.lineEdit_ipv4netmask->setValidator(vd->getValidator() );
+ ui.lineEdit_ipv4gateway->setValidator(vd->getValidator() );
+ vd->setValidator(CMST::ValDialog_IPv6);
+ ui.lineEdit_ipv6address->setValidator(vd->getValidator() );
+ ui.lineEdit_ipv6gateway->setValidator(vd->getValidator() );
+
+ // now QLineEdits (validated) that allow multiple addresses
+ vd->setValidator(CMST::ValDialog_46, true);
+ ui.lineEdit_nameservers->setValidator(vd->getValidator() );
+ ui.lineEdit_timeservers->setValidator(vd->getValidator() );
+ vd->deleteLater();
// initialize and populate submaps
ipv4map.clear();
@@ -115,30 +109,33 @@ PropertiesEditor::PropertiesEditor(QWidget* parent, const arrayElement& ae)
ui.spinBox_ipv6prefixlength->setValue(ipv6map.value("PrefixLength").toUInt() );
ui.lineEdit_ipv6address->setText(ipv6map.value("Address").toString() );
ui.lineEdit_ipv6gateway->setText(ipv6map.value("Gateway").toString() );
- if (! ipv6map.value("Privacy").toString().isEmpty() ) {
- ui.comboBox_ipv6privacy->setCurrentIndex(sl_ipv6_privacy.indexOf(QRegularExpression(ipv6map.value("Privacy").toString())) );
+ if (! ipv6map.value("Privacy").toString().isEmpty() ) {
+ ui.comboBox_ipv6privacy->setCurrentIndex(sl_ipv6_privacy.indexOf(QRegularExpression(ipv6map.value("Privacy").toString())) );
}
// proxy page
if (proxmap.value("Method").toString().isEmpty() )
- ui.comboBox_proxymethod->setCurrentIndex(-1);
- else
- ui.comboBox_proxymethod->setCurrentIndex(sl_proxy_method.indexOf(QRegularExpression(proxmap.value("Method").toString())) );
+ ui.comboBox_proxymethod->setCurrentIndex(-1);
+ else
+ ui.comboBox_proxymethod->setCurrentIndex(sl_proxy_method.indexOf(QRegularExpression(proxmap.value("Method").toString())) );
ui.lineEdit_proxyservers->setText(proxmap.value("Servers").toStringList().join("\n") );
ui.lineEdit_proxyexcludes->setText(proxmap.value("Excludes").toStringList().join("\n") );
ui.lineEdit_proxyurl->setText(proxmap.value("URL").toString() );
if (ui.comboBox_proxymethod->currentIndex() < 0)
- ui.stackedWidget_proxy01->setCurrentIndex(0);
- else
- ui.stackedWidget_proxy01->setCurrentIndex(ui.comboBox_proxymethod->currentIndex() );
-
+ ui.stackedWidget_proxy01->setCurrentIndex(0);
+ else
+ ui.stackedWidget_proxy01->setCurrentIndex(ui.comboBox_proxymethod->currentIndex() );
+
// disable pages not needed for a service (mainly vpn)
if (objmap.value("Type").toString() == "vpn") {
- ui.ipv4->setDisabled(true);
- ui.ipv6->setDisabled(true);
- }
+ ui.ipv4->setDisabled(true);
+ ui.ipv6->setDisabled(true);
+ }
+
+ // mDNS page
+ ui.checkBox_mdns->setChecked(objmap.value("mDNS").toBool() );
}
@@ -245,6 +242,7 @@ void PropertiesEditor::updateConfiguration()
s = lep.at(i)->text();
s.replace(',', ' ');
s.replace(';', ' ');
+ s.replace('|', ' ');
s = s.simplified();
if (s.isEmpty() ) sl.clear();
@@ -260,78 +258,78 @@ void PropertiesEditor::updateConfiguration()
} //for
// ipv4
- if (ui.ipv4->isEnabled() ) {
- // Only update if an entry has changed.
- if ((ui.comboBox_ipv4method->currentText() != TranslateStrings::cmtr(ipv4map.value("Method").toString()) ) |
- (ui.lineEdit_ipv4address->text() != TranslateStrings::cmtr(ipv4map.value("Address").toString()) ) |
- (ui.lineEdit_ipv4netmask->text() != TranslateStrings::cmtr(ipv4map.value("Netmask").toString()) ) |
- (ui.lineEdit_ipv4gateway->text() != TranslateStrings::cmtr(ipv4map.value("Gateway").toString())) ) {
-
- vlist.clear();
- lep.clear();
- slp.clear();
- dict.clear();
-
- if (ui.comboBox_ipv4method->currentIndex() >= 0) {
- vlist << "IPv4.Configuration";
- dict.insert("Method", sl_ipv4_method.at(ui.comboBox_ipv4method->currentIndex()) );
- lep << ui.lineEdit_ipv4address << ui.lineEdit_ipv4netmask << ui.lineEdit_ipv4gateway;
- slp << "Address" << "Netmask" << "Gateway";
-
- for (int i = 0; i < lep.count(); ++i) {
- s = lep.at(i)->text();
- s = s.simplified(); // really should not be needed with the validator
- if (s.isEmpty() ) break;
- dict.insert(slp.at(i), s);
- } // for
-
- vlist << QVariant::fromValue(QDBusVariant(dict) );
- shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
- } // if there is a valid index
- } // if ipv4 changed
- }// ipv4 page is enabled
-
- // iqv6
- if (ui.ipv6->isEnabled() ) {
- // Only update if an entry has changed.
- if ((ui.comboBox_ipv6method->currentText() != TranslateStrings::cmtr(ipv6map.value("Method").toString()) ) |
- (static_cast<uint>(ui.spinBox_ipv6prefixlength->value()) != ipv6map.value("PrefixLength").toUInt() ) |
- (ui.lineEdit_ipv6gateway->text() != TranslateStrings::cmtr(ipv6map.value("Privacy").toString()) ) |
- (ui.lineEdit_ipv6address->text() != TranslateStrings::cmtr(ipv6map.value("Address").toString()) ) |
- (ui.comboBox_ipv6privacy->currentText() != TranslateStrings::cmtr(ipv6map.value("Gateway").toString())) ) {
-
- vlist.clear();
- lep.clear();
- slp.clear();
- dict.clear();
-
- if (ui.comboBox_ipv6method->currentIndex() >= 0) {
- vlist << "IPv6.Configuration";
- dict.insert("Method", sl_ipv6_method.at(ui.comboBox_ipv6method->currentIndex()) );
- dict.insert("PrefixLength", QVariant::fromValue(static_cast<quint8>(ui.spinBox_ipv6prefixlength->value())) );
- dict.insert("Privacy", sl_ipv6_privacy.at(ui.comboBox_ipv6privacy->currentIndex()) );
-
- lep << ui.lineEdit_ipv6address << ui.lineEdit_ipv6gateway;
- slp << "Address" << "Gateway";
- for (int i = 0; i < lep.count(); ++i) {
- s = lep.at(i)->text();
- s = s.simplified(); // really should not be needed with the validator
- if (s.isEmpty() ) break;
- dict.insert(slp.at(i), s);
- } // for
-
- vlist << QVariant::fromValue(QDBusVariant(dict) );
- shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
- } // if there is a valid index
- } // if ipv6 changed
- } // if ipv6 enabled
+ if (ui.ipv4 == ui.toolBox_peditor->currentWidget() ) {
+ // Only update if an entry has changed.
+ if ((ui.comboBox_ipv4method->currentText() != TranslateStrings::cmtr(ipv4map.value("Method").toString()) ) |
+ (ui.lineEdit_ipv4address->text() != TranslateStrings::cmtr(ipv4map.value("Address").toString()) ) |
+ (ui.lineEdit_ipv4netmask->text() != TranslateStrings::cmtr(ipv4map.value("Netmask").toString()) ) |
+ (ui.lineEdit_ipv4gateway->text() != TranslateStrings::cmtr(ipv4map.value("Gateway").toString())) ) {
+
+ vlist.clear();
+ lep.clear();
+ slp.clear();
+ dict.clear();
+
+ if (ui.comboBox_ipv4method->currentIndex() >= 0) {
+ vlist << "IPv4.Configuration";
+ dict.insert("Method", sl_ipv4_method.at(ui.comboBox_ipv4method->currentIndex()) );
+ lep << ui.lineEdit_ipv4address << ui.lineEdit_ipv4netmask << ui.lineEdit_ipv4gateway;
+ slp << "Address" << "Netmask" << "Gateway";
+
+ for (int i = 0; i < lep.count(); ++i) {
+ s = lep.at(i)->text();
+ s = s.simplified(); // really should not be needed with the validator
+ if (s.isEmpty() ) break;
+ dict.insert(slp.at(i), s);
+ } // for
+
+ vlist << QVariant::fromValue(QDBusVariant(dict) );
+ shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
+ } // if there is a valid index
+ } // if ipv4 changed
+ }// ipv4 page is enabled
+
+ // ipv6
+ if (ui.ipv6 == ui.toolBox_peditor->currentWidget() ) {
+ // Only update if an entry has changed.
+ if ((ui.comboBox_ipv6method->currentText() != TranslateStrings::cmtr(ipv6map.value("Method").toString()) ) |
+ (static_cast<uint>(ui.spinBox_ipv6prefixlength->value()) != ipv6map.value("PrefixLength").toUInt() ) |
+ (ui.lineEdit_ipv6gateway->text() != TranslateStrings::cmtr(ipv6map.value("Gateway").toString()) ) |
+ (ui.lineEdit_ipv6address->text() != TranslateStrings::cmtr(ipv6map.value("Address").toString()) ) |
+ (ui.comboBox_ipv6privacy->currentText() != TranslateStrings::cmtr(ipv6map.value("Privacy").toString())) ) {
+
+ vlist.clear();
+ lep.clear();
+ slp.clear();
+ dict.clear();
+
+ if (ui.comboBox_ipv6method->currentIndex() >= 0) {
+ vlist << "IPv6.Configuration";
+ dict.insert("Method", sl_ipv6_method.at(ui.comboBox_ipv6method->currentIndex()) );
+ dict.insert("PrefixLength", QVariant::fromValue(static_cast<quint8>(ui.spinBox_ipv6prefixlength->value())) );
+ dict.insert("Privacy", sl_ipv6_privacy.at(ui.comboBox_ipv6privacy->currentIndex()) );
+
+ lep << ui.lineEdit_ipv6address << ui.lineEdit_ipv6gateway;
+ slp << "Address" << "Gateway";
+ for (int i = 0; i < lep.count(); ++i) {
+ s = lep.at(i)->text();
+ s = s.simplified(); // really should not be needed with the validator
+ if (s.isEmpty() ) break;
+ dict.insert(slp.at(i), s);
+ } // for
+
+ vlist << QVariant::fromValue(QDBusVariant(dict) );
+ shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
+ } // if there is a valid index
+ } // if ipv6 changed
+ } // if ipv6 enabled
// proxy
// Only update if an entry has changed.
- if ((ui.comboBox_proxymethod->currentText() != TranslateStrings::cmtr(proxmap.value("Method").toString()) ) |
- (ui.lineEdit_proxyservers->text() != proxmap.value("Servers").toStringList().join("\n") ) |
- (ui.lineEdit_proxyexcludes->text() != proxmap.value("Excludes").toStringList().join("\n") ) |
- (ui.lineEdit_proxyurl->text() != proxmap.value("URL").toString()) ) {
+ if ((ui.comboBox_proxymethod->currentText() != TranslateStrings::cmtr(proxmap.value("Method").toString()) ) |
+ (ui.lineEdit_proxyservers->text() != proxmap.value("Servers").toStringList().join("\n") ) |
+ (ui.lineEdit_proxyexcludes->text() != proxmap.value("Excludes").toStringList().join("\n") ) |
+ (ui.lineEdit_proxyurl->text() != proxmap.value("URL").toString()) ) {
vlist.clear();
lep.clear();
@@ -361,6 +359,14 @@ void PropertiesEditor::updateConfiguration()
vlist << QVariant::fromValue(QDBusVariant(dict) );
shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
} // if proxy changed
+
+ // mDNS
+ if (ui.checkBox_mdns->isChecked() != objmap.value("mDNS").toBool() ) {
+ vlist.clear();
+ vlist << "mDNS";
+ vlist << QVariant::fromValue(QDBusVariant(ui.checkBox_mdns->isChecked()) );
+ shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
+ }
// cleanup
iface_serv->deleteLater();
@@ -368,26 +374,26 @@ void PropertiesEditor::updateConfiguration()
}
//
-// Slot to hide or show boxes based on ipv4 method
+// Slot to hide or show boxes based on ipv4 method
void PropertiesEditor::ipv4Method(int idx)
{
- // variables
- if (idx == 1 ) { // index 1 is manual
- ui.label_ipv4address->show();
- ui.label_ipv4netmask->show();
- ui.label_ipv4gateway->show();
- ui.lineEdit_ipv4address->show();
- ui.lineEdit_ipv4netmask->show();
- ui.lineEdit_ipv4gateway->show();
- }
- else {
- ui.label_ipv4address->hide();
- ui.label_ipv4netmask->hide();
- ui.label_ipv4gateway->hide();
- ui.lineEdit_ipv4address->hide();
- ui.lineEdit_ipv4netmask->hide();
- ui.lineEdit_ipv4gateway->hide();
- }
-
- return;
+ // variables
+ if (idx == 1 ) { // index 1 is manual
+ ui.label_ipv4address->show();
+ ui.label_ipv4netmask->show();
+ ui.label_ipv4gateway->show();
+ ui.lineEdit_ipv4address->show();
+ ui.lineEdit_ipv4netmask->show();
+ ui.lineEdit_ipv4gateway->show();
+ }
+ else {
+ ui.label_ipv4address->hide();
+ ui.label_ipv4netmask->hide();
+ ui.label_ipv4gateway->hide();
+ ui.lineEdit_ipv4address->hide();
+ ui.lineEdit_ipv4netmask->hide();
+ ui.lineEdit_ipv4gateway->hide();
+ }
+
+ return;
}
diff --git a/apps/cmstapp/code/peditor/peditor.h b/apps/cmstapp/code/peditor/peditor.h
index 2984b2f..b35e213 100644
--- a/apps/cmstapp/code/peditor/peditor.h
+++ b/apps/cmstapp/code/peditor/peditor.h
@@ -2,7 +2,7 @@
Code to manage the Properties Editor dialog.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -38,7 +38,7 @@ DEALINGS IN THE SOFTWARE.
# include "ui_peditor.h"
# include "./code/control_box/controlbox.h"
-// The class to control the properties editor UI based on a QDialog
+// The class to control the properties editor UI based on a QDialog
class PropertiesEditor : public QDialog
{
Q_OBJECT
@@ -49,28 +49,28 @@ class PropertiesEditor : public QDialog
private:
// members
- Ui::Peditor ui;
- QDBusObjectPath objpath;
- QMap<QString,QVariant> objmap;
- QMap<QString,QVariant> ipv4map;
- QMap<QString,QVariant> ipv6map;
- QMap<QString,QVariant> proxmap;
- QStringList sl_ipv4_method;
- QStringList sl_ipv6_method;
- QStringList sl_ipv6_privacy;
- QStringList sl_proxy_method;
-
- // functions
-
+ Ui::Peditor ui;
+ QDBusObjectPath objpath;
+ QMap<QString,QVariant> objmap;
+ QMap<QString,QVariant> ipv4map;
+ QMap<QString,QVariant> ipv6map;
+ QMap<QString,QVariant> proxmap;
+ QStringList sl_ipv4_method;
+ QStringList sl_ipv6_method;
+ QStringList sl_ipv6_privacy;
+ QStringList sl_proxy_method;
+
+ // functions
private slots:
- void showWhatsThis();
- void resetPage(int page = -1);
- void resetAll();
- void updateConfiguration();
- void ipv4Method(int);
-
- public:
- inline void setWhatsThisIcon(QIcon icon) {ui.toolButton_whatsthis->setIcon(icon);}
+ void showWhatsThis();
+ void resetPage(int page = -1);
+ void resetAll();
+ void updateConfiguration();
+ void ipv4Method(int);
+
+ public:
+ inline void setWhatsThisIcon(QIcon icon) {ui.toolButton_whatsthis->setIcon(icon);}
+ inline void setItemEnabled (int i, bool b) {ui.toolBox_peditor->setItemEnabled(i, b);}
};
diff --git a/apps/cmstapp/code/peditor/ui/peditor.ui b/apps/cmstapp/code/peditor/ui/peditor.ui
index fb7d7ff..04f9e60 100644
--- a/apps/cmstapp/code/peditor/ui/peditor.ui
+++ b/apps/cmstapp/code/peditor/ui/peditor.ui
@@ -28,7 +28,7 @@
<x>0</x>
<y>0</y>
<width>288</width>
- <height>192</height>
+ <height>163</height>
</rect>
</property>
<attribute name="label">
@@ -38,7 +38,7 @@
<item>
<widget class="QCheckBox" name="checkBox_autoconnect">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked this service will auto-connect when no other connection is available. This is only available for services marked &amp;quot;Favorite&amp;quot;. &lt;/p&gt;&lt;p&gt;The service will not auto-connect while roaming.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string comment="property editor">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked this service will auto-connect when no other connection is available. This is only available for services marked &amp;quot;Favorite&amp;quot;. &lt;/p&gt;&lt;p&gt;The service will not auto-connect while roaming.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>AutoConnect</string>
@@ -65,19 +65,23 @@
<rect>
<x>0</x>
<y>0</y>
- <width>288</width>
- <height>192</height>
+ <width>98</width>
+ <height>47</height>
</rect>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The list of manually configured domain name servers. Some cellular networks don't provide correct name servers and this allows for an override.&lt;/p&gt;&lt;p&gt;This array is sorted by priority and the first entry in the list represents the nameserver with the highest priority.&lt;/p&gt;&lt;p&gt;When using manual configuration and no global nameservers are configured, then it is useful to configure this setting.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The list of manually configured domain name servers. Some cellular networks don't provide correct name servers and this allows for an override.&lt;/p&gt;&lt;p&gt;This array is sorted by priority and the first entry in the list represents the nameserver with the highest priority.&lt;/p&gt;&lt;p&gt;When using manual configuration and no global nameservers are configured, then it is useful to configure this setting.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, vertical bar, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<attribute name="label">
<string>&amp;Nameservers</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <widget class="QLineEdit" name="lineEdit_nameservers"/>
+ <widget class="QLineEdit" name="lineEdit_nameservers">
+ <property name="whatsThis">
+ <string notr="true"/>
+ </property>
+ </widget>
</item>
<item>
<spacer name="verticalSpacer_4">
@@ -99,19 +103,23 @@
<rect>
<x>0</x>
<y>0</y>
- <width>288</width>
- <height>192</height>
+ <width>98</width>
+ <height>47</height>
</rect>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The list of manually configured time servers.&lt;/p&gt;&lt;p&gt;The first entry in the list represents the timeserver with the highest priority.&lt;/p&gt;&lt;p&gt;When using manual configuration this setting is useful to override all the other timeserver settings. This is service specific, hence only the values for the default service are used.&lt;/p&gt;&lt;p&gt;Changes to this property will result in restart of NTP query.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The list of manually configured time servers.&lt;/p&gt;&lt;p&gt;The first entry in the list represents the timeserver with the highest priority.&lt;/p&gt;&lt;p&gt;When using manual configuration this setting is useful to override all the other timeserver settings. This is service specific, hence only the values for the default service are used.&lt;/p&gt;&lt;p&gt;Changes to this property will result in restart of NTP query.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, vertical bar, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<attribute name="label">
<string>&amp;Timeservers</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
- <widget class="QLineEdit" name="lineEdit_timeservers"/>
+ <widget class="QLineEdit" name="lineEdit_timeservers">
+ <property name="whatsThis">
+ <string notr="true"/>
+ </property>
+ </widget>
</item>
<item>
<spacer name="verticalSpacer_5">
@@ -133,19 +141,23 @@
<rect>
<x>0</x>
<y>0</y>
- <width>288</width>
- <height>192</height>
+ <width>98</width>
+ <height>47</height>
</rect>
</property>
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;List of manually configures search domains.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;List of manually configures search domains.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, vertical bar, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<attribute name="label">
<string>&amp;Domains</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
- <widget class="QLineEdit" name="lineEdit_domains"/>
+ <widget class="QLineEdit" name="lineEdit_domains">
+ <property name="whatsThis">
+ <string notr="true"/>
+ </property>
+ </widget>
</item>
<item>
<spacer name="verticalSpacer_8">
@@ -167,8 +179,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>288</width>
- <height>192</height>
+ <width>159</width>
+ <height>136</height>
</rect>
</property>
<attribute name="label">
@@ -180,7 +192,11 @@
<item row="1" column="1">
<widget class="QLineEdit" name="lineEdit_ipv4address">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv4 address to use for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string comment="property editor">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The IPv4 address to use for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
@@ -197,7 +213,11 @@
<item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_ipv4gateway">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv4 gateway for this connection. This field is optional and may be left blank&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string comment="property editor">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The IPv4 gateway for this connection. This field is optional and may be left blank&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
@@ -224,7 +244,11 @@
<item row="2" column="1">
<widget class="QLineEdit" name="lineEdit_ipv4netmask">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv4 netmask for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string comment="property editor">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The IPv4 netmask for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
@@ -237,6 +261,9 @@
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_ipv4method">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Possible values of &lt;span style=&quot; font-weight:600;&quot;&gt;dhcp&lt;/span&gt;, &lt;span style=&quot; font-weight:600;&quot;&gt;manual&lt;/span&gt;, and &lt;span style=&quot; font-weight:600;&quot;&gt;off&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;If &lt;span style=&quot; font-weight:600;&quot;&gt;manual&lt;/span&gt; is selected boxes for &lt;span style=&quot; font-weight:600;&quot;&gt;Address&lt;/span&gt;, &lt;span style=&quot; font-weight:600;&quot;&gt;Netmask&lt;/span&gt; and&lt;span style=&quot; font-weight:600;&quot;&gt; Gateway&lt;/span&gt; will become visible.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
<property name="text">
<string>Method</string>
</property>
@@ -264,8 +291,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>288</width>
- <height>192</height>
+ <width>172</width>
+ <height>155</height>
</rect>
</property>
<attribute name="label">
@@ -284,14 +311,22 @@
<item row="1" column="0" colspan="2">
<widget class="QStackedWidget" name="stackedWidget_ipv601">
<property name="currentIndex">
- <number>2</number>
+ <number>1</number>
</property>
<widget class="QWidget" name="page">
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="1">
<widget class="QComboBox" name="comboBox_ipv6privacy">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable the IPv6 privacy extension as described in RFC 4941,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Disabled&lt;/span&gt;: privacy extension is disabled and normal autoconf addresses are used.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Enabled&lt;/span&gt;: the system prefers to use public addresses over temporary addresses.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Prefered&lt;/span&gt;: privacy extension is enabled and the system prefers temporary addresses over public addresses.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Enable or disable the IPv6 privacy extension as described in RFC 4941,&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Disabled&lt;/span&gt;: privacy extension is disabled and normal autoconf addresses are used.&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Enabled&lt;/span&gt;: the system prefers to use public addresses over temporary addresses.&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Prefered&lt;/span&gt;: privacy extension is enabled and the system prefers temporary addresses over public addresses.&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="currentText">
<string/>
@@ -410,7 +445,10 @@
</widget>
</item>
<item row="0" column="0">
- <widget class="QLabel" name="label_9">
+ <widget class="QLabel" name="label_ipv6method">
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Possible values are &amp;quot;auto&amp;quot;, &amp;quot;manual&amp;quot;, and &amp;quot;off&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
<property name="text">
<string>Method</string>
</property>
@@ -425,8 +463,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>288</width>
- <height>192</height>
+ <width>98</width>
+ <height>28</height>
</rect>
</property>
<property name="whatsThis">
@@ -435,7 +473,7 @@
<attribute name="label">
<string>&amp;Proxy</string>
</attribute>
- <widget class="QWidget" name="">
+ <widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>1</x>
@@ -462,7 +500,7 @@
<item row="1" column="0" colspan="2">
<widget class="QStackedWidget" name="stackedWidget_proxy01">
<property name="currentIndex">
- <number>2</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="page_0"/>
<widget class="QWidget" name="page_1">
@@ -508,7 +546,12 @@
<item>
<widget class="QLineEdit" name="lineEdit_proxyservers">
<property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Used when &amp;quot;manual&amp;quot; is set.List of proxy URIs. The URI without a protocol will be interpreted as the generic proxy URI.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string comment="property editor">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Used when &amp;quot;manual&amp;quot; is set.List of proxy URIs. The URI without a protocol will be interpreted as the generic proxy URI.&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
@@ -546,6 +589,40 @@
</layout>
</widget>
</widget>
+ <widget class="QWidget" name="mDNS">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>98</width>
+ <height>28</height>
+ </rect>
+ </property>
+ <property name="whatsThis">
+ <string>Check to enable mDNS. Note that mDNS requires a DNS backend which supports it.
+
+</string>
+ </property>
+ <attribute name="label">
+ <string>&amp;mDNS</string>
+ </attribute>
+ <widget class="QCheckBox" name="checkBox_mdns">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>0</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="whatsThis">
+ <string comment="property editor">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to enable mDNS. Note that mDNS requires a DNS backend which supports it.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Enable mDNS </string>
+ </property>
+ </widget>
+ </widget>
</widget>
</item>
<item>
diff --git a/apps/cmstapp/code/provisioning/prov_ed.cpp b/apps/cmstapp/code/provisioning/prov_ed.cpp
index 0de25c1..f26f374 100644
--- a/apps/cmstapp/code/provisioning/prov_ed.cpp
+++ b/apps/cmstapp/code/provisioning/prov_ed.cpp
@@ -2,7 +2,7 @@
Code to manage the Provisioning Editor dialog.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -44,7 +44,7 @@ DEALINGS IN THE SOFTWARE.
# include "./code/shared/shared.h"
//
// Provisioning Editor constructor
-ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
+ProvisioningEditor::ProvisioningEditor(QWidget* parent, const float& ver) : QDialog(parent)
{
// Setup the user interface
ui.setupUi(this);
@@ -80,8 +80,10 @@ ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
group_freeform->addAction(ui.actionService);
group_freeform->addAction(ui.actionWifiPrivateKeyPassphrase);
group_freeform->addAction(ui.actionWifiIdentity);
+ group_freeform->addAction(ui.actionWifiAnonymousIdentity);
group_freeform->addAction(ui.actionWifiPassphrase);
group_freeform->addAction(ui.actionWifiPhase2);
+ group_freeform->addAction(ui.actionServiceDeviceName);
group_combobox = new QActionGroup(this);
group_combobox->addAction(ui.actionServiceType);
@@ -90,7 +92,10 @@ ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
group_combobox->addAction(ui.actionWifiSecurity);
group_combobox->addAction(ui.actionWifiHidden);
group_combobox->addAction(ui.actionServiceIPv6Privacy);
-
+ group_combobox->addAction(ui.actionServiceIPv4);
+ group_combobox->addAction(ui.actionServiceIPv6);
+ group_combobox->addAction(ui.actionServicemDNS);
+
group_validated = new QActionGroup(this);
group_validated->addAction(ui.actionServiceMAC);
group_validated->addAction(ui.actionWifiSSID);
@@ -99,22 +104,16 @@ ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
group_validated->addAction(ui.actionServiceSearchDomains);
group_validated->addAction(ui.actionServiceDomain);
group_validated->addAction(ui.actionWifiName);
+ group_validated->addAction(ui.actionWifiSubjectMatch);
+ group_validated->addAction(ui.actionWifiAltSubjectMatch);
+ group_validated->addAction(ui.actionWifiDomainMatch);
+ group_validated->addAction(ui.actionWifiDomainSuffixMatch);
group_selectfile = new QActionGroup(this);
group_selectfile->addAction(ui.actionWifiCACertFile);
group_selectfile->addAction(ui.actionWifiClientCertFile);
group_selectfile->addAction(ui.actionWifiPrivateKeyFile);
- group_ipv4 = new QActionGroup(this);
- group_ipv4->addAction(ui.actionServiceIPv4Off);
- group_ipv4->addAction(ui.actionServiceIPV4DHCP);
- group_ipv4->addAction(ui.actionServiceIPv4Address);
-
- group_ipv6 = new QActionGroup(this);
- group_ipv6->addAction(ui.actionServiceIPv6Off);
- group_ipv6->addAction(ui. actionServiceIPv6Auto);
- group_ipv6->addAction(ui.actionServiceIPv6Address);
-
// Add Actions from UI to menu's
menu_global = new QMenu(tr("Global"), this);
menu_global->addAction(ui.actionGlobal);
@@ -128,14 +127,14 @@ ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
menu_service->addAction(ui.actionServiceType);
menu_service->addAction(ui.actionServiceDomain);
menu_service->addAction(ui.actionServiceMAC);
+ if (ver > 1.37f) {
+ menu_service->addAction(ui.actionServiceDeviceName);
+ menu_service->addAction(ui.actionServicemDNS);
+ }
menu_service->addSeparator();
- menu_service->addAction(ui.actionServiceIPv4Off);
- menu_service->addAction(ui.actionServiceIPV4DHCP);
- menu_service->addAction(ui.actionServiceIPv4Address);
+ menu_service->addAction(ui.actionServiceIPv4);
menu_service->addSeparator();
- menu_service->addAction(ui.actionServiceIPv6Off);
- menu_service->addAction(ui. actionServiceIPv6Auto);
- menu_service->addAction(ui.actionServiceIPv6Address);
+ menu_service->addAction(ui.actionServiceIPv6);
menu_service->addAction(ui.actionServiceIPv6Privacy);
menu_service->addSeparator();
menu_service->addAction(ui.actionServiceNameServers);
@@ -154,6 +153,13 @@ ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
menu_wifi->addSeparator();
menu_wifi->addAction(ui.actionWifiEAP);
menu_wifi->addAction(ui.actionWifiIdentity);
+ if (ver > 1.37f) {
+ menu_wifi->addAction(ui.actionWifiAnonymousIdentity);
+ menu_wifi->addAction(ui.actionWifiSubjectMatch);
+ menu_wifi->addAction(ui.actionWifiAltSubjectMatch);
+ menu_wifi->addAction(ui.actionWifiDomainMatch);
+ menu_wifi->addAction(ui.actionWifiDomainSuffixMatch);
+ }
menu_wifi->addSeparator();
menu_wifi->addAction(ui.actionWifiCACertFile);
menu_wifi->addAction(ui.actionWifiClientCertFile);
@@ -185,8 +191,6 @@ ProvisioningEditor::ProvisioningEditor(QWidget* parent) : QDialog(parent)
connect(group_combobox, SIGNAL(triggered(QAction*)), this, SLOT(inputComboBox(QAction*)));
connect(group_validated, SIGNAL(triggered(QAction*)), this, SLOT(inputValidated(QAction*)));
connect(group_selectfile, SIGNAL(triggered(QAction*)), this, SLOT(inputSelectFile(QAction*)));
- connect(group_ipv4, SIGNAL(triggered(QAction*)), this, SLOT(ipv4Triggered(QAction*)));
- connect(group_ipv6, SIGNAL(triggered(QAction*)), this, SLOT(ipv6Triggered(QAction*)));
}
/////////////////////////////////////////////// Private Slots /////////////////////////////////////////////
@@ -224,6 +228,7 @@ void ProvisioningEditor::inputValidated(QAction* act)
{
// variables
QString key = act->text();
+ QChar delim(','); // default delim character for plurals
// create the dialog
shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
@@ -231,11 +236,15 @@ void ProvisioningEditor::inputValidated(QAction* act)
// create some prompts and set validator
if (act == ui.actionServiceMAC) {vd->setLabel(tr("MAC address.")); vd->setValidator(CMST::ValDialog_MAC);}
if (act == ui.actionWifiSSID) {vd->setLabel(tr("SSID: hexadecimal representation of an 802.11 SSID")); vd->setValidator(CMST:: ValDialog_Hex);}
- if (act == ui.actionServiceNameServers) {vd->setLabel(tr("List of Nameservers")); vd->setValidator(CMST::ValDialog_46d, true);}
- if (act == ui.actionServiceTimeServers) {vd->setLabel(tr("List of Timeservers")); vd->setValidator(CMST::ValDialog_46d, true);}
+ if (act == ui.actionServiceNameServers) {vd->setLabel(tr("List of Nameservers")); vd->setValidator(CMST::ValDialog_46, true);}
+ if (act == ui.actionServiceTimeServers) {vd->setLabel(tr("List of Timeservers")); vd->setValidator(CMST::ValDialog_46, true);}
if (act == ui.actionServiceSearchDomains) {vd->setLabel(tr("List of DNS Search Domains")); vd->setValidator(CMST::ValDialog_Dom, true);}
if (act == ui.actionServiceDomain) {vd->setLabel(tr("Domain name to be used")); vd->setValidator(CMST::ValDialog_Dom);}
- if (act == ui.actionWifiName) {vd->setLabel(tr("Enter the string representation of an 802.11 SSID.")); vd->setValidator(CMST::ValDialog_Wd);}
+ if (act == ui.actionWifiName) {vd->setLabel(tr("Enter the string representation of an 802.11 SSID.")); vd->setValidator(CMST::ValDialog_Word);}
+ if (act == ui.actionWifiSubjectMatch) { vd->setLabel(tr("Substring to be matched against the subject of the authentication server")); vd->setValidator(CMST::ValDialog_Word);}
+ if (act == ui.actionWifiAltSubjectMatch) {vd->setLabel(tr("List of entries to be matched against the alternative subject name.")); vd->setValidator(CMST::ValDialog_Word, true); delim=';';}
+ if (act == ui.actionWifiDomainMatch) {vd->setLabel(tr("A fully qualified domain name used as a full match requirement for the authentication server")); vd->setValidator(CMST::ValDialog_Dom);}
+ if (act == ui.actionWifiDomainSuffixMatch) {vd->setLabel(tr("A fully qualified domain name used as a suffix match requirement for the authentication server")); vd->setValidator(CMST::ValDialog_Dom);}
// if accepted put an entry in the textedit
if (vd->exec() == QDialog::Accepted) {
@@ -246,8 +255,9 @@ void ProvisioningEditor::inputValidated(QAction* act)
if (vd->isPlural() ) {
s.replace(',', ' ');
s.replace(';', ' ');
+ s.replace('|', ' ');
s = s.simplified();
- s.replace(' ', ',');
+ s.replace(' ', delim);
}
ui.plainTextEdit_main->insertPlainText(key.arg(s) );
@@ -275,7 +285,10 @@ void ProvisioningEditor::inputComboBox(QAction* act)
if (act == ui.actionWifiSecurity) {str = tr("Network security type."); sl << "psk" << "ieee8021x" << "wep" << "none";}
if (act == ui.actionWifiHidden) {str = tr("Hidden network"); sl << "true" << "false";}
if (act == ui.actionServiceIPv6Privacy) {str = tr("IPv6 Privacy"); sl << "disabled" << "enabled" << "preferred";}
-
+ if (act == ui.actionServiceIPv4) {str = tr("IPv4 Settings"); sl << "off" << "dhcp" << "address";}
+ if (act == ui.actionServiceIPv6) {str = tr("IPv6 Settings"); sl << "off" << "auto" << "address";}
+ if (act == ui.actionServicemDNS) {str = tr("Enable mDNS"); sl << "false" << "true";}
+
QStringList sl_tr = TranslateStrings::cmtr_sl(sl);
QString item = QInputDialog::getItem(this,
tr("%1 - Item Input").arg(TranslateStrings::cmtr("cmst")),
@@ -284,11 +297,17 @@ void ProvisioningEditor::inputComboBox(QAction* act)
0,
false,
&ok);
-
- key.append(" = %1\n");
- if (ok) ui.plainTextEdit_main->insertPlainText(key.arg(sl.at(sl_tr.indexOf(QRegularExpression(item)))) );
-
- return;
+
+ // if we need ipv4 or ipv6 address information go there
+ if (act == ui.actionServiceIPv4 && sl.at(sl_tr.indexOf(QRegularExpression(item))) == "address" ) ipv4Address();
+ else{
+ if (act == ui.actionServiceIPv6 && sl.at(sl_tr.indexOf(QRegularExpression(item))) == "address" ) ipv6Address();
+ else {
+ key.append(" = %1\n");
+ if (ok) ui.plainTextEdit_main->insertPlainText(key.arg(sl.at(sl_tr.indexOf(QRegularExpression(item)))) );
+ } // else not ipv4 or ipv6
+ } //else not ipv4
+ return;
}
//
// Slot called when a member of the QActionGroup group_freeform is triggered
@@ -308,8 +327,10 @@ void ProvisioningEditor::inputFreeForm(QAction* act)
if (act == ui.actionGlobalDescription) str = tr("Enter a description of the network.");
if (act == ui.actionWifiPrivateKeyPassphrase) str = tr("Password/Passphrase for the private key file.");
if (act == ui.actionWifiIdentity) str = tr("Identity string for EAP.");
+ if (act == ui.actionWifiAnonymousIdentity) str = tr("Anonymous identity string for EAP.");
if (act == ui.actionWifiPassphrase) str = tr("RSN/WPA/WPA2 Passphrase");
if (act == ui.actionWifiPhase2) str = tr("Phase 2 (inner authentication with TLS tunnel)<br>authentication method.");
+ if (act == ui.actionServiceDeviceName) str = tr("The interface name in which to apply the provisioning (ex. eth0)") ;
if (act == ui.actionGlobal) {
key.append("\n");
@@ -334,93 +355,72 @@ void ProvisioningEditor::inputFreeForm(QAction* act)
}
//
-// Slot called when a member of the QActionGroup group_ipv4 is triggered
-void ProvisioningEditor::ipv4Triggered(QAction* act)
+// Not a real slot anymore as we only call this directly when we need to get ipv4 address/netmask/gateway
+// information from the user.
+void ProvisioningEditor::ipv4Address()
{
// variables
QString s = "IPv4 = %1\n";
QString val;
- // process action
- if (act == ui.actionServiceIPv4Off) ui.plainTextEdit_main->insertPlainText(s.arg("off") );
- if (act == ui.actionServiceIPV4DHCP) ui.plainTextEdit_main->insertPlainText(s.arg("dhcp") );
- if (act == ui.actionServiceIPv4Address) {
- QMessageBox::StandardButton but = QMessageBox::information(this,
- QString(TranslateStrings::cmtr("cmst")) + tr(" Information"),
- tr("The IPv4 <b>Address</b>, <b>Netmask</b>, and optionally <b>Gateway</b> need to be provided." \
- "<p>Press OK when you are ready to proceed."),
- QMessageBox::Ok | QMessageBox::Abort,QMessageBox::Ok);
- if (but == QMessageBox::Ok) {
- shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
- vd->setLabel(tr("IPv4 Address"));
- vd->setValidator(CMST::ValDialog_IPv4);
+ // process string item
+ shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
+ vd->setLabel(tr("IPv4 Address. <br><br>Enter the IPv4 network address in the form xxx.xxx.xxx.xxx"));
+ vd->setValidator(CMST::ValDialog_IPv4);
+ if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
+ val = vd->getText();
+ vd->clear();
+ vd->setLabel(tr("IPv4 Netmask. <br><br>The entry can be a mask length (example 24) or in the form xxx:xxx:xxx:xxx"));
+ vd->setValidator(CMST::ValDialog_nmask);
if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
- val = vd->getText();
- vd->clear();
- vd->setLabel(tr("IPv4 Netmask"));
- vd->setValidator(CMST::ValDialog_IPv4);
- if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
- val.append("/" + vd->getText() );
- vd->clear();
- vd->setLabel(tr("IPv4 Gateway (This is an optional entry)"));
- vd->setValidator(CMST::ValDialog_IPv4);
- if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
- val.append("/" + vd->getText() );
- } // if gateway accpted
- ui.plainTextEdit_main->insertPlainText(s.arg(val) );
- } // if netmask accepted
- } // if address accepted
- vd->deleteLater();
- } // we pressed OK on the information dialog
- } // act == actionServiceIPv4Address
-
+ val.append("/" + vd->getText() );
+ vd->clear();
+ vd->setLabel(tr("IPv4 Gateway.<br><br>This is an optional entry, press cancel if there is no entry for gateway"));
+ vd->setValidator(CMST::ValDialog_IPv4);
+ if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
+ val.append("/" + vd->getText() );
+ } // if gateway accpted
+ ui.plainTextEdit_main->insertPlainText(s.arg(val) );
+ } // if netmask accepted
+ } // if address accepted
+ vd->deleteLater();
+
return;
}
//
-// Slot called when a member of the QActonGroup group_ipv6 is triggered
-void ProvisioningEditor::ipv6Triggered(QAction* act)
+// Not a real slot anymore as we only call this directly when we need to get ipv6 address/prefix/gateway
+// information from the user.
+void ProvisioningEditor::ipv6Address()
{
// variables
QString s = "IPv6 = %1\n";
bool ok;
QString val;
- // process action
- if (act == ui.actionServiceIPv6Off) ui.plainTextEdit_main->insertPlainText(s.arg("off") );
- if (act == ui.actionServiceIPv6Auto) ui.plainTextEdit_main->insertPlainText(s.arg("auto") );
- if (act == ui.actionServiceIPv6Address) {
- QMessageBox::StandardButton but = QMessageBox::information(this,
- QString(TranslateStrings::cmtr("cmst")) + tr(" Information"),
- tr("The IPv6 <b>Address</b>, <b>Prefix Length</b>, and optionally <b>Gateway</b> need to be provided." \
- "<p>Press OK when you are ready to proceed."),
- QMessageBox::Ok | QMessageBox::Abort,QMessageBox::Ok);
- if (but == QMessageBox::Ok) {
- shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
- vd->setLabel(tr("IPv6 Address"));
- vd->setValidator(CMST::ValDialog_IPv6);
- if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
- val = vd->getText();
- int i = QInputDialog::getInt(this,
- tr("%1 - Integer Input").arg(TranslateStrings::cmtr("cmst")),
- tr("Enter the IPv6 prefix length"),
- 0, 0, 255, 1,
- &ok);
- if (ok) {
- val.append(QString("/%1").arg(i) );
- shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
- vd->setLabel(tr("IPv6 Gateway (This is an optional entry)"));
- vd->setValidator(CMST::ValDialog_IPv6);
- if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
- val.append(QString("/" + vd->getText()) );
- } // if gateway was accepted
- ui.plainTextEdit_main->insertPlainText(s.arg(val) );
- } // if prefix provided
- } // if address accepted
- vd->deleteLater();
- } // we pressed OK on the informaion dialog
- } // act == actionServiceIPv6Address
-
+ shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
+ vd->setLabel(tr("IPv6 Address"));
+ vd->setValidator(CMST::ValDialog_IPv6);
+ if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
+ val = vd->getText();
+ int i = QInputDialog::getInt(this,
+ tr("%1 - Integer Input").arg(TranslateStrings::cmtr("cmst")),
+ tr("Enter the IPv6 prefix length"),
+ 0, 0, 255, 1,
+ &ok);
+ if (ok) {
+ val.append(QString("/%1").arg(i) );
+ shared::ValidatingDialog* vd = new shared::ValidatingDialog(this);
+ vd->setLabel(tr("IPv6 Gateway .<br><br>This is an optional entry, press cancel if there is no entry for gateway"));
+ vd->setValidator(CMST::ValDialog_IPv6);
+ if (vd->exec() == QDialog::Accepted && ! vd->getText().isEmpty() ) {
+ val.append(QString("/" + vd->getText()) );
+ } // if gateway was accepted
+ ui.plainTextEdit_main->insertPlainText(s.arg(val) );
+ } // if prefix provided
+ } // if tddress accepted
+ vd->deleteLater();
+
return;
}
@@ -493,7 +493,7 @@ void ProvisioningEditor::requestFileList(QAbstractButton* button)
//
// Slot to process the file list from /var/lib/connman. Connected to
-// the obtainedFileList signal in roothelper
+// the callWithCallback signal in requestFileList()
void ProvisioningEditor::processFileList(const QStringList& sl_conf)
{
// variables
diff --git a/apps/cmstapp/code/provisioning/prov_ed.h b/apps/cmstapp/code/provisioning/prov_ed.h
index ccdc785..79afc08 100644
--- a/apps/cmstapp/code/provisioning/prov_ed.h
+++ b/apps/cmstapp/code/provisioning/prov_ed.h
@@ -2,7 +2,7 @@
Code to manage the Provisioning Editor dialog.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -47,7 +47,7 @@ class ProvisioningEditor : public QDialog
Q_OBJECT
public:
- ProvisioningEditor(QWidget*);
+ ProvisioningEditor(QWidget*, const float&);
private:
// members
@@ -63,8 +63,6 @@ class ProvisioningEditor : public QDialog
QActionGroup* group_combobox;
QActionGroup* group_validated;
QActionGroup* group_selectfile;
- QActionGroup* group_ipv4;
- QActionGroup* group_ipv6;
QButtonGroup* bg01;
QStatusBar* statusbar;
int statustimeout;
@@ -75,8 +73,8 @@ class ProvisioningEditor : public QDialog
void inputValidated(QAction*);
void inputComboBox(QAction*);
void inputFreeForm(QAction*);
- void ipv4Triggered(QAction*);
- void ipv6Triggered(QAction*);
+ void ipv4Address();
+ void ipv6Address();
void templateTriggered(QAction*);
void showWhatsThis();
void resetPage();
diff --git a/apps/cmstapp/code/provisioning/ui/provisioning_editor.ui b/apps/cmstapp/code/provisioning/ui/provisioning_editor.ui
index ced3344..e759d71 100644
--- a/apps/cmstapp/code/provisioning/ui/provisioning_editor.ui
+++ b/apps/cmstapp/code/provisioning/ui/provisioning_editor.ui
@@ -317,81 +317,105 @@
<string>Eduroam (short)</string>
</property>
</action>
- <action name="actionServiceIPv4Address">
- <property name="checkable">
- <bool>true</bool>
- </property>
+ <action name="actionServiceIPv4">
<property name="text">
- <string>IPv4 Address</string>
+ <string>IPv4</string>
</property>
- </action>
- <action name="actionServiceIPv4Off">
- <property name="checkable">
- <bool>true</bool>
+ <property name="toolTip">
+ <string>Set IPv4 to &quot;off&quot;, &quot;dhcp&quot;, or enter IPV4 address information</string>
</property>
+ </action>
+ <action name="actionServiceIPv6">
<property name="text">
- <string>IPv4 Off</string>
+ <string>IPv6</string>
</property>
- </action>
- <action name="actionServiceIPV4DHCP">
- <property name="checkable">
- <bool>true</bool>
+ <property name="toolTip">
+ <string>Set IPv6 to &quot;off, &quot;auto&quot;, or enter IPv6 address information</string>
</property>
+ </action>
+ <action name="actionServiceIPv6Privacy">
<property name="text">
- <string>IPV4 DHCP</string>
+ <string>IPv6.Privacy</string>
</property>
</action>
- <action name="actionServiceIPv6Address">
- <property name="checkable">
- <bool>true</bool>
+ <action name="actionTemplateeap_peap">
+ <property name="text">
+ <string>EAP-PEAP</string>
</property>
+ <property name="toolTip">
+ <string>EAP-PEAP</string>
+ </property>
+ </action>
+ <action name="actionTemplateeap_tls">
<property name="text">
- <string>IPv6 Address</string>
+ <string>EAP-TLS</string>
+ </property>
+ <property name="toolTip">
+ <string>EAP-TLS</string>
</property>
</action>
- <action name="actionServiceIPv6Off">
- <property name="checkable">
- <bool>true</bool>
+ <action name="actionTemplateeap_ttls">
+ <property name="text">
+ <string>EAP-TTLS</string>
+ </property>
+ <property name="toolTip">
+ <string>EAP-TTLS</string>
</property>
+ </action>
+ <action name="actionServiceDeviceName">
<property name="text">
- <string>IPv6 Off</string>
+ <string>DeviceName</string>
+ </property>
+ <property name="toolTip">
+ <string>Interface name where this provisioning applies (ex: eth0)</string>
</property>
</action>
- <action name="actionServiceIPv6Auto">
- <property name="checkable">
- <bool>true</bool>
+ <action name="actionServicemDNS">
+ <property name="text">
+ <string>mDNS</string>
+ </property>
+ <property name="toolTip">
+ <string>Set to true if mDNS domains can be resolved and the hostname registered.</string>
</property>
+ </action>
+ <action name="actionWifiAnonymousIdentity">
<property name="text">
- <string>IPv6 Auto</string>
+ <string>AnonymousIdentity</string>
+ </property>
+ <property name="toolTip">
+ <string>Anonymous identity string for EAP</string>
</property>
</action>
- <action name="actionServiceIPv6Privacy">
+ <action name="actionWifiSubjectMatch">
<property name="text">
- <string>IPv6.Privacy</string>
+ <string>SubjectMatch</string>
+ </property>
+ <property name="toolTip">
+ <string>Substring to be matched against the subject of the authentication server certificate for EAP</string>
</property>
</action>
- <action name="actionTemplateeap_peap">
+ <action name="actionWifiAltSubjectMatch">
<property name="text">
- <string>EAP-PEAP</string>
+ <string>AltSubjectMatch</string>
</property>
<property name="toolTip">
- <string>EAP-PEAP</string>
+ <string>Semicolon separated string of entries to be matched against the alternative subject name of the authentication server certificate for EAP</string>
</property>
</action>
- <action name="actionTemplateeap_tls">
+ <action name="actionWifiDomainSuffixMatch">
<property name="text">
- <string>EAP-TLS</string>
+ <string>DomainSuffixMatch</string>
</property>
<property name="toolTip">
- <string>EAP-TLS</string>
+ <string>A FQDN used as a suffix match requirement for the authentication server.</string>
</property>
</action>
- <action name="actionTemplateeap_ttls">
+ <action name="actionWifiDomainMatch">
<property name="text">
- <string>EAP-TTLS</string>
+ <string>DomainMatch</string>
</property>
<property name="toolTip">
- <string>EAP-TTLS</string>
+ <string>A FQDN used as a full match requirement for the authentication server.</string>
</property>
</action>
</widget>
diff --git a/apps/cmstapp/code/scrollbox/scrollbox.cpp b/apps/cmstapp/code/scrollbox/scrollbox.cpp
index ec0ebe6..d49b3a1 100755
--- a/apps/cmstapp/code/scrollbox/scrollbox.cpp
+++ b/apps/cmstapp/code/scrollbox/scrollbox.cpp
@@ -3,7 +3,7 @@
Dialog to display text to the user. Kind of like a neutered QMessageBox
except it has scroll bars built in.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/scrollbox/scrollbox.h b/apps/cmstapp/code/scrollbox/scrollbox.h
index 46be03f..f0e42f1 100755
--- a/apps/cmstapp/code/scrollbox/scrollbox.h
+++ b/apps/cmstapp/code/scrollbox/scrollbox.h
@@ -3,7 +3,7 @@
Dialog to display text to the user. Kind of like a neutered QMessageBox
except it has scroll bars built in.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/shared/shared.cpp b/apps/cmstapp/code/shared/shared.cpp
index a779c3d..bef0c02 100644
--- a/apps/cmstapp/code/shared/shared.cpp
+++ b/apps/cmstapp/code/shared/shared.cpp
@@ -1,7 +1,7 @@
/**************************** shared.cpp ***************************
Functions shared across various classes
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -122,72 +122,100 @@ shared::ValidatingDialog::ValidatingDialog(QWidget* parent) : QDialog(parent)
void shared::ValidatingDialog::setValidator(const int& vd, bool plural)
{
// setup a switch to set the validator
- const QString s_ip4 = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])";
- const QString s_ip6 = "(?:[0-9a-fA-F]{1,4})";
+ const QString ip4seg = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])";
+ const QString s_ip4 = (ip4seg + "(?:\\." + ip4seg + "){3}");
+ const QString s_nmask = "(?:8|16|24)";
+ const QString ip6seg = "[0-9a-fA-F]{1,4}";
+ const QString s_ip6 = (
+ QString("(" + ip6seg + ":){7,7}" + ip6seg + "|") +
+ QString("(" + ip6seg + ":){1,7}:" + "|") +
+ QString("(" + ip6seg + ":){1,6}:" + ip6seg + "|") +
+ QString("(" + ip6seg + ":){1,5}(:" + ip6seg + "){1,2}" + "|") +
+ QString("(" + ip6seg + ":){1,4}(:" + ip6seg + "){1,3}" + "|") +
+ QString("(" + ip6seg + ":){1,3}(:" + ip6seg + "){1,4}" + "|") +
+ QString("(" + ip6seg + ":){1,2}(:" + ip6seg + "){1,5}" + "|") +
+ QString(ip6seg + ":((:" + ip6seg + "){1,6})") );
const QString s_mac = "(?:[0-9a-fA-F]{1,2})";
const QString s_hex = "[0-9a-fA-F]*";
const QString s_int = "[0-9]*";
const QString s_dom = "((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}";
- const QString s_wd = "[0-9,a-zA-Z_\\.\\!\\@\\#\\$\\%\\^\\&\\*\\+\\-]*";
+ const QString s_word = "[0-9,a-zA-Z_\\.\\!\\@\\#\\$\\%\\^\\&\\*\\+\\-]*";
const QString s_ch = "\\S";
- const QString s_start = (plural ? "\\s?|(" : "^");
- const QString s_end = (plural ? "(\\s*|[,|;|\\s]\\s*|$))+" : "$");
+ const QString s_start = (plural ? "^(" : "^");
+ const QString s_end = (plural ? "([,;|\\s]\\s*|$))+" : "$");
switch (vd){
case CMST::ValDialog_IPv4: {
- QRegularExpression rx4(s_start + s_ip4 + "(?:\\." + s_ip4 + "){3}" + s_end);
+ QRegularExpression rx4(s_start + s_ip4 + s_end);
QRegularExpressionValidator* lev_4 = new QRegularExpressionValidator(rx4, this);
- lineedit->setValidator(lev_4); }
+ lineedit->setValidator(lev_4);
+ lev_4->deleteLater(); }
+ break;
+ case CMST::ValDialog_nmask: {
+ QRegularExpression nmsk(s_start + "(" + s_nmask + "|" + s_ip4 + ")" + s_end);
+ QRegularExpressionValidator* lev_nmask = new QRegularExpressionValidator(nmsk, this);
+ lineedit->setValidator(lev_nmask);
+ lev_nmask->deleteLater(); }
break;
case CMST::ValDialog_IPv6: {
- QRegularExpression rx6(s_start + s_ip6 + "(?::" + s_ip6 + "){7}" + s_end);
+ QRegularExpression rx6(s_start + s_ip6 + s_end);
QRegularExpressionValidator* lev_6 = new QRegularExpressionValidator(rx6, this);
- lineedit->setValidator(lev_6); }
+ lineedit->setValidator(lev_6);
+ lev_6->deleteLater(); }
break;
case CMST::ValDialog_MAC: {
QRegularExpression rxm(s_start + s_mac + "(?::" + s_mac + "){5}" + s_end);
QRegularExpressionValidator* lev_m = new QRegularExpressionValidator(rxm, this);
- lineedit->setValidator(lev_m); }
+ lineedit->setValidator(lev_m);
+ lev_m->deleteLater(); }
break;
case CMST::ValDialog_46: {
- QRegularExpression rx46(s_start + "(" + s_ip4 + "(?:\\." + s_ip4 + "){3}|" + s_ip6 + "(?::" + s_ip6 + "){7})" + s_end);
+ QRegularExpression rx46(s_start + "(" + s_ip4 + "|" + s_ip6 + ")" + s_end);
QRegularExpressionValidator* lev_46 = new QRegularExpressionValidator(rx46, this);
- lineedit->setValidator(lev_46); }
+ lineedit->setValidator(lev_46);
+ lev_46->deleteLater(); }
break;
case CMST::ValDialog_Hex: {
QRegularExpression rxh(s_start + s_hex + s_end);
QRegularExpressionValidator* lev_h = new QRegularExpressionValidator(rxh, this);
- lineedit->setValidator(lev_h); }
+ lineedit->setValidator(lev_h);
+ lev_h->deleteLater(); }
break;
case CMST::ValDialog_Int: {
QRegularExpression rxint(s_start + s_int + s_end);
QRegularExpressionValidator* lev_int = new QRegularExpressionValidator(rxint, this);
- lineedit->setValidator(lev_int); }
+ lineedit->setValidator(lev_int);
+ lev_int->deleteLater(); }
break;
case CMST::ValDialog_Dom: {
QRegularExpression rxdom(s_start + s_dom + s_end);
QRegularExpressionValidator* lev_dom = new QRegularExpressionValidator(rxdom, this);
- lineedit->setValidator(lev_dom); }
+ lineedit->setValidator(lev_dom);
+ lev_dom->deleteLater(); }
break;
- case CMST::ValDialog_Wd: {
- QRegularExpression rxwd(s_start + s_wd + s_end);
+ case CMST::ValDialog_Word: {
+ QRegularExpression rxwd(s_start + s_word + s_end);
QRegularExpressionValidator* lev_wd = new QRegularExpressionValidator(rxwd, this);
- lineedit->setValidator(lev_wd); }
+ lineedit->setValidator(lev_wd);
+ lev_wd->deleteLater(); }
break;
case CMST::ValDialog_min1ch: {
QRegularExpression rx1char(s_start + s_ch + "{1,}" + s_end);
QRegularExpressionValidator* lev_1char = new QRegularExpressionValidator(rx1char, this);
- lineedit->setValidator(lev_1char); }
+ lineedit->setValidator(lev_1char);
+ lev_1char->deleteLater(); }
break;
case CMST::ValDialog_min8ch: {
QRegularExpression rx8char(s_start + s_ch + "{8,}" + s_end);
QRegularExpressionValidator* lev_8char = new QRegularExpressionValidator(rx8char, this);
- lineedit->setValidator(lev_8char); }
+ lineedit->setValidator(lev_8char);
+ lev_8char->deleteLater(); }
break;
case CMST::ValDialog_46d: {
QRegularExpression rx46d(s_start + "(" + s_ip4 + "(?:\\." + s_ip4 + "){3}|" + s_ip6 + "(?::" + s_ip6 + "){7}|" + s_dom + ")" + s_end);
QRegularExpressionValidator* lev_46d = new QRegularExpressionValidator(rx46d, this);
- lineedit->setValidator(lev_46d); }
+ lineedit->setValidator(lev_46d);
+ lev_46d->deleteLater(); }
break;
default:
lineedit->setValidator(0);
@@ -222,3 +250,5 @@ void shared::ValidatingDialog::initialize()
return;
}
+
+
diff --git a/apps/cmstapp/code/shared/shared.h b/apps/cmstapp/code/shared/shared.h
index c02e47f..6460567 100644
--- a/apps/cmstapp/code/shared/shared.h
+++ b/apps/cmstapp/code/shared/shared.h
@@ -2,7 +2,7 @@
/**************************** shared.h ***************************
Functions shared across various classes
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -37,6 +37,8 @@ DEALINGS IN THE SOFTWARE.
# include <QLineEdit>
# include <QLabel>
# include <QPushButton>
+# include <QValidator>
+# include <QDBusInterface>
namespace shared {
//
@@ -49,6 +51,7 @@ class ValidatingDialog : public QDialog
ValidatingDialog(QWidget*);
inline void setLabel(const QString& s) {label->setText(s);}
void setValidator(const int&, bool plural = false);
+ inline const QValidator* getValidator() {return lineedit->validator(); }
inline QString getText() {return lineedit->text().trimmed();}
inline void setText(const QString& s) {lineedit->setText(s);}
inline void clear() {initialize();}
@@ -64,10 +67,11 @@ class ValidatingDialog : public QDialog
QLineEdit* lineedit;
QDialogButtonBox* buttonbox;
bool plural;
-};
+}; // class
QDBusMessage::MessageType processReply(const QDBusMessage& reply);
bool extractMapData(QMap<QString,QVariant>&,const QVariant&);
-}
+
+} // namespace
#endif
diff --git a/apps/cmstapp/code/trstring/tr_strings.cpp b/apps/cmstapp/code/trstring/tr_strings.cpp
index 89ec3f6..cb3498a 100644
--- a/apps/cmstapp/code/trstring/tr_strings.cpp
+++ b/apps/cmstapp/code/trstring/tr_strings.cpp
@@ -4,7 +4,7 @@ Class to manage and present strings that need to be translated. These
are typically not inline strings, rather strings used globally or strings
returned by third parties, for instance, Connman.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -34,17 +34,17 @@ DEALINGS IN THE SOFTWARE.
// Constructor
TranslateStrings::TranslateStrings(QObject* parent) : QObject(parent)
{
- // The stringlist is not actually used for anything other than a means
- // to mark strings for translation.
- QStringList sl;
- sl.clear();
+// The stringlist is not actually used for anything other than a means
+// to mark strings for translation.
+ QStringList sl;
+ sl.clear();
- // Global strings
- sl << tr("connman system tray", "Main Window Title");
- sl << tr("cmst", "Abbreviated Program Name - used for QMessageBox titles");
+// Global strings
+ sl << tr("connman system tray", "Main Window Title");
+ sl << tr("cmst", "Abbreviated Program Name - used for QMessageBox titles");
- // Connman strings
- sl << tr("idle", "connman state string");
+// Connman strings
+ sl << tr("idle", "connman state string");
sl << tr("association", "connman state string");
sl << tr("configuration", "connman state string");
sl << tr("ready", "connman state string");
@@ -73,6 +73,7 @@ TranslateStrings::TranslateStrings(QObject* parent) : QObject(parent)
sl << tr("none", "connman security string");
sl << tr("wep", "connman security string");
sl << tr("wps", "connman security string");
+ sl << tr("wps_advertising", "connman security string");
sl << tr("Invalid arguments", "connman error string");
sl << tr("Permission denied", "connman error string");
@@ -106,6 +107,7 @@ TranslateStrings::TranslateStrings(QObject* parent) : QObject(parent)
sl << tr("manual", "connman ipv4 method string");
sl << tr("off", "connman ipv4 method string");
sl << tr("fixed", "connman ipv4 method string");
+ sl << tr("address", "connamn ipv4 method string");
sl << tr("auto", "connman ipv6 method string");
sl << tr("manual", "connman ipv6 method string");
@@ -117,8 +119,11 @@ TranslateStrings::TranslateStrings(QObject* parent) : QObject(parent)
sl << tr("vpnc", "connman vpn connection type");
sl << tr("l2tp", "connman vpn connection type");
sl << tr("pptp", "connman vpn connection type");
+ sl << tr("wireguard", "connman vpn connection type");
+
+ sl << tr("true", "connman mdns setting");
+ sl << tr("false", "connman mdns setting");
-
return;
}
@@ -126,12 +131,12 @@ TranslateStrings::TranslateStrings(QObject* parent) : QObject(parent)
// Function to return a stringlist with entries translated
QStringList TranslateStrings::cmtr_sl(const QStringList& sl_src)
{
- QStringList sl_rtn;
- sl_rtn.clear();
- for (int i = 0; i < sl_src.count(); ++i) {
- sl_rtn << TranslateStrings::cmtr(sl_src.at(i) );
- }
+ QStringList sl_rtn;
+ sl_rtn.clear();
+ for (int i = 0; i < sl_src.count(); ++i) {
+ sl_rtn << TranslateStrings::cmtr(sl_src.at(i) );
+ }
- return sl_rtn;
+ return sl_rtn;
}
diff --git a/apps/cmstapp/code/trstring/tr_strings.h b/apps/cmstapp/code/trstring/tr_strings.h
index 06ca394..254e38c 100644
--- a/apps/cmstapp/code/trstring/tr_strings.h
+++ b/apps/cmstapp/code/trstring/tr_strings.h
@@ -4,7 +4,7 @@ Class to manage and present strings that need to be translated. These
are typically not inline strings, rather strings used globally or strings
returned by third parties, for instance, Connman.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/vpn_agent/vpnagent.cpp b/apps/cmstapp/code/vpn_agent/vpnagent.cpp
index 9056fe4..ad82b2c 100644
--- a/apps/cmstapp/code/vpn_agent/vpnagent.cpp
+++ b/apps/cmstapp/code/vpn_agent/vpnagent.cpp
@@ -4,7 +4,7 @@
Code for the user agent registered on DBus. When the connman vpn daemon
needs to communicate with the user it does so through this agent.
-Copyright (C) 2016-2019
+Copyright (C) 2016-2020
by: Andrew J. Bibb
License: MIT
@@ -34,32 +34,32 @@ DEALINGS IN THE SOFTWARE.
# include <QFile>
# include <QTextStream>
-# include "./vpnagent.h"
-# include "../resource.h"
+# include "./vpnagent.h"
+# include "../resource.h"
# include "./code/trstring/tr_strings.h"
-// header files generated by qmake from the xml file created by qdbuscpp2xml
+// header files generated by qmake from the xml file created by qdbuscpp2xml
# include "./vpnagent_adaptor.h"
# include "./vpnagent_interface.h"
-// defines
+// defines
# define ERROR_RETRY "net.connman.vpn.Agent.Error.Retry"
# define ERROR_CANCELED "net.connman.vpn.Agent.Error.Canceled"
-// constructor
+// constructor
ConnmanVPNAgent::ConnmanVPNAgent(QObject* parent)
: QObject(parent)
-{
- // members
- uiDialog = new VPNAgentDialog(qobject_cast<QWidget *> (this) );
- input_map.clear();
- b_loginputrequest = false;
-
- // Create Adaptor and register this Agent on the system bus.
- new VPNAgentAdaptor(this);
- QDBusConnection::systemBus().registerObject(VPN_AGENT_OBJECT, this);
-
- return;
+{
+ // members
+ uiDialog = new VPNAgentDialog(qobject_cast<QWidget *> (this) );
+ input_map.clear();
+ b_loginputrequest = false;
+
+ // Create Adaptor and register this Agent on the system bus.
+ new VPNAgentAdaptor(this);
+ QDBusConnection::systemBus().registerObject(VPN_AGENT_OBJECT, this);
+
+ return;
}
/////////////////////////////////////// PUBLIC Q_SLOTS////////////////////////////////
@@ -68,24 +68,24 @@ ConnmanVPNAgent::ConnmanVPNAgent(QObject* parent)
// tasks so don't need much here
void ConnmanVPNAgent::Release()
{
- //qDebug() << "Agent Released";
-
- return;
+ //qDebug() << "Agent Released";
+
+ return;
}
// Called when an error has to be reported to the user. Show the
// error in a QMessageBox
void ConnmanVPNAgent::ReportError(QDBusObjectPath path, QString s_error)
{
- (void) path;
-
- if ( QMessageBox::warning(qobject_cast<QWidget *> (parent()), tr("Connman Error"),
- tr("Connman returned the following error:<b><center>%1</b><br>Would you like to retry?").arg(TranslateStrings::cmtr(s_error)),
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::No
- ) == QMessageBox::Yes) this->sendErrorReply(ERROR_RETRY, "Going to retry the request");
-
- else return;
+ (void) path;
+
+ if ( QMessageBox::warning(qobject_cast<QWidget *> (parent()), tr("Connman Error"),
+ tr("Connman returned the following error:<b><center>%1</b><br>Would you like to retry?").arg(TranslateStrings::cmtr(s_error)),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::No
+ ) == QMessageBox::Yes) this->sendErrorReply(ERROR_RETRY, "Going to retry the request");
+
+ else return;
}
@@ -94,21 +94,21 @@ void ConnmanVPNAgent::ReportError(QDBusObjectPath path, QString s_error)
// A dialog is displayed with the required fields enabled (non-required fields are disabled).
QVariantMap ConnmanVPNAgent::RequestInput(QDBusObjectPath path, QMap<QString,QVariant> dict)
{
- (void) path;
-
- // Take the dict returned by DBus and extract the information we are interested in and place in input_map.
- this->createInputMap(dict);
-
- // Send our input_map to the dialog to have the user supply the necessary information
- // needed to continue. Return if canceled.
- QMap<QString,QVariant> rtn;
- rtn.clear();
- if (this->uiDialog->showPage(input_map) == QDialog::Rejected)
- this->sendErrorReply(ERROR_CANCELED,"User cancelled the dialog");
- else
- uiDialog->createDict(rtn); // create a return dict and send it back to connman on DBus
-
- return rtn;
+ (void) path;
+
+ // Take the dict returned by DBus and extract the information we are interested in and place in input_map.
+ this->createInputMap(dict);
+
+ // Send our input_map to the dialog to have the user supply the necessary information
+ // needed to continue. Return if canceled.
+ QMap<QString,QVariant> rtn;
+ rtn.clear();
+ if (this->uiDialog->showPage(input_map) == QDialog::Rejected)
+ this->sendErrorReply(ERROR_CANCELED,"User cancelled the dialog");
+ else
+ uiDialog->createDict(rtn); // create a return dict and send it back to connman on DBus
+
+ return rtn;
}
//
@@ -116,80 +116,80 @@ QVariantMap ConnmanVPNAgent::RequestInput(QDBusObjectPath path, QMap<QString,QVa
// a QMessageBox
void ConnmanVPNAgent::Cancel()
{
- QMessageBox::information(qobject_cast<QWidget *> (parent()), tr("Agent Request Failed"),
- tr("The agent request failed before a reply was returned.") );
+ QMessageBox::information(qobject_cast<QWidget *> (parent()), tr("Agent Request Failed"),
+ tr("The agent request failed before a reply was returned.") );
- return;
+ return;
}
/////////////////////////////////////// PUBLIC FUNCTIONS ////////////////////////////////
//
-// Function to put all of input fields received via DBus:RequestInput into a
-// QMap<QString,QString> where key is the input field received and value is
-// generally blank but can be used for informational text.
+// Function to put all of input fields received via DBus:RequestInput into a
+// QMap<QString,QString> where key is the input field received and value is
+// generally blank but can be used for informational text.
//
-// If we asked to log the input request create the log file in /tmp/cmst/input_request.log
+// If we asked to log the input request create the log file in /tmp/cmst/input_request.log
void ConnmanVPNAgent::createInputMap(const QMap<QString,QVariant>& r_map)
{
- // Initialize our data map
- input_map.clear();
-
- // QFile object for logging
- QTextStream log;
- QDir d(IPT_REQ_LOG_PATH);
- QFile logfile(d.absoluteFilePath(IPT_REQ_LOG_FILE));
- if (b_loginputrequest) {
- if (!logfile.open(QIODevice::WriteOnly | QIODevice::Text)) b_loginputrequest = false;
- else log.setDevice(&logfile);
- }
+ // Initialize our data map
+ input_map.clear();
+
+ // QFile object for logging
+ QTextStream log;
+ QDir d(IPT_REQ_LOG_PATH);
+ QFile logfile(d.absoluteFilePath(IPT_REQ_LOG_FILE));
+ if (b_loginputrequest) {
+ if (!logfile.open(QIODevice::WriteOnly | QIODevice::Text)) b_loginputrequest = false;
+ else log.setDevice(&logfile);
+ }
- // Run through the r_map getting the keys and the few values we are interested in.
- QMap<QString, QVariant>::const_iterator i = r_map.constBegin();
- while (i != r_map.constEnd()) {
-
+ // Run through the r_map getting the keys and the few values we are interested in.
+ QMap<QString, QVariant>::const_iterator i = r_map.constBegin();
+ while (i != r_map.constEnd()) {
+
// Lets see what the values contain, but first make sure we can get to them.
if (b_loginputrequest) log << "\nVPN_Agent: "<< "Map Key = " << i.key() << "\n";
if (! i.value().canConvert<QDBusArgument>() ) return;
const QDBusArgument qdba = i.value().value<QDBusArgument>();
- if (qdba.currentType() != QDBusArgument::MapType ) {
- if (b_loginputrequest) log << "\nVPN_Agent: Error - QDBusArgument as the value is not a MapType\n";
- return;
- }
+ if (qdba.currentType() != QDBusArgument::MapType ) {
+ if (b_loginputrequest) log << "\nVPN_Agent: Error - QDBusArgument as the value is not a MapType\n";
+ return;
+ }
// The r_map.value() is a QDBusArgument::MapType so extract this map into a new QMap called m.
qdba.beginMap();
QMap<QString,QString> m;
- m.clear();
- if (b_loginputrequest) log << "\nVPN_Agent: " << "Extracting the DBusArgument Map...\n";
- while ( ! qdba.atEnd() ) {
- QString k;
- QVariant v;
- qdba.beginMapEntry();
- qdba >> k >> v;
- qdba.endMapEntry();
- m.insert(k, v.toString());
- if (b_loginputrequest) log << "{ " << k << " , " << v.toString() << "}\n";
- } // while
- qdba.endMap();
-
- // Browse through QMap m and get things we need to look at
- // Types we don' really care about. We ignore "optional" and "alternate" requirements
+ m.clear();
+ if (b_loginputrequest) log << "\nVPN_Agent: " << "Extracting the DBusArgument Map...\n";
+ while ( ! qdba.atEnd() ) {
+ QString k;
+ QVariant v;
+ qdba.beginMapEntry();
+ qdba >> k >> v;
+ qdba.endMapEntry();
+ m.insert(k, v.toString());
+ if (b_loginputrequest) log << "{ " << k << " , " << v.toString() << "}\n";
+ } // while
+ qdba.endMap();
+
+ // Browse through QMap m and get things we need to look at
+ // Types we don' really care about. We ignore "optional" and "alternate" requirements
// and only extract the "mandatory" and "informational" requirements with values
- if (m.contains("Requirement") ) {
- QString val = QString();
- if ( m.value("Requirement").contains("mandatory", Qt::CaseInsensitive) || m.value("Requirement").contains("informational", Qt::CaseInsensitive) ) {
- if (m.contains("Value") ) val = m.value("Value");
- } // if mandatory or informational
- // create our input_map entry
- input_map[i.key()] = val;
- } // if requirement
+ if (m.contains("Requirement") ) {
+ QString val = QString();
+ if ( m.value("Requirement").contains("mandatory", Qt::CaseInsensitive) || m.value("Requirement").contains("informational", Qt::CaseInsensitive) ) {
+ if (m.contains("Value") ) val = m.value("Value");
+ } // if mandatory or informational
+ // create our input_map entry
+ input_map[i.key()] = val;
+ } // if requirement
++i;
- } // while
-
- logfile.close();
- return;
+ } // while
+
+ logfile.close();
+ return;
}
diff --git a/apps/cmstapp/code/vpn_agent/vpnagent.h b/apps/cmstapp/code/vpn_agent/vpnagent.h
index 0e17537..907563c 100644
--- a/apps/cmstapp/code/vpn_agent/vpnagent.h
+++ b/apps/cmstapp/code/vpn_agent/vpnagent.h
@@ -3,7 +3,7 @@
Code for the user agent registered on DBus. When the connman vpn daemon
needs to communicate with the user it does so through this agent.
-Copyright (C) 2016-2019
+Copyright (C) 2016-2020
by: Andrew J. Bibb
License: MIT
@@ -28,7 +28,7 @@ DEALINGS IN THE SOFTWARE.
# ifndef CONNMAN_VPN_AGENT
-# define CONNMAN_VPN_AGENT
+# define CONNMAN_VPN_AGENT
# include <QObject>
# include <QString>
@@ -50,8 +50,8 @@ class ConnmanVPNAgent : public QObject, protected QDBusContext
Q_CLASSINFO("D-Bus Interface", VPN_AGENT_INTERFACE)
public:
- ConnmanVPNAgent(QObject*);
- inline void setLogInputRequest(bool b) {b_loginputrequest = b;}
+ ConnmanVPNAgent(QObject*);
+ inline void setLogInputRequest(bool b) {b_loginputrequest = b;}
public Q_SLOTS:
void Release();
@@ -60,13 +60,13 @@ class ConnmanVPNAgent : public QObject, protected QDBusContext
void Cancel();
private:
- VPNAgentDialog* uiDialog;
- QMap<QString,QString> input_map;
- bool b_loginputrequest;
- void createInputMap(const QMap<QString,QVariant>&);
-
- public:
- inline void setWhatsThisIcon(QIcon icon) {uiDialog->setWhatsThisIcon(icon);}
+ VPNAgentDialog* uiDialog;
+ QMap<QString,QString> input_map;
+ bool b_loginputrequest;
+ void createInputMap(const QMap<QString,QVariant>&);
+
+ public:
+ inline void setWhatsThisIcon(QIcon icon) {uiDialog->setWhatsThisIcon(icon);}
};
#endif
diff --git a/apps/cmstapp/code/vpn_agent/vpnagent_dialog.cpp b/apps/cmstapp/code/vpn_agent/vpnagent_dialog.cpp
index 3ab8eba..fb19a9b 100644
--- a/apps/cmstapp/code/vpn_agent/vpnagent_dialog.cpp
+++ b/apps/cmstapp/code/vpn_agent/vpnagent_dialog.cpp
@@ -5,7 +5,7 @@ needs to communicate with the user it does so through the agent. The
agent has a QDialog as a class member, and agent_dialog.cpp manages
that dialog.
-Copyright (C) 2016-2019
+Copyright (C) 2016-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/vpn_agent/vpnagent_dialog.h b/apps/cmstapp/code/vpn_agent/vpnagent_dialog.h
index 3a0a6e3..8e28021 100644
--- a/apps/cmstapp/code/vpn_agent/vpnagent_dialog.h
+++ b/apps/cmstapp/code/vpn_agent/vpnagent_dialog.h
@@ -5,7 +5,7 @@ needs to communicate with the user it does so through the agent. The
agent has a QDialog as a class member, and agent_dialog.cpp manages
that dialog.
-Copyright (C) 2016-2019
+Copyright (C) 2016-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui b/apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui
index 3614ea1..9edfdd7 100644
--- a/apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui
+++ b/apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>418</width>
+ <width>434</width>
<height>574</height>
</rect>
</property>
@@ -857,6 +857,166 @@ that the peer is no longer connected.</string>
<string notr="true">Import Configuration</string>
</property>
</action>
+ <action name="actionProviderWireGuard">
+ <property name="text">
+ <string>Provider WireGuard</string>
+ </property>
+ <property name="toolTip">
+ <string>Provider Wire Guard</string>
+ </property>
+ </action>
+ <action name="actionVPNC_DeviceType">
+ <property name="text">
+ <string>VPNC.DeviceType</string>
+ </property>
+ <property name="toolTip">
+ <string>Wheher the VPN should use tun or tap.</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_Address">
+ <property name="text">
+ <string>WireGuard.Address</string>
+ </property>
+ <property name="toolTip">
+ <string>Internal IP Address</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_ListPort">
+ <property name="text">
+ <string>WireGuard.ListPort</string>
+ </property>
+ <property name="toolTip">
+ <string>Local listen port (optional).</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_DNS">
+ <property name="text">
+ <string>WireGuard.DNS</string>
+ </property>
+ <property name="toolTip">
+ <string>List of name servers (optional).</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_PrivateKey">
+ <property name="text">
+ <string>WireGuard.PrivateKey</string>
+ </property>
+ <property name="toolTip">
+ <string>Private key of the interface.</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_PublicKey">
+ <property name="text">
+ <string>WireGuard.PublicKey</string>
+ </property>
+ <property name="toolTip">
+ <string>Public key of peer.</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_PresharedKey">
+ <property name="text">
+ <string>WireGuard.PresharedKey</string>
+ </property>
+ <property name="toolTip">
+ <string>Preshared key of peer (optional).</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_AllowedIPs">
+ <property name="text">
+ <string>WireGuard.AllowedIPs</string>
+ </property>
+ <property name="toolTip">
+ <string>See cryptokey routing.</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_EndpointPort">
+ <property name="text">
+ <string>WireGuard.EndpointPort</string>
+ </property>
+ <property name="toolTip">
+ <string>Endpoint listen port (optional).</string>
+ </property>
+ </action>
+ <action name="actionWireGuard_PersistentKeepalive">
+ <property name="text">
+ <string>WireGuard.PersistentKeepalive</string>
+ </property>
+ <property name="toolTip">
+ <string>Keep alive in seconds (optional).</string>
+ </property>
+ </action>
+ <action name="actionOpenVPN_DeviceType">
+ <property name="text">
+ <string>OpenVPN.DeviceType</string>
+ </property>
+ <property name="toolTip">
+ <string>Whether the VPN should use tun or tap.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_AllowSelfSignedCert">
+ <property name="text">
+ <string>OpenConnect.AllowSelfSignedCert</string>
+ </property>
+ <property name="toolTip">
+ <string>Define if self signed server certificates are allowed.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_AuthType">
+ <property name="text">
+ <string>OpenConnect.AuthType</string>
+ </property>
+ <property name="toolTip">
+ <string>Type of authentication used.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_DisableIPv6">
+ <property name="text">
+ <string>OpenConnect.DisableIPv6</string>
+ </property>
+ <property name="toolTip">
+ <string>Do not ask for IPv6 connectivity.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_NoDTLS">
+ <property name="text">
+ <string>OpenConnect.NoDTLS</string>
+ </property>
+ <property name="toolTip">
+ <string>Disable DTLS and ESP.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_NoHTTPKeepalive">
+ <property name="text">
+ <string>OpenConnect.NoHTTPKeepalive</string>
+ </property>
+ <property name="toolTip">
+ <string>Disable HTTP connection re-use.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_PKCSClientCert">
+ <property name="text">
+ <string>OpenConnect.PKCSClientCert</string>
+ </property>
+ <property name="toolTip">
+ <string>Certificate and privatekey in a PKCS#1/PKCS#8/PKCS#12 structure.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_Usergroup">
+ <property name="text">
+ <string>OpenConnect.Usergroup</string>
+ </property>
+ <property name="toolTip">
+ <string>Set login usergroup on remote server.</string>
+ </property>
+ </action>
+ <action name="actionOpenConnect_UserPrivateKey">
+ <property name="text">
+ <string>OpenConnect.UserPrivateKey</string>
+ </property>
+ <property name="toolTip">
+ <string>SSL private key file needed by web authentication.</string>
+ </property>
+ </action>
</widget>
<resources/>
<connections>
diff --git a/apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp b/apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp
index 6edd946..b38b2fe 100644
--- a/apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp
+++ b/apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp
@@ -2,7 +2,7 @@
Code to manage the VPN Provisioning Editor dialog.
-Copyright (C) 2016-2019
+Copyright (C) 2016-2020
by: Andrew J. Bibb
License: MIT
@@ -45,7 +45,7 @@ DEALINGS IN THE SOFTWARE.
# include "./code/shared/shared.h"
//
-// This class is derived from the ProvisioningEditor class, There are a few improvements
+// This class is based on the ProvisioningEditor class, There are a few improvements
// mainly in more efficient packaging of the text data into each QAction.
//
// In this class:
@@ -57,8 +57,8 @@ DEALINGS IN THE SOFTWARE.
// ask for all mandatory fields for each type of connection.
//
-// Constructor
-VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
+// Constructor
+VPN_Editor::VPN_Editor(QWidget* parent, const float& ver) : QDialog(parent)
{
// Setup the user interface
ui.setupUi(this);
@@ -86,7 +86,8 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
group_provider->addAction(ui.actionProviderVPNC);
group_provider->addAction(ui.actionProviderL2TP);
group_provider->addAction(ui.actionProviderPPTP);
-
+ group_provider->addAction(ui.actionProviderWireGuard);
+
group_freeform = new QActionGroup(this);
group_freeform->addAction(ui.actionGlobal);
group_freeform->addAction(ui.actionGlobalName);
@@ -104,19 +105,27 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
group_freeform->addAction(ui.actionVPNC_AppVersion);
group_freeform->addAction(ui.actionOpenVPN_Cipher);
group_freeform->addAction(ui.actionOpenVPN_Auth);
-
+ group_freeform->addAction(ui.actionOpenConnect_Usergroup);
+ group_freeform->addAction(ui.actionWireGuard_Address);
+
group_combobox = new QActionGroup(this);
group_combobox->addAction(ui.actionVPNC_IKE_Authmode);
group_combobox->addAction(ui.actionVPNC_IKE_DHGroup);
group_combobox->addAction(ui.actionVPNC_PFS);
group_combobox->addAction(ui.actionVPNC_Vendor);
group_combobox->addAction(ui.actionVPNC_NATTMode);
+ group_combobox->addAction(ui.actionVPNC_DeviceType);
group_combobox->addAction(ui.actionOpenVPN_NSCertType);
group_combobox->addAction(ui.actionOpenVPN_Proto);
group_combobox->addAction(ui.actionOpenVPN_CompLZO);
group_combobox->addAction(ui.actionOpenVPN_RemoteCertTls);
-
-
+ group_combobox->addAction(ui.actionOpenVPN_DeviceType);
+ group_combobox->addAction(ui.actionOpenConnect_AllowSelfSignedCert);
+ group_combobox->addAction(ui.actionOpenConnect_AuthType);
+ group_combobox->addAction(ui.actionOpenConnect_DisableIPv6);
+ group_combobox->addAction(ui.actionOpenConnect_NoDTLS);
+ group_combobox->addAction(ui.actionOpenConnect_NoHTTPKeepalive);
+
group_yes = new QActionGroup(this);
group_yes->addAction(ui.actionPPPD_RefuseEAP);
group_yes->addAction(ui.actionPPPD_RefusePAP);
@@ -171,7 +180,15 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
group_validated->addAction(ui.actionOpenVPN_Port);
group_validated->addAction(ui.actionOpenConnect_ServerCert);
group_validated->addAction(ui.actionOpenConnect_VPNHost);
-
+ group_validated->addAction(ui.actionWireGuard_ListPort);
+ group_validated->addAction(ui.actionWireGuard_DNS);
+ group_validated->addAction(ui.actionWireGuard_PrivateKey);
+ group_validated->addAction(ui.actionWireGuard_PublicKey);
+ group_validated->addAction(ui.actionWireGuard_PresharedKey);
+ group_validated->addAction(ui.actionWireGuard_AllowedIPs);
+ group_validated->addAction(ui.actionWireGuard_EndpointPort);
+ group_validated->addAction(ui.actionWireGuard_PersistentKeepalive);
+
group_selectfile = new QActionGroup(this);
group_selectfile->addAction(ui.actionL2TP_AuthFile);
group_selectfile->addAction(ui.actionOpenVPN_CACert);
@@ -182,6 +199,8 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
group_selectfile->addAction(ui.actionOpenConnect_ClientCert);
group_selectfile->addAction(ui.actionOpenVPN_AuthUserPass);
group_selectfile->addAction(ui.actionOpenVPN_AskPass);
+ group_selectfile->addAction(ui.actionOpenConnect_PKCSClientCert);
+ group_selectfile->addAction(ui.actionOpenConnect_UserPrivateKey);
// Add Actions from UI to menu's
menu_global = new QMenu(tr("Global"), this);
@@ -193,7 +212,7 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_OpenConnect = new QMenu(tr("OpenConnect"), this);
menu_OpenConnect->addAction(ui.actionProviderOpenConnect);
menu_OpenConnect->addSeparator();
- menu_OpenConnect->addAction(ui.actionOpenConnect_ServerCert);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_ServerCert);
menu_OpenConnect->addAction(ui.actionOpenConnect_CACert);
menu_OpenConnect->addAction(ui.actionOpenConnect_ClientCert);
menu_OpenConnect->addSeparator();
@@ -201,6 +220,17 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_OpenConnect->addAction(ui.actionOpenConnect_Cookie);
menu_OpenConnect->addSeparator();
menu_OpenConnect->addAction(ui.actionOpenConnect_VPNHost);
+ if (ver > 1.37f) {
+ menu_OpenConnect->addSeparator();
+ menu_OpenConnect->addAction(ui.actionOpenConnect_AllowSelfSignedCert);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_AuthType);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_DisableIPv6);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_NoDTLS);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_NoHTTPKeepalive);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_PKCSClientCert);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_Usergroup);
+ menu_OpenConnect->addAction(ui.actionOpenConnect_UserPrivateKey);
+ }
menu_OpenVPN = new QMenu(tr("OpenVPN"), this);
menu_OpenVPN->addAction(ui.actionProviderOpenVPN);
@@ -215,9 +245,9 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_OpenVPN->addAction(ui.actionOpenVPN_Proto);
menu_OpenVPN->addAction(ui.actionOpenVPN_Port);
menu_OpenVPN->addSeparator();
- menu_OpenVPN->addAction(ui.actionOpenVPN_AuthUserPass);
- menu_OpenVPN->addAction(ui.actionOpenVPN_AskPass);
- menu_OpenVPN->addAction(ui.actionOpenVPN_AuthNoCache);
+ menu_OpenVPN->addAction(ui.actionOpenVPN_AuthUserPass);
+ menu_OpenVPN->addAction(ui.actionOpenVPN_AskPass);
+ menu_OpenVPN->addAction(ui.actionOpenVPN_AuthNoCache);
menu_OpenVPN->addSeparator();
menu_OpenVPN->addAction(ui.actionOpenVPN_Cipher);
menu_OpenVPN->addAction(ui.actionOpenVPN_Auth);
@@ -225,7 +255,10 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_OpenVPN->addAction(ui.actionOpenVPN_RemoteCertTls);
menu_OpenVPN->addSeparator();
menu_OpenVPN->addAction(ui.actionOpenVPN_ConfigFile);
-
+ if (ver > 1.37f) {
+ menu_OpenVPN->addSeparator();
+ menu_OpenVPN->addAction(ui.actionOpenVPN_DeviceType);
+ }
menu_VPNC = new QMenu(tr("VPNC"), this);
menu_VPNC->addAction(ui.actionProviderVPNC);
menu_VPNC->addSeparator();
@@ -248,11 +281,14 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_VPNC->addSeparator();
menu_VPNC->addAction(ui.actionVPNC_SingleDES);
menu_VPNC->addAction(ui.actionVPNC_NoEncryption);
+ if (ver > 1.37f) {
+ menu_VPNC->addSeparator();
+ menu_VPNC->addAction(ui.actionVPNC_DeviceType);
+ }
menu_L2TP = new QMenu(tr("L2TP"), this);
menu_L2TP->addAction(ui.actionProviderL2TP);
menu_L2TP->addSeparator();
- menu_L2TP->addSeparator();
menu_L2TP->addAction(ui.actionL2TP_User);
menu_L2TP->addAction(ui.actionL2TP_Password);
menu_L2TP->addSeparator();
@@ -281,7 +317,7 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_L2TP->addAction(ui.actionL2TP_IPsecSaref);
menu_L2TP->addAction(ui.actionL2TP_Port);
menu_L2TP->addSeparator();
- menu_L2TP->addAction(ui.actionPPPD_EchoFailure);
+ menu_L2TP->addAction(ui.actionPPPD_EchoFailure);
menu_L2TP->addAction(ui.actionPPPD_EchoInterval);
menu_L2TP->addAction(ui.actionPPPD_Debug);
menu_L2TP->addSeparator();
@@ -327,7 +363,20 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menu_PPTP->addAction(ui.actionPPPD_RequirMPPE128);
menu_PPTP->addAction(ui.actionPPPD_RequirMPPEStateful);
-
+ menu_WireGuard = new QMenu(tr("WireGuard"), this);
+ menu_WireGuard->addAction(ui.actionProviderWireGuard);
+ menu_WireGuard->addSeparator();
+ menu_WireGuard->addAction(ui.actionWireGuard_Address);
+ menu_WireGuard->addAction(ui.actionWireGuard_ListPort);
+ menu_WireGuard->addAction(ui.actionWireGuard_DNS);
+ menu_WireGuard->addSeparator();
+ menu_WireGuard->addAction(ui.actionWireGuard_PrivateKey);
+ menu_WireGuard->addAction(ui.actionWireGuard_PublicKey);
+ menu_WireGuard->addAction(ui.actionWireGuard_PresharedKey);
+ menu_WireGuard->addAction(ui.actionWireGuard_AllowedIPs);
+ menu_WireGuard->addAction(ui.actionWireGuard_EndpointPort);
+ menu_WireGuard->addAction(ui.actionWireGuard_PersistentKeepalive);
+
// add menus to UI
menubar->addMenu(menu_global);
menubar->addMenu(menu_OpenConnect);
@@ -335,6 +384,9 @@ VPN_Editor::VPN_Editor(QWidget* parent) : QDialog(parent)
menubar->addMenu(menu_VPNC);
menubar->addMenu(menu_L2TP);
menubar->addMenu(menu_PPTP);
+ if (ver > 1.37f) {
+ menubar->addMenu(menu_WireGuard);
+ }
// connect signals to slots
connect(ui.toolButton_whatsthis, SIGNAL(clicked()), this, SLOT(showWhatsThis()));
@@ -368,10 +420,11 @@ void VPN_Editor::inputSelectFile(QAction* act)
if (act == ui.actionOpenVPN_Key) filterstring = tr("Key Files (*.key *.ca *.cert *.crt *.pem);;All Files (*.*)");
if (act == ui.actionOpenVPN_ConfigFile) filterstring = tr("Config Files (*.ovpn *.conf *.config);;All Files (*.*)");
- filepath = "/etc/openvpn";
+ filepath = "/etc/openconnect";
if (act == ui.actionOpenConnect_CACert) filterstring = tr("Cert Files (*.pem *.ca *.crt *.cert);;All Files (*.*)");
if (act == ui.actionOpenConnect_ClientCert) filterstring = tr("Cert Files (*.pem *.ca *.crt *.cert);;All Files (*.*)");
-
+ if (act == ui.actionOpenConnect_PKCSClientCert) filterstring = tr("Cert Files (*.pem *.ca *.crt *.cert);;All Files (*.*)");
+ if (act == ui.actionOpenConnect_UserPrivateKey) filterstring = tr("Cert Files (*.pem *.ca *.crt *.cert);;All Files (*.*)");
QString fname = QFileDialog::getOpenFileName(this, act->toolTip(),
filepath,
@@ -393,6 +446,7 @@ void VPN_Editor::inputSelectFile(QAction* act)
void VPN_Editor::inputValidated(QAction* act, QString key)
{
// variables
+ QChar delim(','); // default delim character for plurals
if (key.isEmpty() ) key = act->text();
// create the dialog
@@ -403,7 +457,7 @@ void VPN_Editor::inputValidated(QAction* act, QString key)
else vd->setLabel(act->toolTip() );
if (act == ui.actionPPPD_EchoFailure) vd->setValidator(CMST::ValDialog_Int, false);
- if (act == ui.actionPPPD_EchoInterval) vd->setValidator(CMST::ValDialog_Int, false);
+ if (act == ui.actionPPPD_EchoInterval) vd->setValidator(CMST::ValDialog_Int, false);
if (act == ui.actionL2TP_BPS) vd->setValidator(CMST::ValDialog_Int, false);
if (act == ui.actionL2TP_TXBPS) vd->setValidator(CMST::ValDialog_Int, false);
if (act == ui.actionL2TP_RXBPS) vd->setValidator(CMST::ValDialog_Int, false);
@@ -418,8 +472,16 @@ void VPN_Editor::inputValidated(QAction* act, QString key)
if (act == ui.actionOpenVPN_Port) vd->setValidator(CMST::ValDialog_Int, false);
if (act == ui.actionOpenConnect_ServerCert) vd->setValidator(CMST:: ValDialog_Hex, false);
if (act == ui.actionOpenConnect_VPNHost) vd->setValidator(CMST::ValDialog_46, false);
-
- // if accepted put an entry in the textedit
+ if (act == ui.actionWireGuard_ListPort) vd->setValidator(CMST::ValDialog_Int, false);
+ if (act == ui.actionWireGuard_DNS) vd->setValidator(CMST::ValDialog_46, true);
+ if (act == ui.actionWireGuard_PrivateKey) vd->setValidator(CMST::ValDialog_Word, false);
+ if (act == ui.actionWireGuard_PublicKey) vd->setValidator(CMST::ValDialog_Word, false);
+ if (act == ui.actionWireGuard_PresharedKey) vd->setValidator(CMST::ValDialog_Word, false);
+ if (act == ui.actionWireGuard_AllowedIPs) vd->setValidator(CMST::ValDialog_46, true);
+ if (act == ui.actionWireGuard_EndpointPort) vd->setValidator(CMST::ValDialog_Int, false);
+ if (act == ui.actionWireGuard_PersistentKeepalive) vd->setValidator(CMST::ValDialog_Int, false);
+
+// if accepted put an entry in the textedit
if (vd->exec() == QDialog::Accepted) {
QString s = vd->getText();
key.append(" = %1\n");
@@ -428,8 +490,9 @@ void VPN_Editor::inputValidated(QAction* act, QString key)
if (vd->isPlural() ) {
s.replace(',', ' ');
s.replace(';', ' ');
+ s.replace('|', ' ');
s = s.simplified();
- s.replace(' ', ',');
+ s.replace(' ', delim);
}
ui.plainTextEdit_main->insertPlainText(key.arg(s) );
@@ -456,11 +519,18 @@ void VPN_Editor::inputComboBox(QAction* act)
if (act == ui.actionVPNC_PFS) sl << "nopfs" << "dh1" << "dh2" << "dh5" << "server";
if (act == ui.actionVPNC_Vendor) sl << "cisco" << "netscreen";
if (act == ui.actionVPNC_NATTMode) sl << "natt" << "none" << "force-natt" << "cisco-udp";
+ if (act == ui.actionVPNC_DeviceType) sl << "tun" << "tap";
if (act == ui.actionOpenVPN_NSCertType) sl << "client" << "server";
if (act == ui.actionOpenVPN_Proto) sl << "udp" << "tcp-client" << "tcp-server";
if (act == ui.actionOpenVPN_CompLZO) sl << "adaptive" << "yes" << "no";
if (act == ui.actionOpenVPN_RemoteCertTls) sl << "client" << "server";
-
+ if (act == ui.actionOpenVPN_DeviceType) sl << "tun" << "tap";
+ if (act == ui.actionOpenConnect_AllowSelfSignedCert) sl << "false" << "true";
+ if (act == ui.actionOpenConnect_AuthType) sl << "cookie" << "cookie_with_userpass" << "userpass" << "publickey" << "pkcs";
+ if (act == ui.actionOpenConnect_DisableIPv6) sl << "false" << "true";
+ if (act == ui.actionOpenConnect_NoDTLS) sl << "false" << "true";
+ if (act == ui.actionOpenConnect_NoHTTPKeepalive) sl << "false" << "true";
+
QStringList sl_tr = TranslateStrings::cmtr_sl(sl);
QString item = QInputDialog::getItem(this,
tr("%1 - Item Input").arg(TranslateStrings::cmtr("cmst")),
@@ -480,15 +550,15 @@ void VPN_Editor::inputComboBox(QAction* act)
// This slot is easy, every action sent is set to "yes"
void VPN_Editor::inputYes(QAction* act)
{
- if (QMessageBox::question (this,
- tr("%1 - Verify Option").arg(TranslateStrings::cmtr("cmst")),
- act->toolTip(),
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::Yes) == QMessageBox::Yes) ui.plainTextEdit_main->insertPlainText(QString(act->text() + " = yes\n") );
-
- return;
+ if (QMessageBox::question (this,
+ tr("%1 - Verify Option").arg(TranslateStrings::cmtr("cmst")),
+ act->toolTip(),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::Yes) == QMessageBox::Yes) ui.plainTextEdit_main->insertPlainText(QString(act->text() + " = yes\n") );
+
+ return;
}
-//
+
// Slot called when a member of the QActionGroup group_freeform is triggered
// Freeform strings may have spaces in them. For strings that cannot have spaces
// use validated text and set b_multiple to false.
@@ -502,12 +572,15 @@ void VPN_Editor::inputFreeForm(QAction* act, QString key)
// create some prompts
if (key == "Name") str = tr("User defined name for the VPN");
- else if (key == "Domain") str = tr("Domain name for the VPN Service\n(example: corporate.com)");
- else if (key == "Networks") str = tr("Networks behing the VPN link, if more than one separate by a comma.\n"
- "Format is network/netmask/gateway, and gateway can be omitted.\n"
- "Ex: 10.10.20.0/255.255.255.0/10.20.1.5,192.168.99.1/24,2001:Ldb8::1/16\n\n"
- "Networks = entry is optional and may be left blank.");
- else str = act->toolTip();
+ else if (key == "Domain") str = tr("Domain name for the VPN Service\n(ex: corporate.com)");
+ else if (key == "Networks") str = tr("Networks behind the VPN link, if more than one separate by a comma.\n"
+ "Format is network/netmask/gateway, and gateway can be omitted.\n"
+ "Ex: 10.10.20.0/255.255.255.0/10.20.1.5,192.168.99.1/24,2001:Ldb8::1/16\n\n"
+ "Networks = entry is optional and may be left blank.");
+ else if (act == ui.actionWireGuard_Address) str = tr("Network address in the form address/netmask/peer.\n"
+ "Ex: 10.2.0.2/24" );
+
+ else str = act->toolTip();
if (act == ui.actionGlobal) {
key.append("\n");
@@ -571,8 +644,8 @@ void VPN_Editor::requestFileList(QAbstractButton* button)
}
//
-// Slot to process the file list from /var/lib/connman. Connected to
-// the obtainedFileList signal in roothelper
+// Slot to process the file list from /var/lib/connman-vpn. Connected to
+// the callWithCallback signal in requestFileList()
void VPN_Editor::processFileList(const QStringList& sl_conf)
{
// variables
@@ -611,7 +684,8 @@ void VPN_Editor::processFileList(const QStringList& sl_conf)
if (ok) filename = item;
break;
} // switch
- // if we have a filename try to open the file
+
+ // if we have a filename try to open the file
if (! filename.isEmpty() ) {
vlist.clear();
vlist << QVariant::fromValue(vpn_path);
@@ -661,9 +735,9 @@ void VPN_Editor::processFileList(const QStringList& sl_conf)
true, // editable
&ok);
if (ok) {
- filename = item.simplified(); // multiple whitespace to one space
- filename = filename.replace(' ', '_'); // replace spaces with underscores
- } // if ok
+ filename = item.simplified(); // multiple whitespace to one space
+ filename = filename.replace(' ', '_'); // replace spaces with underscores
+ } // if ok
// if we have a filename try to save the file
if (! filename.isEmpty() ) {
vlist.clear();
@@ -746,193 +820,156 @@ void VPN_Editor::callbackErrorHandler(QDBusError err)
// Slot to prompt and create a new Provider section
void VPN_Editor::createProvider(QAction* act)
{
- // common mandatory fields
- if (act == ui.actionProviderOpenConnect) ui.plainTextEdit_main->insertPlainText("\n[provider_openconnect]\nType = OpenConnect\n");
- else if (act == ui.actionProviderOpenVPN) ui.plainTextEdit_main->insertPlainText("\n[provider_openvpn]\nType = OpenVPN\n");
- else if (act == ui.actionProviderVPNC) ui.plainTextEdit_main->insertPlainText("\n[provider_vpnc]\nType = VPNC\n");
- else if (act == ui.actionProviderL2TP) ui.plainTextEdit_main->insertPlainText("\n[provider_l2tp]\nType = L2TP\n");
- else if (act == ui.actionProviderPPTP) ui.plainTextEdit_main->insertPlainText("\n[provider_pptp]\nType = PPTP\n");
- inputFreeForm(act, "Name");
- inputValidated(act, "Host");
- inputFreeForm(act, "Domain");
- inputFreeForm(act, "Networks");
-
- // individual provider mandatory fields
- if (act == ui.actionProviderVPNC) inputFreeForm(ui.actionVPNC_IPSec_ID, "VPNC.IPSec.ID");
- if (act == ui.actionProviderOpenVPN) {
- inputSelectFile(ui.actionOpenVPN_CACert);
- inputSelectFile(ui.actionOpenVPN_Cert);
- inputSelectFile(ui.actionOpenVPN_Key);
- }
-
- return;
+ // common mandatory fields
+ if (act == ui.actionProviderOpenConnect) ui.plainTextEdit_main->insertPlainText("\n[provider_openconnect]\nType = OpenConnect\n");
+ else if (act == ui.actionProviderOpenVPN) ui.plainTextEdit_main->insertPlainText("\n[provider_openvpn]\nType = OpenVPN\n");
+ else if (act == ui.actionProviderVPNC) ui.plainTextEdit_main->insertPlainText("\n[provider_vpnc]\nType = VPNC\n");
+ else if (act == ui.actionProviderL2TP) ui.plainTextEdit_main->insertPlainText("\n[provider_l2tp]\nType = L2TP\n");
+ else if (act == ui.actionProviderPPTP) ui.plainTextEdit_main->insertPlainText("\n[provider_pptp]\nType = PPTP\n");
+ else if (act == ui.actionProviderWireGuard) ui.plainTextEdit_main->insertPlainText("\n[provider_wireguard]\nType = WireGuard\n");
+ inputFreeForm(act, "Name");
+ inputValidated(act, "Host");
+ inputFreeForm(act, "Domain");
+ inputFreeForm(act, "Networks");
+
+ // individual provider mandatory fields
+ if (act == ui.actionProviderVPNC) inputFreeForm(ui.actionVPNC_IPSec_ID, "VPNC.IPSec.ID");
+ if (act == ui.actionProviderOpenVPN) {
+ inputSelectFile(ui.actionOpenVPN_CACert);
+ inputSelectFile(ui.actionOpenVPN_Cert);
+ inputSelectFile(ui.actionOpenVPN_Key);
+ }
+
+ return;
}
//
// Slot to import an OpenVPN configuration file
void VPN_Editor::importOpenVPN()
{
- // Variables
+ // Variables
QString filterstring = tr("OpenVPN Configurations (*.ovpn *.conf);;All Files (*.*)");
- QString filepath = QDir::homePath();
- QStringList taglist = (QStringList() << "ca" << "cert" << "key" << "tls-auth");
-
- // To start things off we need some input from the user
- ui.plainTextEdit_main->insertPlainText("\n[provider_openvpn]\nType = OpenVPN\n");
- inputFreeForm(ui.actionProviderOpenConnect, "Name");
- inputValidated(ui.actionProviderOpenConnect, "Host");
- inputFreeForm(ui.actionProviderOpenConnect, "Domain");
- inputFreeForm(ui.actionProviderOpenConnect, "Networks");
+ QString filepath = QDir::homePath();
+
+ // To start things off we need some input from the user
+ ui.plainTextEdit_main->insertPlainText("\n[provider_openvpn]\nType = OpenVPN\n");
+ inputFreeForm(ui.actionProviderOpenConnect, "Name");
+ inputValidated(ui.actionProviderOpenConnect, "Host");
+ inputFreeForm(ui.actionProviderOpenConnect, "Domain");
+ inputFreeForm(ui.actionProviderOpenConnect, "Networks");
QString fname = QFileDialog::getOpenFileName(this, tr("Select the configuration file to import"),
filepath,
filterstring);
- // Return if the file name returned is empty (cancel pressed in the dialog)
+ // Return if the file name returned is empty (cancel pressed in the dialog)
if (fname.isEmpty() ) return;
// Read the source file
- QFile sourcefile(fname);
- if (sourcefile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString contents = QString(sourcefile.readAll());
- sourcefile.close();
-
- // Setup the data directories
- // APP defined in resource.h
- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
- QFileInfo fi(fname); // need to extract the baseName
- QDir target_dir = QDir(QString(env.value("XDG_DATA_HOME", QString(QDir::homePath()) + "/.local/share") + "/%1/openvpn/%2").arg(QString(APP).toLower()).arg(fi.baseName()) );
- if (! target_dir.exists()) target_dir.mkpath(target_dir.absolutePath() );
-
- // Extract all the certs and keys
- for (int i = 0; i < taglist.count(); ++i) {
- int snipfrom = contents.indexOf(QString("<%1>\n").arg(taglist.at(i)) );
- int snipto = contents.indexOf(QString("</%1>").arg(taglist.at(i)), snipfrom + QString("<%1>\n").arg(taglist.at(i)).size()) + QString("</%1>").arg(taglist.at(i)).size();
- if (snipfrom != snipto && snipfrom >= 0 && snipto >= 0) {
- QString substring = contents.mid(snipfrom, snipto-snipfrom);
- contents.remove(snipfrom, snipto-snipfrom);
-
- // Write the cert or key to a file
- QFile outfile(QString(target_dir.absolutePath() + "/%1%2")
- .arg(taglist.at(i) == "cert" || taglist.at(i) == "key" ? "client" : taglist.at(i) )
- .arg(taglist.at(i) == "ca" || taglist.at(i) == "cert" ? ".crt" : ".key") );
-
- if (outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
- QTextStream outstream(&outfile);
- substring.remove(QString("</%1>").arg(taglist.at(i)) );
- substring.remove(QString("<%1>\n").arg(taglist.at(i)) );
- outstream << substring;
- outfile.close();
- if (taglist.at(i) == "ca")
- ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_CACert->text() + " = " + outfile.fileName() + "\n") );
- else if (taglist.at(i) == "cert")
- ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_Cert->text() + " = " + outfile.fileName() + "\n") );
- else if (taglist.at(i) == "key")
- ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_Key->text() + " = " + outfile.fileName() + "\n") );
- } // if outfile opened for writing
-
- else {
- QMessageBox::critical(this, QString("%1 - Critical").arg(TranslateStrings::cmtr("cmst")),
- tr("Unable to write <b>%1</b> - Aborting the import").arg(outfile.fileName() ),
- QMessageBox::Ok,
- QMessageBox::Ok);
- return;
- } // else outfile failed to open
- } // if a tag was found
- } // for each tag
-
- // If auth-user-pass will be in the conf file ask to remove it
- if (contents.contains("auth-user-pass\n", Qt::CaseSensitive) ) {
- if (QMessageBox::question (this,
- tr("Keep --auth-user-pass"),
- tr( "The conf file will contain the <b>auth-user-pass</b> entry which will require "
- "prompts sent to stdout and a reply on stdin. This cannot be handled by "
- "Connman nor by CMST.<p>If this entry is removed you will need to create a "
- "\"user:pass\" file in order to have Connman make the VPN connection. In the "
- "next step you will be asked if you want to create this file and you will prompted "
- "for the user name and password.<p><b>Do you wish to remove this entry?</b>"),
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::Yes) == QMessageBox::Yes) contents.remove("auth-user-pass\n");
- } // if contents contains auth-user-pass
-
- // If there is anything left write it to a conf file
- contents = contents.trimmed();
- if (! contents.isEmpty()) {
- QFile outfile(QString(target_dir.absolutePath() + "/%1%2")
- .arg(fi.baseName())
- .arg(".conf") );
-
- if (outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
- QTextStream outstream(&outfile);
- outstream << contents;
- outfile.close();
- ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_ConfigFile->text() + " = " + outfile.fileName() + "\n") );
- } // if outfile opened for writing
-
- else {
- QMessageBox::warning(this, QString("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
- tr("Unable to write conf file <b>%1</b>").arg(outfile.fileName() ),
- QMessageBox::Ok,
- QMessageBox::Ok);
- } // else outfile (conf) failed to open
- } // if contents not empty
-
- // Copy the original conf file for safekeeping
- if (target_dir.exists(fi.fileName()) ) target_dir.remove(fi.fileName());
- sourcefile.copy(target_dir.absoluteFilePath(fi.fileName()) );
-
- // Check to see if a user:pass file needs to be created.
- if (QMessageBox::question (this,
- tr("Create User:Password File"),
- tr("Do you wish to create a user:password file for this connection?"),
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::Yes) == QMessageBox::Yes) {
- bool b_continue = false;
- QString pass;
- QString user = QInputDialog::getText(this, tr("User"),
- tr("Enter the user name for this connection."),
- QLineEdit::Normal,
- "",
- &b_continue);
- if (b_continue) {
- pass = QInputDialog::getText(this, tr("Password"),
- tr("Enter the password for this connection."),
- QLineEdit::Normal,
- "",
- &b_continue);
- } // if
- if (b_continue) {
- QFile outfile(QString(target_dir.absolutePath() + "/%1%2")
- .arg(fi.baseName())
- .arg(".up") );
- if (outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
- QTextStream outstream(&outfile);
- outstream << user << "\n" << pass << "\n";
- outfile.close();
- ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_AuthUserPass->text() + " = " + outfile.fileName() + "\n") );
- } // if outfile (up) could be opened for writing
- else {
- QMessageBox::warning(this, QString("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
- tr("Unable to write user:password file <b>%1</b>").arg(outfile.fileName() ),
- QMessageBox::Ok,
- QMessageBox::Ok);
- } // else outfile (up) failed to open
- } // b_continue - we have user and pass
- } // messagebox yes - we wanted to create a user:pass file
- } // If sourcefile opened for reading
-
- else {
- QMessageBox::critical(this, QString("%1 - Critical").arg(TranslateStrings::cmtr("cmst")),
- tr("Unable to read <b>%1</b> - Aborting the import").arg(sourcefile.fileName() ),
- QMessageBox::Ok,
- QMessageBox::Ok);
- return;
- } // else sourcefile failed to open
-
- // Print a done message
- QMessageBox::information(this, QString("%1 - Information").arg(TranslateStrings::cmtr("cmst")),
- tr("OpenVPN import is complete. The provisioning file may now be saved."),
- QMessageBox::Ok,
- QMessageBox::Ok);
-
- return;
+ QFile sourcefile(fname);
+ if (sourcefile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QString contents = QString(sourcefile.readAll());
+ sourcefile.close();
+
+ // Setup the data directories
+ // APP defined in resource.h
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ QFileInfo fi(fname); // need to extract the baseName
+ QDir target_dir = QDir(QString(env.value("XDG_DATA_HOME", QString(QDir::homePath()) + "/.local/share") + "/%1/openvpn/%2").arg(QString(APP).toLower()).arg(fi.baseName()) );
+ if (! target_dir.exists()) target_dir.mkpath(target_dir.absolutePath() );
+
+ // If auth-user-pass will be in the conf file ask to remove it
+ if (contents.contains("auth-user-pass\n", Qt::CaseSensitive) ) {
+ if (QMessageBox::question (this,
+ tr("Keep --auth-user-pass"),
+ tr( "The conf file will contain the <b>auth-user-pass</b> entry which will require "
+ "prompts sent to stdout and a reply on stdin. This cannot be handled by "
+ "Connman nor by CMST.<p>If this entry is removed you will need to create a "
+ "\"user:pass\" file in order to have Connman make the VPN connection. In the "
+ "next step you will be asked if you want to create this file and you will prompted "
+ "for the user name and password.<p><b>Do you wish to remove this entry?</b>"),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::Yes) == QMessageBox::Yes) contents.remove("auth-user-pass\n");
+ } // if contents contains auth-user-pass
+
+ // If there is anything left write it to a conf file
+ contents = contents.trimmed();
+ if (! contents.isEmpty()) {
+ QFile outfile(QString(target_dir.absolutePath() + "/%1%2")
+ .arg(fi.baseName())
+ .arg(".conf") );
+
+ if (outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ QTextStream outstream(&outfile);
+ outstream << contents;
+ outfile.close();
+ ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_ConfigFile->text() + " = " + outfile.fileName() + "\n") );
+ } // if outfile opened for writing
+
+ else {
+ QMessageBox::warning(this, QString("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
+ tr("Unable to write conf file <b>%1</b>").arg(outfile.fileName() ),
+ QMessageBox::Ok,
+ QMessageBox::Ok);
+ } // else outfile (conf) failed to open
+ } // if contents not empty
+
+ // Copy the original conf file for safekeeping
+ if (target_dir.exists(fi.fileName()) ) target_dir.remove(fi.fileName());
+ sourcefile.copy(target_dir.absoluteFilePath(fi.fileName()) );
+
+ // Check to see if a user:pass file needs to be created.
+ if (QMessageBox::question (this,
+ tr("Create User:Password File"),
+ tr("Do you wish to create a user:password file for this connection?"),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::Yes) == QMessageBox::Yes) {
+ bool b_continue = false;
+ QString pass;
+ QString user = QInputDialog::getText(this, tr("User"),
+ tr("Enter the user name for this connection."),
+ QLineEdit::Normal,
+ "",
+ &b_continue);
+ if (b_continue) {
+ pass = QInputDialog::getText(this, tr("Password"),
+ tr("Enter the password for this connection."),
+ QLineEdit::Normal,
+ "",
+ &b_continue);
+ } // if
+ if (b_continue) {
+ QFile outfile(QString(target_dir.absolutePath() + "/%1%2")
+ .arg(fi.baseName())
+ .arg(".up") );
+ if (outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ QTextStream outstream(&outfile);
+ outstream << user << "\n" << pass << "\n";
+ outfile.close();
+ ui.plainTextEdit_main->insertPlainText(QString(ui.actionOpenVPN_AuthUserPass->text() + " = " + outfile.fileName() + "\n") );
+ } // if outfile (up) could be opened for writing
+ else {
+ QMessageBox::warning(this, QString("%1 - Warning").arg(TranslateStrings::cmtr("cmst")),
+ tr("Unable to write user:password file <b>%1</b>").arg(outfile.fileName() ),
+ QMessageBox::Ok,
+ QMessageBox::Ok);
+ } // else outfile (up) failed to open
+ } // b_continue - we have user and pass
+ } // messagebox yes - we wanted to create a user:pass file
+ } // If sourcefile opened for reading
+
+ else {
+ QMessageBox::critical(this, QString("%1 - Critical").arg(TranslateStrings::cmtr("cmst")),
+ tr("Unable to read <b>%1</b> - Aborting the import").arg(sourcefile.fileName() ),
+ QMessageBox::Ok,
+ QMessageBox::Ok);
+ return;
+ } // else sourcefile failed to open
+
+ // Print a done message
+ QMessageBox::information(this, QString("%1 - Information").arg(TranslateStrings::cmtr("cmst")),
+ tr("OpenVPN import is complete. The provisioning file may now be saved."),
+ QMessageBox::Ok,
+ QMessageBox::Ok);
+
+ return;
}
diff --git a/apps/cmstapp/code/vpn_prov_ed/vpn_ed.h b/apps/cmstapp/code/vpn_prov_ed/vpn_ed.h
index 682bab1..f4a2ded 100644
--- a/apps/cmstapp/code/vpn_prov_ed/vpn_ed.h
+++ b/apps/cmstapp/code/vpn_prov_ed/vpn_ed.h
@@ -2,7 +2,7 @@
Code to manage the VPN Provisioning Editor dialog.
-Copyright (C) 2016-2019
+Copyright (C) 2016-2020
by: Andrew J. Bibb
License: MIT
@@ -50,7 +50,7 @@ class VPN_Editor : public QDialog
Q_OBJECT
public:
- VPN_Editor(QWidget*);
+ VPN_Editor(QWidget*, const float&);
private:
// members
@@ -63,6 +63,7 @@ class VPN_Editor : public QDialog
QMenu* menu_VPNC;
QMenu* menu_L2TP;
QMenu* menu_PPTP;
+ QMenu* menu_WireGuard;
QActionGroup* group_provider;
QActionGroup* group_freeform;
QActionGroup* group_combobox;
diff --git a/apps/resource.h b/apps/resource.h
index 226bcd1..c17cae3 100755
--- a/apps/resource.h
+++ b/apps/resource.h
@@ -6,7 +6,7 @@ we've moved a lot of that to txt files inside the /text directory which
are compiled in as a resource. This seems to result in a faster
compile, but we now have manage information in two locations.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -35,10 +35,10 @@ DEALINGS IN THE SOFTWARE.
///////////////////////////////// Program Values ///////////////////////
//
// Program Info (may be visible, but don't mark for tranalation)
-#define VERSION "2019.01.13-1"
+#define VERSION "2020.11.01-1"
-#define RELEASE_DATE "13 January 2019"
-#define COPYRIGHT_DATE "2013-2019"
+#define RELEASE_DATE "1 November 2020"
+#define COPYRIGHT_DATE "2013-2020"
// Program Values:
// QApplication (not user visible)
@@ -84,17 +84,18 @@ namespace CMST
// validating dialog validator input
ValDialog_None = 0x00,
ValDialog_IPv4 = 0x01,
- ValDialog_IPv6 = 0x02,
- ValDialog_MAC = 0x03,
- ValDialog_46 = 0x04,
- ValDialog_Hex = 0x05,
- ValDialog_Int = 0x06,
- ValDialog_Dom = 0x07,
- ValDialog_Wd = 0x08,
- ValDialog_min1ch = 0x09,
- ValDialog_min8ch = 0x0a,
- ValDialog_46d = 0x0b,
-
+ ValDialog_nmask = 0x02,
+ ValDialog_IPv6 = 0x03,
+ ValDialog_MAC = 0x04,
+ ValDialog_46 = 0x05,
+ ValDialog_Hex = 0x06,
+ ValDialog_Int = 0x07,
+ ValDialog_Dom = 0x08,
+ ValDialog_Word = 0x09,
+ ValDialog_min1ch = 0x0a,
+ ValDialog_min8ch = 0x0b,
+ ValDialog_46d = 0x0c,
+
}; // enum
} // namespace CMST
diff --git a/apps/rootapp/code/main.cpp b/apps/rootapp/code/main.cpp
index 51e0039..0203501 100644
--- a/apps/rootapp/code/main.cpp
+++ b/apps/rootapp/code/main.cpp
@@ -2,7 +2,7 @@
main program for the roothelper application
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/apps/rootapp/code/roothelper/roothelper.cpp b/apps/rootapp/code/roothelper/roothelper.cpp
index 4cde75a..9608684 100644
--- a/apps/rootapp/code/roothelper/roothelper.cpp
+++ b/apps/rootapp/code/roothelper/roothelper.cpp
@@ -6,7 +6,7 @@ name implies roothelper is run as the root user, since we need to read
and write to /var/lib/connman. This program is started by DBus and the
configuration files necessary to make that happen are in the system dir.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
@@ -82,8 +82,8 @@ void RootHelper::startHelper()
// by CMST. These files will end in .cmst.config
QStringList RootHelper::getFileList(const QString& path)
{
- // make sure the path is allowed
- if (! pathAllowed(path) ) return QStringList();
+ // make sure the path is allowed
+ if (! pathAllowed(path) ) return QStringList();
// variables
QDir dir = QDir(path);
@@ -98,8 +98,8 @@ QStringList RootHelper::getFileList(const QString& path)
// Slot to read a file from disk
QString RootHelper::readFile(const QString& path, const QString& fn)
{
- // make sure the path is allowed
- if (! pathAllowed(path) ) return QString();
+ // make sure the path is allowed
+ if (! pathAllowed(path) ) return QString();
// open the file for reading
QFile infile(QString(path + "/%1.cmst.config").arg(sanitizeInput(fn)) );
@@ -118,8 +118,8 @@ QString RootHelper::readFile(const QString& path, const QString& fn)
// Slot to delete a disk file
bool RootHelper::deleteFile(const QString& path, const QString& fn)
{
- // make sure the path is allowed
- if (! pathAllowed(path) ) return false;
+ // make sure the path is allowed
+ if (! pathAllowed(path) ) return false;
// delete the file and emit a signal with the result
return QFile::remove(QString(path + "/%1.cmst.config").arg(sanitizeInput(fn)) );
@@ -129,8 +129,8 @@ bool RootHelper::deleteFile(const QString& path, const QString& fn)
// Slot to write the file to disk
qint64 RootHelper::saveFile(const QString& path, const QString& fn, const QString& data)
{
- // make sure the path is allowed
- if (! pathAllowed(path) ) return -1;
+ // make sure the path is allowed
+ if (! pathAllowed(path) ) return -1;
// open the file for writing
QFile outfile(QString(path + "/%1.cmst.config").arg(sanitizeInput(fn)) );
@@ -162,9 +162,9 @@ QString RootHelper::sanitizeInput(QString instr)
// Function to determine if the path is allowed
bool RootHelper::pathAllowed(QString path)
{
- if (path == "/var/lib/connman") return true;
- else if (path == "/var/lib/connman-vpn") return true;
-
- return false;
+ if (path == "/var/lib/connman") return true;
+ else if (path == "/var/lib/connman-vpn") return true;
+
+ return false;
}
diff --git a/apps/rootapp/code/roothelper/roothelper.h b/apps/rootapp/code/roothelper/roothelper.h
index 3d72619..2145e7d 100644
--- a/apps/rootapp/code/roothelper/roothelper.h
+++ b/apps/rootapp/code/roothelper/roothelper.h
@@ -6,7 +6,7 @@ name implies roothelper is run as the root user, since we need to read
and write to /var/lib/connman. This program is started by DBus and the
configuration files necessary to make that happen are in the system dir.
-Copyright (C) 2013-2019
+Copyright (C) 2013-2020
by: Andrew J. Bibb
License: MIT
diff --git a/cmst.pro b/cmst.pro
index 2c14027..ac586a9 100755
--- a/cmst.pro
+++ b/cmst.pro
@@ -15,6 +15,8 @@ TRANSLATIONS += ./translations/cmst_it_IT.ts
TRANSLATIONS += ./translations/cmst_es_ES.ts
TRANSLATIONS += ./translations/cmst_es_CO.ts
TRANSLATIONS += ./translations/cmst_fr_FR.ts
+TRANSLATIONS += ./translations/cmst_tr_TR.ts
+TRANSLATIONS += ./translations/cmst_nl_NL.ts
# non-application files which need to be installed
#
diff --git a/cmst.qrc b/cmst.qrc
index 36a9b68..f48303c 100644
--- a/cmst.qrc
+++ b/cmst.qrc
@@ -21,6 +21,7 @@
<file>translations/cmst_zh_CN.qm</file>
<file>translations/cmst_ru_RU.qm</file>
<file>translations/cmst_en_US.qm</file>
+ <file>translations/cmst_tr_TR.qm</file>
</qresource>
<qresource prefix="icons">
<file>images/interface/radio.png</file>
diff --git a/misc/desktop/cmst-autostart.desktop b/misc/desktop/cmst-autostart.desktop
index 11da515..f0ce81b 100644
--- a/misc/desktop/cmst-autostart.desktop
+++ b/misc/desktop/cmst-autostart.desktop
@@ -2,8 +2,11 @@
Type=Application
Version=1.0
Name=Connman UI Setup
+Name[tr]=Connman Arayüz Kurulumu
GenericName=Network Configuration
+GenericName[tr]=Ağ Yapılandırması
Comment=QT GUI frontend for connman
+Comment[tr]=Connman için QT arayüzü
Categories=Settings;System;Qt;Network;
Icon=cmst
Exec=cmst -w5
diff --git a/misc/desktop/cmst.desktop b/misc/desktop/cmst.desktop
index 6d5ade3..545d525 100644
--- a/misc/desktop/cmst.desktop
+++ b/misc/desktop/cmst.desktop
@@ -2,8 +2,11 @@
Type=Application
Version=1.0
Name=Connman UI Setup
+Name[tr]=Connman Arayüz Kurulumu
GenericName=Network Configuration
+GenericName[tr]=Ağ Yapılandırması
Comment=QT GUI frontend for connman
+Comment[tr]=Connman için QT arayüzü
Categories=Settings;System;Qt;Network;
Icon=cmst
Terminal=false
diff --git a/text/changelog.txt b/text/changelog.txt
index 31cddf4..a196860 100644
--- a/text/changelog.txt
+++ b/text/changelog.txt
@@ -1,8 +1,54 @@
<b><center>Connman System Tray (CMST)</center></b>
<b><center>Change Log</center></b>
+<b> 2020.11.01</b>
+<ul>
+<li>Added translation to Turkish by Yaşar Çiv.</li>
+<li>Work around for KDE no longer displaying rich text in system tray icon popups (issue #216).</li>
+<li>Fixed compiler warnings on QT depreciated functions.</li>
+</ul>
+<b> 2020.05.09</b>
+<ul>
+<li>No longer extract key files from OpenVPN .opvn configurations. Not needed.</li>
+<li>Fixed UI where Advanced options were in Start Options group box.</li>
+<li>Work on Prefereneces tab to make start options clearer (issue #210).</li>
+<li>Added VPN internet kill switch.</li>
+<li>Take VPN services out of move before/after menu.</li>
+</ul>
+<b> 2020.04.12</b>
+<ul>
+<li>Fixed wrong validator on fields that accept either IPV4 or IPv6 addresses.</li>
+<li>Expanded IPv6 validator to accept most abbreviated addresses.</li>
+<li>Peditor now uses the shared validator instead of its own.</li>
+<li>Fixed update problems in details tab.</li>
+<li>Fixed VPN tray icon not always showing (possibly issue #198).</li>
+<li>Fixed notification daemon working and starting.</li>
+<li>Added ability to execute a process prior to making a wifi or vpn connection (issue #194).</li>
+</ul>
+<b> 2020.03.07</b>
+<ul>
+<li>Move offline checkbox in tab 1 (issue # 201)</li>
+<li>Translation to Dutch by Heimen Stoffels.</li>
+<li>Cleaned up the IPv4 and IPv6 entries in the provisioning editor.</li>
+<li>Fixed retain state not working for window size and position.</li>
+<li>Additions for Connman 1.38</li>
+<ul>
+<li>Add mDNS status to the details tab.</li>
+<li>Added mDNS enable or disable tool to provisioning editor.</li>
+<li>Add Last Address Conflict information to details tab.</li>
+<li>Added VPNC.DeviceType to VPN provisioning editor.</li>
+<li>Added WireGuard configuration options to VPN Provisioning editor.</li>
+<li>Added OpenVPN.DeviceType to VPN provisioning editor.</li>
+<li>Added eight new OpenConnect items to VPN provisioning editor.</li>
+<li>Added mDNS setting to the provisioning editor.</li>
+<li>Added DeviceName field to the provisioning editor.</li>
+<li>Added AnonymousIdentity field to the wifi section of the provisioning editor.</li>
+<li>Added SubjectMatch and AltSubjectMatch fields to the wifi section of the provisioning editor. </li>
+<li>Added DomainMatch and DomainSuffixMatch fields to the wifi section of the provisioning editor. </li>
+</ul>
+</ul>
<b> 2019.01.13</b>
<ul>
-<li>Fixed segfaul on close when running without Connman.</li>
+<li>Fixed segfault on close when running without Connman.</li>
<li>Revert network group to "netdev" in Slackware and Debian.</li>
<li>Pull request #183 (fixed typo in notification icon name).</li>
<li>Pull request #184 (correct dialog size on high DPI monitors).</li>
@@ -25,7 +71,7 @@
<ul>
<li>Removed padding hack (issue #166) from id buttons.</li>
<li>Allow configuration of VPN services from the Details tab.</li>
-<li>Allow CMST to close from window decoration if not running in system tray (issue #169).<li>
+<li>Allow CMST to close from window decoration if not running in system tray (issue #169).</li>
<li>Fix appdata.xml install location (issue #176).</li>
<li>Fixed No Reply popup starting VPN from system tray menu (issue #175).</li>
<li>Technologies and Services splitter state retained (issue #173).</li>
@@ -51,7 +97,7 @@
</ul>
<b>2016.04.03</b>
<ul>
-<li>Removed unnecessary calls to managerReacan from servicePropertyChanged slot.<li>
+<li>Removed unnecessary calls to managerReacan from servicePropertyChanged slot.</li>
<li>Added nicknames for display to wired and hidden wifi connections.</li>
<li>Install application icons in all sizes and scalable.</li>
<li>Improvements to internal layouts.</li>
@@ -73,7 +119,7 @@
<b>2015.12.03</b>
<ul>
<li>CMST icon by Progandy was reworked and made cleaner by Hagabaka.</li>
-<li>Added feature to run an external program automatically after a connect. The <i>Advanced Controls</i> checkbox must be checked to access this.<li>
+<li>Added feature to run an external program automatically after a connect. The <i>Advanced Controls</i> checkbox must be checked to access this.</li>
<li>Expanded functionality of system tray icon menu to toggle power for technologies and to connect or disconnect wifi services.</li>
<li>System tray menu can be torn off and live in its own window on the desktop.</li>
<li>Internal icons can be colorized (color selector control on Preferences Tab).</li>
@@ -128,7 +174,7 @@
</ul>
<b>2014.10.15</b>
<ul>
-<li>Connect, Disconnect, and Remove buttons in the Wifi tab are disabled if no Wifi services are available.<li>
+<li>Connect, Disconnect, and Remove buttons in the Wifi tab are disabled if no Wifi services are available.</li>
<li>If only one WiFi service exists it is no longer necessary to select it first before pressing the Connect button.</li>
<li>If only one WiFi service is connected it is no longer necessary to select it first before pressing the Disconnect button.</li>
<li>Single instance code now checked using a local socket, not shared memory.</li>
diff --git a/translations/cmst_de_DE.qm b/translations/cmst_de_DE.qm
index 4ec300d..1e89baa 100644
--- a/translations/cmst_de_DE.qm
+++ b/translations/cmst_de_DE.qm
Binary files differ
diff --git a/translations/cmst_de_DE.ts b/translations/cmst_de_DE.ts
index aff27c4..6a93f06 100644
--- a/translations/cmst_de_DE.ts
+++ b/translations/cmst_de_DE.ts
@@ -149,7 +149,7 @@
</message>
<message>
<location filename="../apps/cmstapp/code/agent/ui/agent.ui" line="327"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Connman is requesting that you open a web browser to complete the login process.&lt;/p&gt;&lt;p&gt;We have scanned your PATH for browsers and any browsers found are shown in the list below. You may select any one browser to use it for the login. If your web browser is not shown in the list you may enter it directly in the&lt;span style=&quot; font-weight:600;&quot;&gt; Choose or enter a browser box&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To launch the browser click the &lt;span style=&quot; font-weight:600;&quot;&gt;Launch Browser&lt;/span&gt; button. &lt;/p&gt;&lt;p&gt;If you wish to login manually close this dialog, start your web browser and proceed to the URL shown in the &lt;span style=&quot; font-weight:600;&quot;&gt;Login URL&lt;/span&gt; box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ConnMan is requesting that you open a web browser to complete the login process.&lt;/p&gt;&lt;p&gt;We have scanned your PATH for browsers and any browsers found are shown in the list below. You may select any one browser to use it for the login. If your web browser is not shown in the list you may enter it directly in the&lt;span style=&quot; font-weight:600;&quot;&gt; Choose or enter a browser box&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To launch the browser click the &lt;span style=&quot; font-weight:600;&quot;&gt;Launch Browser&lt;/span&gt; button. &lt;/p&gt;&lt;p&gt;If you wish to login manually close this dialog, start your web browser and proceed to the URL shown in the &lt;span style=&quot; font-weight:600;&quot;&gt;Login URL&lt;/span&gt; box.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Brave Browser Users:&lt;/span&gt; Note that Brave does not seem to accept a URL to start with. After the browser starts you will need to enter the URL manually. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -260,12 +260,12 @@
<context>
<name>AgentDialog</name>
<message>
- <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="296"/>
+ <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="298"/>
<source> Information</source>
<translation>Information</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="297"/>
+ <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="299"/>
<source>You have requested the %1 browser, but we cannot find a terminal program to open it with. Currenty we can start %1 using these terminals: &lt;b&gt;roxterm&lt;/b&gt; and &lt;b&gt;xterm&lt;/b&gt;.&lt;br&gt;&lt;br&gt;To continue you need to manually open a terminal and then enter: &quot;%1 %2&quot;</source>
<translation type="unfinished"></translation>
</message>
@@ -277,22 +277,22 @@
<context>
<name>ConnmanAgent</name>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="81"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="82"/>
<source>Connman Error</source>
<translation>Connman Fehler</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="82"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="83"/>
<source>Connman returned the following error:&lt;b&gt;&lt;center&gt;%1&lt;/b&gt;&lt;br&gt;Would you like to retry?</source>
<translation>Connman gab folgenden Fehler zurück: &lt;b&gt;&lt;center&gt;%1&lt;/b&gt;&lt;br&gt;Möchtest du es erneut versuchen?</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="130"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="131"/>
<source>Agent Request Failed</source>
<translation>Agent-Anfrage fehlgeschlagen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="131"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="132"/>
<source>The agent request failed before a reply was returned.</source>
<translation>Die Agent-Anfrage ist fehlgeschlagen bevor eine Antwort zurück kam.</translation>
</message>
@@ -417,579 +417,626 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="45"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="48"/>
<source>&amp;Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="81"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="100"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This checkbox controls the global setting for switching all radios on or off. When checked all radios are powered down.&lt;/p&gt;&lt;p&gt;When the system is In offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="84"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="103"/>
<source>All Devices &amp;Off</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="93"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="69"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;OfflineMode&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The offline mode indicates the global setting for switching all radios on or off. Changing offline mode to true results in powering down all devices. When leaving offline mode the individual policy of each device decides to switch the radio back on or not. &lt;/p&gt;&lt;p&gt;During offline mode, it is still possible to switch certain technologies manually back on. For example the limited usage of WiFi or Bluetooth devices might be allowed in some situations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="96"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="35"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="477"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="577"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="733"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="862"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="902"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="72"/>
<source>Global Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="102"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="80"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="132"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global setting for switching all radios on or off. When offline mode is engaged all radios are powered down.&lt;/p&gt;&lt;p&gt;While in offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="105"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="83"/>
<source>OfflineMode: Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="147"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="90"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global connection state of the system. Possible values are &amp;quot;offline&amp;quot;, &amp;quot;idle&amp;quot;, &amp;quot;ready&amp;quot;, and &amp;quot;online&amp;quot;. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="150"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="93"/>
<source>State: Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="211"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="151"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="166"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="149"/>
<source>Technologies</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="260"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="402"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="662"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="856"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="215"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="357"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="626"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="833"/>
<source>Name</source>
<translation type="unfinished">Name</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="265"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="407"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="861"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="220"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="362"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="838"/>
<source>Type</source>
<translation type="unfinished">Typ</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="270"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="225"/>
<source>Powered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="275"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="672"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2195"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="230"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="636"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2273"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="280"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="235"/>
<source>Tethering</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="295"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="250"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="690"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Force a rescan of all WiFi technologies. This is similar to issuing the command &lt;span style=&quot; font-weight:600;&quot;&gt;connmanctl scan wifi&lt;/span&gt; from the command line.&lt;/p&gt;&lt;p&gt;The button will become inactive while the scan is occuring.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="298"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="253"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="693"/>
<source>Resc&amp;an</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="347"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="302"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This box lists all services that connman can connect to.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="350"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="305"/>
<source>Services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="412"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="866"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="367"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="843"/>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="417"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="876"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="372"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="853"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="433"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1842"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="388"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1851"/>
<source>Move Before</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="446"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1847"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="401"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1856"/>
<source>Move After</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="466"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="421"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked hide the connection name in the Services box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="469"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="424"/>
<source>&amp;Less</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="490"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="445"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page will show the details of the service selected in the box at the top. If the selected service is not in the READY or ONLINE state then most of the details will be blank. &lt;/p&gt;&lt;p&gt;You may override service details by using the &lt;span style=&quot; font-weight:600;&quot;&gt;Configuration&lt;/span&gt; button at the bottom right. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="448"/>
<source>&amp;Details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="502"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="460"/>
<source>Ser&amp;vice</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="512"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="470"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use this Combobox to select the service for which you wish to view the detailed information.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="603"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="564"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The default configuration method for all services is automatic or something like DHCP. This should be good enough for most typical usage, but if it is not this button will allow manual configuration of Ethernet and IP settings for the selected Service.&lt;/p&gt;&lt;p&gt;This button will be disabled if the service is provisioned via an external config file or if the service is a hidden wifi service. It is not possible to modify the properties of these services.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="606"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="567"/>
<source>Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="616"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="580"/>
<source>&amp;Wireless</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="622"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page shows the known WiFi services. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Name:&lt;/span&gt; The SSID of the network.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Favorite:&lt;/span&gt; A heart symbol in this column indicates that this computer has previously made a connection to the network using this service.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Connected:&lt;/span&gt; Shows the connection state of this service. Hover the mouse over the icon to popup a text description. Online signals that an Internet connectionis available and has been verified. Ready signals a successfully connected device. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Security: &lt;/span&gt;Describes the type of security used for this service. Possible values are &amp;quot;none&amp;quot;, &amp;quot;wep&amp;quot;, &amp;quot;psk&amp;quot;, &amp;quot;ieee8021x&amp;quot;, and &amp;quot;wps&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;SIgnal Strength:&lt;/span&gt; The strength of the WiFi signal, normalized to a scale of 0 to 100.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="667"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="631"/>
<source>Favorite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="677"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="641"/>
<source>Security</source>
<translation type="unfinished">Sicherheit</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="682"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="646"/>
<source>Signal Strength</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="690"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="654"/>
<source>Wireless Services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="696"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="660"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a wifi service in the table below and press this button to connect the service. &lt;/p&gt;&lt;p&gt;If there is only one wifi service listed in the table pressing this button will automatically select that service and attempt to connect. &lt;/p&gt;&lt;p&gt;If information about the service is needed, a passphrase for instance, you will be prompted for it. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="699"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="777"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="663"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="754"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="706"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="670"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a wifi service in the table below and press this button to disconnect it. &lt;/p&gt;&lt;p&gt;If there is only one wifi service in the &amp;quot;ready&amp;quot; or &amp;quot;online&amp;quot; state pressing this button will automatically select that service and disconnect it. &lt;/p&gt;&lt;p&gt;This may also be used to abort a previous connection attempt.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="709"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="790"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="673"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="767"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="719"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="683"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="732"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="706"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This label shows the number of WiFi technologies (devices) that were found, and the number that are powered on. There must be at least one WiFi technology found and powered in order for the box below to show services.&lt;/p&gt;&lt;p&gt;To turn a technology on or off go to the &lt;span style=&quot; font-weight:600;&quot;&gt;Technologies&lt;/span&gt; box in the &lt;span style=&quot; font-weight:600;&quot;&gt;Status&lt;/span&gt; tab and double click on the text that shows in the &lt;span style=&quot; font-weight:600;&quot;&gt;Powered&lt;/span&gt; column for the technology.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="735"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="709"/>
<source>Wifi State</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="885"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="865"/>
<source>&amp;Counters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="906"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="886"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The service being monitored by the counters.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="909"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="889"/>
<source>Service:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="922"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="932"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Counters for the &amp;quot;online&amp;quot; service connection that is not marked roaming. &lt;/p&gt;&lt;p&gt;Counters may not always be available. The counters could have been disabled at the command line (-c or --disable-counters) or occasionally the connection will register &amp;quot;ready&amp;quot; instead of &amp;quot;online&amp;quot;. Online is a &amp;quot;ready&amp;quot; connection that has verified internet connectivity. It is possible to be online with only a &amp;quot;ready&amp;quot; connection, however the counters only work for they &amp;quot;online&amp;quot; connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="925"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="905"/>
<source>Home</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="952"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1008"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="586"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page shows the known WiFi services. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Name:&lt;/span&gt; The SSID of the network.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Favorite:&lt;/span&gt; A heart symbol in this column indicates that this computer has previously made a connection to the network using this service.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Connected:&lt;/span&gt; Shows the connection state of this service. Hover the mouse over the icon to popup a text description. Online signals that an Internet connectionis available and has been verified. Ready signals a successfully connected device. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Security: &lt;/span&gt;Describes the type of security used for this service. Possible values are &amp;quot;none&amp;quot;, &amp;quot;wep&amp;quot;, &amp;quot;psk&amp;quot;, &amp;quot;ieee8021x&amp;quot;, and &amp;quot;wps&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;SIgnal Strength:&lt;/span&gt; The strength of the WiFi signal, normalized to a scale of 0 to 100.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="790"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page shows the provisioned VPN services. Some cells in the table may only be available once a connection is estlablished. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Name:&lt;/span&gt; The name given in the provisioning file.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Type:&lt;/span&gt; The VPN type (OpenConnect, OpenVPN, PPTP, etc)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;State:&lt;/span&gt; Shows the connection state of this service. Hover the mouse over the icon to popup a text description. . &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Host: &lt;/span&gt;VPN Host IP.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Domain:&lt;/span&gt; The VPN Domain.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="935"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="991"/>
<source>Counter not available.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="978"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="961"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Counters for the &amp;quot;online&amp;quot; service connection marked &amp;quot;roaming&amp;quot;.&lt;/p&gt;&lt;p&gt;In the case of cellular services this normally indicates connections to a foreign provider.&lt;/p&gt;&lt;p&gt;Counters may not always be available. The counters could have been disabled at the command line (-c or --disable-counters) or occasionally the connection will register &amp;quot;ready&amp;quot; instead of &amp;quot;online&amp;quot;. Online is a &amp;quot;ready&amp;quot; connection that has verified internet connectivity. It is possible to be online with only a &amp;quot;ready&amp;quot; connection, however the counters only work for they &amp;quot;online&amp;quot; connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="981"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="964"/>
<source>Roaming</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1028"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1011"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Counter Settings&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1031"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1014"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The threshold values for counter updates (counter resolution). Data and time work together to define how often the fields are updated.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1034"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1017"/>
<source>Settings:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1049"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1032"/>
<source>&amp;Preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1380"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1289"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;monospace&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;monospace&apos;; font-weight:600;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot; font-family:&apos;monospace&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;monospace&apos;; font-weight:600;&quot;&gt;--enable-counters&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Enable Connman RX and TX counters. Counters are experimental in Connman and enabling them will write a large amount of data to the system logs.&lt;/p&gt;&lt;p&gt;Counters are turned off by default, and is a change from the way it was originally. Up to and including version 2017.09.19 counters were enabled by default. All versions subsequent to that counters are disabled by default.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1292"/>
+ <source>Enable Counters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1362"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Programs or processes to execute after various events occur.&lt;/p&gt;&lt;p&gt;If the program or process requires command line arguments provide them here just as if you were typing at a command line.&lt;/p&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;/path/to/program arg1 arg2 arg3&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1383"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1365"/>
<source>External Programs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1389"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1399"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1371"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1381"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the program or process to be executed after Connman enters the &amp;quot;Ready&amp;quot; or &amp;quot;Online&amp;quot; state.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1392"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1374"/>
<source>After Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1523"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1461"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--disable-vpn&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Disable VPN. This will hide the VPN tab and will also skip trying to make a connection to connman-vpn. The later is useful if your Connman was built with the --disable-vpn feature.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1464"/>
+ <source>Disable VPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1471"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-M&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--disable-minimized&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Disable the minimize button. Use when you want to have the window manager have sole control of minimizing the interface.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1474"/>
+ <source>Disable Minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1525"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Preferences for the interface are in this box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1526"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1528"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1561"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1563"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the Start Options set here will be read and used next time the program starts. &lt;/p&gt;&lt;p&gt;Settings are stored in&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;: ~&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;/.config/cmst/cmst.conf &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;&lt;br/&gt;This is a standard ini type text file.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1564"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1566"/>
<source>Use Start Options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1574"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1576"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the state of the GUI will be restored from settings saved on disk. Settings include the geometry and position of the dialog and the current tab. &lt;/p&gt;&lt;p&gt;These settings will be used at next boot to restore the user interface to the way it was at shutdown.&lt;/p&gt;&lt;p&gt;The settings file is: ~&lt;span style=&quot; font-weight:600;&quot;&gt;/.config/cmst/cmst.conf &lt;/span&gt;&lt;br/&gt;This is a standard ini type text file.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1577"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1579"/>
<source>Retain State</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1852"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1672"/>
+ <source>Aw&amp;Oken</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1679"/>
+ <source>A&amp;rtwork</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1861"/>
<source>Rescan</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1860"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1869"/>
<source>Offline Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1865"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1874"/>
<source>IDPass</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1868"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1877"/>
<source>Set ID and Password for tethered wifi</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1285"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1268"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-i&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--icon-theme&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Use an icon theme from your system. You may specify the theme in the box at the right, or if the box is left blank CMST will try and use the system wide icon theme (if one is defined).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1288"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1271"/>
<source>Use Icon Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1584"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1586"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the display of tooltips will be enabled for the interface widgets.&lt;/p&gt;&lt;p&gt;Tooltips are the small popups that appear when you hover the mouse pointer over an area of the interface. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1587"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1589"/>
<source>Enable ToolTips (Interface)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1535"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1537"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Normally counters are cumulative and will retain the connect time and the TX and RX counts between boots. &lt;/p&gt;&lt;p&gt;When this box is checked the counters will reset to zero every time CMST is started, and if CMST is running everytime a Connman service is started. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1538"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1540"/>
<source>Reset Counters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1545"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1547"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked additional controls for advanced users are displayed.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1548"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1550"/>
<source>Advanced Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1163"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1146"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;These entries control various options for CMST at program start. &lt;/p&gt;&lt;p&gt;All of these options are available from the command line, and if a command line option is provided it will take precedence over these settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1166"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1149"/>
<source>Start Options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1197"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1180"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-d&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--disable-tray-icon&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disable the system tray icon.&lt;/p&gt;&lt;p&gt;May be needed for system trays not compliant with the Freedesktop.org system tray specification.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1201"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1184"/>
<source>Disable Tray Icon</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1211"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1194"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disabled because currently Connman will accept this option but will do nothing with it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1214"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1197"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the amount of data in KB that must be transmitted before the counters update (default is 1024 KB).&lt;/p&gt;&lt;p&gt;Connman will accept this entry, but according to a comment in the Connman code the actual feature still needs to be implemented and the selection is therefore disabled.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1217"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1200"/>
<source>Counter Update KB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1227"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1210"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the wait time in seconds before starting the system tray icon (default is 0 seconds).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1246"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1229"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the amount of data in KB that must be transmitted before the counters update (default is 1024 KB).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1271"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1254"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--minimized&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Start the GUI minimized in the system tray.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1275"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1258"/>
<source>Start Minimized</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1295"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1278"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-w&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--wait-time&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the wait time in seconds before starting the system tray icon (default is 0 seconds).&lt;/p&gt;&lt;p&gt;If CMST is started and tries to create a tray icon before the system tray itself is created a dialog will be displayed explaining that. This sometimes happens when the program is started automatically. If you know the tray will exist once the system is up you may specify a wait time and CMST will wait that number of seconds before trying to create the tray icon. This is to give the window manager or panel time to create the tray before we try to place the icon there.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1299"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1282"/>
<source>Wait Time</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1306"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Command Line Option: &lt;span style=&quot; font-weight:600;&quot;&gt;-c&lt;/span&gt; or &lt;span style=&quot; font-weight:600;&quot;&gt;--disable-counters&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
-&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disable the counters. May be used to minimize load on your system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1310"/>
- <source>Disable Counters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1320"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1302"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--counter-update-rate&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the frequency in seconds between counter updates (default is 10 seconds). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1324"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1306"/>
<source>Counter Update Rate </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1175"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1158"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the frequency in seconds between counter updates (default is 10 seconds). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1425"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1407"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use code specific for the selected desktop environment.&lt;/p&gt;&lt;p&gt;As of 2014.11.24 there seems to be a problem with QT5.3 and some system trays. There is code in the program to try and work around this issue, and selecting one of these buttons will invoke the code specific to the desktop.&lt;/p&gt;&lt;p&gt;If the bug gets fixed these options will remain so that start up scripts do not break, but the options will do nothing.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1428"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1410"/>
<source>Desktop Specific</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1437"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1419"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Default is no desktop specific code.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1440"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1422"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1453"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--use-xfce&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1456"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1438"/>
<source>XFCE</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1466"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1448"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--use-mate&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1469"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1451"/>
<source>MATE</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1334"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1316"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--fake-transparency&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Used to work around a QT bug where system tray icons display with white or black backgrounds instead of being transparent.&lt;/p&gt;&lt;p&gt;You can specify the icon background color here. Format is a hex number in the form RRGGBB. If the spedified color matches the tray background we&apos;ve effectively created fake transparency. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="716"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="680"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a wifi service in the table below and press this button to remove the service. &lt;/p&gt;&lt;p&gt;If a service has previously been successfully connected (Favorite is true) this button will remove the Favorite property. The service will also be disconnected if it is currently connected. If the service required a passphrase then the passphrase it will be cleared and forgotten.&lt;/p&gt;&lt;p&gt;If a connection attempt failed this can slso be used to reset the service.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="759"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="736"/>
<source>&amp;VPN</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="765"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="742"/>
<source>VPN Services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="774"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="751"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a vpn service in the table below and press this button to connect the service. &lt;/p&gt;&lt;p&gt;If there is only one vpn service listed in the table pressing this button will automatically select that service and attempt to connect. &lt;/p&gt;&lt;p&gt;If information about the service is needed, a passphrase for instance, you will be prompted for it. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="787"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="764"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a vpn service in the table below and press this button to disconnect it. &lt;/p&gt;&lt;p&gt;If there is only one vpn service in the &amp;quot;ready&amp;quot; or &amp;quot;online&amp;quot; state pressing this button will automatically select that service and disconnect it. &lt;/p&gt;&lt;p&gt;This may also be used to abort a previous connection attempt.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="813"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page shows the provisioned VPN services. Some cells in the table may only be available once a connection is estlablished. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Name:&lt;/span&gt; The name given in the provisioning file.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Type:&lt;/span&gt; The VPN type (OpenConnect, OpenVPN, PPTP, etc)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;State:&lt;/span&gt; Shows the connection state of this service. Hover the mouse over the icon to popup a text description. . &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Host: &lt;/span&gt;VPN Host IP.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Domain:&lt;/span&gt; The VPN Domain.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="871"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="848"/>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
@@ -998,1026 +1045,1086 @@
<translation type="obsolete">Domäne</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1338"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1320"/>
<source>Fake Transparency</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1348"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1330"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Specify the background color as a hex number in the format: RRGGBB.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1370"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1352"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Icon theme to use. For this theme to be used it must be installed on your system. If the theme is not installed, or if you spell the name wrong CMST will fall back to using its internal icon set.&lt;/p&gt;&lt;p&gt;If this box is blank CMST will try and use the system wide icon theme (if one is defined).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1112"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1095"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Preferences for the system tray are in this box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1115"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1098"/>
<source>System Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1121"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1104"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked an icon will not be displayed in the system tray. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1124"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1107"/>
<source>Hide Tray Icon</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1131"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1114"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the system tray icon will popup a status message when you hover the mouse over it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1134"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1117"/>
<source>Enable System Tray Popups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1147"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1130"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the system tray will popup a notify message when a significant connman related event is received.&lt;/p&gt;&lt;p&gt;Notifications can be handled by the System Tray Icon, or by a Notify daemon if one is installed. Both can not be active at the same time.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1150"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1133"/>
<source>System Tray Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1485"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1487"/>
<source>Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1510"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1512"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked the system desktop notification daemon will popup a notify message when a significant connman related event is received.&lt;/p&gt;&lt;p&gt;Notifications can be handled by the System Tray Icon, or by a Notification daemon if one is installed. Both can not be active at the same time.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1513"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1515"/>
<source>Notification Daemon</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1497"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1499"/>
<source>Server Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="208"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="163"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Connman refers to hardware devices as technologies. This box will display information about all known technologies.&lt;/p&gt;&lt;p&gt;To turn a technology on or off click on the button that shows in the &lt;span style=&quot; font-weight:600;&quot;&gt;Powered&lt;/span&gt; column for the technology.&lt;/p&gt;&lt;p&gt;To tether a technology click the button in the &lt;span style=&quot; font-weight:600;&quot;&gt;Tethering&lt;/span&gt; column to on. When tethering is enabled the default service is bridged to all clients connected through the tethered technology. If the &lt;span style=&quot; font-weight:600;&quot;&gt;Tethering&lt;/span&gt; columns are not shown clear the check in &lt;span style=&quot; font-weight:600;&quot;&gt;Less&lt;/span&gt; checkbox below this window.&lt;/p&gt;&lt;p&gt;Note that by default wired connections cannot be tethered. This behavior can be overwritten in the connman.conf file. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="285"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="240"/>
<source>ID:Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="318"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="273"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;To edit the ID and Password of a tethered WiFi device click this button.&lt;/p&gt;&lt;p&gt;The ID and Password are what clients will have to enter to connect to the ad-hoc network. This is only valid for WiFi connections&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="321"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="276"/>
<source>ID:Pass</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="328"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="283"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked the tethering columns will be hidden.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="331"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="286"/>
<source>Less</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="430"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="385"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Move the selected service before another in the list.&lt;/p&gt;&lt;p&gt;The button will only become active if the selected service can be moved and if there is another valid service which it can be used as a target.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="443"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="398"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Move the selected service after another in the list.&lt;/p&gt;&lt;p&gt;The button will only become active if the selected service can be moved and if there is another valid service which it can be used as a target.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1070"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1053"/>
<source>Program Control</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1076"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1082"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked CMST will place an entry in the autostart directory for the current user, unchecking will remove said entry. This directory is typically: &lt;span style=&quot; font-weight:600;&quot;&gt;${HOME}/.config/autostart&lt;/span&gt;. &lt;/p&gt;&lt;p&gt;CMST only add or remove the .desktop file from the autostart directory. Autostarting is typically dependent upon your Desktop Environment and must be enabled from there.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1079"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1085"/>
<source>Enable Autostart</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1086"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1059"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If a Connman service falls into the &amp;quot;Failed&amp;quot; state it will normally remain in that state.&lt;/p&gt;&lt;p&gt;If this box is checked CMST will try to automatically reconnect a WiFi service that enters the &amp;quot;Failed&amp;quot; state. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1089"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1062"/>
<source>Retry Failed Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1602"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1604"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Color in #RGB format to colorize the internal icons with.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1612"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1614"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open the color selection dialog. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1615"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="135"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1617"/>
<source>...</source>
<translation type="unfinished">...</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1625"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1627"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Internal icons can be colorized. You may select a color using the button to the left, or you may type in the #RGB color yourself.&lt;/p&gt;&lt;p&gt;If you type the entry it must have leading # sign. Example: #22aa44 &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1628"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1630"/>
<source>Colorize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1645"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1647"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1651"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1653"/>
<source>&amp;About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1657"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1659"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Display a dialog box containing information about this program. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1660"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1662"/>
<source>C&amp;MST</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1667"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1669"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Display a dialog box containing information about the Icon set used in this program. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1670"/>
- <source>&amp;AwOken</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1677"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1686"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Display a dialog box containing information about the QT toolkit used to develop this program. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1680"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1689"/>
<source>&amp;QT</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1687"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1696"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use this button to view the program license.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1690"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1699"/>
<source>&amp;License</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1697"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1706"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use this button to view the change log of the program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1700"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1709"/>
<source>ChangeLo&amp;g</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1738"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1747"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Help&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Program help is mainly provided by the &amp;quot;What&apos;s This&amp;quot; button in the lower left corner. Press the button and then click on an item you are interested in. &amp;quot;What&apos;s This&amp;quot; is also available via context menu by right clicking on a button, box or text area.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1774"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1783"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;What&apos;s This&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Was ist das&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1777"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1786"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use this button to find information about an element in the GUI by entering &amp;quot;What&apos;s This&amp;quot; mode. &lt;/p&gt;&lt;p&gt;You may also right click on an element to show the &amp;quot;What&apos;s This&amp;quot; text for it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1787"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1796"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open the provisioning editor to create or edit Connman configuration (provisioning) files.&lt;/p&gt;&lt;p&gt;These config files reside in /var/lib/connman which is owned by root:root. CMST will register a roothelper to allow reading and writing files in this directory. &lt;/p&gt;&lt;p&gt;To avoid abusing the root privileges the editor will only operate on files with names ending in &lt;span style=&quot; font-style:italic;&quot;&gt;.cmst.config&lt;/span&gt;. This file name ending will be added automatically during a file save and cannot be altered. &lt;/p&gt;&lt;p&gt;Using this editor it is not possible to edit or delete config files created by other means.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1790"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1799"/>
<source>Provisioning Editor</source>
<translation type="unfinished">Provisionierungs-Editor</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1797"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1806"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open the VPN provisioning editor to create or edit Connman configuration (provisioning) files for VPN connections.&lt;/p&gt;&lt;p&gt;These config files reside in /var/lib/connman-vpn which is owned by root:root. CMST will register a roothelper to allow reading and writing files in this directory. &lt;/p&gt;&lt;p&gt;To avoid abusing the root privileges the editor will only operate on files with names ending in &lt;span style=&quot; font-style:italic;&quot;&gt;.cmst.config&lt;/span&gt;. This file name ending will be added automatically during a file save and cannot be altered. &lt;/p&gt;&lt;p&gt;Using this editor it is not possible to edit or delete config files created by other means.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1800"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1809"/>
<source>VPN Editor</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1807"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1816"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Exit the program and remove the system tray icon. Connman will still be running as a daemon but will not be managed by this program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1810"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1819"/>
<source>E&amp;xit</source>
<translation type="unfinished">&amp;Beenden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1830"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1839"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Minimize the dialog. If you have the system tray Icon shown this dialog may be restored by right clicking on the tray icon. If the tray icon is hidden minimize will not be active.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1833"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="336"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1842"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="387"/>
<source>Mi&amp;nimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="337"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="388"/>
<source>Ma&amp;ximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="340"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="391"/>
<source>&amp;Exit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="437"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="490"/>
<source>About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="152"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="150"/>
<source>Service Details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="153"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="151"/>
<source>WiFi Connections</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="154"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="152"/>
<source>VPN Connections</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="468"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="516"/>
<source>About AwOken</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="485"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="547"/>
<source>License</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="493"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="555"/>
<source>%1 change log is not available.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="495"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="557"/>
<source>ChangeLog</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="613"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2487"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="674"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2584"/>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="638"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="643"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="699"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="704"/>
<source>&lt;b&gt;Service:&lt;/b&gt; %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="643"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="704"/>
<source>Unable to determine service</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="675"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="750"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="778"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="736"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="810"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="838"/>
<source>No Services Selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="779"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="839"/>
<source>You need to select a Wifi service before pressing the remove button.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="808"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="868"/>
<source>Offline Mode Engaged</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="812"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="873"/>
<source>Offline Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="838"/>
- <source>%1 (%2) Network</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="887"/>
+ <source>Network Services:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="839"/>
- <source>Connection: %1</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1129"/>
+ <source>Service Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="862"/>
- <source>Network Services:</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1130"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1157"/>
+ <source>Object Path: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="863"/>
- <source>No network services available</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1150"/>
+ <source>VPN Engaged</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1085"/>
- <source>Service Error: %1</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1154"/>
+ <source>VPN Disengaged</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1086"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1112"/>
- <source>Object Path: %1</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1237"/>
+ <source>&lt;b&gt;Technology: %1&lt;/b&gt;&lt;p&gt;Please enter the WiFi AP SSID that clients will&lt;br&gt;have to join in order to gain internet connectivity.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1105"/>
- <source>VPN Engaged</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1249"/>
+ <source>&lt;b&gt;Technology: %1&lt;/b&gt;&lt;p&gt;Please enter the WPA pre-shared key clients will&lt;br&gt;have to use in order to establish a connection.&lt;p&gt;PSK length: minimum of 8 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1109"/>
- <source>VPN Disengaged</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2631"/>
+ <source> Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1192"/>
- <source>&lt;b&gt;Technology: %1&lt;/b&gt;&lt;p&gt;Please enter the WiFi AP SSID that clients will&lt;br&gt;have to join in order to gain internet connectivity.</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1476"/>
+ <source>&lt;b&gt;Connection:&lt;/b&gt; %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1204"/>
- <source>&lt;b&gt;Technology: %1&lt;/b&gt;&lt;p&gt;Please enter the WPA pre-shared key clients will&lt;br&gt;have to use in order to establish a connection.&lt;p&gt;PSK length: minimum of 8 characters.</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="491"/>
+ <source>&lt;center&gt;%1 is a program to interface with the Connman daemon and to provide a system tray control.&lt;br&gt;&lt;center&gt;Version &lt;b&gt;%2&lt;/b&gt;&lt;center&gt;Release date: %3&lt;center&gt;Copyright c %4&lt;center&gt;by&lt;center&gt;Andrew J. Bibb&lt;center&gt;Vermont, USA&lt;br&gt;&lt;center&gt;&lt;b&gt;Translations:&lt;/b&gt;&lt;center&gt;Jianfeng Zhang (Chinese)&lt;center&gt;sqozz (German)&lt;center&gt;Ilya Shestopalov (Russian)&lt;center&gt;Heimen Stoffels (Dutch)&lt;br&gt;&lt;center&gt;&lt;b&gt;Build Information:&lt;/b&gt;&lt;center&gt;Compiled using QT version %5</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1725"/>
- <source>%1On%1%1</source>
- <comment>tethering</comment>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="530"/>
+ <source>About Other Artwork</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1730"/>
- <source>%1Off%1%1</source>
- <comment>tethering</comment>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="531"/>
+ <source>&lt;center&gt;This program uses artwork from &lt;b&gt;Freepik&lt;/b&gt; obtained from www.flaticon.com:&lt;br&gt;&lt;br&gt;Released under the Flaticon Basic License&lt;br&gt;&lt;a href=&quot;url&quot;&gt;https://file000.flaticon.com/downloads/license/license.pdf&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Artwork files:&lt;/b&gt;&lt;li&gt;radio.png&lt;/li&gt;&lt;li&gt;basic-plane.png&lt;/li&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2529"/>
- <source> Warning</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="870"/>
+ <source>All network devices are powered off, now in Airplane mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1425"/>
- <source>&lt;b&gt;Connection:&lt;/b&gt; %1</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="875"/>
+ <source>Power has been restored to all previously powered network devices.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="890"/>
+ <source>The system is online.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1428"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="896"/>
+ <source>The system is offline.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1479"/>
<source>&lt;br&gt;&lt;b&gt;Service Details:&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1430"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1481"/>
<source>Service Type: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1431"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1482"/>
<source>Service State: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1432"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1483"/>
<source>Favorite: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1432"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1483"/>
<source>Yes</source>
<comment>favorite</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1432"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1483"/>
<source>No</source>
<comment>favorite</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1433"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1484"/>
<source>External Configuration File: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1433"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1484"/>
<source>Yes</source>
<comment>immutable</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1433"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1484"/>
<source>No</source>
<comment>immutable</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1435"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1486"/>
<source>Auto Connect: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1435"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1486"/>
<source>On</source>
<comment>autoconnect</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1435"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1486"/>
<source>No</source>
<comment>autoconnect</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1437"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1488"/>
<source>&lt;br&gt;&lt;b&gt;IPv4&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1439"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1490"/>
<source>IP Address Acquisition: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1440"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1447"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1491"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1498"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1533"/>
<source>IP Address: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1441"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1492"/>
<source>IP Netmask: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1442"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1453"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1493"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1504"/>
<source>IP Gateway: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1444"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1495"/>
<source>&lt;br&gt;&lt;b&gt;IPv6&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1446"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1459"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1497"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1510"/>
<source>Address Acquisition: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1450"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1501"/>
<source>Prefix Length: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1452"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1503"/>
<source>Prefix Length: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1454"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1505"/>
<source>Privacy: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1456"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1507"/>
<source>&lt;br&gt;&lt;b&gt;Proxy&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1461"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1512"/>
<source>URL: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1464"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1515"/>
<source>Servers:&lt;br&gt;&amp;nbsp;&amp;nbsp;%1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1465"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1516"/>
<source>Excludes:&lt;br&gt;&amp;nbsp;&amp;nbsp;%1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1472"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1521"/>
+ <source>&lt;br&gt;&lt;b&gt;mDNS&lt;/b&gt;&lt;br&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1522"/>
+ <source>Support Enabled: %1&lt;br&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1522"/>
+ <source>Yes</source>
+ <comment>mdns</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1522"/>
+ <source>No</source>
+ <comment>mdns</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1531"/>
+ <source>&lt;br&gt;&lt;b&gt;Last Address Conflict&lt;/b&gt;&lt;br&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1535"/>
+ <source>MAC Address: %1&lt;br&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1536"/>
+ <source>Conflict detected on: %1&lt;br&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1537"/>
+ <source>Resolved: %1&lt;br&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1537"/>
+ <source>Yes</source>
+ <comment>last_address_conflict</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1537"/>
+ <source>No</source>
+ <comment>last_address_conflict</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1546"/>
<source>&lt;br&gt;&lt;b&gt;Name Servers&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1475"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1549"/>
<source>&lt;br&gt;&lt;br&gt;&lt;b&gt;Time Servers&lt;/b&gt;&lt;br&gt; </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1478"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1552"/>
<source>&lt;br&gt;&lt;br&gt;&lt;b&gt;Search Domains&lt;/b&gt;&lt;br&gt; </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1481"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1555"/>
<source>&lt;br&gt;&lt;br&gt;&lt;b&gt;Ethernet&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1483"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1557"/>
<source>Connection Method: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1484"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1558"/>
<source>Interface: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1485"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1559"/>
<source>Device Address: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1486"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1560"/>
<source>MTU: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1488"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1562"/>
<source>&lt;br&gt;&lt;b&gt;Wireless&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1493"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2094"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1567"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2171"/>
<source>Security: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1494"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1568"/>
<source>Strength: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1495"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1569"/>
<source>Roaming: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1495"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1569"/>
<source>Yes</source>
<comment>roaming</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1495"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1569"/>
<source>No</source>
<comment>roaming</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1497"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1571"/>
<source>&lt;br&gt;&lt;b&gt;VPN Provider&lt;/b&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1499"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2110"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1573"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2187"/>
<source>Host: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1500"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1574"/>
<source>Domain: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1501"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1575"/>
<source>Name: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1502"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2108"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1576"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2185"/>
<source>Type: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1644"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1717"/>
<source>State: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1650"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1723"/>
<source>Engaged</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1655"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2197"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2263"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1728"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2275"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2346"/>
<source>Disabled</source>
<translation type="unfinished">Deaktiviert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1658"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1731"/>
<source>Offline Mode </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1702"/>
- <source>%1On%1%1</source>
- <comment>powered</comment>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1785"/>
+ <source>Yes</source>
+ <comment>connected</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1707"/>
- <source>%1Off%1%1</source>
- <comment>powered</comment>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1785"/>
+ <source>No</source>
+ <comment>connected</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1715"/>
- <source>Yes</source>
- <comment>connected</comment>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1792"/>
+ <source>On</source>
+ <comment>tethering</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1715"/>
- <source>No</source>
- <comment>connected</comment>
- <translation type="unfinished"></translation>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1797"/>
+ <source>Off</source>
+ <comment>tethering</comment>
+ <translation type="unfinished">Aus</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1854"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1932"/>
<source> WiFi Technologies:&lt;br&gt; %1 Found, %2 Powered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2053"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2130"/>
<source>Update resolution of the counters is based on a threshold of %L1 KB of data and %L2 seconds of time.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2080"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2157"/>
<source>Ethernet Connection&lt;br&gt;</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2081"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2109"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2158"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2186"/>
<source>Service: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2082"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2096"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2159"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2173"/>
<source>Interface: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2087"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2164"/>
<source>WiFi Connection&lt;br&gt;</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2089"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2166"/>
<source>SSID: %1&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2095"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2172"/>
<source>Strength: %1%&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2107"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2184"/>
<source>VPN Connection&lt;br&gt;</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2119"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2196"/>
<source>Connection is in the Ready State.</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2130"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2207"/>
<source>Connection is in the Failure State, attempting to reestablish the connection</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2134"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2211"/>
<source>Connection is in the Failure State.</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2140"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2217"/>
<source>Not Connected</source>
<comment>icon_tool_tip</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2147"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2224"/>
<source>Error retrieving properties via Dbus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2148"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2225"/>
<source>Connection status is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2191"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2269"/>
<source>Type: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2192"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2270"/>
<source>&lt;br&gt;Powered </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2193"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2271"/>
<source>On</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2193"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2271"/>
<source>Off</source>
<translation type="unfinished">Aus</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2195"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2273"/>
<source>Not Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2196"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2274"/>
<source>&lt;br&gt;Tethering </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2197"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2263"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2275"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2346"/>
<source>Enabled</source>
<translation type="unfinished">Aktiviert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2255"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2275"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2333"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2362"/>
<source>Connection : %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2257"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2335"/>
<source>Signal Strength: %1%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2259"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2337"/>
<source>Favorite Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2259"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2337"/>
<source>Never Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2260"/>
- <source>&lt;br&gt;Security : %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2261"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2344"/>
<source>&lt;br&gt;Roaming</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2262"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2345"/>
<source>&lt;br&gt;Autoconnect is </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2254"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2274"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2332"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2361"/>
<source>&lt;p style=&apos;white-space:pre&apos;&gt;&lt;center&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/center&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="438"/>
- <source>&lt;center&gt;%1 is a program to interface with the Connman daemon and to provide a system tray control.&lt;br&gt;&lt;center&gt;Version &lt;b&gt;%2&lt;/b&gt;&lt;center&gt;Release date: %3&lt;center&gt;Copyright c %4&lt;center&gt;by&lt;center&gt;Andrew J. Bibb&lt;center&gt;Vermont, USA&lt;br&gt;&lt;center&gt;&lt;b&gt;Contributors:&lt;/b&gt;&lt;center&gt;Brett Dutro&lt;center&gt;Adam Fontenot&lt;center&gt;Lester Bico&lt;center&gt;Yaohan Chen&lt;br&gt;&lt;center&gt;&lt;b&gt;Translations:&lt;/b&gt;&lt;center&gt;Jianfeng Zhang (Chinese)&lt;center&gt;sqozz (German)&lt;center&gt;Ilya Shestopalov (Russian)&lt;br&gt;&lt;center&gt;&lt;b&gt;Build Information:&lt;/b&gt;&lt;center&gt;Compiled using QT version %5</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="517"/>
+ <source>&lt;center&gt;This program uses the &lt;b&gt;AwOken&lt;/b&gt; icon set version 2.5&lt;br&gt;&lt;br&gt;Released under the&lt;br&gt;Creative Commons&lt;br&gt;Attribution-Share Alike 3.0&lt;br&gt;Unported License&lt;br&gt;&lt;a href=&quot;url&quot;&gt;http://creativecommons.org/licenses/by-sa/3.0/legalcode&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="469"/>
- <source>&lt;center&gt;This program uses the &lt;b&gt;AwOken&lt;/b&gt; icon set version 2.5&lt;br&gt;&lt;br&gt;Released under the&lt;br&gt;Creative Commons&lt;br&gt;Attribution-Share Alike 3.0&lt;br&gt;Unported License&lt;br&gt;&lt;a href=&quot;url&quot;&gt;http://creativecommons.org/licenses/by-sa/3.0/legalcode&lt;/a&gt;</source>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1772"/>
+ <source>On</source>
+ <comment>powered</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="1777"/>
+ <source>Off</source>
+ <comment>powered</comment>
+ <translation type="unfinished">Aus</translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2343"/>
+ <source>Security: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2530"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2632"/>
<source>&lt;center&gt;&lt;b&gt;Unable to find a systemtray on this machine.&lt;/b&gt;&lt;center&gt;&lt;br&gt;The program may still be used to manage your connections, but the tray icon will be disabled.&lt;center&gt;&lt;br&gt;&lt;br&gt;If you are seeing this message at system start up and you know a system tray exists once the system is up, try starting with the &lt;b&gt;-w&lt;/b&gt; switch and set a delay as necessary. The exact wait time will vary from system to system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2706"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2814"/>
<source>Could not find a connection to the system bus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2707"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2712"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2732"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2815"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2820"/>
<source>%1 - Critical Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2708"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2816"/>
<source>Unable to find a connection to the system bus.&lt;br&gt;&lt;br&gt;%1 will not be able to communicate with connman.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2711"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2819"/>
<source>Could not create an interface to connman on the system bus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2713"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2821"/>
<source>Unable to create an interface to connman on the system bus.&lt;br&gt;&lt;br&gt;%1 will not be able to communicate with connman.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2716"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2824"/>
<source>Error reading or parsing connman.Manager.GetProperties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2717"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2722"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2727"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2825"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2830"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2835"/>
<source>%1 - Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2718"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2826"/>
<source>There was an error reading or parsing the reply from method connman.Manager.GetProperties.&lt;br&gt;&lt;br&gt;It is unlikely any portion of %1 will be functional.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2721"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2829"/>
<source>Error reading or parsing connman.Manager.GetTechnologies</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2723"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2831"/>
<source>There was an error reading or parsing the reply from method connman.Manager.GetTechnologies.&lt;br&gt;&lt;br&gt;Some portion of %1 may still be functional.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2726"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2834"/>
<source>Error reading or parsing connman.Manager.GetServices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2728"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2836"/>
<source>There was an error reading or parsing the reply from method connman.Manager.GetServices.&lt;br&gt;&lt;br&gt;Some portion of %1 may still be functional.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2731"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2843"/>
<source>Could not create an interface to connman-vpn on the system bus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2733"/>
- <source>Unable to create an interface to connman-vpn on the system bus.&lt;br&gt;&lt;br&gt;%1 will not be able to communicate with the connman vpn daemon.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2794"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2904"/>
<source>[Hidden Wifi]</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2829"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2956"/>
<source>%1 version %2 by %3 has been detected on this system.&lt;p&gt;This server supports desktop Notification Specification version %4</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2956"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="3086"/>
<source>Colorize Icons</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2841"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2968"/>
<source>Attempt %1 of 4 looking for notification server.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="483"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="545"/>
<source>%1 license is the MIT (Expat) license.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="676"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="737"/>
<source>You need to select a service before pressing the connect button.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="751"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="811"/>
<source>You need to select a service before pressing the disconnect button.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2190"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2268"/>
<source>&lt;p style=&apos;white-space:pre&apos;&gt;&lt;center&gt;&lt;b&gt;%1 Properties&lt;/b&gt;&lt;/center&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2844"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2971"/>
<source>Unable to find or connect to a Notification server.</source>
<translation type="unfinished"></translation>
</message>
@@ -2025,7 +2132,7 @@
<context>
<name>IconManager</name>
<message>
- <location filename="../apps/cmstapp/code/iconman/iconman.cpp" line="335"/>
+ <location filename="../apps/cmstapp/code/iconman/iconman.cpp" line="344"/>
<source>A new icon definition file will be installed to &lt;b&gt;%1&lt;/b&gt; and a backup of the old definition file has been created as &lt;b&gt;%2&lt;/b&gt; &lt;p&gt;If the original definition file was customized and you wish to retain those changes you will need to manually merge them into the new file. &lt;p&gt;If the original was never customized or you just wish to delete the backup now you may select &lt;i&gt;Discard&lt;/i&gt; to delete the backup or &lt;i&gt;Save&lt;/i&gt; to retain it.</source>
<translation type="unfinished"></translation>
</message>
@@ -2038,74 +2145,68 @@
<translation>Eigenschaften-Editor</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="38"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="35"/>
<source>&amp;General</source>
<translation>&amp;Allgemein</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="44"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="41"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked this service will auto-connect when no other connection is available. This is only available for services marked &amp;quot;Favorite&amp;quot;. &lt;/p&gt;&lt;p&gt;The service will not auto-connect while roaming.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="47"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="44"/>
<source>AutoConnect</source>
<translation>Automatisch verbinden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="76"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="73"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The list of manually configured domain name servers. Some cellular networks don&apos;t provide correct name servers and this allows for an override.&lt;/p&gt;&lt;p&gt;This array is sorted by priority and the first entry in the list represents the nameserver with the highest priority.&lt;/p&gt;&lt;p&gt;When using manual configuration and no global nameservers are configured, then it is useful to configure this setting.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="79"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="76"/>
<source>&amp;Nameservers</source>
<translation>&amp;Namensserver</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="110"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="107"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The list of manually configured time servers.&lt;/p&gt;&lt;p&gt;The first entry in the list represents the timeserver with the highest priority.&lt;/p&gt;&lt;p&gt;When using manual configuration this setting is useful to override all the other timeserver settings. This is service specific, hence only the values for the default service are used.&lt;/p&gt;&lt;p&gt;Changes to this property will result in restart of NTP query.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="113"/>
<source>&amp;TImeservers</source>
- <translation>&amp;Zeitserver</translation>
+ <translation type="vanished">&amp;Zeitserver</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="144"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="141"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;List of manually configures search domains.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="147"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="144"/>
<source>&amp;Domains</source>
<translation>&amp;Domänen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="178"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User configuration of IPv4 settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="181"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="175"/>
<source>IPv&amp;4</source>
<translation>IPv&amp;4</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="192"/>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="313"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="193"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="387"/>
<source>Address</source>
<translation>Adresse</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="202"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="210"/>
<source>Netmask</source>
<translation>Netzmaske</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="209"/>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="275"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="220"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="334"/>
<source>Gateway</source>
<translation>Gateway</translation>
</message>
@@ -2122,19 +2223,14 @@
<translation type="vanished">Aus</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="226"/>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="327"/>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="369"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="241"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="415"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="451"/>
<source>Method</source>
<translation>Methode</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="257"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User configuration of IPv6 settings&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="260"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="272"/>
<source>IPv&amp;6</source>
<translation>IPv&amp;6</translation>
</message>
@@ -2143,12 +2239,12 @@
<translation type="vanished">Auto</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="289"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="364"/>
<source>Prefix Length</source>
<translation>Prefix-Länge</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="303"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="320"/>
<source>Privacy</source>
<translation>Privatsphäre</translation>
</message>
@@ -2165,12 +2261,12 @@
<translation type="vanished">Aktiviert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="358"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="433"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User configuration of Proxy settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="361"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="436"/>
<source>&amp;Proxy</source>
<translation>&amp;Proxy</translation>
</message>
@@ -2179,77 +2275,139 @@
<translation type="vanished">Direkt</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="391"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="480"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Automatic proxy configuration URL. Used by the &amp;quot;auto&amp;quot; method.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="411"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="473"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="422"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="110"/>
+ <source>&amp;Timeservers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="183"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="190"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv4 address to use for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="200"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="217"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv4 gateway for this connection. This field is optional and may be left blank&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="207"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="227"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv4 netmask for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="294"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="317"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable the IPv6 privacy extension as described in RFC 4941,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Disabled&lt;/span&gt;: privacy extension is disabled and normal autoconf addresses are used.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Enabled&lt;/span&gt;: the system prefers to use public addresses over temporary addresses.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Prefered&lt;/span&gt;: privacy extension is enabled and the system prefers temporary addresses over public addresses.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="331"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="354"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv6 gateway for this connection. This field is optional and may be left blank&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="344"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="361"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The prefix length of the IPv6 connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="374"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="384"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IPv6 address to use for this connection.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="504"/>
<source>Servers</source>
<translation>Server</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="429"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="511"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Used when &amp;quot;manual&amp;quot; is set.List of proxy URIs. The URI without a protocol will be interpreted as the generic proxy URI.&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="436"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="518"/>
<source>Excludes</source>
<translation>Ausgeschlossen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="443"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="525"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Used when &amp;quot;manual&amp;quot; is set. A list of hosts which can be accessed directly.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Enter one or more IP addresses. Separate each address you enter by a comma, semi-colon, or by white space.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="495"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="551"/>
+ <source>&amp;mDNS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="563"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to enable mDNS. Note that mDNS requires a DNS backend which supports it.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="566"/>
+ <source>Enable mDNS </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="584"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;What&apos;s This&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Was ist das&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="518"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="607"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clear all entries on the current page.&lt;/p&gt;&lt;p&gt;This button will reset every field on the current page to the default value, which generally means nothing in the field.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="521"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="610"/>
<source>Reset Pa&amp;ge</source>
<translation>Sei&amp;te zurücksetzen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="528"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="617"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clear all fields on every page of the dialog.&lt;/p&gt;&lt;p&gt;This will reset every field on every page to the default value for the field. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="531"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="620"/>
<source>Reset &amp;All</source>
<translation>&amp;Alles zurücksetzen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="558"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="647"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accept the entries, send them to Connman, and close the dialog.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="561"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="650"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="568"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="657"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Close the dialog without sending any entries to Connman.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="571"/>
+ <location filename="../apps/cmstapp/code/peditor/ui/peditor.ui" line="660"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
@@ -2448,37 +2606,89 @@
<translation>Eduroam (kurz)</translation>
</message>
<message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="322"/>
+ <source>IPv4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="325"/>
- <source>IPv4 Address</source>
- <translation>IPv4 Adresse</translation>
+ <source>Set IPv4 to &quot;off&quot;, &quot;dhcp&quot;, or enter IPV4 address information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="330"/>
+ <source>IPv6</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="333"/>
+ <source>Set IPv6 to &quot;off, &quot;auto&quot;, or enter IPv6 address information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="367"/>
+ <source>DeviceName</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="370"/>
+ <source>Interface name where this provisioning applies (ex: eth0)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="375"/>
+ <source>mDNS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="378"/>
+ <source>True if mDNS domains can be resolved and the hostname registered.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="343"/>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="346"/>
+ <source>EAP-PEAP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="351"/>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="354"/>
+ <source>EAP-TLS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="359"/>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="362"/>
+ <source>EAP-TTLS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IPv4 Address</source>
+ <translation type="vanished">IPv4 Adresse</translation>
+ </message>
+ <message>
<source>IPv4 Off</source>
- <translation>IPv4 Aus</translation>
+ <translation type="vanished">IPv4 Aus</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="341"/>
<source>IPV4 DHCP</source>
- <translation>IPV4 DHCP</translation>
+ <translation type="vanished">IPV4 DHCP</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="349"/>
<source>IPv6 Address</source>
- <translation>IPv6 Adresse</translation>
+ <translation type="vanished">IPv6 Adresse</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="357"/>
<source>IPv6 Off</source>
- <translation>IPv6 Aus</translation>
+ <translation type="vanished">IPv6 Aus</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="365"/>
<source>IPv6 Auto</source>
- <translation>IPv6 Auto</translation>
+ <translation type="vanished">IPv6 Auto</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="370"/>
+ <location filename="../apps/cmstapp/code/provisioning/ui/provisioning_editor.ui" line="338"/>
<source>IPv6.Privacy</source>
<translation>IPv6.Privacy</translation>
</message>
@@ -2486,287 +2696,299 @@
<context>
<name>ProvisioningEditor</name>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="116"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="113"/>
<source>Global</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="122"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="119"/>
<source>Service</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="142"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="139"/>
<source>WiFi</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="162"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="159"/>
<source>Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="194"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="193"/>
<source>File Path to the CA Certificate File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="195"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="194"/>
<source>File Path to the Client Certificate File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="196"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="195"/>
<source>File path to the Client Private Key File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="201"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="200"/>
<source>Key Files (*.pem);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="225"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="224"/>
<source>MAC address.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="226"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="225"/>
<source>SSID: hexadecimal representation of an 802.11 SSID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="227"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="226"/>
<source>List of Nameservers</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="228"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="227"/>
<source>List of Timeservers</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="229"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="228"/>
<source>List of DNS Search Domains</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="230"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="229"/>
<source>Domain name to be used</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="231"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="230"/>
<source>Enter the string representation of an 802.11 SSID.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="265"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="264"/>
<source>Service type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="266"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="265"/>
<source>EAP type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="267"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="266"/>
<source>Private key passphrase type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="268"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="267"/>
<source>Network security type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="269"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="268"/>
<source>Hidden network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="270"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="269"/>
<source>IPv6 Privacy</source>
<translation type="unfinished">IPv6.Privacy {6 ?}</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="274"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="270"/>
+ <source>IPv4 Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="271"/>
+ <source>IPv6 Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="272"/>
+ <source>mDNS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="276"/>
<source>%1 - Item Input</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="299"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="307"/>
<source>Tag which will replace the * with&lt;br&gt;an identifier unique to the config file.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="300"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="308"/>
<source>Enter the network name.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="301"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="309"/>
<source>Enter a description of the network.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="302"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="310"/>
<source>Password/Passphrase for the private key file.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="303"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="311"/>
<source>Identity string for EAP.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="304"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="312"/>
<source>RSN/WPA/WPA2 Passphrase</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="305"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="313"/>
<source>Phase 2 (inner authentication with TLS tunnel)&lt;br&gt;authentication method.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="317"/>
- <source>%1 - Text Input</source>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="314"/>
+ <source>The interface name in which to apply the provisioning (ex. eth0)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="342"/>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="387"/>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="500"/>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="539"/>
- <source> Information</source>
- <translation type="unfinished">Information</translation>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="326"/>
+ <source>%1 - Text Input</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="343"/>
- <source>The IPv4 &lt;b&gt;Address&lt;/b&gt;, &lt;b&gt;Netmask&lt;/b&gt;, and optionally &lt;b&gt;Gateway&lt;/b&gt; need to be provided.&lt;p&gt;Press OK when you are ready to proceed.</source>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="349"/>
+ <source>IPv4 Address. &lt;br&gt;&lt;br&gt;Enter the IPv4 network address in the form xxx.xxx.xxx.xxx</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="348"/>
- <source>IPv4 Address</source>
- <translation type="unfinished">IPv4 Adresse</translation>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="354"/>
+ <source>IPv4 Netmask. &lt;br&gt;&lt;br&gt;The entry can be a mask length (example 24) or in the form xxx:xxx:xxx:xxx</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="353"/>
- <source>IPv4 Netmask</source>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="395"/>
+ <source>IPv6 Gateway .&lt;br&gt;&lt;br&gt;This is an optional entry, press cancel if there is no entry for gateway</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="358"/>
- <source>IPv4 Gateway (This is an optional entry)</source>
- <translation type="unfinished"></translation>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="492"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="531"/>
+ <source> Information</source>
+ <translation type="unfinished">Information</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="388"/>
- <source>The IPv6 &lt;b&gt;Address&lt;/b&gt;, &lt;b&gt;Prefix Length&lt;/b&gt;, and optionally &lt;b&gt;Gateway&lt;/b&gt; need to be provided.&lt;p&gt;Press OK when you are ready to proceed.</source>
+ <source>IPv4 Address</source>
+ <translation type="obsolete">IPv4 Adresse</translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="359"/>
+ <source>IPv4 Gateway.&lt;br&gt;&lt;br&gt;This is an optional entry, press cancel if there is no entry for gateway</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="393"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="383"/>
<source>IPv6 Address</source>
<translation type="unfinished">IPv6 Adresse</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="398"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="388"/>
<source>%1 - Integer Input</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="399"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="389"/>
<source>Enter the IPv6 prefix length</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="405"/>
- <source>IPv6 Gateway (This is an optional entry)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="501"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="493"/>
<source>&lt;center&gt;No configuration files were found.&lt;br&gt;You may use this dialog to create one.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="507"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="499"/>
<source>%1 - Information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="508"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="500"/>
<source>&lt;center&gt;Reading configuration file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="515"/>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="546"/>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="567"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="507"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="538"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="559"/>
<source>%1 - Select File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="516"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="508"/>
<source>Select a file to load.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="540"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="532"/>
<source>&lt;center&gt;No configuration files were found.&lt;br&gt;Nothing will be deleted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="547"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="539"/>
<source>Select a file to be deleted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="568"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="560"/>
<source>Enter a new file name or select&lt;br&gt;an existing file to overwrite.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="604"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="595"/>
<source>File read completed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="616"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="607"/>
<source>File deleted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="618"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="609"/>
<source>Error encountered deleting.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="632"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="623"/>
<source>File save failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="635"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="626"/>
<source>%L1 KB written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="637"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="628"/>
<source>%L1 Bytes written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="649"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="640"/>
<source> Critical</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="650"/>
+ <location filename="../apps/cmstapp/code/provisioning/prov_ed.cpp" line="641"/>
<source>&lt;b&gt;DBus Error Name:&lt;/b&gt; %1&lt;br&gt;&lt;br&gt;&lt;b&gt;String:&lt;/b&gt; %2&lt;br&gt;&lt;br&gt;&lt;b&gt;Message:&lt;/b&gt; %3</source>
<translation type="unfinished"></translation>
</message>
@@ -2800,403 +3022,433 @@
<context>
<name>TranslateStrings</name>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="42"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="43"/>
<source>connman system tray</source>
<comment>Main Window Title</comment>
<translation>connman system tray</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="43"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="44"/>
<source>cmst</source>
<comment>Abbreviated Program Name - used for QMessageBox titles</comment>
<translation>cmst</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="46"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="47"/>
<source>idle</source>
<comment>connman state string</comment>
<translation>Inaktiv</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="47"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="48"/>
<source>association</source>
<comment>connman state string</comment>
<translation>Verbindung</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="48"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="49"/>
<source>configuration</source>
<comment>connman state string</comment>
<translation>Konfiguration</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="49"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="50"/>
<source>ready</source>
<comment>connman state string</comment>
<translation>Bereit</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="50"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="51"/>
<source>online</source>
<comment>connman state string</comment>
<translation>Online</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="51"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="52"/>
<source>disconnect</source>
<comment>connman state string</comment>
<translation>Trennen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="52"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="53"/>
<source>failure</source>
<comment>connman state string</comment>
<translation>Fehlschlag</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="53"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="54"/>
<source>offline</source>
<comment>connman state string</comment>
<translation>Offline</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="55"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="56"/>
<source>system</source>
<comment>connman type string</comment>
<translation>System</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="56"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="57"/>
<source>ethernet</source>
<comment>connman type string</comment>
<translation>Ethernet</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="57"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="58"/>
<source>wifi</source>
<comment>connman type string</comment>
<translation>Wifi</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="58"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="59"/>
<source>bluetooth</source>
<comment>connman type string</comment>
<translation>Bluetooth</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="59"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="60"/>
<source>cellular</source>
<comment>connman type string</comment>
<translatorcomment>Brauche Kontext um das richtig übersetzen zu können / Need the context to translate this right</translatorcomment>
<translation type="unfinished">Cellular</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="60"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="61"/>
<source>gps</source>
<comment>connman type string</comment>
<translation>GPS</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="61"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="62"/>
<source>vpn</source>
<comment>connman type string</comment>
<translation>VPN</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="62"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="63"/>
<source>gadget</source>
<comment>connman type string</comment>
<translation>Gadget</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="63"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="64"/>
<source>p2p</source>
<comment>connman type string</comment>
<translation>P2P</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="64"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="65"/>
<source>wired</source>
<comment>connman type string</comment>
<translation>Kabelgebunden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="66"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="67"/>
<source>direct</source>
<comment>connman proxy string</comment>
<translation>Direkt</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="67"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="68"/>
<source>manual</source>
<comment>connman proxy string</comment>
<translation>Manuell</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="68"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="69"/>
<source>auto</source>
<comment>connman proxy string</comment>
<translation>Auto</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="70"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="71"/>
<source>psk</source>
<comment>connman security string</comment>
<translation>PSK</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="71"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="72"/>
<source>ieee8021x</source>
<comment>connman security string</comment>
<translation>ieee8021x</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="72"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="73"/>
<source>none</source>
<comment>connman security string</comment>
<translation>Nichts</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="73"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="74"/>
<source>wep</source>
<comment>connman security string</comment>
<translation>WEP</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="74"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="75"/>
<source>wps</source>
<comment>connman security string</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="76"/>
+ <source>wps_advertising</source>
+ <comment>connman security string</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="78"/>
<source>Invalid arguments</source>
<comment>connman error string</comment>
<translation type="unfinished">Ungültige Argumente</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="77"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="79"/>
<source>Permission denied</source>
<comment>connman error string</comment>
<translation type="unfinished">Zugriff verweigert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="78"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="80"/>
<source>Passphrase required</source>
<comment>connman error string</comment>
<translation type="unfinished">Passwort benötigt</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="79"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="81"/>
<source>Not registered</source>
<comment>connman error string</comment>
<translation type="unfinished">Nicht registriert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="80"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="82"/>
<source>Not unique</source>
<comment>connman error string</comment>
<translation type="unfinished">Nicht eindeutig</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="81"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="83"/>
<source>Not supported</source>
<comment>connman error string</comment>
<translation type="unfinished">Nicht unterstützt</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="82"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="84"/>
<source>Not implemented</source>
<comment>connman error string</comment>
<translation type="unfinished">Nicht implementiert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="83"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="85"/>
<source>Not found</source>
<comment>connman error string</comment>
<translation type="unfinished">Nicht gefunden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="84"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="86"/>
<source>No carrier</source>
<comment>connman error string</comment>
<translation type="unfinished">Kein Carrier</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="85"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="87"/>
<source>In progress</source>
<comment>connman error string</comment>
<translation type="unfinished">In Bearbeitung</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="86"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="88"/>
<source>Already exists</source>
<comment>connman error string</comment>
<translation type="unfinished">Existiert bereits</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="87"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="89"/>
<source>Already enabled</source>
<comment>connman error string</comment>
<translation type="unfinished">Bereits aktiviert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="88"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="90"/>
<source>Already disabled</source>
<comment>connman error string</comment>
<translation type="unfinished">Bereits deaktiviert</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="89"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="91"/>
<source>Already connected</source>
<comment>connman error string</comment>
<translation type="unfinished">Bereits verbunden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="90"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="92"/>
<source>Not connected</source>
<comment>connman error string</comment>
<translation type="unfinished">Nicht verbunden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="91"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="93"/>
<source>Operation aborted</source>
<comment>connman error string</comment>
<translation type="unfinished">Aktion abgebrochen</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="92"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="94"/>
<source>Operation timeout</source>
<comment>connman error string</comment>
<translation type="unfinished">Aktion Zeitüberschreitung</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="93"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="95"/>
<source>Invalid service</source>
<comment>connman error string</comment>
<translation type="unfinished">Ungültiger Dienst</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="94"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="96"/>
<source>Invalid property</source>
<comment>connman error string</comment>
<translation type="unfinished">Ungültige Eigenschaft</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="96"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="98"/>
<source>disabled</source>
<comment>connman privacy string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="97"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="99"/>
<source>enabled</source>
<comment>connman privacy string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="98"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="100"/>
<source>prefered</source>
<comment>connman privacy string - known misspelling but needed to avoid breaking code</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="99"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="101"/>
<source>preferred</source>
<comment>connman privacy string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="101"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="103"/>
<source>auto</source>
<comment>connman ethernet connection method</comment>
<translation type="unfinished">Auto</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="102"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="104"/>
<source>manual</source>
<comment>connman ethernet connection method</comment>
<translation type="unfinished">Manuell</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="104"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="106"/>
<source>dhcp</source>
<comment>connman ipv4 method string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="105"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="107"/>
<source>manual</source>
<comment>connman ipv4 method string</comment>
<translation type="unfinished">Manuell</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="106"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="108"/>
<source>off</source>
<comment>connman ipv4 method string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="107"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="109"/>
<source>fixed</source>
<comment>connman ipv4 method string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="109"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="110"/>
+ <source>address</source>
+ <comment>connamn ipv4 method string</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="112"/>
<source>auto</source>
<comment>connman ipv6 method string</comment>
<translation type="unfinished">Auto</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="110"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="113"/>
<source>manual</source>
<comment>connman ipv6 method string</comment>
<translation type="unfinished">Manuell</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="111"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="114"/>
<source>6to4</source>
<comment>connman ipv6 method string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="112"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="115"/>
<source>off</source>
<comment>connman ipv6 method string</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="114"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="117"/>
<source>openconnect</source>
<comment>connman vpn connection type</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="115"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="118"/>
<source>openvpn</source>
<comment>connman vpn connection type</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="116"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="119"/>
<source>vpnc</source>
<comment>connman vpn connection type</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="117"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="120"/>
<source>l2tp</source>
<comment>connman vpn connection type</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="118"/>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="121"/>
<source>pptp</source>
<comment>connman vpn connection type</comment>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="122"/>
+ <source>wireguard</source>
+ <comment>connman vpn connection type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="124"/>
+ <source>true</source>
+ <comment>connman mdns setting</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/trstring/tr_strings.cpp" line="125"/>
+ <source>false</source>
+ <comment>connman mdns setting</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>auto</source>
<comment>connamn ipv6 method string</comment>
<translation type="obsolete">Auto</translation>
@@ -3419,100 +3671,107 @@
<context>
<name>VPN_Editor</name>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="187"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="206"/>
<source>Global</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="193"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="212"/>
<source>OpenConnect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="205"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="235"/>
<source>OpenVPN</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="229"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="262"/>
<source>VPNC</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="252"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="289"/>
<source>L2TP</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="305"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="341"/>
<source>PPTP</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="359"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="411"/>
<source>All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="372"/>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="373"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="424"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="425"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="426"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="427"/>
<source>Cert Files (*.pem *.ca *.crt *.cert);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="363"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="415"/>
<source>User:Pass Files (*.up *.txt *.conf);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="366"/>
+ <source>WireGuard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="418"/>
<source>CA Files (*.ca *.cert *.crt *.pem);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="367"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="419"/>
<source>Cert Files (*.ca *.cert *.crt *.pem);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="368"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="420"/>
<source>Key Files (*.key *.ca *.cert *.crt *.pem);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="369"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="421"/>
<source>Config Files (*.ovpn *.conf *.config);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="402"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="455"/>
<source>VPN server IP address (ex: 1.2.3.4)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="466"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="529"/>
<source>%1 - Item Input</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="484"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="547"/>
<source>%1 - Verify Option</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="504"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="567"/>
<source>User defined name for the VPN</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="505"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="568"/>
<source>Domain name for the VPN Service
(example: corporate.com)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="506"/>
- <source>Networks behing the VPN link, if more than one separate by a comma.
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="569"/>
+ <source>Networks behind the VPN link, if more than one separate by a comma.
Format is network/netmask/gateway, and gateway can be omitted.
Ex: 10.10.20.0/255.255.255.0/10.20.1.5,192.168.99.1/24,2001:Ldb8::1/16
@@ -3520,170 +3779,176 @@ Networks = entry is optional and may be left blank.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="522"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="573"/>
+ <source>Network address in the form address/netmask/peer.
+Ex: 10.2.0.2/24</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="588"/>
<source>%1 - Text Input</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="590"/>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="629"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="656"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="695"/>
<source> Information</source>
<translation type="unfinished">Information</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="591"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="657"/>
<source>&lt;center&gt;No configuration files were found.&lt;br&gt;You may use this dialog to create one.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="597"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="663"/>
<source>%1 - Information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="598"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="664"/>
<source>&lt;center&gt;Reading configuration file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="605"/>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="636"/>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="657"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="671"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="702"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="723"/>
<source>%1 - Select File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="606"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="672"/>
<source>Select a file to load.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="630"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="696"/>
<source>&lt;center&gt;No configuration files were found.&lt;br&gt;Nothing will be deleted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="637"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="703"/>
<source>Select a file to be deleted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="658"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="724"/>
<source>Enter a new file name or select&lt;br&gt;an existing file to overwrite.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="693"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="759"/>
<source>File read completed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="705"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="771"/>
<source>File deleted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="707"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="773"/>
<source>Error encountered deleting.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="721"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="787"/>
<source>File save failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="724"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="790"/>
<source>%L1 KB written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="726"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="792"/>
<source>%L1 Bytes written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="738"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="804"/>
<source> Critical</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="739"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="805"/>
<source>&lt;b&gt;DBus Error Name:&lt;/b&gt; %1&lt;br&gt;&lt;br&gt;&lt;b&gt;String:&lt;/b&gt; %2&lt;br&gt;&lt;br&gt;&lt;b&gt;Message:&lt;/b&gt; %3</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="776"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="843"/>
<source>OpenVPN Configurations (*.ovpn *.conf);;All Files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="786"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="853"/>
<source>Select the configuration file to import</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="834"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="901"/>
<source>Unable to write &lt;b&gt;%1&lt;/b&gt; - Aborting the import</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="845"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="912"/>
<source>Keep --auth-user-pass</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="846"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="913"/>
<source>The conf file will contain the &lt;b&gt;auth-user-pass&lt;/b&gt; entry which will require prompts sent to stdout and a reply on stdin. This cannot be handled by Connman nor by CMST.&lt;p&gt;If this entry is removed you will need to create a &quot;user:pass&quot; file in order to have Connman make the VPN connection. In the next step you will be asked if you want to create this file and you will prompted for the user name and password.&lt;p&gt;&lt;b&gt;Do you wish to remove this entry?&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="872"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="939"/>
<source>Unable to write conf file &lt;b&gt;%1&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="884"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="951"/>
<source>Create User:Password File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="885"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="952"/>
<source>Do you wish to create a user:password file for this connection?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="890"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="957"/>
<source>User</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="891"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="958"/>
<source>Enter the user name for this connection.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="896"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="963"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="897"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="964"/>
<source>Enter the password for this connection.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="914"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="981"/>
<source>Unable to write user:password file &lt;b&gt;%1&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="924"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="991"/>
<source>Unable to read &lt;b&gt;%1&lt;/b&gt; - Aborting the import</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="932"/>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/vpn_ed.cpp" line="999"/>
<source>OpenVPN import is complete. The provisioning file may now be saved.</source>
<translation type="unfinished"></translation>
</message>
@@ -4091,6 +4356,206 @@ that the peer is no longer connected.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="862"/>
+ <source>Provider WireGuard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="865"/>
+ <source>Provider Wire Guard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="870"/>
+ <source>VPNC.DeviceType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="873"/>
+ <source>Wheher the VPN should use tun or tap.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="878"/>
+ <source>WireGuard.Address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="881"/>
+ <source>Internal IP Address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="886"/>
+ <source>WireGuard.ListPort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="889"/>
+ <source>Local listen port (optional).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="894"/>
+ <source>WireGuard.DNS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="897"/>
+ <source>A comma separated list of name servers (optional).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="902"/>
+ <source>WireGuard.PrivateKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="905"/>
+ <source>Private key of the interface.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="910"/>
+ <source>WireGuard.PublicKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="913"/>
+ <source>Public key of peer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="918"/>
+ <source>WireGuard.PresharedKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="921"/>
+ <source>Preshared key of peer (optional).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="926"/>
+ <source>WireGuard.AllowedIPs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="929"/>
+ <source>See cryptokey routing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="934"/>
+ <source>WireGuard.EndpointPort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="937"/>
+ <source>Endpoint listen port (optional).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="942"/>
+ <source>WireGuard.PersistentKeepalive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="945"/>
+ <source>Keep alive in seconds (optional).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="950"/>
+ <source>OpenVPN.DeviceType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="953"/>
+ <source>Whether the VPN should use tun or tap.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="958"/>
+ <source>OpenConnect.AllowSelfSignedCert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="961"/>
+ <source>Define if self signed server certificates are allowed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="966"/>
+ <source>OpenConnect.AuthType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="969"/>
+ <source>Type of authentication used.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="974"/>
+ <source>OpenConnect.DisableIPv6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="977"/>
+ <source>Do not ask for IPv6 connectivity.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="982"/>
+ <source>OpenConnect.NoDTLS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="985"/>
+ <source>Disable DTLS and ESP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="990"/>
+ <source>OpenConnect.NoHTTPKeepalive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="993"/>
+ <source>Disable HTTP connection re-use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="998"/>
+ <source>OpenConnect.PKCSClientCert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="1001"/>
+ <source>Certificate and privatekey in a PKCS#1/PKCS#8/PKCS#12 structure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="1006"/>
+ <source>OpenConnect.Usergroup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="1009"/>
+ <source>Set login usergroup on remote server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="1014"/>
+ <source>OpenConnect.UserPrivateKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="1017"/>
+ <source>SSL private key file needed by web authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../apps/cmstapp/code/vpn_prov_ed/ui/vpn_prov_editor.ui" line="716"/>
<source>MTU of the tunnel.</source>
<translation type="unfinished"></translation>
@@ -4199,9 +4664,8 @@ that the peer is no longer connected.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="87"/>
<source>[Experimental] Disable data counters. May be used to minimize load on your system.</source>
- <translation>[Experimentell] Datenzähler ausschalten. Kann eventuell die Last auf dem System minimieren.</translation>
+ <translation type="vanished">[Experimentell] Datenzähler ausschalten. Kann eventuell die Last auf dem System minimieren.</translation>
</message>
<message>
<location filename="../apps/cmstapp/code/main.cpp" line="91"/>
@@ -4213,6 +4677,11 @@ that the peer is no longer connected.</source>
<translation type="vanished">Benutze das Icon Theme von deinem System, falls eines definiert ist.</translation>
</message>
<message>
+ <location filename="../apps/cmstapp/code/main.cpp" line="87"/>
+ <source>[Experimental] Enable data counters.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../apps/cmstapp/code/main.cpp" line="97"/>
<source>Use an icon theme from your system.</source>
<translation type="unfinished"></translation>
@@ -4233,48 +4702,58 @@ that the peer is no longer connected.</source>
<translation>Starte das GUI minimiert im System-Tray.</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="113"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="111"/>
+ <source>Disable the minimize button. Use when you want to have the window manager have sole control of minimizing the interface.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/main.cpp" line="115"/>
+ <source>Disable VPN support.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/main.cpp" line="121"/>
<source>Specify the wait time in seconds before starting the system tray icon.</source>
<translation>Gebe die Wartezeit in Sekunden an, bevor das System-Tray-Icon angezeigt wird.</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="114"/>
- <location filename="../apps/cmstapp/code/main.cpp" line="126"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="122"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="134"/>
<source>seconds</source>
<translation>Sekunden</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="119"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="127"/>
<source>[Experimental] The number of kb that have to be transmitted before the counter updates.</source>
<translation>[Experimentell] Die Anzahl der kb die übertragen werden, bevor der Zähler aktualisiert wird.</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="120"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="128"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="125"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="133"/>
<source>[Experimental] The interval in seconds between counter updates.</source>
<translation>[Experimentell] Der Zeitraum in Sekunden zwischen den Zähler-Aktualisierungen.</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="132"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="140"/>
<source>If tray icon fake transparency is required, specify the background color to use (format: 0xRRGGBB)</source>
<translation>Falls Pseudotransparenz benötigt wird, kann hier die Hintergrundfarbe definiert werden (Format: 0xRRGGBB)</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="133"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="141"/>
<source>RRGGBB</source>
<translation>RRGGBB</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="140"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="148"/>
<source>Use XFCE specific code.</source>
<translation>Benutze XFCE spezifischen Code.</translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/main.cpp" line="145"/>
+ <location filename="../apps/cmstapp/code/main.cpp" line="153"/>
<source>Use MATE DE specific code.</source>
<translation>Benutze MATE DE spezifischen Code.</translation>
</message>
diff --git a/translations/cmst_en_US.qm b/translations/cmst_en_US.qm
index 7431660..5658798 100644
--- a/translations/cmst_en_US.qm
+++ b/translations/cmst_en_US.qm
Binary files differ
diff --git a/translations/cmst_en_US.ts b/translations/cmst_en_US.ts
index f459d0f..a7de7a9 100644
--- a/translations/cmst_en_US.ts
+++ b/translations/cmst_en_US.ts
@@ -145,7 +145,7 @@
</message>
<message>
<location filename="../apps/cmstapp/code/agent/ui/agent.ui" line="327"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Connman is requesting that you open a web browser to complete the login process.&lt;/p&gt;&lt;p&gt;We have scanned your PATH for browsers and any browsers found are shown in the list below. You may select any one browser to use it for the login. If your web browser is not shown in the list you may enter it directly in the&lt;span style=&quot; font-weight:600;&quot;&gt; Choose or enter a browser box&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To launch the browser click the &lt;span style=&quot; font-weight:600;&quot;&gt;Launch Browser&lt;/span&gt; button. &lt;/p&gt;&lt;p&gt;If you wish to login manually close this dialog, start your web browser and proceed to the URL shown in the &lt;span style=&quot; font-weight:600;&quot;&gt;Login URL&lt;/span&gt; box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ConnMan is requesting that you open a web browser to complete the login process.&lt;/p&gt;&lt;p&gt;We have scanned your PATH for browsers and any browsers found are shown in the list below. You may select any one browser to use it for the login. If your web browser is not shown in the list you may enter it directly in the&lt;span style=&quot; font-weight:600;&quot;&gt; Choose or enter a browser box&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To launch the browser click the &lt;span style=&quot; font-weight:600;&quot;&gt;Launch Browser&lt;/span&gt; button. &lt;/p&gt;&lt;p&gt;If you wish to login manually close this dialog, start your web browser and proceed to the URL shown in the &lt;span style=&quot; font-weight:600;&quot;&gt;Login URL&lt;/span&gt; box.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Brave Browser Users:&lt;/span&gt; Note that Brave does not seem to accept a URL to start with. After the browser starts you will need to enter the URL manually. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -217,12 +217,12 @@
<context>
<name>AgentDialog</name>
<message>
- <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="296"/>
+ <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="298"/>
<source> Information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="297"/>
+ <location filename="../apps/cmstapp/code/agent/agent_dialog.cpp" line="299"/>
<source>You have requested the %1 browser, but we cannot find a terminal program to open it with. Currenty we can start %1 using these terminals: &lt;b&gt;roxterm&lt;/b&gt; and &lt;b&gt;xterm&lt;/b&gt;.&lt;br&gt;&lt;br&gt;To continue you need to manually open a terminal and then enter: &quot;%1 %2&quot;</source>
<translation type="unfinished"></translation>
</message>
@@ -230,22 +230,22 @@
<context>
<name>ConnmanAgent</name>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="81"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="82"/>
<source>Connman Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="82"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="83"/>
<source>Connman returned the following error:&lt;b&gt;&lt;center&gt;%1&lt;/b&gt;&lt;br&gt;Would you like to retry?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="130"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="131"/>
<source>Agent Request Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/agent/agent.cpp" line="131"/>
+ <location filename="../apps/cmstapp/code/agent/agent.cpp" line="132"/>
<source>The agent request failed before a reply was returned.</source>
<translation type="unfinished"></translation>
</message>
@@ -368,1603 +368,1710 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="45"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="48"/>
<source>&amp;Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="81"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="100"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This checkbox controls the global setting for switching all radios on or off. When checked all radios are powered down.&lt;/p&gt;&lt;p&gt;When the system is In offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="84"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="103"/>
<source>All Devices &amp;Off</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="93"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="69"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;OfflineMode&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The offline mode indicates the global setting for switching all radios on or off. Changing offline mode to true results in powering down all devices. When leaving offline mode the individual policy of each device decides to switch the radio back on or not. &lt;/p&gt;&lt;p&gt;During offline mode, it is still possible to switch certain technologies manually back on. For example the limited usage of WiFi or Bluetooth devices might be allowed in some situations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="96"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="35"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="477"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="577"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="733"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="862"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="902"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="72"/>
<source>Global Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="102"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="80"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="132"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global setting for switching all radios on or off. When offline mode is engaged all radios are powered down.&lt;/p&gt;&lt;p&gt;While in offline mode it is possible to turn individual devices back on. When leaving offline mode the individual policy of each device determines if the radio is turned back on or not.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="105"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="83"/>
<source>OfflineMode: Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="147"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="90"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The global connection state of the system. Possible values are &amp;quot;offline&amp;quot;, &amp;quot;idle&amp;quot;, &amp;quot;ready&amp;quot;, and &amp;quot;online&amp;quot;. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="150"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="93"/>
<source>State: Unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="211"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="151"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="166"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="149"/>
<source>Technologies</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="260"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="402"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="662"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="856"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="215"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="357"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="626"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="833"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="265"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="407"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="861"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="220"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="362"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="838"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="270"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="225"/>
<source>Powered</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="275"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="672"/>
- <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2195"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="230"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="636"/>
+ <location filename="../apps/cmstapp/code/control_box/controlbox.cpp" line="2273"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="280"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="235"/>
<source>Tethering</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="298"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="253"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="693"/>
<source>Resc&amp;an</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="347"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="302"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This box lists all services that connman can connect to.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="350"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="305"/>
<source>Services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="412"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="866"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="367"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="843"/>
<source>State</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="417"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="876"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="372"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="853"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="433"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1842"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="388"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1851"/>
<source>Move Before</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="446"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1847"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="401"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1856"/>
<source>Move After</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="466"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="421"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked hide the connection name in the Services box.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="469"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="424"/>
<source>&amp;Less</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="490"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="445"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page will show the details of the service selected in the box at the top. If the selected service is not in the READY or ONLINE state then most of the details will be blank. &lt;/p&gt;&lt;p&gt;You may override service details by using the &lt;span style=&quot; font-weight:600;&quot;&gt;Configuration&lt;/span&gt; button at the bottom right. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="448"/>
<source>&amp;Details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="502"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="460"/>
<source>Ser&amp;vice</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="512"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="470"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use this Combobox to select the service for which you wish to view the detailed information.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="603"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="564"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The default configuration method for all services is automatic or something like DHCP. This should be good enough for most typical usage, but if it is not this button will allow manual configuration of Ethernet and IP settings for the selected Service.&lt;/p&gt;&lt;p&gt;This button will be disabled if the service is provisioned via an external config file or if the service is a hidden wifi service. It is not possible to modify the properties of these services.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="606"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="567"/>
<source>Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="616"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="580"/>
<source>&amp;Wireless</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="690"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="586"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page shows the known WiFi services. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Name:&lt;/span&gt; The SSID of the network.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Favorite:&lt;/span&gt; A heart symbol in this column indicates that this computer has previously made a connection to the network using this service.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Connected:&lt;/span&gt; Shows the connection state of this service. Hover the mouse over the icon to popup a text description. Online signals that an Internet connectionis available and has been verified. Ready signals a successfully connected device. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Security: &lt;/span&gt;Describes the type of security used for this service. Possible values are &amp;quot;none&amp;quot;, &amp;quot;wep&amp;quot;, &amp;quot;psk&amp;quot;, &amp;quot;ieee8021x&amp;quot;, and &amp;quot;wps&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;SIgnal Strength:&lt;/span&gt; The strength of the WiFi signal, normalized to a scale of 0 to 100.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="654"/>
<source>Wireless Services</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="696"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="660"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a wifi service in the table below and press this button to connect the service. &lt;/p&gt;&lt;p&gt;If there is only one wifi service listed in the table pressing this button will automatically select that service and attempt to connect. &lt;/p&gt;&lt;p&gt;If information about the service is needed, a passphrase for instance, you will be prompted for it. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="699"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="777"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="663"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="754"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="706"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="670"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a wifi service in the table below and press this button to disconnect it. &lt;/p&gt;&lt;p&gt;If there is only one wifi service in the &amp;quot;ready&amp;quot; or &amp;quot;online&amp;quot; state pressing this button will automatically select that service and disconnect it. &lt;/p&gt;&lt;p&gt;This may also be used to abort a previous connection attempt.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="709"/>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="790"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="673"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="767"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="719"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="683"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="732"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="706"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This label shows the number of WiFi technologies (devices) that were found, and the number that are powered on. There must be at least one WiFi technology found and powered in order for the box below to show services.&lt;/p&gt;&lt;p&gt;To turn a technology on or off go to the &lt;span style=&quot; font-weight:600;&quot;&gt;Technologies&lt;/span&gt; box in the &lt;span style=&quot; font-weight:600;&quot;&gt;Status&lt;/span&gt; tab and double click on the text that shows in the &lt;span style=&quot; font-weight:600;&quot;&gt;Powered&lt;/span&gt; column for the technology.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="735"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="709"/>
<source>Wifi State</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1271"/>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="790"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This page shows the provisioned VPN services. Some cells in the table may only be available once a connection is estlablished. &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Name:&lt;/span&gt; The name given in the provisioning file.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Type:&lt;/span&gt; The VPN type (OpenConnect, OpenVPN, PPTP, etc)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;State:&lt;/span&gt; Shows the connection state of this service. Hover the mouse over the icon to popup a text description. . &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Host: &lt;/span&gt;VPN Host IP.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Domain:&lt;/span&gt; The VPN Domain.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../apps/cmstapp/code/control_box/ui/controlbox.ui" line="1254"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;pre style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt;Command Line Option: &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot; font-family:&apos;Courier New,courier&apos;; font-weight:600;&quot;&gt;--minimized&lt;/span&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;
&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Start the GUI minimized in the system tray.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"&g