qBittorrent
io.cpp
Go to the documentation of this file.
1 /*
2  * Bittorrent Client using Qt and libtorrent.
3  * Copyright (C) 2020 Mike Tzou (Chocobo1)
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  * In addition, as a special exception, the copyright holders give permission to
20  * link this program with the OpenSSL project's "OpenSSL" library (or with
21  * modified versions of it that use the same license as the "OpenSSL" library),
22  * and distribute the linked executables. You must obey the GNU General Public
23  * License in all respects for all of the code used other than "OpenSSL". If you
24  * modify file(s), you may extend this exception to your version of the file(s),
25  * but you are not obligated to do so. If you do not wish to do so, delete this
26  * exception statement from your version.
27  */
28 
29 #include "io.h"
30 
31 #include <libtorrent/bencode.hpp>
32 #include <libtorrent/entry.hpp>
33 
34 #include <QByteArray>
35 #include <QFileDevice>
36 #include <QSaveFile>
37 #include <QString>
38 
39 Utils::IO::FileDeviceOutputIterator::FileDeviceOutputIterator(QFileDevice &device, const int bufferSize)
40  : m_device {&device}
41  , m_buffer {std::make_shared<QByteArray>()}
42  , m_bufferSize {bufferSize}
43 {
44  m_buffer->reserve(bufferSize);
45 }
46 
48 {
49  if (m_buffer.use_count() == 1)
50  {
51  if (m_device->error() == QFileDevice::NoError)
52  m_device->write(*m_buffer);
53  m_buffer->clear();
54  }
55 }
56 
58 {
59  m_buffer->append(c);
60  if (m_buffer->size() >= m_bufferSize)
61  {
62  if (m_device->error() == QFileDevice::NoError)
63  m_device->write(*m_buffer);
64  m_buffer->clear();
65  }
66  return *this;
67 }
68 
69 nonstd::expected<void, QString> Utils::IO::saveToFile(const QString &path, const QByteArray &data)
70 {
71  QSaveFile file {path};
72  if (!file.open(QIODevice::WriteOnly) || (file.write(data) != data.size()) || !file.flush() || !file.commit())
73  return nonstd::make_unexpected(file.errorString());
74  return {};
75 }
76 
77 nonstd::expected<void, QString> Utils::IO::saveToFile(const QString &path, const lt::entry &data)
78 {
79  QSaveFile file {path};
80  if (!file.open(QIODevice::WriteOnly))
81  return nonstd::make_unexpected(file.errorString());
82 
83  const int bencodedDataSize = lt::bencode(Utils::IO::FileDeviceOutputIterator {file}, data);
84  if ((file.size() != bencodedDataSize) || !file.flush() || !file.commit())
85  return nonstd::make_unexpected(file.errorString());
86 
87  return {};
88 }
std::shared_ptr< QByteArray > m_buffer
Definition: io.h:79
FileDeviceOutputIterator(QFileDevice &device, const int bufferSize=(4 *1024))
Definition: io.cpp:39
FileDeviceOutputIterator & operator=(char c)
Definition: io.cpp:57
nonstd::expected< void, QString > saveToFile(const QString &path, const QByteArray &data)
Definition: io.cpp:69
file(GLOB QBT_TS_FILES "${qBittorrent_SOURCE_DIR}/src/lang/*.ts") set_source_files_properties($
Definition: CMakeLists.txt:5