PulseView  unreleased development snapshot
A Qt-based sigrok GUI
assetreader.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2015 Daniel Elstner <daniel.kitta@gmail.com>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "assetreader.hpp"
21 
22 #include <memory>
23 
24 #include <QtCore/QDebug>
25 #include <QtCore/QFile>
26 #include <QtCore/QStandardPaths>
27 
28 #include <libsigrok/libsigrok.h>
29 
30 using namespace pv;
31 
32 using std::string;
33 using std::unique_ptr;
34 
35 void AndroidAssetReader::open(struct sr_resource *res, string name)
36 {
37  if (res->type == SR_RESOURCE_FIRMWARE) {
38  auto path = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
39  QString::fromStdString("sigrok-firmware/" + name));
40  if (path.isEmpty())
41  path = QString::fromStdString("assets:/sigrok-firmware/" + name);
42 
43  unique_ptr<QFile> file {new QFile{path}};
44 
45  if (!file->open(QIODevice::ReadOnly))
46  throw sigrok::Error{SR_ERR};
47 
48  const auto size = file->size();
49  if (size < 0)
50  throw sigrok::Error{SR_ERR};
51 
52  res->size = size;
53  res->handle = file.release();
54  } else {
55  qWarning() << "AndroidAssetReader: Unknown resource type" << res->type;
56  throw sigrok::Error{SR_ERR};
57  }
58 }
59 
60 void AndroidAssetReader::close(struct sr_resource *res)
61 {
62  if (!res->handle) {
63  qCritical("AndroidAssetReader: Invalid handle");
64  throw sigrok::Error{SR_ERR_ARG};
65  }
66  const unique_ptr<QFile> file {static_cast<QFile*>(res->handle)};
67  res->handle = nullptr;
68 
69  file->close();
70 }
71 
72 size_t AndroidAssetReader::read(const struct sr_resource *res, void *buf, size_t count)
73 {
74  if (!res->handle) {
75  qCritical("AndroidAssetReader: Invalid handle");
76  throw sigrok::Error{SR_ERR_ARG};
77  }
78  auto *const file = static_cast<QFile*>(res->handle);
79 
80  const auto n_read = file->read(static_cast<char*>(buf), count);
81  if (n_read < 0)
82  throw sigrok::Error{SR_ERR};
83 
84  return n_read;
85 }
void open(struct sr_resource *res, string name) override
Definition: assetreader.cpp:35
size_t read(const struct sr_resource *res, void *buf, size_t count) override
Definition: assetreader.cpp:72
libsigrok allows users to import and export data from files in various formats some of them as generic as others very specific For a list and make sure to check not so common and outright exotic ways to represent data and sigrok tries to suit as many needs as it can To see which formats your version of PulseView just click on the small arrow next to the _Open_ PulseView will ask for the file name to open Once you picked the file
void close(struct sr_resource *res) override
Definition: assetreader.cpp:60