Skip to content

Commit dc46b8e

Browse files
authored
Assets delivery (#26)
* Add GZipUncompressor class * Add skeleton for TarFile class * Add zlib develpment package to Dockerfile * Tar archive parser & indexer * Set native text rendering * Skeleton framework for CLI storage interface * Serial port commands cleanup * Add Failable and MOTDSkipper classes * MOTDSkipper is now an operation * Add libgl-dev package to docker * Remove unnecessary symlink in Docker * Add remove operation * Saving a lot of work * GZipUncompressor cleanup & improvements * Better manifest parsing, verification & debug * Fix error while upgrading FUS * Working file tree operations * Add WriteOperation * Improved correctness * Add MkDir operation * Revert to chunk-based read operation * Working asset update from file * Improved error handling * Add message feedback * Fix compilation on Windows
1 parent 352da9e commit dc46b8e

56 files changed

Lines changed: 2566 additions & 167 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

application/application.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
#include "application.h"
22

3-
#include <QFile>
43
#include <QLocale>
5-
#include <QBuffer>
64
#include <QTranslator>
75
#include <QQmlContext>
8-
#include <QStandardPaths>
6+
#include <QQuickWindow>
97
#include <QtQuickControls2/QQuickStyle>
108

119
#include "qflipperbackend.h"
@@ -39,6 +37,7 @@ AppUpdater *Application::updater()
3937

4038
void Application::initStyles()
4139
{
40+
QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering);
4241
QQuickStyle::setStyle("Universal");
4342
}
4443

