Skip to content

Commit

Permalink
Manage boot item list using RbootHttpUpdater::ItemList
Browse files Browse the repository at this point in the history
  • Loading branch information
mikee47 committed Mar 16, 2021
1 parent f46039c commit a27f59e
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 46 deletions.
92 changes: 54 additions & 38 deletions Sming/Components/rboot/include/Network/RbootHttpUpdater.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,46 @@ class RbootHttpUpdater;

using OtaUpdateDelegate = Delegate<void(RbootHttpUpdater& client, bool result)>;

struct RbootHttpUpdaterItem {
String url;
uint32_t targetOffset;
size_t size; // << max allowed size
RbootOutputStream* stream = nullptr; // (optional) output stream to use.
};

class RbootHttpUpdater : protected HttpClient
{
public:
virtual ~RbootHttpUpdater()
struct Item {
String url;
uint32_t targetOffset;
size_t size; // << max allowed size
RbootOutputStream* stream{nullptr}; // (optional) output stream to use.

Item(String url, uint32_t targetOffset, size_t size, RbootOutputStream* stream)
: url(url), targetOffset(targetOffset), size(size), stream(stream)
{
}

~Item()
{
delete stream;
}

RbootOutputStream* getStream()
{
if(stream == nullptr) {
stream = new RbootOutputStream(targetOffset, size);
}
return stream;
}
};

class ItemList : public Vector<Item>
{
cleanup();
}
public:
bool addNew(Item* it)
{
if(addElement(it)) {
return true;
}
delete it;
return false;
}
};

/**
* @brief Add an item to update
Expand All @@ -52,12 +78,7 @@ class RbootHttpUpdater : protected HttpClient
*/
bool addItem(uint32_t offset, const String& firmwareFileUrl, size_t maxSize = 0)
{
RbootHttpUpdaterItem add;
add.targetOffset = offset;
add.url = firmwareFileUrl;
add.size = maxSize;
add.stream = nullptr;
return items.add(add);
return items.addNew(new Item{firmwareFileUrl, offset, maxSize, nullptr});
}

/**
Expand All @@ -66,7 +87,7 @@ class RbootHttpUpdater : protected HttpClient
* @param partition Target partition to write
* @retval bool
*/
bool addItem(const String& firmwareFileUrl, Partition partition)
bool addItem(const String& firmwareFileUrl, Storage::Partition partition)
{
return addItem(partition.address(), firmwareFileUrl, partition.size());
}
Expand All @@ -83,13 +104,7 @@ class RbootHttpUpdater : protected HttpClient
return false;
}

RbootHttpUpdaterItem add;
add.targetOffset = stream->getStartAddress();
add.url = firmwareFileUrl;
add.size = stream->getMaxLength();
add.stream = stream;

return items.add(add);
return items.addNew(new Item{firmwareFileUrl, stream->getStartAddress(), stream->getMaxLength(), stream});
}

void start();
Expand Down Expand Up @@ -128,10 +143,21 @@ class RbootHttpUpdater : protected HttpClient
baseRequest = request;
}

// Allow reading items
RbootHttpUpdaterItem getItem(unsigned int index)
/**
* @brief Allow reading items
* @deprecated Access list directly using `getItems()`
*/
const Item& getItem(unsigned int index) const SMING_DEPRECATED
{
return items.elementAt(index);
return items[index];
}

/**
* @brief Allow read access to item list
*/
const ItemList& getItems() const
{
return items;
}

protected:
Expand All @@ -142,22 +168,12 @@ class RbootHttpUpdater : protected HttpClient
virtual int updateComplete(HttpConnection& client, bool success);

protected:
Vector<RbootHttpUpdaterItem> items;
ItemList items;
OtaUpdateDelegate updateDelegate;
HttpRequest* baseRequest{nullptr};
uint8_t romSlot{NO_ROM_SWITCH};
uint8_t currentItem{0};
rboot_write_status rbootWriteStatus{};

private:
void cleanup()
{
for(unsigned i = 0; i < items.count(); i++) {
delete items[i].stream;
items[i].stream = nullptr;
}
items.clear();
}
};

/** @deprecated Use `RbootHttpUpdater` */
Expand Down
11 changes: 3 additions & 8 deletions Sming/Components/rboot/src/RbootHttpUpdater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,7 @@ void RbootHttpUpdater::start()
}

request->setMethod(HTTP_GET);

if(it.stream == nullptr) {
it.stream = new RbootOutputStream(it.targetOffset, it.size);
}

request->setResponseStream(it.stream);
request->setResponseStream(it.getStream());

if(i == items.count() - 1) {
request->onRequestComplete(RequestCompletedDelegate(&RbootHttpUpdater::updateComplete, this));
Expand Down Expand Up @@ -101,12 +96,12 @@ void RbootHttpUpdater::updateFailed()
if(updateDelegate) {
updateDelegate(*this, false);
}
cleanup();
items.clear();
}

void RbootHttpUpdater::applyUpdate()
{
cleanup();
items.clear();
if(romSlot == NO_ROM_SWITCH) {
debug_d("Firmware updated.");
return;
Expand Down

0 comments on commit a27f59e

Please sign in to comment.