diff options
author | Samuli Piippo <samuli.piippo@qt.io> | 2020-10-23 15:32:54 +0300 |
---|---|---|
committer | Samuli Piippo <samuli.piippo@qt.io> | 2020-10-29 05:43:55 +0000 |
commit | 31a633bc93eb2eaff4d50596c69db0ad83a3e6cf (patch) | |
tree | 754e90145a71900cbf24888a6d676afca6d591ae /startupscreen/settingsmanager.cpp | |
parent | 25842566eee73aa8f2b07dcd334d47d6f6853579 (diff) |
startupscreen: enable usb mode switch
The USB button can be used switch the USB Ethernet driver mode
between cdcecm and rndis to work with Linux, Windows and macOS
host machines.
Task-number: QTBUG-87857
Change-Id: Iab54d7582bdd9c39fca95dfa0bb8637d5ea14e81
Reviewed-by: Rami Potinkara <rami.potinkara@qt.io>
Diffstat (limited to 'startupscreen/settingsmanager.cpp')
-rw-r--r-- | startupscreen/settingsmanager.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/startupscreen/settingsmanager.cpp b/startupscreen/settingsmanager.cpp new file mode 100644 index 0000000..4f5f217 --- /dev/null +++ b/startupscreen/settingsmanager.cpp @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "settingsmanager.h" + +#include <QDebug> +#include <QDir> +#include <QFile> +#include <QTemporaryFile> + +#include <sys/reboot.h> +#include <unistd.h> + +const QString QdbdFileName(QStringLiteral("/etc/default/qdbd")); +const char *ProtocolSetting("USB_ETHERNET_PROTOCOL="); + +SettingsManager::SettingsManager(QObject *parent) : QObject(parent) {} + +bool SettingsManager::hasQdb() +{ + return QFile::exists(QdbdFileName); +} + +QString SettingsManager::usbMode() +{ + static bool initialized = false; + if (!initialized) { + QFile file(QdbdFileName); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QByteArray line; + while (!(line = file.readLine()).isEmpty()) { + if (line.startsWith(ProtocolSetting)) + m_usbMode = + QString::fromLatin1(line.last(line.length() - strlen(ProtocolSetting))) + .trimmed(); + } + } else { + qWarning() << "Failed to open file" << QdbdFileName; + } + initialized = true; + } + return m_usbMode; +} + +void SettingsManager::setUsbMode(const QString &usbMode) +{ + QFile file(QdbdFileName); + QTemporaryFile newFile(QdbdFileName); + newFile.setAutoRemove(false); + if (!newFile.open()) { + qWarning() << "Failed to save qdbd settings:" << newFile.errorString(); + return; + } + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream out(&newFile); + QByteArray line; + while (!(line = file.readLine()).isEmpty()) { + if (line.startsWith(ProtocolSetting)) + out << ProtocolSetting << usbMode.toLatin1() << '\n'; + else + out << line; + } + + file.remove(); + if (!newFile.rename(QdbdFileName)) + qWarning() << "Failed to save qdbd settings:" << newFile.errorString(); + + } else { + qWarning() << "Failed to save qdbd settings:" << file.errorString(); + } +} + +void SettingsManager::reboot() +{ + sync(); + ::reboot(RB_AUTOBOOT); + qWarning("reboot failed"); +} |