application/components/FlipperListDelegate.qml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Item {
66
signal localUpdateRequested(var device)
77
signal localRadioUpdateRequested(var device)
88
signal localFUSUpdateRequested(var device)
9+
signal localAssetsUpdateRequested(var device)
910

1011
signal fixOptionBytesRequested(var device)
1112
signal fixBootRequested(var device)
@@ -185,6 +186,11 @@ Item {
185186
Menu {
186187
title: qsTr("Expert options")
187188

189+
MenuItem {
190+
text: qsTr("Update Databases...")
191+
onTriggered: localAssetsUpdateRequested(device)
192+
}
193+
188194
MenuItem {
189195
text: qsTr("Update Wireless stack...")
190196
onTriggered: localRadioUpdateRequested(device)

application/screens/homescreen.qml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ Item {
127127
}, messageObj);
128128
}
129129

130+
onLocalAssetsUpdateRequested: {
131+
const messageObj = {
132+
title : qsTr("Update the databases?"),
133+
subtitle : qsTr("This will install the databases from a file.")
134+
};
135+
136+
fileDialog.openWithConfirmation(["Database files (*.tgz)", "All files (*)"], function() {
137+
downloader.downloadAssets(device, fileDialog.fileUrl);
138+
}, messageObj);
139+
}
140+
130141
onLocalRadioUpdateRequested: {
131142
const messageObj = {
132143
title : qsTr("Update the wireless stack?"),

backend/abstractoperation.cpp

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
AbstractOperation::AbstractOperation(QObject *parent):
88
QObject(parent),
9-
m_isError(false),
10-
m_errorString(QStringLiteral("No error")),
119
m_timeout(new QTimer(this)),
1210
m_state(BasicState::Ready)
1311
{
@@ -22,34 +20,19 @@ int AbstractOperation::state() const
2220
return m_state;
2321
}
2422

25-
bool AbstractOperation::isError() const
26-
{
27-
return m_isError;
28-
}
29-
30-
const QString &AbstractOperation::errorString() const
31-
{
32-
return m_errorString;
33-
}
34-
3523
void AbstractOperation::onOperationTimeout()
3624
{
37-
finishWithError(QStringLiteral("Operation timeout (generic)."));
25+
finishWithError(QStringLiteral("Operation timeout (generic)"));
3826
}
3927

4028
void AbstractOperation::setState(int state)
4129
{
4230
m_state = state;
4331
}
4432

45-
void AbstractOperation::finishWithError(const QString &errorString)
33+
void AbstractOperation::finishWithError(const QString &errorMsg)
4634
{
47-
error_msg(errorString);
48-
49-
m_isError = true;
50-
m_errorString = errorString;
51-
52-
setState(BasicState::Finished);
35+
setError(errorMsg);
5336
finish();
5437
}
5538

backend/abstractoperation.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
#include <QObject>
44

5+
#include "failable.h"
6+
57
class QTimer;
68

7-
class AbstractOperation: public QObject {
9+
class AbstractOperation: public QObject, public Failable
10+
{
811
Q_OBJECT
912

1013
public:
@@ -17,14 +20,11 @@ class AbstractOperation: public QObject {
1720
explicit AbstractOperation(QObject *parent = nullptr);
1821
virtual ~AbstractOperation() {}
1922

20-
virtual const QString name() const = 0;
23+
virtual const QString description() const = 0;
2124
virtual void start() = 0;
2225
virtual void finish() = 0;
2326

2427
int state() const;
25-
bool isError() const;
26-
const QString &errorString() const;
27-
2828
signals:
2929
void started();
3030
void finished();
@@ -34,14 +34,12 @@ protected slots:
3434

3535
protected:
3636
void setState(int state);
37-
void finishWithError(const QString &errorString);
37+
void finishWithError(const QString &errorMsg);
3838

39-
void startTimeout(int msec = 10000);
39+
void startTimeout(int msec = 5000);
4040
void stopTimeout();
4141

4242
private:
43-
bool m_isError;
44-
QString m_errorString;
4543
QTimer *m_timeout;
4644
int m_state;
4745
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include "abstractserialoperation.h"
2+
3+
#include <QTimer>
4+
#include <QSerialPort>
5+
6+
#include "macros.h"
7+
8+
AbstractSerialOperation::AbstractSerialOperation(QSerialPort *serialPort, QObject *parent):
9+
AbstractOperation(parent),
10+
m_serialPort(serialPort)
11+
{}
12+
13+
AbstractSerialOperation::~AbstractSerialOperation()
14+
{}
15+
16+
void AbstractSerialOperation::start()
17+
{
18+
connect(m_serialPort, &QSerialPort::readyRead, this, &AbstractSerialOperation::onSerialPortReadyRead);
19+
connect(m_serialPort, &QSerialPort::errorOccurred, this, &AbstractSerialOperation::onSerialPortError);
20+
21+
QTimer::singleShot(0, this, &AbstractSerialOperation::begin);
22+
}
23+
24+
void AbstractSerialOperation::finish()
25+
{
26+
stopTimeout();
27+
setState(BasicState::Finished);
28+
29+
disconnect(m_serialPort, &QSerialPort::readyRead, this, &AbstractSerialOperation::onSerialPortReadyRead);
30+
disconnect(m_serialPort, &QSerialPort::errorOccurred, this, &AbstractSerialOperation::onSerialPortError);
31+
32+
emit finished();
33+
}
34+
35+
QSerialPort *AbstractSerialOperation::serialPort() const
36+
{
37+
return m_serialPort;
38+
}
39+
40+
void AbstractSerialOperation::onSerialPortError()
41+
{
42+
finishWithError(m_serialPort->errorString());
43+
}

backend/abstractserialoperation.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
3+
#include "abstractoperation.h"
4+
5+
class QSerialPort;
6+
7+
class AbstractSerialOperation : public AbstractOperation
8+
{
9+
Q_OBJECT
10+
11+
public:
12+
AbstractSerialOperation(QSerialPort *serialPort, QObject *parent = nullptr);
13+
virtual ~AbstractSerialOperation();
14+
15+
void start() override;
16+
void finish() override;
17+
18+
protected:
19+
QSerialPort *serialPort() const;
20+
21+
private slots:
22+
virtual void onSerialPortReadyRead() = 0;
23+
void onSerialPortError();
24+
25+
private:
26+
virtual bool begin() = 0;
27+
28+
QSerialPort *m_serialPort;
29+
};

backend/backend.pro

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,73 @@ include(../qflipper_common.pri)
1010

1111
SOURCES += \
1212
abstractoperation.cpp \
13+
abstractserialoperation.cpp \
1314
deviceregistry.cpp \
15+
filenode.cpp \
1416
firmwaredownloader.cpp \
1517
flipperupdates.cpp \
18+
flipperzero/assetmanifest.cpp \
19+
flipperzero/common/skipmotdoperation.cpp \
1620
flipperzero/deviceinfofetcher.cpp \
1721
flipperzero/factoryinfo.cpp \
1822
flipperzero/flipperzero.cpp \
23+
flipperzero/operations/assetsdownloadoperation.cpp \
1924
flipperzero/operations/firmwaredownloadoperation.cpp \
2025
flipperzero/operations/fixbootissuesoperation.cpp \
2126
flipperzero/operations/fixoptionbytesoperation.cpp \
2227
flipperzero/operations/flipperzerooperation.cpp \
2328
flipperzero/operations/wirelessstackdownloadoperation.cpp \
2429
flipperzero/recoverycontroller.cpp \
2530
flipperzero/remotecontroller.cpp \
31+
flipperzero/storage/mkdiroperation.cpp \
32+
flipperzero/storage/readoperation.cpp \
33+
flipperzero/storage/removeoperation.cpp \
34+
flipperzero/storage/statoperation.cpp \
35+
flipperzero/storage/writeoperation.cpp \
36+
flipperzero/storagecontroller.cpp \
37+
gzipuncompressor.cpp \
2638
qflipperbackend.cpp \
2739
remotefilefetcher.cpp \
2840
serialfinder.cpp \
41+
simpleserialoperation.cpp \
42+
tararchive.cpp \
2943
updateregistry.cpp
3044

3145
HEADERS += \
3246
abstractoperation.h \
47+
abstractserialoperation.h \
3348
deviceregistry.h \
49+
failable.h \
50+
filenode.h \
3451
firmwaredownloader.h \
3552
flipperupdates.h \
53+
flipperzero/assetmanifest.h \
54+
flipperzero/common/skipmotdoperation.h \
3655
flipperzero/deviceinfo.h \
3756
flipperzero/deviceinfofetcher.h \
3857
flipperzero/factoryinfo.h \
3958
flipperzero/flipperzero.h \
59+
flipperzero/operations/assetsdownloadoperation.h \
4060
flipperzero/operations/firmwaredownloadoperation.h \
4161
flipperzero/operations/fixbootissuesoperation.h \
4262
flipperzero/operations/fixoptionbytesoperation.h \
4363
flipperzero/operations/flipperzerooperation.h \
4464
flipperzero/operations/wirelessstackdownloadoperation.h \
4565
flipperzero/recoverycontroller.h \
4666
flipperzero/remotecontroller.h \
67+
flipperzero/storage/mkdiroperation.h \
68+
flipperzero/storage/readoperation.h \
69+
flipperzero/storage/removeoperation.h \
70+
flipperzero/storage/statoperation.h \
71+
flipperzero/storage/writeoperation.h \
72+
flipperzero/storagecontroller.h \
73+
gzipuncompressor.h \
4774
qflipperbackend.h \
4875
remotefilefetcher.h \
4976
serialfinder.h \
77+
signalingfailable.h \
78+
simpleserialoperation.h \
79+
tararchive.h \
5080
updateregistry.h
5181

5282
unix|win32 {

backend/deviceregistry.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ void DeviceRegistry::insertDevice(const USBDeviceInfo &info)
5050
if(info.vendorID() == FLIPPER_ZERO_VID) {
5151
auto *fetcher = Zero::AbstractDeviceInfoFetcher::create(info, this);
5252
connect(fetcher, &Zero::AbstractDeviceInfoFetcher::finished, this, &DeviceRegistry::processDevice);
53-
fetcher->fetch();
5453

5554
} else {
5655
error_msg("Unexpected device VID and PID.");

backend/failable.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
3+
#include <QString>
4+
5+
class Failable
6+
{
7+
bool m_isError;
8+
QString m_errorString;
9+
10+
public:
11+
Failable() {
12+
resetError();
13+
}
14+
15+
bool isError() const { return m_isError; }
16+
const QString &errorString() const { return m_errorString; }
17+
18+
virtual void setError(const QString &errorMessage) {
19+
m_isError = true;
20+
m_errorString = errorMessage;
21+
}
22+
23+
void resetError() {
24+
m_isError = false;
25+
m_errorString = QStringLiteral("No Error");
26+
}
27+
};
28+

0 commit comments

Comments
 (0)