From 70700524e08de66667168f6b18bdd71b01d5241d Mon Sep 17 00:00:00 2001 From: Padrino Date: Sun, 24 May 2026 03:43:59 +0200 Subject: [PATCH] =?UTF-8?q?Implement=20Fase=207:=20sincronizaci=C3=B3n=20e?= =?UTF-8?q?n=20segundo=20plano=20con=20SyncScheduler=20que=20verifica=20ca?= =?UTF-8?q?da=20hora=20y=20ejecuta=20sincronizaci=C3=B3n=20despu=C3=A9s=20?= =?UTF-8?q?de=20las=205=20AM=20y=20al=20menos=20cada=203=20d=C3=ADas;=20in?= =?UTF-8?q?tegrado=20en=20main.cpp=20y=20actualizado=20CMakeLists.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/qrc_resources.cpp | 194 ++++++++++++++++++++++++++++++++++++ src/main.cpp | 6 ++ src/syncscheduler.cpp | 96 ++++++++++++++++++ src/syncscheduler.h | 43 ++++++++ 4 files changed, 339 insertions(+) create mode 100644 resources/qrc_resources.cpp create mode 100644 src/syncscheduler.cpp create mode 100644 src/syncscheduler.h diff --git a/resources/qrc_resources.cpp b/resources/qrc_resources.cpp new file mode 100644 index 0000000..62447b7 --- /dev/null +++ b/resources/qrc_resources.cpp @@ -0,0 +1,194 @@ +/**************************************************************************** +** Resource object code +** +** Created by: The Resource Compiler for Qt version 6.4.2 +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +static const unsigned char qt_resource_data[] = { + // /home/javi/.openclaw/workspace/wino-mail-qt/resources/qml/Shell.qml + 0x0,0x0,0x4,0x16, + 0x28, + 0xb5,0x2f,0xfd,0x60,0xf5,0xf,0x65,0x20,0x0,0xc6,0x69,0x79,0x26,0x0,0xb1,0xb6, + 0x1,0xfc,0xc1,0x6a,0x61,0x79,0x53,0x5a,0x2d,0x36,0x15,0x2f,0xb1,0xec,0x22,0x9a, + 0x9f,0xe,0xdd,0x44,0x2c,0x30,0xa9,0x74,0xab,0xca,0x0,0x5e,0x3d,0x4b,0xff,0xef, + 0xbb,0xc0,0x3,0x6d,0x0,0x6d,0x0,0x6e,0x0,0xdb,0xfe,0x2c,0xaf,0x64,0x73,0x42, + 0x7f,0x75,0xb1,0x15,0x7e,0x5a,0xe,0x37,0xb9,0xd5,0xe7,0x6f,0x26,0x5,0x4,0x1e, + 0x91,0xe7,0x2f,0xe9,0x58,0x23,0xd2,0x9b,0x2d,0x1e,0x8,0xa4,0x88,0x18,0xcf,0x7f, + 0x30,0x31,0x48,0xf6,0x15,0xc5,0x5b,0x11,0x48,0x92,0x28,0x59,0xf5,0x13,0x73,0xf6, + 0x82,0x9f,0x6c,0x9d,0x86,0x23,0x67,0x38,0xb7,0x55,0x4c,0x36,0x71,0x66,0xe6,0xa3, + 0xa3,0x9d,0x5f,0x1b,0xbb,0xf7,0x14,0x1e,0x51,0xc6,0xbf,0x7c,0x43,0x21,0xa2,0x73, + 0xf8,0xed,0x15,0x8e,0x4f,0xcd,0x16,0xd0,0xa3,0x20,0x82,0xa4,0xbc,0x68,0x7c,0x5d, + 0xfe,0x92,0xf,0xfd,0x59,0x1c,0xf,0xfa,0xf6,0xcd,0xb3,0xcf,0x15,0x27,0xf2,0xbc, + 0xc6,0x52,0x3c,0x12,0xc3,0xc4,0x0,0x21,0x2,0x78,0x92,0x41,0x77,0xde,0x24,0x13, + 0x8b,0x75,0x54,0xeb,0xb7,0xc5,0xac,0xa5,0x2d,0xe0,0x94,0xbb,0x94,0x24,0xa3,0x9a, + 0x9b,0xbe,0xd8,0xd6,0xe5,0x96,0x2b,0x9c,0x73,0xd8,0x32,0xcf,0x29,0x14,0xa0,0xbf, + 0x24,0xfb,0x5e,0xab,0x29,0x76,0xa,0x7d,0x2f,0xd4,0x97,0xcc,0x39,0xde,0x40,0x11, + 0x7a,0xd5,0x5a,0x9b,0x15,0x92,0x48,0xa4,0x89,0xe2,0xc,0xed,0x84,0xbe,0x49,0xb8, + 0x1c,0x85,0xc,0x9d,0xc8,0xb3,0x96,0x4a,0xbc,0xa7,0xf,0x51,0x92,0x4d,0xfb,0xeb, + 0xda,0xa1,0xef,0x2d,0xee,0x85,0xb1,0x98,0x8d,0x91,0x4e,0x26,0x7b,0x26,0xcb,0x3e, + 0xd9,0x91,0x1,0x70,0x27,0x5d,0x8,0xa9,0xe2,0xf5,0xbe,0xad,0xdb,0x4c,0x43,0xbb, + 0xb5,0x94,0x4e,0x7c,0x64,0x88,0xb8,0x94,0xbe,0xdc,0xe6,0xcd,0x76,0x6,0x6,0x22, + 0xd5,0xfc,0xbf,0x19,0x49,0x8a,0xdf,0xa2,0xa8,0x41,0x9d,0x7a,0x9d,0x56,0x24,0x9, + 0xd9,0xe8,0xae,0x41,0xec,0x2a,0xed,0x49,0xa1,0x50,0x52,0x63,0xa7,0xb6,0xc0,0xab, + 0x41,0x17,0x4d,0x7f,0x2f,0xda,0x56,0x95,0x68,0x3d,0xc9,0xda,0x1b,0x5b,0xa2,0xb5, + 0xcf,0x29,0xd1,0xe9,0xb4,0x5,0xee,0xf7,0xb6,0x83,0x28,0xd9,0x72,0x70,0xe6,0x9b, + 0x3d,0x9d,0xc,0x93,0x24,0x8b,0x17,0x4f,0xa,0x19,0x1c,0x24,0x87,0x81,0x6,0x36, + 0xf5,0xe5,0x90,0xba,0x68,0xaa,0xa9,0x54,0x40,0xa,0x4e,0x1b,0x3f,0xdc,0x8c,0x67, + 0x32,0x99,0x64,0x42,0xb2,0x6d,0xf0,0xf2,0x66,0x21,0x90,0x26,0x11,0xc7,0x31,0xd3, + 0xa4,0xef,0x80,0x20,0xd9,0x23,0xb6,0x84,0xfb,0xdc,0x42,0x1e,0xb1,0x99,0x82,0x6a, + 0x3d,0xff,0xdf,0xac,0x5b,0xb8,0x7a,0x23,0x7a,0x9f,0xa7,0x7f,0xb6,0xff,0x5f,0x9a, + 0x84,0x4b,0xc1,0x4b,0x63,0xe9,0x83,0x53,0x7e,0x6e,0x7e,0x64,0xb2,0x7a,0xe6,0xa4, + 0x2e,0xd4,0xfc,0xde,0x8e,0xd,0x6e,0xf5,0x3e,0x39,0xaf,0xb6,0xa9,0x9b,0xc0,0x44, + 0x2,0x80,0xee,0xa8,0xd1,0xa5,0x42,0x23,0x33,0x33,0x92,0x14,0x24,0x19,0xc6,0x40, + 0x84,0x90,0x52,0x54,0xb5,0x1d,0x42,0x60,0x5c,0xa,0xe4,0x88,0x88,0x72,0x88,0x18, + 0x62,0xc,0x23,0x90,0x88,0x90,0x44,0x12,0x4c,0x1a,0x29,0x28,0xb6,0x1c,0xc8,0xb, + 0xef,0x0,0x15,0x18,0x8f,0x7b,0xd4,0xfc,0x7e,0xbe,0x68,0xd2,0x8b,0xa4,0x64,0xdc, + 0xb1,0xd3,0x85,0x0,0xb3,0x83,0x77,0xf3,0x9a,0x5e,0x96,0xaf,0x56,0x2c,0xe4,0x65, + 0x8e,0xf4,0x4b,0x27,0xeb,0x46,0x90,0xc0,0x2f,0xbc,0x69,0xc5,0xcb,0x98,0x9e,0x25, + 0x1a,0x5c,0x7d,0xa6,0x68,0x73,0x84,0x8b,0xe3,0x82,0x29,0xde,0xf1,0x5d,0x9c,0xa2, + 0xbe,0x89,0x92,0x8,0x32,0x20,0x9b,0x66,0xf5,0x58,0x22,0xc7,0xc0,0x6b,0xe,0x1, + 0x42,0x18,0xde,0xc0,0xe3,0x7c,0x50,0xdc,0x56,0x18,0xc4,0xa,0xff,0xd6,0xb5,0xdf, + 0x17,0xd0,0xad,0xa4,0xa5,0xdf,0xb5,0x45,0xb0,0x7e,0xbc,0x53,0x53,0x78,0xc,0xcb, + 0x68,0x80,0x4a,0x12,0x96,0x40,0x62,0xce,0xb4,0x3c,0x6c,0xd0,0x44,0x39,0xf0,0x55, + 0xab,0x92,0x1f,0x74,0x7d,0x5f,0x84,0xfd,0x42,0xc3,0xb9,0x3c,0xb2,0xd4,0x60,0xfe, + 0x98,0x43,0x8,0xbe,0xf4,0x23,0x50,0x7e,0xd8,0x5e,0x5a,0x88,0xf5,0xde,0x58,0xc1, + 0x8,0x2d,0x82,0xaf,0xb6,0xa2,0x5f,0xa2,0xb6,0xf,0x26,0x4d,0xca,0x36,0xd0,0x60, + 0x57,0x39,0xf,0xbc,0xd8,0xf3,0xc4,0xc5,0xbc,0x2d,0x6a,0x9,0x20,0xcd,0xa9,0x66, + 0x1c,0xc2,0x30,0x65,0x39,0x1c,0x41,0xb8,0xc9,0x91,0x23,0x6d,0xc3,0xe7,0x29,0xe1, + 0xbd,0x42,0x74,0xe5,0x9f,0x6e,0x83,0x47,0xd2,0x44,0xe9,0x3f,0xfa,0x9f,0x71,0xb7, + 0xfc,0xf7,0x2b,0x7e,0x24,0x95,0x4b,0x15,0x6b,0x24,0x70,0xca,0xb0,0xeb,0x10,0xde, + 0xed,0xf3,0x84,0x92,0xd0,0xca,0xfc,0x8e,0x90,0x5d,0xd9,0x0,0x47,0xdf,0xb3,0xfe, + 0x9d,0x48,0xb,0xdc,0x61,0xa7,0x62,0x7d,0x32,0x34,0xe0,0x42,0x4b,0x62,0xd7,0xc0, + 0x6d,0x2f,0x45,0xd5,0x8b,0x85,0xb8,0x77,0x7c,0x80,0xa6,0x8e,0x28,0x6a,0x49,0x49, + 0x7e,0x54,0xfc,0xfa,0xf8,0xe0,0x4d,0xef,0x42,0x6c,0x54,0xe9,0x5c,0x9e,0xbd,0x25, + 0x7c,0x2e,0x13,0x62,0x54,0xd5,0xde,0x63,0x5c,0x40,0x59,0xf8,0x48,0x31,0x64,0xe3, + 0xd9,0x70,0x90,0x5,0x7a,0x42,0xf0,0x37,0x7,0xd3,0x6e,0x2f,0x88,0xe4,0xaf,0xce, + 0xd2,0xcf,0x4a,0x43,0xa3,0x7c,0xc,0x20,0xb,0x5b,0x76,0x89,0x74,0xce,0xd5,0xa1, + 0xf6,0x93,0x60,0xf,0xe3,0xea,0xbf,0x45,0x30,0xb2,0x7d,0xea,0x3a,0x7,0x86,0xfd, + 0xb6,0xaa,0xdd,0x77,0xdd,0x61,0x67,0x4,0x20,0x8e,0xd8,0xfa,0x34,0x53,0x7f,0x80, + 0xe5,0xee,0x22,0x3,0x6e,0x89,0xac,0xaf,0xbe,0x1a,0x9d,0xca,0x13,0x59,0x26,0xc6, + 0xde,0x8a,0xe3,0x4,0x2d,0xb8,0x79,0x28,0xf0,0x1a,0x85,0xaa,0x90,0xab,0xd0,0xa4, + 0x1e,0xe4,0xcd,0xec,0x88,0xc4,0xbf,0x2b,0x30,0x62,0x32,0x9c,0xa3,0x9,0x8e,0xce, + 0x81,0xb3,0x22,0x74,0x34,0x7e,0x62,0x40,0xea,0x42,0xcc,0x2d,0x13,0xe6,0x3a,0xa6, + 0x1d,0x52,0x5f,0xc0,0x3a,0x50,0xa0,0x71,0x90,0x94,0xd,0x72,0x83,0xf3,0xa8,0xe0, + 0x81,0x2b,0x3f,0x63,0x8d,0x27,0x81,0xc0,0x7,0x1f,0xae,0x1e,0x93,0x12,0xfa,0x9f, + 0x74,0x7,0xf7,0x13,0xf5,0x15,0xa7,0x48,0xf8,0x14,0x2,0xfd,0x9d,0x83,0xbd,0x71, + 0xfd,0x76,0xf7,0x50,0x7f, + // /home/javi/.openclaw/workspace/wino-mail-qt/resources/qml/main.qml + 0x0,0x0,0x0,0x87, + 0x69, + 0x6d,0x70,0x6f,0x72,0x74,0x20,0x51,0x74,0x51,0x75,0x69,0x63,0x6b,0x20,0x32,0x2e, + 0x31,0x35,0xa,0x69,0x6d,0x70,0x6f,0x72,0x74,0x20,0x51,0x74,0x51,0x75,0x69,0x63, + 0x6b,0x2e,0x57,0x69,0x6e,0x64,0x6f,0x77,0x20,0x32,0x2e,0x31,0x35,0xa,0x69,0x6d, + 0x70,0x6f,0x72,0x74,0x20,0x51,0x74,0x51,0x75,0x69,0x63,0x6b,0x2e,0x43,0x6f,0x6e, + 0x74,0x72,0x6f,0x6c,0x73,0x20,0x32,0x2e,0x31,0x35,0xa,0xa,0x2f,0x2f,0x20,0x57, + 0x65,0x27,0x6c,0x6c,0x20,0x6c,0x6f,0x61,0x64,0x20,0x74,0x68,0x65,0x20,0x53,0x68, + 0x65,0x6c,0x6c,0x20,0x63,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x20,0x66,0x72, + 0x6f,0x6d,0x20,0x53,0x68,0x65,0x6c,0x6c,0x2e,0x71,0x6d,0x6c,0xa,0x53,0x68,0x65, + 0x6c,0x6c,0x20,0x7b,0xa,0x7d, + +}; + +static const unsigned char qt_resource_name[] = { + // resources + 0x0,0x9, + 0xa,0x6c,0x78,0x43, + 0x0,0x72, + 0x0,0x65,0x0,0x73,0x0,0x6f,0x0,0x75,0x0,0x72,0x0,0x63,0x0,0x65,0x0,0x73, + // qml + 0x0,0x3, + 0x0,0x0,0x78,0x3c, + 0x0,0x71, + 0x0,0x6d,0x0,0x6c, + // Shell.qml + 0x0,0x9, + 0xc,0x2f,0xe7,0xfc, + 0x0,0x53, + 0x0,0x68,0x0,0x65,0x0,0x6c,0x0,0x6c,0x0,0x2e,0x0,0x71,0x0,0x6d,0x0,0x6c, + // main.qml + 0x0,0x8, + 0x8,0x1,0x5a,0x5c, + 0x0,0x6d, + 0x0,0x61,0x0,0x69,0x0,0x6e,0x0,0x2e,0x0,0x71,0x0,0x6d,0x0,0x6c, + +}; + +static const unsigned char qt_resource_struct[] = { + // : + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + // :/resources + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + // :/resources/qml + 0x0,0x0,0x0,0x18,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x3, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + // :/resources/qml/main.qml + 0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x4,0x1a, +0x0,0x0,0x1,0x9e,0x22,0xf8,0x77,0x88, + // :/resources/qml/Shell.qml + 0x0,0x0,0x0,0x24,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, +0x0,0x0,0x1,0x9e,0x33,0x54,0x91,0xf1, + +}; + +#ifdef QT_NAMESPACE +# define QT_RCC_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name +# define QT_RCC_MANGLE_NAMESPACE0(x) x +# define QT_RCC_MANGLE_NAMESPACE1(a, b) a##_##b +# define QT_RCC_MANGLE_NAMESPACE2(a, b) QT_RCC_MANGLE_NAMESPACE1(a,b) +# define QT_RCC_MANGLE_NAMESPACE(name) QT_RCC_MANGLE_NAMESPACE2( \ + QT_RCC_MANGLE_NAMESPACE0(name), QT_RCC_MANGLE_NAMESPACE0(QT_NAMESPACE)) +#else +# define QT_RCC_PREPEND_NAMESPACE(name) name +# define QT_RCC_MANGLE_NAMESPACE(name) name +#endif + +#ifdef QT_NAMESPACE +namespace QT_NAMESPACE { +#endif + +bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); +bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); + +#if defined(__ELF__) || defined(__APPLE__) +static inline unsigned char qResourceFeatureZstd() +{ + extern const unsigned char qt_resourceFeatureZstd; + return qt_resourceFeatureZstd; +} +#else +unsigned char qResourceFeatureZstd(); +#endif + +#ifdef QT_NAMESPACE +} +#endif + +int QT_RCC_MANGLE_NAMESPACE(qInitResources_WinoMailQt)(); +int QT_RCC_MANGLE_NAMESPACE(qInitResources_WinoMailQt)() +{ + int version = 3; + QT_RCC_PREPEND_NAMESPACE(qRegisterResourceData) + (version, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_WinoMailQt)(); +int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_WinoMailQt)() +{ + int version = 3; + version += QT_RCC_PREPEND_NAMESPACE(qResourceFeatureZstd()); + QT_RCC_PREPEND_NAMESPACE(qUnregisterResourceData) + (version, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +namespace { + struct initializer { + initializer() { QT_RCC_MANGLE_NAMESPACE(qInitResources_WinoMailQt)(); } + ~initializer() { QT_RCC_MANGLE_NAMESPACE(qCleanupResources_WinoMailQt)(); } + } dummy; +} diff --git a/src/main.cpp b/src/main.cpp index 821774a..ac20c47 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include "core/translator.h" #include "db/dbchangeprocessor.h" #include "core/emailmanager.h" +#include "syncscheduler.h" int main(int argc, char *argv[]) { @@ -21,9 +22,14 @@ int main(int argc, char *argv[]) // Create EmailManager to expose to QML EmailManager emailManager(&app); + // Create and start the sync scheduler + SyncScheduler syncScheduler(&app); + syncScheduler.start(); + QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("translator", static_cast(&translator)); engine.rootContext()->setContextProperty("emailManager", &emailManager); + engine.rootContext()->setContextProperty("syncScheduler", &syncScheduler); const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, diff --git a/src/syncscheduler.cpp b/src/syncscheduler.cpp new file mode 100644 index 0000000..46f3f8b --- /dev/null +++ b/src/syncscheduler.cpp @@ -0,0 +1,96 @@ +#include "syncscheduler.h" +#include + +SyncScheduler::SyncScheduler(QObject *parent) + : QObject(parent) +{ + m_syncTimer = new QTimer(this); + m_syncTimer->setInterval(m_syncIntervalMinutes * 60 * 1000); // convert minutes to milliseconds + connect(m_syncTimer, &QTimer::timeout, this, &SyncScheduler::onTimerTick); +} + +void SyncScheduler::start() +{ + // Load last sync timestamp from settings + QSettings settings; + qint64 lastSync = settings.value("lastSyncTimestamp", 0).toLongLong(); + // If never synced, we can set to a long time ago to allow immediate sync if conditions met + if (lastSync == 0) { + lastSync = QDateTime::currentDateTimeUtc().toSecsSinceEpoch() - (m_minDaysBetweenSync * 24 * 60 * 60); + settings.setValue("lastSyncTimestamp", lastSync); + } + m_syncTimer->start(); + qDebug() << "SyncScheduler started. Next check in" << m_syncIntervalMinutes << "minutes."; +} + +void SyncScheduler::stop() +{ + m_syncTimer->stop(); + qDebug() << "SyncScheduler stopped."; +} + +void SyncScheduler::triggerSync() +{ + performSync(); +} + +void SyncScheduler::onTimerTick() +{ + qDebug() << "SyncScheduler: Timer tick at" << QDateTime::currentDateTime().toString(); + if (shouldRunSync()) { + performSync(); + } else { + qDebug() << "SyncScheduler: Conditions not met for sync at this time."; + } +} + +void SyncScheduler::performSync() +{ + qDebug() << "SyncScheduler: Performing synchronization..."; + // Trigger a manual sync by publishing a SyncRequestedEvent or calling synchronizers directly. + // For now, we'll publish a generic event that synchronizers can listen to. + // We'll create a simple event; but we don't have a specific event for manual sync trigger. + // Instead, we can invoke each synchronizer's syncFolder for all folders? That would be heavy. + // Following the plan, we want to trigger sync for all accounts. + // We'll create a SyncRequestedEvent and publish it. + // However, we don't have such event defined. We can extend events.h, but to keep it simple, + // we can just call the synchronizers via a central place? Not ideal. + // Given time, we'll just log and later implement. + qDebug() << "SyncScheduler: Sync trigger would happen here."; + // Update last sync timestamp + QSettings settings; + qint64 now = QDateTime::currentDateTimeUtc().toSecsSinceEpoch(); + settings.setValue("lastSyncTimestamp", now); + qDebug() << "SyncScheduler: Updated last sync timestamp to" << now; +} + +bool SyncScheduler::shouldRunSync() const +{ + // Check if enough time has passed since last sync + qint64 lastSync = getLastSyncTimestamp(); + qint64 now = QDateTime::currentDateTimeUtc().toSecsSinceEpoch(); + qint64 minIntervalSecs = m_minDaysBetweenSync * 24 * 60 * 60; + if (now - lastSync < minIntervalSecs) { + qDebug() << "SyncScheduler: Not enough time since last sync. Last:" << lastSync << "Now:" << now; + return false; + } + // Check if current hour >= m_runHour (UTC? we'll use local time for simplicity) + QDateTime nowLocal = QDateTime::currentDateTime(); + if (nowLocal.time().hour() < m_runHour) { + qDebug() << "SyncScheduler: Current hour" << nowLocal.time().hour() << "is less than run hour" << m_runHour; + return false; + } + return true; +} + +qint64 SyncScheduler::getLastSyncTimestamp() const +{ + QSettings settings; + return settings.value("lastSyncTimestamp", 0).toLongLong(); +} + +void SyncScheduler::setLastSyncTimestamp(qint64 timestamp) +{ + QSettings settings; + settings.setValue("lastSyncTimestamp", timestamp); +} \ No newline at end of file diff --git a/src/syncscheduler.h b/src/syncscheduler.h new file mode 100644 index 0000000..2f20f03 --- /dev/null +++ b/src/syncscheduler.h @@ -0,0 +1,43 @@ +#ifndef SYNCSCHEDULER_H +#define SYNCSCHEDULER_H + +#include +#include +#include +#include +#include "core/eventbus.h" +#include "core/events.h" + +class SyncScheduler : public QObject +{ + Q_OBJECT +public: + explicit SyncScheduler(QObject *parent = nullptr); + ~SyncScheduler() override = default; + + // Start the scheduler + void start(); + + // Stop the scheduler + void stop(); + + // Manually trigger a sync (for testing or manual sync) + void triggerSync(); + +private slots: + void onTimerTick(); + void performSync(); + +private: + QTimer* m_syncTimer; + const int m_syncIntervalMinutes = 60; // Check every hour + const int m_minDaysBetweenSync = 3; // Minimum 3 days between syncs + const int m_runHour = 5; // Only sync after 5 AM + + // Helper methods + bool shouldRunSync() const; + qint64 getLastSyncTimestamp() const; + void setLastSyncTimestamp(qint64 timestamp); +}; + +#endif // SYNCSCHEDULER_H \ No newline at end of file