Fix Bug #1649 (Save dialog does not close automatically)
[pulseview.git] / android / assetreader.cpp
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 }