256 lines
8.2 KiB
C++
256 lines
8.2 KiB
C++
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
#include "vpnlistitem.h"
|
|
#include "kylinconnectitem.h"
|
|
|
|
#include <QDebug>
|
|
|
|
#define LOG_FLAG "[VpnListItem]"
|
|
|
|
VpnListItem::VpnListItem(const KyConnectItem *vpnConnectItem, QWidget *parent):ListItem(parent)
|
|
{
|
|
m_connectOperation = new KyVpnConnectOperation(this);
|
|
m_deviceResource = new KyNetworkDeviceResourse(this);
|
|
|
|
connectItemCopy(vpnConnectItem);
|
|
|
|
m_nameLabel->setText(m_vpnConnectItem.m_connectName);
|
|
m_netButton->setButtonIcon(QIcon::fromTheme("ukui-vpn-symbolic"));
|
|
|
|
qDebug() << "VpnListItem init:" << m_vpnConnectItem.m_connectName << m_vpnConnectItem.m_connectState << m_vpnConnectItem.m_ifaceName;
|
|
|
|
if (Deactivated == m_vpnConnectItem.m_connectState || Activated == m_vpnConnectItem.m_connectState) {
|
|
m_netButton->stopLoading();
|
|
if (m_vpnConnectItem.m_connectState == Activated) {
|
|
setIcon(true);
|
|
} else {
|
|
setIcon(false);
|
|
}
|
|
} else {
|
|
m_netButton->startLoading();
|
|
}
|
|
|
|
m_itemFrame->installEventFilter(this);
|
|
connect(this->m_infoButton, &InfoButton::clicked, this, &VpnListItem::onInfoButtonClicked);
|
|
connect(m_menu, &QMenu::triggered, this, &VpnListItem::onMenuTriggered);
|
|
}
|
|
|
|
|
|
VpnListItem::VpnListItem(QWidget *parent) : ListItem(parent)
|
|
{
|
|
m_isActive = false;
|
|
m_netButton->setButtonIcon(QIcon::fromTheme("ukui-vpn-symbolic"));
|
|
setIcon(false);
|
|
const QString str=tr("Not connected");
|
|
m_nameLabel->setText(str);
|
|
this->m_infoButton->hide();
|
|
}
|
|
|
|
VpnListItem::~VpnListItem()
|
|
{
|
|
qDebug()<<"[LanPage] lan list item is deleted." << m_vpnConnectItem.m_connectName;
|
|
}
|
|
|
|
void VpnListItem::setIcon(bool isOn)
|
|
{
|
|
if (isOn) {
|
|
m_netButton->setActive(true); //设置图标显示不同颜色
|
|
} else {
|
|
m_netButton->setActive(false);
|
|
}
|
|
}
|
|
|
|
void VpnListItem::connectItemCopy(const KyConnectItem *vpnConnectItem)
|
|
{
|
|
if (vpnConnectItem) {
|
|
m_vpnConnectItem.m_connectName = vpnConnectItem->m_connectName;
|
|
m_vpnConnectItem.m_connectPath = vpnConnectItem->m_connectPath;
|
|
m_vpnConnectItem.m_connectState = vpnConnectItem->m_connectState;
|
|
m_vpnConnectItem.m_connectUuid = vpnConnectItem->m_connectUuid;
|
|
m_vpnConnectItem.m_ifaceName = vpnConnectItem->m_ifaceName;
|
|
m_vpnConnectItem.m_itemType = vpnConnectItem->m_itemType;
|
|
} else {
|
|
qDebug() << LOG_FLAG <<"the connect item is nullptr";
|
|
m_vpnConnectItem.m_connectName = "";
|
|
m_vpnConnectItem.m_connectPath = "";
|
|
m_vpnConnectItem.m_connectState = NetworkManager::ActiveConnection::State::Unknown;
|
|
m_vpnConnectItem.m_connectUuid = "";
|
|
m_vpnConnectItem.m_ifaceName = "";
|
|
m_vpnConnectItem.m_itemType = NetworkManager::ConnectionSettings::ConnectionType::Unknown;
|
|
}
|
|
}
|
|
|
|
void VpnListItem::activeConnection()
|
|
{
|
|
if (m_vpnConnectItem.m_connectUuid.isEmpty()) {
|
|
qDebug() << LOG_FLAG << "connect is empty, so can not connect or disconnect.";
|
|
return;
|
|
}
|
|
|
|
if (Deactivated == m_vpnConnectItem.m_connectState) {
|
|
//断开的连接,点击激活连接
|
|
m_connectOperation->activateVpnConnection(m_vpnConnectItem.m_connectUuid);
|
|
qDebug() << LOG_FLAG << "it will activate connection" << m_vpnConnectItem.m_connectName;
|
|
m_netButton->startLoading();
|
|
} else {
|
|
qDebug() << LOG_FLAG <<"the connection" << m_vpnConnectItem.m_connectName
|
|
<< "is not deactived, so it can not be operation.";
|
|
}
|
|
}
|
|
|
|
void VpnListItem::onNetButtonClicked()
|
|
{
|
|
if (m_vpnConnectItem.m_connectUuid.isEmpty()) {
|
|
qDebug() << LOG_FLAG << "connect is empty, so can not connect or disconnect.";
|
|
return;
|
|
}
|
|
|
|
if (Deactivated == m_vpnConnectItem.m_connectState) {
|
|
//断开的连接,点击激活连接
|
|
m_connectOperation->activateVpnConnection(m_vpnConnectItem.m_connectUuid);
|
|
qDebug() << LOG_FLAG << "it will activate connection" << m_vpnConnectItem.m_connectName;
|
|
m_netButton->startLoading();
|
|
} else {
|
|
qDebug() << LOG_FLAG <<"the connection" << m_vpnConnectItem.m_connectName
|
|
<< "is not deactived, so it can not be operation.";
|
|
}
|
|
}
|
|
|
|
void VpnListItem::onRightButtonClicked()
|
|
{
|
|
//右键点击事件
|
|
qDebug()<< LOG_FLAG <<"onRightButtonClicked";
|
|
if (!m_menu) {
|
|
return;
|
|
}
|
|
|
|
m_menu->clear();
|
|
if (Activated == m_vpnConnectItem.m_connectState || Activating == m_vpnConnectItem.m_connectState) {
|
|
m_menu->addAction(new QAction(tr("Disconnect"), this));
|
|
} else if (Deactivated == m_vpnConnectItem.m_connectState) {
|
|
m_menu->addAction(new QAction(tr("Connect"), this));
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
m_menu->move(cursor().pos());
|
|
m_menu->show();
|
|
}
|
|
|
|
void VpnListItem::onMenuTriggered(QAction *action)
|
|
{
|
|
if (action->text() == tr("Connect")) {
|
|
this->onNetButtonClicked();
|
|
} else if (action->text() == tr("Disconnect")) {
|
|
m_connectOperation->deactivateVpnConnection(m_vpnConnectItem.m_connectName, m_vpnConnectItem.m_connectUuid);
|
|
qDebug() << LOG_FLAG << "it will disconnect connection" << m_vpnConnectItem.m_connectName;
|
|
m_netButton->startLoading();
|
|
}
|
|
}
|
|
|
|
bool VpnListItem::launchApp(QString desktopFile)
|
|
{
|
|
QDBusInterface appManagerDbusInterface(KYLIN_APP_MANAGER_NAME,
|
|
KYLIN_APP_MANAGER_PATH,
|
|
KYLIN_APP_MANAGER_INTERFACE,
|
|
QDBusConnection::sessionBus());
|
|
|
|
if (!appManagerDbusInterface.isValid()) {
|
|
qWarning()<<"appManagerDbusInterface init error";
|
|
return false;
|
|
} else {
|
|
QDBusReply<bool> reply = appManagerDbusInterface.call("LaunchApp", desktopFile);
|
|
return reply;
|
|
}
|
|
}
|
|
|
|
void VpnListItem::runExternalApp() {
|
|
if (!launchApp("nm-connection-editor.desktop")){
|
|
QString cmd = "nm-connection-editor";
|
|
QProcess process(this);
|
|
process.startDetached(cmd);
|
|
}
|
|
}
|
|
|
|
void VpnListItem::onInfoButtonClicked()
|
|
{
|
|
#ifdef VPNDETAIL
|
|
if (m_vpnConnectItem.m_itemType != NetworkManager::ConnectionSettings::ConnectionType::Vpn) {
|
|
#else
|
|
if (true) {
|
|
#endif
|
|
runExternalApp();
|
|
return;
|
|
}
|
|
|
|
#ifdef VPNDETAIL
|
|
if(m_vpnDetail != nullptr){
|
|
m_vpnDetail->activateWindow();
|
|
return;
|
|
}
|
|
m_vpnDetail = new VpnDetail(m_vpnConnectItem.m_connectUuid, getConnectionName());
|
|
connect(m_vpnDetail, &VpnDetail::destroyed, [&](){
|
|
if (m_vpnDetail != nullptr) {
|
|
m_vpnDetail = nullptr;
|
|
}
|
|
});
|
|
|
|
m_vpnDetail->show();
|
|
m_vpnDetail->centerToScreen();
|
|
#endif
|
|
}
|
|
|
|
void VpnListItem::updateConnectionState(ConnectState state)
|
|
{
|
|
m_vpnConnectItem.m_connectState = (NetworkManager::ActiveConnection::State)state;
|
|
|
|
if (Deactivated == state || Activated == state) {
|
|
m_netButton->stopLoading();
|
|
if (state == Activated) {
|
|
setIcon(true);
|
|
} else {
|
|
setIcon(false);
|
|
}
|
|
} else {
|
|
m_netButton->startLoading();
|
|
}
|
|
}
|
|
|
|
QString VpnListItem::getConnectionName()
|
|
{
|
|
return m_vpnConnectItem.m_connectName;
|
|
}
|
|
|
|
void VpnListItem::updateConnectionName(QString connectionName)
|
|
{
|
|
m_vpnConnectItem.m_connectName = connectionName;
|
|
m_nameLabel->setText(m_vpnConnectItem.m_connectName);
|
|
}
|
|
|
|
QString VpnListItem::getConnectionPath()
|
|
{
|
|
return m_vpnConnectItem.m_connectPath;
|
|
}
|
|
|
|
void VpnListItem::updateConnectionPath(QString connectionPath)
|
|
{
|
|
m_vpnConnectItem.m_connectPath = connectionPath;
|
|
}
|