Compare commits

...

5 Commits

Author SHA1 Message Date
Konstantin Vukolov
3a49a3d343 Fix style 2026-01-21 15:25:06 +03:00
Konstantin Vukolov
05d1a03fe4 Fix cppcheck 2026-01-21 15:19:31 +03:00
Konstantin Vukolov
a4242ab11e Fix style 2026-01-21 15:13:26 +03:00
Konstantin Vukolov
1bcc9068c1 Fix 2026-01-21 15:11:26 +03:00
Konstantin Vukolov
c22a2b56fb Change opds parser interface 2026-01-20 16:27:45 +03:00
4 changed files with 22 additions and 19 deletions

View File

@ -22,9 +22,11 @@ OpdsParser::~OpdsParser() {
}
}
void OpdsParser::push(const char* xmlData, const size_t length) {
size_t OpdsParser::write(uint8_t c) { return write(&c, 1); }
size_t OpdsParser::write(const uint8_t* xmlData, const size_t length) {
if (errorOccured) {
return;
return length;
}
XML_SetUserData(parser, this);
@ -32,7 +34,7 @@ void OpdsParser::push(const char* xmlData, const size_t length) {
XML_SetCharacterDataHandler(parser, characterData);
// Parse in chunks to avoid large buffer allocations
const char* currentPos = xmlData;
const char* currentPos = reinterpret_cast<const char*>(xmlData);
size_t remaining = length;
constexpr size_t chunkSize = 1024;
@ -43,7 +45,7 @@ void OpdsParser::push(const char* xmlData, const size_t length) {
Serial.printf("[%lu] [OPDS] Couldn't allocate memory for buffer\n", millis());
XML_ParserFree(parser);
parser = nullptr;
return;
return length;
}
const size_t toRead = remaining < chunkSize ? remaining : chunkSize;
@ -55,15 +57,16 @@ void OpdsParser::push(const char* xmlData, const size_t length) {
XML_ErrorString(XML_GetErrorCode(parser)));
XML_ParserFree(parser);
parser = nullptr;
return;
return length;
}
currentPos += toRead;
remaining -= toRead;
}
return length;
}
void OpdsParser::finish() {
void OpdsParser::flush() {
if (XML_Parse(parser, nullptr, 0, XML_TRUE) != XML_STATUS_OK) {
errorOccured = true;
XML_ParserFree(parser);

View File

@ -1,4 +1,5 @@
#pragma once
#include <Print.h>
#include <expat.h>
#include <string>
@ -42,7 +43,7 @@ using OpdsBook = OpdsEntry;
* }
* }
*/
class OpdsParser {
class OpdsParser final : public Print {
public:
OpdsParser();
~OpdsParser();
@ -51,10 +52,15 @@ class OpdsParser {
OpdsParser(const OpdsParser&) = delete;
OpdsParser& operator=(const OpdsParser&) = delete;
void push(const char* xmlData, size_t length);
void finish();
size_t write(uint8_t) override;
size_t write(const uint8_t*, size_t) override;
void flush() override;
bool error() const;
operator bool() { return !error(); }
/**
* Get the parsed entries (both navigation and book entries).
* @return Vector of OpdsEntry entries

View File

@ -8,14 +8,8 @@ int OpdsParserStream::peek() { abort(); }
int OpdsParserStream::read() { abort(); }
size_t OpdsParserStream::write(uint8_t c) {
parser.push(reinterpret_cast<const char*>(&c), 1);
return 1;
}
size_t OpdsParserStream::write(uint8_t c) { return parser.write(c); }
size_t OpdsParserStream::write(const uint8_t* buffer, size_t size) {
parser.push(reinterpret_cast<const char*>(buffer), size);
return size;
}
size_t OpdsParserStream::write(const uint8_t* buffer, size_t size) { return parser.write(buffer, size); }
OpdsParserStream::~OpdsParserStream() { parser.finish(); }
OpdsParserStream::~OpdsParserStream() { parser.flush(); }

View File

@ -277,7 +277,7 @@ void OpdsBookBrowserActivity::fetchFeed(const std::string& path) {
}
}
if (parser.error()) {
if (!parser) {
state = BrowserState::ERROR;
errorMessage = "Failed to parse feed";
updateRequired = true;