diff --git a/src/backend/DataCollectorAndUploader.cpp b/src/backend/DataCollectorAndUploader.cpp new file mode 100644 index 0000000..494f267 --- /dev/null +++ b/src/backend/DataCollectorAndUploader.cpp @@ -0,0 +1,85 @@ +#include "DataCollectorAndUploader.h" +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QStandardPaths> +#include <QNetworkReply> +#include <QJsonDocument> +#include <QJsonObject> +#include <QSettings> +#include <QProcess> +#include <QDebug> + +DataCollectorAndUploader::DataCollectorAndUploader(QObject *parent) : QObject(parent) +{ +} + +void DataCollectorAndUploader::collectAndUploadData() +{ + collectData(); +} + +void DataCollectorAndUploader::collectData() +{ + QString distributor_id; + QString release; + QString architecture; + + QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat); + QString version = config.value("build/version").toString(); + QString uuid = config.value("info/uuid").toString(); + + + // Execute lsb_release --all and capture the output + QProcess lsbProcess; + lsbProcess.start("lsb_release", QStringList() << "--all"); + lsbProcess.waitForFinished(); + QString lsbOutput = lsbProcess.readAllStandardOutput(); + + QStringList lines = lsbOutput.split('\n'); + for (const QString &line : lines) { + if (line.contains("Distributor ID:")) { + distributor_id = line.split(":").last().trimmed(); + } else if (line.contains("Release:")) { + release = line.split(":").last().trimmed(); + } + } + + // Execute uname -m to get the architecture + QProcess unameProcess; + unameProcess.start("uname", QStringList() << "-m"); + unameProcess.waitForFinished(); + architecture = unameProcess.readAllStandardOutput().trimmed(); + + // Create a JSON object + QJsonObject json; + json.insert("Distributor ID", distributor_id); + json.insert("Release", release); + json.insert("Architecture", architecture); + json.insert("Store_Version", version); + json.insert("UUID", uuid); + + + + // Convert to byte array + QJsonDocument doc(json); + QByteArray jsonData = doc.toJson(); + + // Initialize a network request + QNetworkAccessManager *manager = new QNetworkAccessManager(this); + QUrl url("http://zunyun01.store.deepinos.org.cn:12345"); + + QNetworkRequest request(url); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + // Send the POST request + QNetworkReply *reply = manager->post(request, jsonData); + + connect(reply, &QNetworkReply::finished, [=]() { + if (reply->error() == QNetworkReply::NoError) { + emit uploadSuccessful(); + } else { + emit uploadFailed(reply->errorString()); + } + reply->deleteLater(); + }); +} diff --git a/src/backend/DataCollectorAndUploader.h b/src/backend/DataCollectorAndUploader.h new file mode 100644 index 0000000..d251b3c --- /dev/null +++ b/src/backend/DataCollectorAndUploader.h @@ -0,0 +1,21 @@ +#ifndef DATACOLLECTORANDUPLOADER_H +#define DATACOLLECTORANDUPLOADER_H + +#include <QObject> + +class DataCollectorAndUploader : public QObject +{ + Q_OBJECT +public: + explicit DataCollectorAndUploader(QObject *parent = nullptr); + void collectAndUploadData(); + +signals: + void uploadSuccessful(); + void uploadFailed(QString errorString); + +private: + void collectData(); +}; + +#endif // DATACOLLECTORANDUPLOADER_H diff --git a/src/main.cpp b/src/main.cpp index 41fdd94..632ab4f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,8 @@ #include <QStandardPaths> #include <QSurfaceFormat> +#include <backend/DataCollectorAndUploader.h> + DCORE_USE_NAMESPACE DWIDGET_USE_NAMESPACE @@ -124,6 +126,17 @@ int main(int argc, char *argv[]) // 初始化 config.ini 配置文件 Utils::initConfig(); + // 回传版本信息,不涉及个人隐私 + DataCollectorAndUploader uploader; + QObject::connect(&uploader, &DataCollectorAndUploader::uploadSuccessful, [](){ + qDebug() << "Data uploaded successfully"; + }); + QObject::connect(&uploader, &DataCollectorAndUploader::uploadFailed, [](QString error){ + qDebug() << "Upload failed with error: " << error; + }); + + uploader.collectAndUploadData(); + // Set display backend Utils::setQPAPlatform(); diff --git a/src/spark-store.pro b/src/spark-store.pro index 724cb81..16dfc5d 100644 --- a/src/spark-store.pro +++ b/src/spark-store.pro @@ -34,6 +34,7 @@ CONFIG += c++11 link_pkgconfig PKGCONFIG += dtkcore dtkgui dtkwidget SOURCES += \ + backend/DataCollectorAndUploader.cpp \ backend/downloadworker.cpp \ backend/image_show.cpp \ backend/sparkapi.cpp \ @@ -58,6 +59,7 @@ SOURCES += \ mainwindow-dtk.cpp HEADERS += \ + backend/DataCollectorAndUploader.h \ backend/downloadworker.h \ backend/image_show.h \ backend/sparkapi.h \ diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index e502d8e..e4c7c34 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -8,6 +8,7 @@ #include <QSettings> #include <QStandardPaths> #include <QFile> +#include <QUuid> #include <QJsonDocument> #define UOSDeveloperModeFile "/var/lib/deepin/developer-mode/enabled" @@ -96,6 +97,11 @@ void Utils::initConfig() { config.setValue("runtime/useWayland", useWayland); } + + // check uuid + if (!config.contains("info/uuid")){ + config.setValue("info/uuid", initUUID()); + } config.sync(); // 写入更改至 config.ini,并同步最新内容 checkUOSDeveloperMode(); // Check UOS developer mode @@ -126,6 +132,14 @@ bool Utils::isUOS() return isUOS; } +/** + * @brief Utils::initUUID 生成 UUID +*/ +QString Utils::initUUID(){ + QUuid uuid = QUuid::createUuid(); + return uuid.toString(); +} + /** * @brief Utils::setQPAPlatform Set display backend */ diff --git a/src/utils/utils.h b/src/utils/utils.h index 154e9b8..4351c08 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -12,6 +12,7 @@ public: static bool isWayland(); static void initConfig(); static bool isUOS(); + static QString initUUID(); static void setQPAPlatform(); static void checkUOSDeveloperMode(); static QJsonObject parseFeatureJsonFile();