From d2f81f30ab8fa3da0be2ab3a8aad189daba77ba4 Mon Sep 17 00:00:00 2001 From: SSimco <37044560+SSimco@users.noreply.github.com> Date: Wed, 30 Oct 2024 19:33:40 +0200 Subject: [PATCH] Refactored contenturi stream --- src/Cafe/TitleList/TitleInfo.cpp | 6 +++--- src/Cafe/TitleList/TitleList.cpp | 4 ++-- src/Common/CMakeLists.txt | 2 +- src/Common/unix/ContentUriIStream.h | 26 ----------------------- src/Common/unix/ContentUriStream.h | 20 +++++++++++++++++ src/Common/unix/FileStream_contentUri.cpp | 20 ++++++++--------- src/Common/unix/FileStream_contentUri.h | 4 ++-- 7 files changed, 38 insertions(+), 44 deletions(-) delete mode 100644 src/Common/unix/ContentUriIStream.h create mode 100644 src/Common/unix/ContentUriStream.h diff --git a/src/Cafe/TitleList/TitleInfo.cpp b/src/Cafe/TitleList/TitleInfo.cpp index 2c9ce392..c3e1db05 100644 --- a/src/Cafe/TitleList/TitleInfo.cpp +++ b/src/Cafe/TitleList/TitleInfo.cpp @@ -6,7 +6,7 @@ #include "Common/FileStream.h" #if __ANDROID__ -#include "Common/unix/ContentUriIStream.h" +#include "Common/unix/ContentUriStream.h" #endif // __ANDROID__ #include @@ -228,7 +228,7 @@ bool TitleInfo::DetectFormat(const fs::path& path, fs::path& pathOut, TitleDataF ZArchiveReader* zar = nullptr; #if __ANDROID__ if(FilesystemAndroid::isContentUri(path)) - zar = ZArchiveReader::OpenFromStream(std::make_unique(path)); + zar = ZArchiveReader::OpenFromStream(std::make_unique(path)); else #endif // __ANDROID__ zar = ZArchiveReader::OpenFromFile(path); @@ -369,7 +369,7 @@ ZArchiveReader* _ZArchivePool_AcquireInstance(const fs::path& path) ZArchiveReader* zar = nullptr; #if __ANDROID__ if(FilesystemAndroid::isContentUri(path)) - zar = ZArchiveReader::OpenFromStream(std::make_unique(path)); + zar = ZArchiveReader::OpenFromStream(std::make_unique(path)); else #endif // __ANDROID__ zar = ZArchiveReader::OpenFromFile(path); diff --git a/src/Cafe/TitleList/TitleList.cpp b/src/Cafe/TitleList/TitleList.cpp index fbf8d4a7..e4da9db1 100644 --- a/src/Cafe/TitleList/TitleList.cpp +++ b/src/Cafe/TitleList/TitleList.cpp @@ -5,7 +5,7 @@ #if __ANDROID__ #include "Common/unix/FilesystemAndroid.h" -#include "Common/unix/ContentUriIStream.h" +#include "Common/unix/ContentUriStream.h" #endif // __ANDROID__ #include @@ -224,7 +224,7 @@ void CafeTitleList::AddTitleFromPath(fs::path path) ZArchiveReader* zar = nullptr; #if __ANDROID__ if(FilesystemAndroid::isContentUri(path)) - zar = ZArchiveReader::OpenFromStream(std::make_unique(path)); + zar = ZArchiveReader::OpenFromStream(std::make_unique(path)); else #endif // __ANDROID__ zar = ZArchiveReader::OpenFromFile(path); diff --git a/src/Common/CMakeLists.txt b/src/Common/CMakeLists.txt index ad41e662..6cf8d9f4 100644 --- a/src/Common/CMakeLists.txt +++ b/src/Common/CMakeLists.txt @@ -56,7 +56,7 @@ endif() if(ANDROID) target_sources(CemuCommon PRIVATE - unix/ContentUriIStream.h + unix/ContentUriStream.h unix/FilesystemAndroid.cpp unix/FilesystemAndroid.h unix/FileStream_contentUri.cpp diff --git a/src/Common/unix/ContentUriIStream.h b/src/Common/unix/ContentUriIStream.h deleted file mode 100644 index 91b94d80..00000000 --- a/src/Common/unix/ContentUriIStream.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include - -#include "Common/unix/FilesystemAndroid.h" - -class ContentUriIStream : public std::istream -{ - public: - ContentUriIStream(const std::filesystem::path& path) - : m_fd(FilesystemAndroid::openContentUri(path)), - m_fileDescriptorStreamBuffer(m_fd, boost::iostreams::close_handle), - std::istream(&m_fileDescriptorStreamBuffer) {} - - virtual ~ContentUriIStream() = default; - - inline bool isOpen() const - { - return m_fd != -1; - } - - private: - int m_fd; - boost::iostreams::stream_buffer m_fileDescriptorStreamBuffer; -}; diff --git a/src/Common/unix/ContentUriStream.h b/src/Common/unix/ContentUriStream.h new file mode 100644 index 00000000..7532ddd3 --- /dev/null +++ b/src/Common/unix/ContentUriStream.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +#include "Common/unix/FilesystemAndroid.h" + +using fd_streambuf = boost::iostreams::stream_buffer; + +class ContentUriStream : public fd_streambuf, public std::istream +{ + public: + explicit ContentUriStream(const std::filesystem::path& path) + : fd_streambuf(FilesystemAndroid::openContentUri(path), boost::iostreams::close_handle), std::istream(this) {} + + bool is_open() + { + return component()->is_open(); + } +}; \ No newline at end of file diff --git a/src/Common/unix/FileStream_contentUri.cpp b/src/Common/unix/FileStream_contentUri.cpp index 2a7bf934..e4448710 100644 --- a/src/Common/unix/FileStream_contentUri.cpp +++ b/src/Common/unix/FileStream_contentUri.cpp @@ -1,6 +1,6 @@ #include "FileStream_contentUri.h" -#include "unix/ContentUriIStream.h" +#include "unix/ContentUriStream.h" void ThrowWriteNotSupportedError() { @@ -11,16 +11,16 @@ void FileStreamContentUri::SetPosition(uint64 pos) { if (!m_isValid) return; - m_contentUriIStream.seekg((std::streampos)pos); + m_contentUriStream.seekg((std::streampos)pos); } uint64 FileStreamContentUri::GetSize() { cemu_assert(m_isValid); - auto currentPos = m_contentUriIStream.tellg(); - m_contentUriIStream.seekg(0, std::ios::end); - auto fileSize = m_contentUriIStream.tellg(); - m_contentUriIStream.seekg(currentPos, std::ios::beg); + auto currentPos = m_contentUriStream.tellg(); + m_contentUriStream.seekg(0, std::ios::end); + auto fileSize = m_contentUriStream.tellg(); + m_contentUriStream.seekg(currentPos, std::ios::beg); uint64 fs = (uint64)fileSize; return fs; } @@ -42,8 +42,8 @@ void FileStreamContentUri::extract(std::vector& data) uint32 FileStreamContentUri::readData(void* data, uint32 length) { - m_contentUriIStream.read((char*)data, length); - size_t bytesRead = m_contentUriIStream.gcount(); + m_contentUriStream.read((char*)data, length); + size_t bytesRead = m_contentUriStream.gcount(); return (uint32)bytesRead; } @@ -116,7 +116,7 @@ void FileStreamContentUri::writeLine(const char* str) } FileStreamContentUri::FileStreamContentUri(const std::string& uri) - : m_contentUriIStream(uri) + : m_contentUriStream(uri) { - m_isValid = m_contentUriIStream.isOpen(); + m_isValid = m_contentUriStream.is_open(); } diff --git a/src/Common/unix/FileStream_contentUri.h b/src/Common/unix/FileStream_contentUri.h index 907dda2e..5dbad151 100644 --- a/src/Common/unix/FileStream_contentUri.h +++ b/src/Common/unix/FileStream_contentUri.h @@ -1,7 +1,7 @@ #pragma once #include "Common/FileStream.h" -#include "Common/unix/ContentUriIStream.h" +#include "Common/unix/ContentUriStream.h" class FileStreamContentUri : public FileStream { @@ -32,6 +32,6 @@ class FileStreamContentUri : public FileStream private: friend class FileStream; FileStreamContentUri(const std::string& uri); - ContentUriIStream m_contentUriIStream; + ContentUriStream m_contentUriStream; bool m_isValid = false; };