diff --git a/calendar-common/src/units.cpp b/calendar-common/src/units.cpp index 114f3bb4..8c1b4eae 100644 --- a/calendar-common/src/units.cpp +++ b/calendar-common/src/units.cpp @@ -3,10 +3,13 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "units.h" +#include +#include #include #include #include +#include QString dtToString(const QDateTime &dt) { @@ -58,6 +61,24 @@ QString getHomeConfigPath() return configPath; } +QDir getAppConfigDir() +{ + return QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); +} + +QDir getAppCacheDir() +{ + return QStandardPaths::writableLocation(QStandardPaths::CacheLocation); +} + +QSharedPointer DownloadFile(QString url, QString filename) +{ + auto process = QSharedPointer::create(); + process->setEnvironment({"LANGUAGE=en"}); + process->start("wget", { "-c", "-N", "-O", filename, url }); + return process; +} + bool withinTimeFrame(const QDate &date) { return date.isValid() && (date.year() >= 1900 && date.year() <=2100); diff --git a/calendar-common/src/units.h b/calendar-common/src/units.h index 87c5d28d..f2a5d17f 100644 --- a/calendar-common/src/units.h +++ b/calendar-common/src/units.h @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include const QString serviceBaseName = "com.deepin.dataserver.Calendar"; const QString serviceBasePath = "/com/deepin/dataserver/Calendar"; @@ -38,6 +41,9 @@ bool isChineseEnv(); //获取家配置目录 QString getHomeConfigPath(); +QDir getAppConfigDir(); +QDir getAppCacheDir(); +QSharedPointer DownloadFile(QString url, QString filename); //时间转换 QDateTime dtConvert(const QDateTime &datetime); diff --git a/calendar-service/src/calendarDataManager/daccountmanagemodule.cpp b/calendar-service/src/calendarDataManager/daccountmanagemodule.cpp index 719560cb..b3a945cc 100644 --- a/calendar-service/src/calendarDataManager/daccountmanagemodule.cpp +++ b/calendar-service/src/calendarDataManager/daccountmanagemodule.cpp @@ -19,7 +19,7 @@ DAccountManageModule::DAccountManageModule(QObject *parent) , m_syncFileManage(new SyncFileManage()) , m_accountManagerDB(new DAccountManagerDataBase) , m_reginFormatConfig(DTK_CORE_NAMESPACE::DConfig::createGeneric("org.deepin.region-format", QString(), this)) - , m_settings(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat) + , m_settings( getAppConfigDir().filePath( "config.ini"), QSettings::IniFormat) { if (m_reginFormatConfig->isValid()) { connect(m_reginFormatConfig, @@ -334,7 +334,7 @@ void DAccountManageModule::setUidSwitchStatus(const DAccount::Ptr &account) DCalendarGeneralSettings::Ptr DAccountManageModule::getGeneralSettings() { auto cg = m_accountManagerDB->getCalendarGeneralSettings(); - if(getFirstDayOfWeekSource()==DCalendarGeneralSettings::Source_System){ + if (getFirstDayOfWeekSource() == DCalendarGeneralSettings::Source_System) { bool ok; auto dayofWeek = Qt::DayOfWeek(m_reginFormatConfig->value(firstDayOfWeek_key).toInt(&ok)); if (ok) { @@ -343,7 +343,7 @@ DCalendarGeneralSettings::Ptr DAccountManageModule::getGeneralSettings() qWarning() << "Unable to get first day of week from control center config file"; } } - if(getTimeFormatTypeSource()==DCalendarGeneralSettings::Source_System){ + if (getTimeFormatTypeSource() == DCalendarGeneralSettings::Source_System) { auto shortTimeFormat = m_reginFormatConfig->value(shortTimeFormat_key).toString(); if (shortTimeFormat.isEmpty()) { qWarning() << "Unable to short time format from control center config file"; diff --git a/calendar-service/src/calendarDataManager/daccountmanagemodule.h b/calendar-service/src/calendarDataManager/daccountmanagemodule.h index 7a0dd51a..fb74d8f3 100644 --- a/calendar-service/src/calendarDataManager/daccountmanagemodule.h +++ b/calendar-service/src/calendarDataManager/daccountmanagemodule.h @@ -86,9 +86,9 @@ class DAccountManageModule : public QObject void updateUIdAccount(const DAccount::Ptr &oldAccount, const DAccount::Ptr &uidAccount); //获取设置开关状态 void setUidSwitchStatus(const DAccount::Ptr &account); - + // 获取通用配置 DCalendarGeneralSettings::Ptr getGeneralSettings(); - + // 保存通用配置 void setGeneralSettings(const DCalendarGeneralSettings::Ptr &cgSet); signals: diff --git a/calendar-service/src/dbmanager/dhuanglidatabase.cpp b/calendar-service/src/dbmanager/dhuanglidatabase.cpp index ff6ff0a9..7c1d18a4 100644 --- a/calendar-service/src/dbmanager/dhuanglidatabase.cpp +++ b/calendar-service/src/dbmanager/dhuanglidatabase.cpp @@ -5,6 +5,9 @@ #include "dhuanglidatabase.h" #include "commondef.h" +#include "units.h" +#include +#include #include #include @@ -12,12 +15,17 @@ #include #include #include +#include const QString HolidayDir = ":/holiday-cn"; +const QString HolidayUpdateURLPrefix ="https://cdn-nu-common.uniontech.com/deepin-calendar"; +const QString HolidayUpdateDateSetKey = "festivalUpdateDate"; DHuangLiDataBase::DHuangLiDataBase(QObject *parent) : DDataBase(parent) + , m_settings(getAppConfigDir().filePath("config.ini"), QSettings::IniFormat) { + qDebug()<< getAppConfigDir().filePath("config.ini"); QString huangliPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QString("dde-calendar/data/huangli.db"), QStandardPaths::LocateFile); @@ -25,6 +33,10 @@ DHuangLiDataBase::DHuangLiDataBase(QObject *parent) qCDebug(ServiceLogger) << "huangli database" << huangliPath; setConnectionName("HuangLi"); dbOpen(); + // 延迟一段时间后,从网络更新节假日 + QTimer::singleShot(QRandomGenerator::global()->bounded(1000, 9999), + this, + &DHuangLiDataBase::updateFestivalList); } // readJSON 会读取一个JSON文件,如果 cache 为 true,则会缓存对象,以供下次使用 @@ -46,13 +58,38 @@ QJsonDocument DHuangLiDataBase::readJSON(QString filename, bool cache) return readJSONCache.value(filename); } +void DHuangLiDataBase::updateFestivalList() +{ + auto now = QDateTime::currentDateTime(); + auto festivalUpdateDate = now.toString("yyyy-MM-dd"); + // 每天更新一次 + if (m_settings.value(HolidayUpdateDateSetKey, "") == festivalUpdateDate) { + return; + } + m_settings.setValue(HolidayUpdateDateSetKey, festivalUpdateDate); + // 获取今年和明年的节假日数据 + for (auto i = 0; i < 2; i++) { + auto year = now.date().year() + i; + auto filename = getAppCacheDir().filePath(QString("%1.json").arg(year)); + auto url = QString("%1/%2.json").arg(HolidayUpdateURLPrefix).arg(year); + auto process = DownloadFile(url, filename); + qCDebug(ServiceLogger) << "Download File" << url << filename; + connect(process.get(), &QProcess::readyReadStandardError, [process]() { + qCDebug(ServiceLogger) << "Download Error: " << process->readAllStandardError(); + }); + } +} + // queryFestivalList 查询指定月份的节假日列表 QJsonArray DHuangLiDataBase::queryFestivalList(quint32 year, quint8 month) { qCDebug(ServiceLogger) << "query festival list" << "year" << year << "month" << month; QJsonArray dataset; - auto filename = QString("%1/%2.json").arg(HolidayDir).arg(year); + auto filename = getAppCacheDir().filePath(QString("%1.json").arg(year)); + if (!QFile(filename).exists()) { + filename = QString("%1/%2.json").arg(HolidayDir).arg(year); + } qCDebug(ServiceLogger) << "festival file name" << filename; auto doc = readJSON(filename, true); for (auto val : doc.object().value("days").toArray()) { diff --git a/calendar-service/src/dbmanager/dhuanglidatabase.h b/calendar-service/src/dbmanager/dhuanglidatabase.h index fee7de4f..6ff466da 100644 --- a/calendar-service/src/dbmanager/dhuanglidatabase.h +++ b/calendar-service/src/dbmanager/dhuanglidatabase.h @@ -10,6 +10,7 @@ #include "lunarandfestival.h" #include #include +#include class DHuangLiDataBase : public DDataBase { @@ -23,6 +24,8 @@ class DHuangLiDataBase : public DDataBase private: QJsonDocument readJSON(QString filename, bool cache); QHash readJSONCache; + void updateFestivalList(); + QSettings m_settings; protected: //创建数据库 void createDB() override;