33// SPDX-License-Identifier: LGPL-3.0-or-later
44
55#include " networkinitialization.h"
6+
67#include " settingconfig.h"
78#include " systemservice.h"
89
10+ #include < NetworkManagerQt/Ipv4Setting>
11+ #include < NetworkManagerQt/Manager>
12+ #include < NetworkManagerQt/Settings>
13+ #include < NetworkManagerQt/WiredDevice>
14+ #include < NetworkManagerQt/WiredSetting>
15+ #include < NetworkManagerQt/WirelessDevice>
16+
917#include < DSysInfo>
1018
1119#include < QCoreApplication>
12- #include < QEventLoop>
1320#include < QDBusConnection>
1421#include < QDBusConnectionInterface>
22+ #include < QDBusInterface>
1523#include < QDBusServiceWatcher>
16- #include < QTimer >
17- #include < QMutex >
24+ #include < QEventLoop >
25+ #include < QFile >
1826#include < QJsonDocument>
19- #include < QJsonParseError>
2027#include < QJsonObject>
28+ #include < QJsonParseError>
29+ #include < QMutex>
30+ #include < QTextStream>
31+ #include < QTimer>
2132#include < QTranslator>
22- #include < QDBusInterface>
23-
24- #include < NetworkManagerQt/WiredDevice>
25- #include < NetworkManagerQt/WirelessDevice>
26- #include < NetworkManagerQt/Manager>
27- #include < NetworkManagerQt/Settings>
28- #include < NetworkManagerQt/WiredSetting>
29- #include < NetworkManagerQt/Ipv4Setting>
3033
3134using namespace network ::systemservice;
3235
@@ -35,17 +38,17 @@ using namespace network::systemservice;
3538
3639#define NETWORKMANAGER_SERVICE " org.freedesktop.NetworkManager"
3740
38- #define LOCKERVICE " com .deepin.dde.LockService "
39- #define LOCKPATH " /com /deepin/dde/LockService "
40- #define LOCKINTERFACE " com .deepin.dde.LockService "
41+ #define LOCKSERVICE " org .deepin.dde.LockService1 "
42+ #define LOCKPATH " /org /deepin/dde/LockService1 "
43+ #define LOCKINTERFACE " org .deepin.dde.LockService1 "
4144
42- #define DEAMONACCOUNTSERVICE " com .deepin.daemon.Accounts "
43- #define DEAMONACCOUNTPATH " /com /deepin/daemon/Accounts "
44- #define DEAMONACCOUNTINTERFACE " com .deepin.daemon.Accounts "
45+ #define DAEMONACCOUNTSERVICE " org .deepin.dde.Accounts1 "
46+ #define DAEMONACCOUNTPATH " /org /deepin/dde/Accounts1 "
47+ #define DAEMONACCOUNTINTERFACE " org .deepin.dde.Accounts1 "
4548
4649NetworkInitialization::NetworkInitialization (QObject *parent)
4750 : QObject(parent)
48- , m_initilized (false )
51+ , m_initialized (false )
4952 , m_accountServiceRegister(false )
5053 , m_hasAddFirstConnection(false )
5154{
@@ -56,9 +59,9 @@ NetworkInitialization::NetworkInitialization(QObject *parent)
5659void NetworkInitialization::updateLanguage (const QString &locale)
5760{
5861 qWarning (DSM) << " update local language" << locale;
59- installLaunguage (locale);
60- m_initilized = true ;
61- updateConnectionLaunguage ();
62+ installLanguage (locale);
63+ m_initialized = true ;
64+ updateConnectionLanguage ();
6265}
6366
6467void NetworkInitialization::initDeviceInfo ()
@@ -78,31 +81,31 @@ void NetworkInitialization::initDeviceInfo()
7881
7982void NetworkInitialization::initConnection ()
8083{
81- QDBusMessage lock = QDBusMessage::createMethodCall (LOCKERVICE , LOCKPATH, LOCKINTERFACE, " CurrentUser" );
84+ QDBusMessage lock = QDBusMessage::createMethodCall (LOCKSERVICE , LOCKPATH, LOCKINTERFACE, " CurrentUser" );
8285 QDBusConnection::systemBus ().callWithCallback (lock, this , SLOT (onUserChanged (QString)));
83- QDBusConnection::systemBus ().connect (LOCKERVICE , LOCKPATH, LOCKINTERFACE, " UserChanged" , this , SLOT (onUserChanged (QString)));
84- QDBusConnection::systemBus ().connect (DEAMONACCOUNTSERVICE, DEAMONACCOUNTPATH, DEAMONACCOUNTINTERFACE , " UserAdded" , this , SLOT (onUserAdded (QString)));
86+ QDBusConnection::systemBus ().connect (LOCKSERVICE , LOCKPATH, LOCKINTERFACE, " UserChanged" , this , SLOT (onUserChanged (QString)));
87+ QDBusConnection::systemBus ().connect (DAEMONACCOUNTSERVICE, DAEMONACCOUNTPATH, DAEMONACCOUNTINTERFACE , " UserAdded" , this , SLOT (onUserAdded (QString)));
8588
86- m_accountServiceRegister = QDBusConnection::systemBus ().interface ()->isServiceRegistered (DEAMONACCOUNTINTERFACE );
89+ m_accountServiceRegister = QDBusConnection::systemBus ().interface ()->isServiceRegistered (DAEMONACCOUNTINTERFACE );
8790 if (!m_accountServiceRegister) {
8891 // 如果服务未启动,则等待服务启动
8992 QDBusServiceWatcher *serviceWatcher = new QDBusServiceWatcher (this );
9093 serviceWatcher->setConnection (QDBusConnection::systemBus ());
9194 qCWarning (DSM) << m_accountServiceRegister << " service is not register" ;
92- serviceWatcher->addWatchedService (DEAMONACCOUNTINTERFACE );
95+ serviceWatcher->addWatchedService (DAEMONACCOUNTINTERFACE );
9396 connect (serviceWatcher, &QDBusServiceWatcher::serviceRegistered, this , [ this ](const QString &service) {
94- if (service != DEAMONACCOUNTSERVICE )
97+ if (service != DAEMONACCOUNTSERVICE )
9598 return ;
9699
97- qCDebug (DSM) << service << " register, initilized" << m_initilized ;
100+ qCDebug (DSM) << service << " register, initilized" << m_initialized ;
98101 m_accountServiceRegister = true ;
99102
100103 // 如果需要初始化设备,则初始化设备
101104 checkAccountStatus ();
102- if (m_initilized ) {
105+ if (m_initialized ) {
103106 addFirstConnection ();
104107 }
105- updateConnectionLaunguage ();
108+ updateConnectionLanguage ();
106109 });
107110 }
108111 // 等待3秒过后再执行一次创建的动作,正常情况下,在500毫秒内系统肯定会发送当前账户变化的信号,
@@ -111,12 +114,7 @@ void NetworkInitialization::initConnection()
111114 // 3秒过后直接调用addFirstConnection函数,在这个函数中,如果连接已经创建了,就不再创建
112115 // 如果没有创建过连接,那么就执行创建的操作
113116 // 调用checkAccountStatus检查当前用户状态并安装当前用户的语言
114- qCDebug (DSM) << " check connection status" ;
115- checkAccountStatus ();
116- if (!m_initilized)
117- qCWarning (DSM) << " can not found current user, used default lauguage to create connection" ;
118- // 不管语言有没有安装上,直接添加新连接,如果语言没有安装上,这个时候肯定不会有当前用户的语言了,此时安装就安装默认的英文
119- // 如果语言安装上了,此时就使用已经安装的语言来新建连接
117+ ensureTranslatorInstalled ();
120118 addFirstConnection ();
121119 });
122120}
@@ -145,7 +143,8 @@ void NetworkInitialization::addFirstConnection(NetworkManager::WiredDevice *devi
145143{
146144 if (!device)
147145 return ;
148-
146+ // 还没安装语言场景,信号变化触发创建连接。回退读取系统配置文件获取语言
147+ ensureTranslatorInstalled ();
149148 // 如果设备不被管理,而且被down掉,或者没有插入网线的情况下,是无需创建连接的
150149 qCDebug (DSM) << " device:" << device->interfaceName () << " managed:" << device->managed ()
151150 << " interfaceFlags:" << device->interfaceFlags () << " carrier:" << device->carrier ();
@@ -194,7 +193,7 @@ void NetworkInitialization::addFirstConnection(NetworkManager::WiredDevice *devi
194193 QDBusPendingReply<QDBusObjectPath> reply = NetworkManager::addConnection (conn->toMap ());
195194 reply.waitForFinished ();
196195 qDebug () << " device" << device->interfaceName () << " create connection success,count:" << device->availableConnections ().size ();
197- if (!m_initilized && matchName.first >= 0 ) {
196+ if (!m_initialized && matchName.first >= 0 ) {
198197 qCDebug (DSM) << " can't found user, add " << matchName.second << conn->uuid () << " to cache" ;
199198 m_untranslactionConnections[conn->uuid ()] = matchName.first ;
200199 }
@@ -314,7 +313,7 @@ QVariant NetworkInitialization::accountInterface(const QString &path, const QStr
314313
315314bool NetworkInitialization::installUserTranslator (const QString &json)
316315{
317- if (m_initilized ) {
316+ if (m_initialized ) {
318317 qCDebug (DSM) << " environment is initialized" ;
319318 return true ;
320319 }
@@ -358,20 +357,71 @@ bool NetworkInitialization::installUserTranslator(const QString &json)
358357
359358 if (localTmp != locale) {
360359 localTmp = locale;
361- installLaunguage (locale);
360+ installLanguage (locale);
362361 }
363362
364363 return true ;
365364}
366365
367- void NetworkInitialization::installLaunguage (const QString &locale)
366+ void NetworkInitialization::installLanguage (const QString &locale)
368367{
369368 static QTranslator translator;
370369 QCoreApplication::removeTranslator (&translator);
371370 const QString qmFile = QString (" %1/network-service-plugin_%2.qm" ).arg (QM_FILES_DIR).arg (locale);
372- translator.load (qmFile);
373- QCoreApplication::installTranslator (&translator);
374- qCDebug (DSM) << " install translation file" << qmFile;
371+ if (translator.load (qmFile)) {
372+ QCoreApplication::installTranslator (&translator);
373+ qCDebug (DSM) << " install translation file" << qmFile;
374+ }
375+ }
376+
377+ static QString getLocaleValue (const QString &filePath, const QStringList &keys, const QString &splitKey = " =" , const QString &keywords = QString())
378+ {
379+ QFile file (filePath);
380+ if (!file.open (QFile::ReadOnly | QFile::Text)) {
381+ qCWarning (DSM) << " Failed to open locale file:" << filePath << " -" << file.errorString ();
382+ return QString ();
383+ }
384+
385+ QMap<QString, QString> localeMap;
386+ QTextStream in (&file);
387+ while (!in.atEnd ()) {
388+ QString line = in.readLine ();
389+ if (!keywords.isEmpty () && !line.contains (keywords))
390+ continue ;
391+ QStringList pair = line.split (splitKey, Qt::SkipEmptyParts);
392+ if (pair.size () == 2 )
393+ localeMap.insert (pair.at (0 ).trimmed (), pair.at (1 ).trimmed ());
394+ }
395+ for (const auto &key : keys) {
396+ if (localeMap.contains (key))
397+ return localeMap.value (key).section (' .' , 0 , 0 );
398+ }
399+ return QString ();
400+ }
401+
402+ bool NetworkInitialization::installSystemTranslator ()
403+ {
404+ QString locale = getLocaleValue (" /etc/locale.conf" , { " LANGUAGE" , " LANG" }, " =" , " LANG" );
405+ if (locale.isEmpty ())
406+ locale = getLocaleValue (" /etc/deepin-installer/deepin-installer.conf" , { " DI_LOCALE" , " LIVE_LOCALES" }, " =" , " LOCALE" );
407+ if (!locale.isEmpty ()) {
408+ qCInfo (DSM) << " Install system language:" << locale;
409+ installLanguage (locale);
410+ return true ;
411+ }
412+ return false ;
413+ }
414+
415+ void NetworkInitialization::ensureTranslatorInstalled ()
416+ {
417+ if (!m_initialized) {
418+ qCDebug (DSM) << " check connection status" ;
419+ checkAccountStatus ();
420+ if (!m_initialized) {
421+ qCWarning (DSM) << " can not found current user, used default language to create connection" ;
422+ m_initialized = installSystemTranslator ();
423+ }
424+ }
375425}
376426
377427void NetworkInitialization::hideWirelessDevice (const QSharedPointer<NetworkManager::Device> &device, bool disableNetwork)
@@ -408,30 +458,30 @@ void NetworkInitialization::initDeviceConnection(const QSharedPointer<NetworkMan
408458
409459void NetworkInitialization::checkAccountStatus ()
410460{
411- QDBusInterface dbusInter (LOCKERVICE , LOCKPATH, LOCKINTERFACE, QDBusConnection::systemBus ());
461+ QDBusInterface dbusInter (LOCKSERVICE , LOCKPATH, LOCKINTERFACE, QDBusConnection::systemBus ());
412462 QDBusPendingCall reply = dbusInter.asyncCall (" CurrentUser" );
413463 reply.waitForFinished ();
414464 QDBusPendingReply<QString> replyResult = reply.reply ();
415- m_initilized = installUserTranslator (replyResult.value ());
465+ m_initialized = installUserTranslator (replyResult.value ());
416466}
417467
418- void NetworkInitialization::updateConnectionLaunguage (const QString &accountPath)
468+ void NetworkInitialization::updateConnectionLanguage (const QString &accountPath)
419469{
420470 QVariant localeVariant = accountInterface (accountPath, " Locale" );
421471 QString locale = localeVariant.toString ().split (" ." ).first ();
422- installLaunguage (locale);
423- m_initilized = true ;
472+ installLanguage (locale);
473+ m_initialized = true ;
424474
425475 if (m_untranslactionConnections.isEmpty ()) {
426476 qDebug () << " can't found untranslation connections" ;
427477 return ;
428478 }
429479 qDebug () << " update connection launguage" ;
430480
431- updateConnectionLaunguage ();
481+ updateConnectionLanguage ();
432482}
433483
434- void NetworkInitialization::updateConnectionLaunguage ()
484+ void NetworkInitialization::updateConnectionLanguage ()
435485{
436486 qCWarning (DSM) << " cache connection count" << m_untranslactionConnections.size ();
437487 for (auto it = m_untranslactionConnections.begin (); it != m_untranslactionConnections.end (); it++) {
@@ -471,10 +521,10 @@ void NetworkInitialization::onInitDeviceConnection()
471521 wirelessDevices << device.staticCast <NetworkManager::WirelessDevice>();
472522 } else if (device->type () == NetworkManager::Device::Type::Ethernet) {
473523 checkAccountStatus ();
474- qCDebug (DSM) << " Wired device" << device->interfaceName () << " initilized" << m_initilized << " ,add first connection" ;
524+ qCDebug (DSM) << " Wired device" << device->interfaceName () << " initilized" << m_initialized << " ,add first connection" ;
475525 NetworkManager::WiredDevice::Ptr wiredDevice = device.staticCast <NetworkManager::WiredDevice>();
476526 initDeviceConnection (wiredDevice);
477- if (m_initilized ) {
527+ if (m_initialized ) {
478528 addFirstConnection (wiredDevice.data ());
479529 }
480530 }
@@ -512,10 +562,10 @@ void NetworkInitialization::onDeviceAdded(const QString &uni)
512562 break ;
513563 case NetworkManager::Device::Type::Ethernet: {
514564 checkAccountStatus ();
515- qCDebug (DSM) << " new Wired device" << device->interfaceName () << " initilized" << m_initilized << " ,add first connection" ;
565+ qCDebug (DSM) << " new Wired device" << device->interfaceName () << " initilized" << m_initialized << " ,add first connection" ;
516566 NetworkManager::WiredDevice::Ptr wiredDevice = device.staticCast <NetworkManager::WiredDevice>();
517567 initDeviceConnection (wiredDevice);
518- if (m_initilized ) {
568+ if (m_initialized ) {
519569 addFirstConnection (wiredDevice.data ());
520570 }
521571 break ;
@@ -533,28 +583,28 @@ void NetworkInitialization::onAvailableConnectionDisappeared(const QString &conn
533583
534584void NetworkInitialization::onUserChanged (const QString &json)
535585{
536- qCDebug (DSM) << " onUserChanged:" << json << " initilized =" << m_initilized ;
537- m_initilized = installUserTranslator (json);
586+ qCDebug (DSM) << " onUserChanged:" << json << " initilized =" << m_initialized ;
587+ m_initialized = installUserTranslator (json);
538588
539- if (!m_initilized )
589+ if (!m_initialized )
540590 return ;
541591
542592 addFirstConnection ();
543593}
544594
545595void NetworkInitialization::onUserAdded (const QString &user)
546596{
547- qCDebug (DSM) << " onUserAdded:" << user << " initilized =" << m_initilized ;
548- updateConnectionLaunguage (user);
597+ qCDebug (DSM) << " onUserAdded:" << user << " initilized =" << m_initialized ;
598+ updateConnectionLanguage (user);
549599 if (m_hasAddFirstConnection) {
550600 qDebug () << " has add connection" ;
551601 return ;
552602 }
553603
554604 // 取第一个用户的locale
555- m_initilized = installUserTranslator (user);
605+ m_initialized = installUserTranslator (user);
556606
557- if (!m_initilized )
607+ if (!m_initialized )
558608 return ;
559609
560610 addFirstConnection ();
0 commit comments