Index: sources/cloudsync/CloudSyncController.cpp =================================================================== diff -u -r14cd1c61c1b956e7605d63be7450657817d17355 -rfe30c662d0fdf9df32883c17772b5803b84d229e --- sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 14cd1c61c1b956e7605d63be7450657817d17355) +++ sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision fe30c662d0fdf9df32883c17772b5803b84d229e) @@ -7,7 +7,7 @@ * * \file CloudSyncController.cpp * \author (last) Behrouz NematiPour - * \date (last) 01-Mar-2024 + * \date (last) 13-Mar-2024 * \author (original) Behrouz NematiPour * \date (original) 14-Oct-2021 * @@ -108,6 +108,8 @@ this , SLOT( onCryptSetupMount(bool))); connect(&_DeviceController , SIGNAL(didPendingLog (const QString &, const QString &)), this , SLOT( onPendingLog (const QString &, const QString &))); + connect(&_Logger , SIGNAL(didRetentionLogCS (quint8)), + this , SLOT( onRetentionLog (quint8))); connect(&_DeviceController , SIGNAL(didWatchFileChange (const QString &)), this , SLOT( onWatchFileChange (const QString &))); @@ -435,6 +437,7 @@ case eError_LogNameNoParam : text = tr( "CS No Log Name provided." ) ; break; case eError_LogNameEmpty : text = tr( "CS The provided Log Name is empty." ) ; break; case eError_NotRegistered : text = tr( "CS Not Sent, Device not registered." ) ; break; + case eError_LogRetentionNoParam : text = tr( "CS No Log Retention summary provided." ) ; break; } return text; @@ -494,6 +497,7 @@ case eError_LogNameNoParam : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_LogNameEmpty : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_NotRegistered : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; + case eError_LogRetentionNoParam : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; } return info; } @@ -833,14 +837,76 @@ return ok; } +/// -------------------------------------------------- Retention Log /*! + * \brief CloudSyncController::onRetentionLog + * \details The slot tha handles the received even to request for the log retention + * \param vMaxUsePercent - the maximum size of the SD-Card (log storage device) cloudsync can get for the logs + */ +void CloudSyncController::onRetentionLog(quint8 vMaxUsePercent) +{ + sendRetentionLog(vMaxUsePercent); +} + +void CloudSyncController::sendRetentionLog(quint8 vMaxUsePercent) +{ + bool ok = true; Q_UNUSED(ok) + QVariantList args ; + Errors_Enum error = eError_Unknown; + qint32 messageID = UI2CS(static_cast( eMessageID_SendLogRetention )); + // DEBUG ok = false; // using the ok bool which is true as the debug flag to bypass the registration on debug testing. + if ( ok && ! isRegistered() ) { error = eError_NotRegistered ; args = { eMessageID_SendLogRetention, vMaxUsePercent }; ok = false; goto lErr; } + sendUIBuff(makeUIBuff( messageID , { QString::number(vMaxUsePercent) } )); + + return; +lErr: + toLog(error, args); +} + +bool CloudSyncController::rcvdRetentionLog(const Message &vMessage) +{ + bool ok = true; + QString tmp; + quint16 mLogsCount; // number of deleted logs + quint32 mLogsSize ; // total current logs size + // although it has been checked in the interpreter, we won't risk the crash and check the list empty. + if ( vMessage.params.isEmpty() ) { toLog(eError_LogRetentionNoParam , {eMessageID_SendLogRetention }); ok = false; goto lOut; } + if ( vMessage.params.count () < paramCount[eMessageID_SendLogRetention]) { toLog(eError_ParamCount , {eMessageID_SendLogRetention }); ok = false; goto lOut; } + + tmp = vMessage.params[0]; + mLogsCount = tmp.toUInt(&ok); + if ( ! ok ) { toLog(eError_ParamMismatch , {eMessageID_SendLogRetention, 0}); ok = false; goto lOut; } + + tmp = vMessage.params[1]; + mLogsSize = tmp.toUInt(&ok); + if ( ! ok ) { toLog(eError_ParamMismatch , {eMessageID_SendLogRetention, 1}); ok = false; goto lOut; } + + //DEBUG qDebug() << " ---------- " << mLogsCount << mLogsSize; + emit didLogRetention( mLogsCount, mLogsSize ); + + LOG_APPED_CS(QString("Log retention deleted %1 files of total %2 MB.").arg(mLogsCount).arg(mLogsSize)); + + lOut: + return ok; +} +/// -------------------------------------------------- + +/*! * \brief CloudSyncController::sendMessage * \details Makes and Sends the appropriate message for the vAction. * Some messages are sent out upon request form the last received on the history and will not be asked from FW. * \return true if there is a history for that message and no error happened. */ bool CloudSyncController::sendMessage(const Message &vMessage) { bool ok = false; + // we are using the file system for the UI<=>CS communication, + // and the file events are multiple during the write to the file. + // if a write to the _out.buf trigeres the message to be sent more than once, + // ignore the same message, with the same sequence number. + static quint32 sequence ; + if ( sequence == vMessage.sequence ) return ok; + sequence = vMessage.sequence ; + //DEBUG qDebug() << Q_FUNC_INFO << vMessage.id; // this function is used in sendUIResponse, therefore the message IDs which are responses should be implemented here. switch (vMessage.id) { @@ -853,6 +919,7 @@ case eMessageID_TxCodeDisplay : ok = sendTxCodeDisplay ( vMessage ); break; case eMessageID_SendLogUpload : ok = rcvdPendingLog ( vMessage ); break; + case eMessageID_SendLogRetention : ok = rcvdRetentionLog ( vMessage ); break; case eMessageID_TxReport : /* No Req/Rsp, it is event based */ break; // This message doesn't have the response since there is no request. UI will send when the data ready by HD. @@ -1116,6 +1183,9 @@ void CloudSyncController::testReady() { bool ok = _postPass && isRegistered(); +#ifdef BUILD_FOR_DESKTOP + ok = true; +#endif emit didCloudSyncStatus( ok || gDisableCloudSyncFailStop // Development testability );