X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;ds=sidebyside;f=android%2Fassetreader.cpp;fp=android%2Fassetreader.cpp;h=bf76704a8b873f724f526ab773e62c4a46562f7b;hb=dddff2e7c658aa84f67186ade0a4845b5fb0b43f;hp=0000000000000000000000000000000000000000;hpb=05b2276928535ae1f8e16b6f9c89802d8d261fee;p=pulseview.git diff --git a/android/assetreader.cpp b/android/assetreader.cpp new file mode 100644 index 0000000..bf76704 --- /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; +}