]> sigrok.org Git - pulseview.git/commitdiff
android: Read firmware resources from assets
authorDaniel Elstner <redacted>
Sat, 26 Sep 2015 23:14:11 +0000 (01:14 +0200)
committerDaniel Elstner <redacted>
Mon, 28 Sep 2015 15:29:48 +0000 (17:29 +0200)
Set up a resource reader to load firmware resources as assets
bundled with the APK.

CMakeLists.txt
android/assetreader.cpp [new file with mode: 0644]
android/assetreader.hpp [new file with mode: 0644]
main.cpp

index ce4139d9e42332b14908038fa106097f90bc18cc..be2cd14e80129d70a9b7973f7f932c63e90eb1be 100644 (file)
@@ -324,7 +324,10 @@ if(WIN32)
 endif()
 
 if(ANDROID)
 endif()
 
 if(ANDROID)
-       list(APPEND pulseview_SOURCES android/loghandler.cpp)
+       list(APPEND pulseview_SOURCES
+               android/assetreader.cpp
+               android/loghandler.cpp
+       )
 endif()
 
 if(Qt5Core_FOUND)
 endif()
 
 if(Qt5Core_FOUND)
diff --git a/android/assetreader.cpp b/android/assetreader.cpp
new file mode 100644 (file)
index 0000000..bf76704
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the PulseView project.
+ *
+ * Copyright (C) 2015 Daniel Elstner <daniel.kitta@gmail.com>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "assetreader.hpp"
+#include <libsigrok/libsigrok.h>
+#include <memory>
+#include <QtCore/QDebug>
+#include <QtCore/QFile>
+
+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<QFile> 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<QFile> file {static_cast<QFile*>(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<QFile*>(res->handle);
+
+       const auto n_read = file->read(static_cast<char*>(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 (file)
index 0000000..74d4999
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * This file is part of the PulseView project.
+ *
+ * Copyright (C) 2015 Daniel Elstner <daniel.kitta@gmail.com>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PULSEVIEW_ANDROID_ASSETREADER_HPP
+#define PULSEVIEW_ANDROID_ASSETREADER_HPP
+
+#include <libsigrokcxx/libsigrokcxx.hpp>
+
+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
index 97a61280ac5bc0462dc2da35d179ecd129a54ecf..daec62d2af09055409677d90885bc9faac5ce4af 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -38,6 +38,7 @@
 #include "pv/mainwindow.hpp"
 #ifdef ANDROID
 #include <libsigrokandroidutils/libsigrokandroidutils.h>
 #include "pv/mainwindow.hpp"
 #ifdef ANDROID
 #include <libsigrokandroidutils/libsigrokandroidutils.h>
+#include "android/assetreader.hpp"
 #include "android/loghandler.hpp"
 #endif
 
 #include "android/loghandler.hpp"
 #endif
 
@@ -77,6 +78,7 @@ int main(int argc, char *argv[])
 #ifdef ANDROID
        srau_init_environment();
        pv::AndroidLogHandler::install_callbacks();
 #ifdef ANDROID
        srau_init_environment();
        pv::AndroidLogHandler::install_callbacks();
+       pv::AndroidAssetReader asset_reader;
 #endif
 
        // Parse arguments
 #endif
 
        // Parse arguments
@@ -137,7 +139,9 @@ int main(int argc, char *argv[])
 
        // Initialise libsigrok
        context = sigrok::Context::create();
 
        // Initialise libsigrok
        context = sigrok::Context::create();
-
+#ifdef ANDROID
+       context->set_resource_reader(&asset_reader);
+#endif
        do {
 
 #ifdef ENABLE_DECODE
        do {
 
 #ifdef ENABLE_DECODE