File indexing completed on 2024-04-21 04:57:27

0001 /*
0002  * SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de>
0003  * SPDX-License-Identifier: GPL-2.0-or-later
0004  */
0005 
0006 #include "afcfile.h"
0007 
0008 #include "afc_debug.h"
0009 
0010 #include "afcfilereader.h"
0011 #include "afcutils.h"
0012 
0013 #include <limits>
0014 
0015 using namespace KIO;
0016 
0017 AfcFileReader::AfcFileReader(const AfcClient::Ptr &client, uint64_t handle)
0018     : m_client(client)
0019     , m_handle(handle)
0020 {
0021 }
0022 
0023 filesize_t AfcFileReader::size() const
0024 {
0025     return m_size;
0026 }
0027 
0028 void AfcFileReader::setSize(filesize_t size)
0029 {
0030     m_size = size;
0031     m_remainingSize = size;
0032     m_data.clear();
0033 }
0034 
0035 WorkerResult AfcFileReader::read()
0036 {
0037     m_data.clear();
0038 
0039     if (m_remainingSize == 0) {
0040         return WorkerResult::pass();
0041     }
0042 
0043     int bytesToRead = std::numeric_limits<int>::max();
0044     if (m_remainingSize < static_cast<filesize_t>(bytesToRead)) {
0045         bytesToRead = m_remainingSize;
0046     }
0047 
0048     if (m_data.length() < bytesToRead) {
0049         m_data.resize(bytesToRead);
0050     }
0051 
0052     uint32_t bytesRead = 0;
0053     afc_error_t ret = afc_file_read(m_client->internalClient(), m_handle, m_data.data(), bytesToRead, &bytesRead);
0054     m_data.resize(bytesRead);
0055 
0056     if (ret != AFC_E_SUCCESS && ret != AFC_E_END_OF_DATA) {
0057         return AfcUtils::Result::from(ret);
0058     }
0059 
0060     m_remainingSize -= bytesRead;
0061     return WorkerResult::pass();
0062 }
0063 
0064 QByteArray AfcFileReader::data() const
0065 {
0066     return m_data;
0067 }
0068 
0069 bool AfcFileReader::hasMore() const
0070 {
0071     return m_remainingSize > 0;
0072 }