From 40d60180c2a1467cd5c2541d3004f570569ac7ed Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 12 Jun 2024 16:30:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=92=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dp4-login-plugin/dp4_login_module.cpp | 92 +++++++++++++++++++-------- dp4-login-plugin/dp4_login_module.h | 27 +++++--- dp4-login-plugin/dp4loginwidget.cpp | 43 +++++++------ dp4-login-plugin/dp4loginwidget.h | 15 +++-- dp4-login-plugin/login.json | 2 +- example/loginwidget.cpp | 3 +- example/loginwidget.h | 4 +- 7 files changed, 121 insertions(+), 65 deletions(-) diff --git a/dp4-login-plugin/dp4_login_module.cpp b/dp4-login-plugin/dp4_login_module.cpp index 6f0d4ff..0302ba7 100644 --- a/dp4-login-plugin/dp4_login_module.cpp +++ b/dp4-login-plugin/dp4_login_module.cpp @@ -9,11 +9,15 @@ namespace dss { -namespace module +namespace module_v2 { Dp4LoginModule::Dp4LoginModule(QObject *parent) : QObject(parent) + , m_loginWidget(nullptr) + , m_appData(nullptr) + , m_callback(nullptr) + , m_msgCallback(nullptr) { setObjectName(QStringLiteral("Dp4LoginModule")); installTranslator(); @@ -21,17 +25,51 @@ Dp4LoginModule::Dp4LoginModule(QObject *parent) Dp4LoginModule::~Dp4LoginModule() { + if (m_loginWidget) { + m_loginWidget->deleteLater(); + } } void Dp4LoginModule::init() { + if (m_loginWidget) { + m_loginWidget->reset(); + return; + } + + m_loginWidget = new Dp4LoginWidget; + m_loginWidget->reset(); + connect(m_loginWidget, &Dp4LoginWidget::requestSendAuthen, this, [ this ](const QString &account, const QString &token) { + // 发送认证的信息 + if (m_callback && m_appData) { + AuthCallbackData data; + data.account = account; + data.token = token; + data.result = 1; + m_callback(&data, &m_appData); + } + }); +} + +void Dp4LoginModule::setAppData(AppDataPtr appData) +{ + m_appData = appData; +} + +void Dp4LoginModule::setAuthCallback(AuthCallbackFun callback) +{ + m_callback = callback; +} + +void Dp4LoginModule::setMessageCallback(MessageCallbackFunc msgCallback) +{ + m_msgCallback = msgCallback; } QWidget *Dp4LoginModule::content() { // 此处返回窗体必须从此处创建,因为该插件是在子线程中加载,而窗体需要在主线程中显示,因此此处第一次获取的时候再返回它的窗体即可 - static Dp4LoginWidget dp4Widget; - return &dp4Widget; + return m_loginWidget; } void Dp4LoginModule::reset() @@ -52,19 +90,13 @@ void Dp4LoginModule::installTranslator() QApplication::installTranslator(&translator); } -void Dp4LoginModule::setCallback(LoginCallBack *callback) -{ - Dp4LoginWidget *loginWidget = static_cast(content()); - loginWidget->setCallback(callback); -} - -std::string Dp4LoginModule::onMessage(const std::string &message) +QString Dp4LoginModule::message(const QString &message) { qInfo() << Q_FUNC_INFO; QJsonParseError jsonParseError; - const QJsonDocument messageDoc = QJsonDocument::fromJson(QByteArray::fromStdString(message), &jsonParseError); + const QJsonDocument messageDoc = QJsonDocument::fromJson(message.toLatin1(), &jsonParseError); if (jsonParseError.error != QJsonParseError::NoError || messageDoc.isEmpty()) { - qWarning() << Q_FUNC_INFO << "Failed to obtain message from shell!: " << QString::fromStdString(message); + qWarning() << Q_FUNC_INFO << "Failed to obtain message from shell!: " << message; return ""; } @@ -77,12 +109,13 @@ std::string Dp4LoginModule::onMessage(const std::string &message) QJsonObject data = msgObj.value("Data").toObject(); qInfo() << "Cmd type: " << cmdType; if (cmdType == "CurrentUserChanged") { - QJsonObject data = msgObj.value("Data").toObject(); - QString userName = data.value("Name").toString(); - QString fullName = data.value("Fullname").toString(); - QString avatar = data.value("Avatar").toString(); - Dp4LoginWidget *loginWidget = static_cast(content()); - loginWidget->setCurrentAccount(userName, fullName, avatar); + if (m_loginWidget) { + QJsonObject data = msgObj.value("Data").toObject(); + QString userName = data.value("Name").toString(); + QString fullName = data.value("Fullname").toString(); + QString avatar = data.value("Avatar").toString(); + m_loginWidget->setCurrentAccount(userName, fullName, avatar); + } } else if (cmdType == "GetConfigs") { QJsonObject retDataObj; retDataObj["ShowAvatar"] = false; @@ -90,22 +123,27 @@ std::string Dp4LoginModule::onMessage(const std::string &message) retDataObj["ShowSwitchButton"] = false; retDataObj["ShowLockButton"] = false; retDataObj["DefaultAuthLevel"] = DefaultAuthLevel::StrongDefault; - retDataObj["showBackGroundColor"] = false; + retDataObj["DisableOtherAuthentications"] = true; + retDataObj["ShowBackGroundColor"] = false; + retDataObj["SwitchUserWhenCheckAccount"] = false; retDataObj["AuthType"] = AuthType::AT_Custom; - retDataObj["width"] = content()->width(); - retDataObj["height"] = content()->height(); retObj["Data"] = retDataObj; } else if (cmdType == "StartAuth") { } else if (cmdType == "AuthState") { // 认证类型 - Dp4LoginWidget *loginWidget = static_cast(content()); - loginWidget->updateAuthenResult(data.value("AuthType").toInt(), data.value("AuthState").toInt()); + int authType = data.value("AuthType").toInt(); + int authState = data.value("AuthState").toInt(); + if (authType == AuthType::AT_All && authState == AuthState::AS_Success) { + init(); + } else if (m_loginWidget) { + m_loginWidget->updateAuthenResult(authType, authState); + } } else if (cmdType == "LimitsInfo") { - } else if (cmdType == "message") { + } else if (cmdType == "AccountError") { // 验证后接收到了错误的消息 - Dp4LoginWidget *loginWidget = static_cast(content()); - loginWidget->setMessage(data.value("type").toString(), data.value("message").toString()); + if (m_loginWidget) + m_loginWidget->setAccountError(); } else if (cmdType == "GetAuthenInfo") { QJsonObject retDataObj; // 是否需要调用外部的登录方式 @@ -120,7 +158,7 @@ std::string Dp4LoginModule::onMessage(const std::string &message) QJsonDocument doc; doc.setObject(retObj); - return doc.toJson().toStdString(); + return doc.toJson(); } } diff --git a/dp4-login-plugin/dp4_login_module.h b/dp4-login-plugin/dp4_login_module.h index 9d5a9a6..7aa9520 100644 --- a/dp4-login-plugin/dp4_login_module.h +++ b/dp4-login-plugin/dp4_login_module.h @@ -5,20 +5,20 @@ #ifndef DP4LOGINMODULE_H #define DP4LOGINMODULE_H -#include "login_module_interface.h" +#include "login_module_interface_v2.h" class Dp4LoginWidget; namespace dss { -namespace module +namespace module_v2 { -class Dp4LoginModule: public QObject, public LoginModuleInterface +class Dp4LoginModule: public QObject, public LoginModuleInterfaceV2 { Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.shell.Modules.Login" FILE "login.json") - Q_INTERFACES(dss::module::LoginModuleInterface) + Q_PLUGIN_METADATA(IID "com.deepin.dde.shell.Modules_v2.Login" FILE "login.json") + Q_INTERFACES(dss::module_v2::LoginModuleInterfaceV2) public: explicit Dp4LoginModule(QObject *parent = nullptr); @@ -26,16 +26,27 @@ public: void init() override; ModuleType type() const override - { return CustomLoginType; } + { return LoginType; } inline QString key() const override { return "dp4-login"; } + + void setAppData(AppDataPtr appData) override; + void setAuthCallback(AuthCallbackFun callback) override; + void setMessageCallback(MessageCallbackFunc msgCallback) override; + QWidget *content() override; - void setCallback(LoginCallBack *callback) override; - std::string onMessage(const std::string &) override; + //void setCallback(LoginCallBack *callback) override; + QString message(const QString &) override; void reset() override; private: void installTranslator(); + +private: + Dp4LoginWidget *m_loginWidget; + AppDataPtr m_appData; + AuthCallbackFun m_callback; + MessageCallbackFunc m_msgCallback; }; } diff --git a/dp4-login-plugin/dp4loginwidget.cpp b/dp4-login-plugin/dp4loginwidget.cpp index 3c3a65e..0a3726a 100644 --- a/dp4-login-plugin/dp4loginwidget.cpp +++ b/dp4-login-plugin/dp4loginwidget.cpp @@ -25,8 +25,6 @@ Dp4LoginWidget::Dp4LoginWidget(QWidget *parent) , m_username(nullptr) , m_password(nullptr) , m_pbForgetPassword(nullptr) - , m_callback(nullptr) - , m_callbackData(new dss::module::AuthCallbackData) { initUi(); } @@ -35,11 +33,6 @@ Dp4LoginWidget::~Dp4LoginWidget() { } -void Dp4LoginWidget::setCallback(dss::module::LoginCallBack *callback) -{ - m_callback = callback; -} - void Dp4LoginWidget::updateAuthenResult(int type, int state) { Q_UNUSED(type); @@ -63,13 +56,12 @@ void Dp4LoginWidget::updateAuthenResult(int type, int state) } } -void Dp4LoginWidget::setMessage(const QString &type, const QString &message) +void Dp4LoginWidget::setAccountError() { // 接收界面发送的消息 - if (type == QString("account_error")) { - // TODO 如果是账户错误,就在界面上体现出来,此处暂时使用消息框代替,具体怎么做由开发人员自己定义 - QMessageBox(QMessageBox::Critical, tr("Logon"), message).exec(); - } + // TODO 如果是账户错误,就在界面上体现出来,此处暂时使用消息框代替,具体怎么做由开发人员自己定义 + m_username->setFocus(); + QMessageBox(QMessageBox::Critical, tr("Logon"), tr("account error")).exec(); } void Dp4LoginWidget::setCurrentAccount(const QString &accountName, const QString &fullname, const QString &avatar) @@ -81,25 +73,34 @@ void Dp4LoginWidget::setCurrentAccount(const QString &accountName, const QString qDebug() << "accountName" << accountName << fullname << avatar; } +void Dp4LoginWidget::reset() +{ + m_username->clear(); + m_password->clear(); +} + void Dp4LoginWidget::Logon() { + const QString userName = m_username->text().trimmed(); + if (userName.isEmpty()) { + m_username->setFocus(); + return; + } + const QString token = m_password->text(); + if (token.isEmpty()) { + m_password->setFocus(); + return; + } // TODO: 这里由开发人员自行添加dp的验证流程,如果在dde-session-shell验证之前,请在这里写验证流程, // 如果在dde-session-shell,请在后面写(由开发人员根据实际情况来决定) // 这里将用户名和密码传给dde-session-shell,由dde-session-shell来处理DA的验证, - if (m_callback) - { - m_callbackData->account = m_username->text().trimmed().toStdString(); - m_callbackData->token = m_password->text().trimmed().toStdString(); - m_callback->authCallbackFun(m_callbackData, m_callback->app_data); - } - //QMessageBox(QMessageBox::Information, tr("Logon"), tr("Environment:") + m_environment->currentText() + "\n" + tr("Username:") + m_username->text() + "\nPassword:" + m_password->text()).exec(); + requestSendAuthen(userName, token); } void Dp4LoginWidget::ResetPassword() { - QMessageBox(QMessageBox::Information,tr("Forget Password"),tr("Forget Password")).exec(); - // QMessageBox(QMessageBox::Information,QIcon::themeName(),QIcon::themeSearchPaths().join("\n")).exec(); + QMessageBox(QMessageBox::Information,QIcon::themeName(),QIcon::themeSearchPaths().join("\n")).exec(); } void Dp4LoginWidget::initUi() diff --git a/dp4-login-plugin/dp4loginwidget.h b/dp4-login-plugin/dp4loginwidget.h index 58263bb..81a282f 100644 --- a/dp4-login-plugin/dp4loginwidget.h +++ b/dp4-login-plugin/dp4loginwidget.h @@ -1,10 +1,12 @@ #ifndef DP4LOGINWIDGET_H #define DP4LOGINWIDGET_H +#include "login_module_interface_v2.h" + #include namespace dss { -namespace module { +namespace module_v2 { struct AuthCallbackData; struct LoginCallBack; struct AuthCallbackData; @@ -18,11 +20,16 @@ class Dp4LoginWidget : public QWidget public: explicit Dp4LoginWidget(QWidget *parent = nullptr); ~Dp4LoginWidget() override; - void setCallback(dss::module::LoginCallBack *callback); + void updateAuthenResult(int type, int state); - void setMessage(const QString &type, const QString &message); + void setAccountError(); void setCurrentAccount(const QString &accountName, const QString &fullname, const QString &avatar); + void reset(); + +signals: + void requestSendAuthen(const QString &account, const QString &token); + private: void Logon(); void ResetPassword(); @@ -39,8 +46,6 @@ private: class QLineEdit *m_username; class QLineEdit *m_password; class QPushButton *m_pbForgetPassword; - struct dss::module::LoginCallBack *m_callback; - struct dss::module::AuthCallbackData *m_callbackData; }; #endif // TESTWIDGET_H diff --git a/dp4-login-plugin/login.json b/dp4-login-plugin/login.json index d7d25a6..3806126 100644 --- a/dp4-login-plugin/login.json +++ b/dp4-login-plugin/login.json @@ -1,4 +1,4 @@ { - "api": "1.2.0", + "api": "2.0.0", "pluginType": "Login" } \ No newline at end of file diff --git a/example/loginwidget.cpp b/example/loginwidget.cpp index e581971..aae56e3 100644 --- a/example/loginwidget.cpp +++ b/example/loginwidget.cpp @@ -5,8 +5,9 @@ LoginWidget::LoginWidget(QWidget *parent) : QWidget (parent) - , m_dp4module(new dss::module::Dp4LoginModule(this)) + , m_dp4module(new dss::module_v2::Dp4LoginModule(this)) { + m_dp4module->init(); QHBoxLayout *layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); diff --git a/example/loginwidget.h b/example/loginwidget.h index 1a1c3b9..cea4e64 100644 --- a/example/loginwidget.h +++ b/example/loginwidget.h @@ -4,7 +4,7 @@ #include namespace dss { -namespace module { +namespace module_v2 { class Dp4LoginModule; } } @@ -18,7 +18,7 @@ public: ~LoginWidget(); private: - dss::module::Dp4LoginModule *m_dp4module; + dss::module_v2::Dp4LoginModule *m_dp4module; }; #endif