mirror of
https://github.com/SFML/SFML.git
synced 2024-11-25 04:41:05 +08:00
Fall back to stdio when performing file input on Android without an activity.
This commit is contained in:
parent
ca0a231b35
commit
4daeac6459
@ -147,8 +147,8 @@ private:
|
|||||||
// Member data
|
// Member data
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
std::unique_ptr<priv::ResourceStream> m_file;
|
std::unique_ptr<priv::ResourceStream> m_androidFile;
|
||||||
#else
|
#endif
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Deleter for stdio file stream that closes the file stream
|
/// \brief Deleter for stdio file stream that closes the file stream
|
||||||
///
|
///
|
||||||
@ -159,7 +159,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<std::FILE, FileCloser> m_file; //!< stdio file stream
|
std::unique_ptr<std::FILE, FileCloser> m_file; //!< stdio file stream
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <SFML/System/InputStream.hpp>
|
#include <SFML/System/InputStream.hpp>
|
||||||
#include <SFML/System/Utils.hpp>
|
#include <SFML/System/Utils.hpp>
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
#include <SFML/System/Android/Activity.hpp>
|
||||||
#include <SFML/System/Android/ResourceStream.hpp>
|
#include <SFML/System/Android/ResourceStream.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -157,7 +158,15 @@ void Image::create(const Vector2u& size, const std::uint8_t* pixels)
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
bool Image::loadFromFile(const std::filesystem::path& filename)
|
bool Image::loadFromFile(const std::filesystem::path& filename)
|
||||||
{
|
{
|
||||||
#ifndef SFML_SYSTEM_ANDROID
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
|
||||||
|
if (priv::getActivityStatesPtr() != nullptr)
|
||||||
|
{
|
||||||
|
priv::ResourceStream stream(filename);
|
||||||
|
return loadFromStream(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// Clear the array (just in case)
|
// Clear the array (just in case)
|
||||||
m_pixels.clear();
|
m_pixels.clear();
|
||||||
@ -186,13 +195,6 @@ bool Image::loadFromFile(const std::filesystem::path& filename)
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
priv::ResourceStream stream(filename);
|
|
||||||
return loadFromStream(stream);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#include <SFML/System/FileInputStream.hpp>
|
#include <SFML/System/FileInputStream.hpp>
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
#include <SFML/System/Android/Activity.hpp>
|
||||||
#include <SFML/System/Android/ResourceStream.hpp>
|
#include <SFML/System/Android/ResourceStream.hpp>
|
||||||
#endif
|
#endif
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -36,12 +37,10 @@
|
|||||||
namespace sf
|
namespace sf
|
||||||
{
|
{
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#ifndef SFML_SYSTEM_ANDROID
|
|
||||||
void FileInputStream::FileCloser::operator()(std::FILE* file)
|
void FileInputStream::FileCloser::operator()(std::FILE* file)
|
||||||
{
|
{
|
||||||
std::fclose(file);
|
std::fclose(file);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@ -64,69 +63,88 @@ FileInputStream& FileInputStream::operator=(FileInputStream&&) noexcept = defaul
|
|||||||
bool FileInputStream::open(const std::filesystem::path& filename)
|
bool FileInputStream::open(const std::filesystem::path& filename)
|
||||||
{
|
{
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
m_file = std::make_unique<priv::ResourceStream>(filename);
|
if (priv::getActivityStatesPtr() != nullptr)
|
||||||
return m_file->tell() != -1;
|
{
|
||||||
#else
|
m_androidFile = std::make_unique<priv::ResourceStream>(filename);
|
||||||
|
return m_androidFile->tell() != -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef SFML_SYSTEM_WINDOWS
|
#ifdef SFML_SYSTEM_WINDOWS
|
||||||
m_file.reset(_wfopen(filename.c_str(), L"rb"));
|
m_file.reset(_wfopen(filename.c_str(), L"rb"));
|
||||||
#else
|
#else
|
||||||
m_file.reset(std::fopen(filename.c_str(), "rb"));
|
m_file.reset(std::fopen(filename.c_str(), "rb"));
|
||||||
#endif
|
#endif
|
||||||
return m_file != nullptr;
|
return m_file != nullptr;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
std::int64_t FileInputStream::read(void* data, std::int64_t size)
|
std::int64_t FileInputStream::read(void* data, std::int64_t size)
|
||||||
{
|
{
|
||||||
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
if (priv::getActivityStatesPtr() != nullptr)
|
||||||
|
{
|
||||||
|
if (!m_androidFile)
|
||||||
|
return -1;
|
||||||
|
return m_androidFile->read(data, size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
|
||||||
return m_file->read(data, size);
|
|
||||||
#else
|
|
||||||
return static_cast<std::int64_t>(std::fread(data, 1, static_cast<std::size_t>(size), m_file.get()));
|
return static_cast<std::int64_t>(std::fread(data, 1, static_cast<std::size_t>(size), m_file.get()));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
std::int64_t FileInputStream::seek(std::int64_t position)
|
std::int64_t FileInputStream::seek(std::int64_t position)
|
||||||
{
|
{
|
||||||
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
if (priv::getActivityStatesPtr() != nullptr)
|
||||||
|
{
|
||||||
|
if (!m_androidFile)
|
||||||
|
return -1;
|
||||||
|
return m_androidFile->seek(position);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
|
||||||
return m_file->seek(position);
|
|
||||||
#else
|
|
||||||
if (std::fseek(m_file.get(), static_cast<long>(position), SEEK_SET))
|
if (std::fseek(m_file.get(), static_cast<long>(position), SEEK_SET))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return tell();
|
return tell();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
std::int64_t FileInputStream::tell()
|
std::int64_t FileInputStream::tell()
|
||||||
{
|
{
|
||||||
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
if (priv::getActivityStatesPtr() != nullptr)
|
||||||
|
{
|
||||||
|
if (!m_androidFile)
|
||||||
|
return -1;
|
||||||
|
return m_androidFile->tell();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
|
||||||
return m_file->tell();
|
|
||||||
#else
|
|
||||||
return std::ftell(m_file.get());
|
return std::ftell(m_file.get());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
std::int64_t FileInputStream::getSize()
|
std::int64_t FileInputStream::getSize()
|
||||||
{
|
{
|
||||||
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
if (priv::getActivityStatesPtr() != nullptr)
|
||||||
|
{
|
||||||
|
if (!m_androidFile)
|
||||||
|
return -1;
|
||||||
|
return m_androidFile->getSize();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
|
||||||
return m_file->getSize();
|
|
||||||
#else
|
|
||||||
const std::int64_t position = tell();
|
const std::int64_t position = tell();
|
||||||
std::fseek(m_file.get(), 0, SEEK_END);
|
std::fseek(m_file.get(), 0, SEEK_END);
|
||||||
const std::int64_t size = tell();
|
const std::int64_t size = tell();
|
||||||
@ -135,7 +153,6 @@ std::int64_t FileInputStream::getSize()
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
Loading…
Reference in New Issue
Block a user