2015-09-27 07:14:11 +08:00
|
|
|
/*
|
|
|
|
* 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"
|
2017-03-28 14:30:43 +08:00
|
|
|
|
2015-09-27 07:14:11 +08:00
|
|
|
#include <memory>
|
2017-03-28 14:30:43 +08:00
|
|
|
|
2015-09-27 07:14:11 +08:00
|
|
|
#include <QtCore/QDebug>
|
|
|
|
#include <QtCore/QFile>
|
2015-10-01 20:59:03 +08:00
|
|
|
#include <QtCore/QStandardPaths>
|
2015-09-27 07:14:11 +08:00
|
|
|
|
2017-03-28 14:30:43 +08:00
|
|
|
#include <libsigrok/libsigrok.h>
|
|
|
|
|
2015-09-27 07:14:11 +08:00
|
|
|
using namespace pv;
|
|
|
|
|
2017-03-16 06:16:05 +08:00
|
|
|
using std::string;
|
|
|
|
using std::unique_ptr;
|
|
|
|
|
|
|
|
void AndroidAssetReader::open(struct sr_resource *res, string name)
|
2015-09-27 07:14:11 +08:00
|
|
|
{
|
|
|
|
if (res->type == SR_RESOURCE_FIRMWARE) {
|
2015-10-01 20:59:03 +08:00
|
|
|
auto path = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
|
|
|
|
QString::fromStdString("sigrok-firmware/" + name));
|
|
|
|
if (path.isEmpty())
|
|
|
|
path = QString::fromStdString("assets:/sigrok-firmware/" + name);
|
|
|
|
|
2017-03-16 06:16:05 +08:00
|
|
|
unique_ptr<QFile> file {new QFile{path}};
|
2015-09-27 07:14:11 +08:00
|
|
|
|
|
|
|
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};
|
|
|
|
}
|
2017-03-16 06:16:05 +08:00
|
|
|
const unique_ptr<QFile> file {static_cast<QFile*>(res->handle)};
|
2015-09-27 07:14:11 +08:00
|
|
|
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;
|
|
|
|
}
|