This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/blenlib/intern/fileops.cc
Sybren A. Stüvel 8cf1994455 Fix T93960: Asset Catalogs I/O fails with unicode file paths on Windows
On Windows, encode file paths as UTF-16 before trying to open the file
for reading/writing.

This introduces a new class `blender::fstream`, which wraps
`std::fstream` and provides this UTF-16 encoding. This class should also
be used in other areas, like the Alembic importer/exporter.

Manifest Task: T93960

Reviewed By: JacquesLucke

Differential Revision: https://developer.blender.org/D13633
2021-12-21 15:54:09 +01:00

52 lines
1.4 KiB
C++

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/** \file
* \ingroup bli
*/
#include "BLI_fileops.hh"
#ifdef WIN32
# include "utfconv.h"
#endif
namespace blender {
fstream::fstream(const char *filepath, std::ios_base::openmode mode)
{
this->open(filepath, mode);
}
fstream::fstream(const std::string &filepath, std::ios_base::openmode mode)
{
this->open(filepath, mode);
}
void fstream::open(StringRefNull filepath, ios_base::openmode mode)
{
#ifdef WIN32
const char *filepath_cstr = filepath.c_str();
UTF16_ENCODE(filepath_cstr);
std::wstring filepath_wstr(filepath_cstr_16);
std::fstream::open(filepath_wstr.c_str(), mode);
UTF16_UN_ENCODE(filepath_cstr);
#else
std::fstream::open(filepath, mode);
#endif
}
} // namespace blender