added path conversion code for unicode on windows
parent
bd8d3025bd
commit
2f93cd77f8
|
@ -123,7 +123,8 @@ size_t DefaultIOStream::FileSize() const
|
||||||
// https://www.securecoding.cert.org/confluence/display/seccode/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+the+size+of+a+regular+file
|
// https://www.securecoding.cert.org/confluence/display/seccode/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+the+size+of+a+regular+file
|
||||||
#if defined _WIN32 && (!defined __GNUC__ || __MSVCRT_VERSION__ >= 0x0601)
|
#if defined _WIN32 && (!defined __GNUC__ || __MSVCRT_VERSION__ >= 0x0601)
|
||||||
struct __stat64 fileStat;
|
struct __stat64 fileStat;
|
||||||
int err = _stat64( mFilename.c_str(), &fileStat );
|
//using fileno + fstat avoids having to handle the filename
|
||||||
|
int err = _fstat64( _fileno(mFile), &fileStat );
|
||||||
if (0 != err)
|
if (0 != err)
|
||||||
return 0;
|
return 0;
|
||||||
mCachedSize = (size_t) (fileStat.st_size);
|
mCachedSize = (size_t) (fileStat.st_size);
|
||||||
|
|
|
@ -54,31 +54,37 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// maximum path length
|
||||||
// Constructor.
|
// XXX http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
|
||||||
DefaultIOSystem::DefaultIOSystem()
|
#ifdef PATH_MAX
|
||||||
{
|
# define PATHLIMIT PATH_MAX
|
||||||
// nothing to do here
|
#else
|
||||||
}
|
# define PATHLIMIT 4096
|
||||||
|
#endif
|
||||||
// ------------------------------------------------------------------------------------------------
|
|
||||||
// Destructor.
|
|
||||||
DefaultIOSystem::~DefaultIOSystem()
|
|
||||||
{
|
|
||||||
// nothing to do here
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Tests for the existence of a file at the given path.
|
// Tests for the existence of a file at the given path.
|
||||||
bool DefaultIOSystem::Exists( const char* pFile) const
|
bool DefaultIOSystem::Exists( const char* pFile) const
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
wchar_t fileName16[PATHLIMIT];
|
||||||
|
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, pFile, -1, fileName16, PATHLIMIT);
|
||||||
|
struct _stat64 filestat;
|
||||||
|
if (0 != _wstat64(fileName16, &filestat))
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
FILE* file = ::fopen( pFile, "rb");
|
FILE* file = ::fopen( pFile, "rb");
|
||||||
if( !file)
|
if( !file)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
::fclose( file);
|
::fclose( file);
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,10 +94,17 @@ IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode)
|
||||||
{
|
{
|
||||||
ai_assert(NULL != strFile);
|
ai_assert(NULL != strFile);
|
||||||
ai_assert(NULL != strMode);
|
ai_assert(NULL != strMode);
|
||||||
|
FILE* file;
|
||||||
FILE* file = ::fopen( strFile, strMode);
|
#ifdef _WIN32
|
||||||
if( NULL == file)
|
wchar_t fileName16[PATHLIMIT];
|
||||||
return NULL;
|
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, strFile, -1, fileName16, PATHLIMIT);
|
||||||
|
std::string mode8(strMode);
|
||||||
|
file = ::_wfopen(fileName16, std::wstring(mode8.begin(), mode8.end()).c_str());
|
||||||
|
#else
|
||||||
|
file = ::fopen(strFile, strMode);
|
||||||
|
#endif
|
||||||
|
if (nullptr == file)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
return new DefaultIOStream(file, (std::string) strFile);
|
return new DefaultIOStream(file, (std::string) strFile);
|
||||||
}
|
}
|
||||||
|
@ -121,25 +134,23 @@ bool IOSystem::ComparePaths (const char* one, const char* second) const
|
||||||
return !ASSIMP_stricmp(one,second);
|
return !ASSIMP_stricmp(one,second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// maximum path length
|
|
||||||
// XXX http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
|
|
||||||
#ifdef PATH_MAX
|
|
||||||
# define PATHLIMIT PATH_MAX
|
|
||||||
#else
|
|
||||||
# define PATHLIMIT 4096
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Convert a relative path into an absolute path
|
// Convert a relative path into an absolute path
|
||||||
inline void MakeAbsolutePath (const char* in, char* _out)
|
inline static void MakeAbsolutePath (const char* in, char* _out)
|
||||||
{
|
{
|
||||||
ai_assert(in && _out);
|
ai_assert(in && _out);
|
||||||
char* ret;
|
|
||||||
#if defined( _MSC_VER ) || defined( __MINGW32__ )
|
#if defined( _MSC_VER ) || defined( __MINGW32__ )
|
||||||
ret = ::_fullpath( _out, in, PATHLIMIT );
|
wchar_t out16[PATHLIMIT];
|
||||||
|
wchar_t in16[PATHLIMIT];
|
||||||
|
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, in, -1, out16, PATHLIMIT);
|
||||||
|
wchar_t* ret = ::_wfullpath( out16, in16, PATHLIMIT );
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
WideCharToMultiByte(CP_UTF8, MB_PRECOMPOSED, out16, -1, _out, PATHLIMIT, nullptr, nullptr);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// use realpath
|
// use realpath
|
||||||
ret = realpath(in, _out);
|
char* ret = realpath(in, _out);
|
||||||
#endif
|
#endif
|
||||||
if(!ret) {
|
if(!ret) {
|
||||||
// preserve the input path, maybe someone else is able to fix
|
// preserve the input path, maybe someone else is able to fix
|
||||||
|
|
|
@ -52,12 +52,6 @@ namespace Assimp {
|
||||||
class ASSIMP_API DefaultIOSystem : public IOSystem
|
class ASSIMP_API DefaultIOSystem : public IOSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** Constructor. */
|
|
||||||
DefaultIOSystem();
|
|
||||||
|
|
||||||
/** Destructor. */
|
|
||||||
~DefaultIOSystem();
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
/** Tests for the existence of a file at the given path. */
|
/** Tests for the existence of a file at the given path. */
|
||||||
bool Exists( const char* pFile) const;
|
bool Exists( const char* pFile) const;
|
||||||
|
|
Loading…
Reference in New Issue