From dddff2e7c658aa84f67186ade0a4845b5fb0b43f Mon Sep 17 00:00:00 2001 From: Daniel Elstner Date: Sun, 27 Sep 2015 01:14:11 +0200 Subject: [PATCH] android: Read firmware resources from assets Set up a resource reader to load firmware resources as assets bundled with the APK. --- CMakeLists.txt | 5 ++- android/assetreader.cpp | 77 +++++++++++++++++++++++++++++++++++++++++ android/assetreader.hpp | 41 ++++++++++++++++++++++ main.cpp | 6 +++- 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 android/assetreader.cpp create mode 100644 android/assetreader.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ce4139d9..be2cd14e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -324,7 +324,10 @@ if(WIN32) endif() if(ANDROID) - list(APPEND pulseview_SOURCES android/loghandler.cpp) + list(APPEND pulseview_SOURCES + android/assetreader.cpp + android/loghandler.cpp + ) endif() if(Qt5Core_FOUND) diff --git a/android/assetreader.cpp b/android/assetreader.cpp new file mode 100644 index 00000000..bf76704a --- /dev/null +++ b/android/assetreader.cpp @@ -0,0 +1,77 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2015 Daniel Elstner + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "assetreader.hpp" +#include +#include +#include +#include + +using namespace pv; + +AndroidAssetReader::~AndroidAssetReader() +{} + +void AndroidAssetReader::open(struct sr_resource *res, std::string name) +{ + if (res->type == SR_RESOURCE_FIRMWARE) { + const auto path = QString::fromStdString("assets:/sigrok-firmware/" + name); + std::unique_ptr file {new QFile{path}}; + + if (!file->open(QIODevice::ReadOnly)) + throw sigrok::Error{SR_ERR}; + + const auto size = file->size(); + if (size < 0) + throw sigrok::Error{SR_ERR}; + + res->size = size; + res->handle = file.release(); + } else { + qWarning() << "AndroidAssetReader: Unknown resource type" << res->type; + throw sigrok::Error{SR_ERR}; + } +} + +void AndroidAssetReader::close(struct sr_resource *res) +{ + if (!res->handle) { + qCritical("AndroidAssetReader: Invalid handle"); + throw sigrok::Error{SR_ERR_ARG}; + } + const std::unique_ptr file {static_cast(res->handle)}; + res->handle = nullptr; + + file->close(); +} + +size_t AndroidAssetReader::read(const struct sr_resource *res, void *buf, size_t count) +{ + if (!res->handle) { + qCritical("AndroidAssetReader: Invalid handle"); + throw sigrok::Error{SR_ERR_ARG}; + } + auto *const file = static_cast(res->handle); + + const auto n_read = file->read(static_cast(buf), count); + if (n_read < 0) + throw sigrok::Error{SR_ERR}; + + return n_read; +} diff --git a/android/assetreader.hpp b/android/assetreader.hpp new file mode 100644 index 00000000..74d49991 --- /dev/null +++ b/android/assetreader.hpp @@ -0,0 +1,41 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2015 Daniel Elstner + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PULSEVIEW_ANDROID_ASSETREADER_HPP +#define PULSEVIEW_ANDROID_ASSETREADER_HPP + +#include + +namespace pv { + +class AndroidAssetReader : public sigrok::ResourceReader +{ +public: + AndroidAssetReader() {} + virtual ~AndroidAssetReader(); + +private: + void open(struct sr_resource *res, std::string name) override; + void close(struct sr_resource *res) override; + size_t read(const struct sr_resource *res, void *buf, size_t count) override; +}; + +} // namespace pv + +#endif // !PULSEVIEW_ANDROID_ASSETREADER_HPP diff --git a/main.cpp b/main.cpp index 97a61280..daec62d2 100644 --- a/main.cpp +++ b/main.cpp @@ -38,6 +38,7 @@ #include "pv/mainwindow.hpp" #ifdef ANDROID #include +#include "android/assetreader.hpp" #include "android/loghandler.hpp" #endif @@ -77,6 +78,7 @@ int main(int argc, char *argv[]) #ifdef ANDROID srau_init_environment(); pv::AndroidLogHandler::install_callbacks(); + pv::AndroidAssetReader asset_reader; #endif // Parse arguments @@ -137,7 +139,9 @@ int main(int argc, char *argv[]) // Initialise libsigrok context = sigrok::Context::create(); - +#ifdef ANDROID + context->set_resource_reader(&asset_reader); +#endif do { #ifdef ENABLE_DECODE -- 2.30.2