Index: scripts/run.sh =================================================================== diff -u -r265ce7409a0ea99a4ae059f5ce7978c9cdb10631 -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- scripts/run.sh (.../run.sh) (revision 265ce7409a0ea99a4ae059f5ce7978c9cdb10631) +++ scripts/run.sh (.../run.sh) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -178,7 +178,7 @@ # ---------------------------------------- CloudSync -if [ -d $CLOUDSYNC_FOLDER ]; then +if [ -d $HOME/$CLOUDSYNC_FOLDER ]; then # moving/ backing up the previous treatment logs so the new buff starts with fresh sequence echo "Backing up CloudSync I/O buff" CLOUDSYNC_PATH="$SDCARD_MNT"/"$CLOUDSYNC_FOLDER" @@ -191,7 +191,7 @@ python3 ./cs.py start & sleep 2 CLOUDSYNC_STATUS="$(python3 ./cs.py status)" - if $CLOUDSYNC_STATUS == $POSTMSG_CLOUDSYNC_RUNNING; then + if [ "$CLOUDSYNC_STATUS" == "$POSTMSG_CLOUDSYNC_RUNNING" ]; then echo $POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_PASSED >> $POSTLOG else echo $POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_FAILED >> $POSTLOG Index: sources/cloudsync/CloudSyncController.cpp =================================================================== diff -u -r265ce7409a0ea99a4ae059f5ce7978c9cdb10631 -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 265ce7409a0ea99a4ae059f5ce7978c9cdb10631) +++ sources/cloudsync/CloudSyncController.cpp (.../CloudSyncController.cpp) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -333,6 +333,7 @@ case eError_CredentialEmpty : text = tr( "CS The credentials folder is empty." ) ; break; case eError_TxCodeNoParam : text = tr( "CS No Treatment Code provided." ) ; break; case eError_TxCodeEmpty : text = tr( "CS The provided Treatment Code is empty." ) ; break; + case eError_NotRegistered : text = tr( "CS Not Sent, Device not registered." ) ; break; } return text; } @@ -374,6 +375,7 @@ case eError_CredentialEmpty : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_TxCodeNoParam : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; case eError_TxCodeEmpty : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; + case eError_NotRegistered : info = QString( "[%1:%2]" ).arg( vErrorID ).arg( item(0) ) ; break; } return info; } @@ -553,8 +555,10 @@ QVariantList args ; Errors_Enum error = eError_Unknown; + // only sends messages if device has been registered qint32 messageID = UI2CS(static_cast(vAction)); - if ( ! _uiHistory.contains( messageID ) ) { error = eError_NoHistory; args = { messageID }; ok = false; goto lErr; } + if ( ! isRegistered() && vAction != eMessageID_DeviceRegister ) { error = eError_NotRegistered ; args = { messageID }; ok = false; goto lErr; } + if ( ! _uiHistory.contains( messageID ) ) { error = eError_NoHistory ; args = { messageID }; ok = false; goto lErr; } sendUIBuff(makeUIBuff(messageID)); @@ -821,18 +825,28 @@ */ bool CloudSyncController::testDeviceRegister() { - QString source = QString(Storage::CloudSync_Base_Path_Name) + Storage::CloudSync_Credentials_Folder_Name; - qDebug() << source; - QFileInfoList fileInfos = QDir(source).entryInfoList(QDir::NoDotAndDotDot|QDir::Files); - if( fileInfos.isEmpty() ) { toLog(eError_CredentialEmpty,{}); // It is intentional that the vault folder path has not been sent to the log. + if( ! isRegistered() ) { sendDeviceRegister(); } return true; // for now always true. } /*! + * \brief CloudSyncController::isRegistered + * \details checks if the device is registered by looking for existing credentials. + * \return true if device has been registered. + */ +bool CloudSyncController::isRegistered() +{ + QString source = QString(Storage::CloudSync_Base_Path_Name) + Storage::CloudSync_Credentials_Folder_Name; + qDebug() << source; + QFileInfoList fileInfos = QDir(source).entryInfoList(QDir::NoDotAndDotDot|QDir::Files); + return !fileInfos.isEmpty(); +} + +/*! * \brief CloudSyncController::saveDeviceInfo * \details keeps the received device information and set a flag to wait for the next message. * \param vAction - the action enum which identifies information source of HD or DG. Index: sources/cloudsync/CloudSyncController.h =================================================================== diff -u -r54c4136d95375116e6daf23b7d4179159cf13d0c -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- sources/cloudsync/CloudSyncController.h (.../CloudSyncController.h) (revision 54c4136d95375116e6daf23b7d4179159cf13d0c) +++ sources/cloudsync/CloudSyncController.h (.../CloudSyncController.h) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -104,6 +104,8 @@ eError_TxCodeEmpty = 520, // the received Tx Code is empty eError_OutFileEmpty = 521, // Out file has changed from CS2UI but the content is empty. + + eError_NotRegistered = 522, // avoid sending any message other than the device regitration, when device is not registered. }; typedef QHash MessageList; @@ -239,6 +241,7 @@ // device registration request bool sendDeviceRegister (); // eMessageID_DeviceRegister bool testDeviceRegister (); // eMessageID_DeviceRegister + bool isRegistered (); // device state report bool saveDeviceState (const QVariantList &vData); Index: sources/model/dg/adjustment/settings/MAdjustDGSerialNumberResponse.cpp =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- sources/model/dg/adjustment/settings/MAdjustDGSerialNumberResponse.cpp (.../MAdjustDGSerialNumberResponse.cpp) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/model/dg/adjustment/settings/MAdjustDGSerialNumberResponse.cpp (.../MAdjustDGSerialNumberResponse.cpp) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -22,9 +22,37 @@ }; } +/** + * \brief MAdjustSerialNumberDGResponse::isValid + * \details Checks if character meets DG serial constraints. (Alphanumeric or '-') + * \param vChar - the character. + * \return bool - whether character is valid. + */ +bool MAdjustSerialNumberDGResponse::isValid(const QChar &vChar) +{ + return vChar.isLetterOrNumber() || vChar == '-'; +} + +/** + * \brief MAdjustSerialNumberDGResponse::fromByteArray + * \details Removes any invalid characters from DG serial string. + * \param vByteArray - DG serial string represented as a byte array. + * \return true if serial contains any valid characters. + */ bool MAdjustSerialNumberDGResponse::fromByteArray(const QByteArray &vByteArray, int *) { - _data.mSerialNumber = qPrintable(vByteArray); - return true; + // only keep valid characters from serial and stop if end of line reached + QString serial; + for ( char c: vByteArray ) { + if ( !c ) break; + QChar ch(c); + if ( isValid(ch) ) { + serial += ch; + } + } + + // whitespace cannot be in serial and empty serial is invalid + _data.mSerialNumber = serial.trimmed(); + return ! _data.mSerialNumber.isEmpty(); } MAdjustSerialNumberDGResponse::Data MAdjustSerialNumberDGResponse::data() const { Index: sources/model/dg/adjustment/settings/MAdjustDGSerialNumberResponse.h =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- sources/model/dg/adjustment/settings/MAdjustDGSerialNumberResponse.h (.../MAdjustDGSerialNumberResponse.h) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/model/dg/adjustment/settings/MAdjustDGSerialNumberResponse.h (.../MAdjustDGSerialNumberResponse.h) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -53,6 +53,7 @@ friend class ::tst_models; QVariantList parameters() const override; + bool isValid(const QChar &vChar); public: Index: sources/model/hd/adjustment/settings/MAdjustHDSerialNumberResponse.cpp =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- sources/model/hd/adjustment/settings/MAdjustHDSerialNumberResponse.cpp (.../MAdjustHDSerialNumberResponse.cpp) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/model/hd/adjustment/settings/MAdjustHDSerialNumberResponse.cpp (.../MAdjustHDSerialNumberResponse.cpp) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -22,9 +22,37 @@ }; } +/** + * \brief MAdjustSerialNumberHDResponse::isValid + * \details Checks if character meets HD serial constraints. (alphanumeric or '-') + * \param vChar - the character. + * \return bool - whether character is valid. + */ +bool MAdjustSerialNumberHDResponse::isValid(const QChar &vChar) +{ + return vChar.isLetterOrNumber() || vChar == '-'; +} + +/** + * \brief MAdjustSerialNumberHDResponse::fromByteArray + * \details Removes any invalid characters from HD serial string. + * \param vByteArray - HD serial string represented as a byte array. + * \return bool - whether serial contains any valid characters. + */ bool MAdjustSerialNumberHDResponse::fromByteArray(const QByteArray &vByteArray, int *) { - _data.mSerialNumber = qPrintable(vByteArray); - return true; + QString serial; + for ( char c: vByteArray ) { + // stop if end of file found while iterating through serial + if ( !c ) break; + QChar ch(c); + if ( isValid(ch) ) { + serial += ch; + } + } + + // whitespace cannot be in serial and empty serial is invalid + _data.mSerialNumber = serial.trimmed(); + return ! _data.mSerialNumber.isEmpty(); } MAdjustSerialNumberHDResponse::Data MAdjustSerialNumberHDResponse::data() const { Index: sources/model/hd/adjustment/settings/MAdjustHDSerialNumberResponse.h =================================================================== diff -u -r27cc308ff5113a9386899d3c8f8b29962a8498e1 -r86d9540191c87953287abc9c9a5efc9ea16433e7 --- sources/model/hd/adjustment/settings/MAdjustHDSerialNumberResponse.h (.../MAdjustHDSerialNumberResponse.h) (revision 27cc308ff5113a9386899d3c8f8b29962a8498e1) +++ sources/model/hd/adjustment/settings/MAdjustHDSerialNumberResponse.h (.../MAdjustHDSerialNumberResponse.h) (revision 86d9540191c87953287abc9c9a5efc9ea16433e7) @@ -53,6 +53,7 @@ friend class ::tst_models; QVariantList parameters() const override; + bool isValid(const QChar &vChar); public: