summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2015-04-14 11:30:55 +0200
committerTomasz Sterna <tomek@xiaoka.com>2015-04-14 11:30:55 +0200
commitb93a1fe88141adf095bab09006b473205f597465 (patch)
treeff9885578c4d3f5bbef9b0d9c362ec9f04c2c8bd
parent78d1697cd63033244304f7794cf9157029e4fdb5 (diff)
Do not compute STM32CRC - use one from manifest.json
Fixes #47
-rw-r--r--daemon/appinfo.cpp13
-rw-r--r--daemon/bankmanager.cpp4
-rw-r--r--daemon/bundle.cpp18
-rw-r--r--daemon/bundle.h1
-rw-r--r--daemon/daemon.pro2
-rw-r--r--daemon/manager.cpp4
-rw-r--r--daemon/uploadmanager.cpp36
-rw-r--r--daemon/uploadmanager.h15
8 files changed, 50 insertions, 43 deletions
diff --git a/daemon/appinfo.cpp b/daemon/appinfo.cpp
index 7e726c3..7dcf49d 100644
--- a/daemon/appinfo.cpp
+++ b/daemon/appinfo.cpp
@@ -6,7 +6,6 @@
#include <QJsonArray>
#include "appinfo.h"
#include "unpacker.h"
-#include "stm32crc.h"
namespace {
struct ResourceEntry {
@@ -332,17 +331,7 @@ QByteArray AppInfo::extractFromResourcePack(QIODevice *dev, int wanted_id) const
int offset = 12 + 256 * 16 + e.offset;
- QByteArray res = data.mid(offset, e.length);
-
- Stm32Crc crc;
- crc.addData(res);
-
- if (crc.result() != e.crc) {
- qCWarning(l) << "CRC failure in resource" << e.index << "on file" << res;
- return QByteArray();
- }
-
- return res;
+ return data.mid(offset, e.length);
}
QImage AppInfo::decodeResourceImage(const QByteArray &data) const
diff --git a/daemon/bankmanager.cpp b/daemon/bankmanager.cpp
index 6f520b8..ef74ef6 100644
--- a/daemon/bankmanager.cpp
+++ b/daemon/bankmanager.cpp
@@ -93,7 +93,7 @@ bool BankManager::uploadApp(const QUuid &uuid, int slot)
_slots[slot].name.clear();
_slots[slot].uuid = QUuid();
- upload->uploadAppBinary(slot, binaryFile.data(),
+ upload->uploadAppBinary(slot, binaryFile.data(), info.crcFile(AppInfo::BINARY),
[this, info, binaryFile, slot]() {
qCDebug(l) << "app binary upload succesful";
binaryFile->close();
@@ -101,7 +101,7 @@ bool BankManager::uploadApp(const QUuid &uuid, int slot)
// Proceed to upload the resource file
QSharedPointer<QIODevice> resourceFile(info.openFile(AppInfo::RESOURCES));
if (resourceFile) {
- upload->uploadAppResources(slot, resourceFile.data(),
+ upload->uploadAppResources(slot, resourceFile.data(), info.crcFile(AppInfo::RESOURCES),
[this, resourceFile, slot]() {
qCDebug(l) << "app resources upload succesful";
resourceFile->close();
diff --git a/daemon/bundle.cpp b/daemon/bundle.cpp
index bfd4b83..63400b5 100644
--- a/daemon/bundle.cpp
+++ b/daemon/bundle.cpp
@@ -127,3 +127,21 @@ bool Bundle::fileExists(enum Bundle::File file) const
delete dev;
return exists;
}
+
+quint32 Bundle::crcFile(enum Bundle::File file) const
+{
+ quint32 ret = 0;
+
+ switch (file) {
+ case Bundle::BINARY:
+ ret = b->manifest.value(type()).toObject().value("crc").toDouble();
+ break;
+ case Bundle::RESOURCES:
+ ret = b->manifest.value("resources").toObject().value("crc").toDouble();
+ break;
+ default:
+ qCWarning(l) << "Unsupported CRC for" << file;
+ }
+
+ return ret;
+}
diff --git a/daemon/bundle.h b/daemon/bundle.h
index c2dc86b..1b77c94 100644
--- a/daemon/bundle.h
+++ b/daemon/bundle.h
@@ -36,6 +36,7 @@ public:
QIODevice *openFile(enum File, QIODevice::OpenMode = 0) const;
bool fileExists(enum File) const;
+ quint32 crcFile(enum File) const;
private:
QSharedDataPointer<BundleData> b;
diff --git a/daemon/daemon.pro b/daemon/daemon.pro
index 4d693ae..40d3290 100644
--- a/daemon/daemon.pro
+++ b/daemon/daemon.pro
@@ -28,7 +28,6 @@ SOURCES += \
packer.cpp \
bankmanager.cpp \
uploadmanager.cpp \
- stm32crc.cpp \
bundle.cpp
HEADERS += \
@@ -50,7 +49,6 @@ HEADERS += \
packer.h \
bankmanager.h \
uploadmanager.h \
- stm32crc.h \
bundle.h
DBUS_ADAPTORS += ../org.pebbled.Watch.xml
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index 345fb1d..db183bd 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -376,14 +376,14 @@ bool Manager::uploadFirmware(bool recovery, const QString &file)
return true;
}
- upload->uploadFirmwareResources(resourceFile.data(),
+ upload->uploadFirmwareResources(resourceFile.data(), bundle.crcFile(Bundle::RESOURCES),
[this, recovery, bundle, resourceFile]() {
qCDebug(l) << "firmware resource upload succesful";
resourceFile->close();
// Proceed to upload the resource file
QSharedPointer<QIODevice> binaryFile(bundle.openFile(Bundle::BINARY));
if (binaryFile) {
- upload->uploadFirmwareBinary(recovery, binaryFile.data(),
+ upload->uploadFirmwareBinary(recovery, binaryFile.data(), bundle.crcFile(Bundle::BINARY),
[this, binaryFile]() {
binaryFile->close();
qCDebug(l) << "firmware binary upload succesful";
diff --git a/daemon/uploadmanager.cpp b/daemon/uploadmanager.cpp
index a894194..0751713 100644
--- a/daemon/uploadmanager.cpp
+++ b/daemon/uploadmanager.cpp
@@ -1,7 +1,6 @@
#include "uploadmanager.h"
#include "unpacker.h"
#include "packer.h"
-#include "stm32crc.h"
static const int CHUNK_SIZE = 2000;
using std::function;
@@ -21,7 +20,7 @@ UploadManager::UploadManager(WatchConnector *watch, QObject *parent) :
});
}
-uint UploadManager::upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size,
+uint UploadManager::upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size, quint32 crc,
SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
{
PendingUpload upload;
@@ -36,6 +35,7 @@ uint UploadManager::upload(WatchConnector::UploadType type, int index, const QSt
upload.size = size;
}
upload.remaining = upload.size;
+ upload.crc = crc;
upload.successCallback = successCallback;
upload.errorCallback = errorCallback;
upload.progressCallback = progressCallback;
@@ -57,30 +57,30 @@ uint UploadManager::upload(WatchConnector::UploadType type, int index, const QSt
return upload.id;
}
-uint UploadManager::uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
+uint UploadManager::uploadAppBinary(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
{
- return upload(WatchConnector::uploadBINARY, slot, QString(), device, -1, successCallback, errorCallback, progressCallback);
+ return upload(WatchConnector::uploadBINARY, slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback);
}
-uint UploadManager::uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
+uint UploadManager::uploadAppResources(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
{
- return upload(WatchConnector::uploadRESOURCES, slot, QString(), device, -1, successCallback, errorCallback, progressCallback);
+ return upload(WatchConnector::uploadRESOURCES, slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback);
}
-uint UploadManager::uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
+uint UploadManager::uploadFile(const QString &filename, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
{
Q_ASSERT(!filename.isEmpty());
- return upload(WatchConnector::uploadFILE, 0, filename, device, -1, successCallback, errorCallback, progressCallback);
+ return upload(WatchConnector::uploadFILE, 0, filename, device, -1, crc, successCallback, errorCallback, progressCallback);
}
-uint UploadManager::uploadFirmwareBinary(bool recovery, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
+uint UploadManager::uploadFirmwareBinary(bool recovery, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
{
- return upload(recovery ? WatchConnector::uploadRECOVERY : WatchConnector::uploadFIRMWARE, 0, QString(), device, -1, successCallback, errorCallback, progressCallback);
+ return upload(recovery ? WatchConnector::uploadRECOVERY : WatchConnector::uploadFIRMWARE, 0, QString(), device, -1, crc, successCallback, errorCallback, progressCallback);
}
-uint UploadManager::uploadFirmwareResources(QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
+uint UploadManager::uploadFirmwareResources(QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback)
{
- return upload(WatchConnector::uploadSYS_RESOURCES, 0, QString(), device, -1, successCallback, errorCallback, progressCallback);
+ return upload(WatchConnector::uploadSYS_RESOURCES, 0, QString(), device, -1, crc, successCallback, errorCallback, progressCallback);
}
void UploadManager::cancel(uint id, int code)
@@ -146,7 +146,11 @@ void UploadManager::startNextUpload()
p.writeCString(upload.filename);
}
- qCDebug(l) << "starting new upload, size:" << upload.remaining << ", type:" << upload.type << ", slot:" << upload.index;
+ qCDebug(l).nospace() << "starting new upload " << upload.id
+ << ", size:" << upload.remaining
+ << ", type:" << upload.type
+ << ", slot:" << upload.index
+ << ", crc:" << qPrintable(QString("0x%1").arg(upload.crc, 0, 16));
_state = StateWaitForToken;
watch->sendMessage(WatchConnector::watchPUTBYTES, msg);
@@ -267,7 +271,6 @@ bool UploadManager::uploadNextChunk(PendingUpload &upload)
watch->sendMessage(WatchConnector::watchPUTBYTES, msg);
upload.remaining -= chunk.size();
- upload.crc.addData(chunk);
qCDebug(l) << "remaining" << upload.remaining << "/" << upload.size << "bytes";
@@ -283,10 +286,9 @@ bool UploadManager::commit(PendingUpload &upload)
Packer p(&msg);
p.write<quint8>(WatchConnector::putbytesCOMMIT);
p.write<quint32>(_token);
- p.write<quint32>(upload.crc.result());
+ p.write<quint32>(upload.crc);
- qCDebug(l) << "commiting upload" << upload.id
- << "with crc" << qPrintable(QString("0x%1").arg(upload.crc.result(), 0, 16));
+ qCDebug(l) << "commiting upload" << upload.id;
watch->sendMessage(WatchConnector::watchPUTBYTES, msg);
diff --git a/daemon/uploadmanager.h b/daemon/uploadmanager.h
index 22e4f80..316f55d 100644
--- a/daemon/uploadmanager.h
+++ b/daemon/uploadmanager.h
@@ -4,7 +4,6 @@
#include <functional>
#include <QQueue>
#include "watchconnector.h"
-#include "stm32crc.h"
class UploadManager : public QObject
{
@@ -18,14 +17,14 @@ public:
typedef std::function<void(int)> ErrorCallback;
typedef std::function<void(qreal)> ProgressCallback;
- uint upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size = -1,
+ uint upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size = -1, quint32 crc = 0,
SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
- uint uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
- uint uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
- uint uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
- uint uploadFirmwareBinary(bool recovery, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
- uint uploadFirmwareResources(QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
+ uint uploadAppBinary(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
+ uint uploadAppResources(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
+ uint uploadFile(const QString &filename, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
+ uint uploadFirmwareBinary(bool recovery, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
+ uint uploadFirmwareResources(QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
void cancel(uint id, int code = 0);
@@ -52,7 +51,7 @@ private:
QIODevice *device;
int size;
int remaining;
- Stm32Crc crc;
+ quint32 crc;
SuccessCallback successCallback;
ErrorCallback errorCallback;