Merge pull request #974 from assimp/issue_901

closes https://github.com/assimp/assimp/issues/901
pull/976/head
Kim Kulling 2016-08-12 19:38:09 +02:00 committed by GitHub
commit e2a1a2f751
3 changed files with 32 additions and 16 deletions

View File

@ -55,6 +55,7 @@ DefaultIOStream::~DefaultIOStream()
{ {
if (mFile) { if (mFile) {
::fclose(mFile); ::fclose(mFile);
mFile = nullptr;
} }
} }
@ -109,9 +110,9 @@ size_t DefaultIOStream::FileSize() const
return 0; return 0;
} }
if (SIZE_MAX == cachedSize) { if (SIZE_MAX == mCachedSize ) {
// Although fseek/ftell would allow us to reuse the exising file handle here, // Although fseek/ftell would allow us to reuse the existing file handle here,
// it is generally unsafe because: // it is generally unsafe because:
// - For binary streams, it is not technically well-defined // - For binary streams, it is not technically well-defined
// - For text files the results are meaningless // - For text files the results are meaningless
@ -124,16 +125,19 @@ size_t DefaultIOStream::FileSize() const
int err = _stat64( mFilename.c_str(), &fileStat ); int err = _stat64( mFilename.c_str(), &fileStat );
if (0 != err) if (0 != err)
return 0; return 0;
cachedSize = (size_t) (fileStat.st_size); mCachedSize = (size_t) (fileStat.st_size);
#else #elif defined __gnu_linux__ || defined __APPLE__ || defined __MACH__
struct stat fileStat; struct stat fileStat;
int err = stat(mFilename.c_str(), &fileStat ); int err = stat(mFilename.c_str(), &fileStat );
if (0 != err) if (0 != err)
return 0; return 0;
cachedSize = (size_t) (fileStat.st_size); const unsigned long long cachedSize = fileStat.st_size;
mCachedSize = static_cast< size_t >( cachedSize );
#else
# error "Unknown platform"
#endif #endif
} }
return cachedSize; return mCachedSize;
} }
// ---------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------

View File

@ -111,7 +111,7 @@ private:
std::string mFilename; std::string mFilename;
// Cached file size // Cached file size
mutable size_t cachedSize; mutable size_t mCachedSize;
}; };
@ -119,7 +119,7 @@ private:
inline DefaultIOStream::DefaultIOStream () : inline DefaultIOStream::DefaultIOStream () :
mFile (NULL), mFile (NULL),
mFilename (""), mFilename (""),
cachedSize (SIZE_MAX) mCachedSize(SIZE_MAX)
{ {
// empty // empty
} }
@ -130,7 +130,7 @@ inline DefaultIOStream::DefaultIOStream (FILE* pFile,
const std::string &strFilename) : const std::string &strFilename) :
mFile(pFile), mFile(pFile),
mFilename(strFilename), mFilename(strFilename),
cachedSize (SIZE_MAX) mCachedSize(SIZE_MAX)
{ {
// empty // empty
} }

View File

@ -52,13 +52,25 @@ public:
// empty // empty
} }
TestDefaultIOStream( FILE* pFile, const std::string &strFilename )
: DefaultIOStream( pFile, strFilename ) {
// empty
}
virtual ~TestDefaultIOStream() { virtual ~TestDefaultIOStream() {
// empty // empty
} }
}; };
TEST_F( utDefaultIOStream, FileSizeTest ) { TEST_F( utDefaultIOStream, FileSizeTest ) {
TestDefaultIOStream myStream; char buffer[ L_tmpnam ];
tmpnam( buffer );
std::FILE *fs( std::fopen( buffer, "w+" ) );
size_t written( std::fwrite( buffer, 1, sizeof( char ) * L_tmpnam, fs ) );
std::fflush( fs );
TestDefaultIOStream myStream( fs, buffer );
size_t size = myStream.FileSize(); size_t size = myStream.FileSize();
EXPECT_EQ( size, 0 ); EXPECT_EQ( size, sizeof( char ) * L_tmpnam );
remove( buffer );
} }