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 }