2
0
Эх сурвалжийг харах

Merge pull request #974 from assimp/issue_901

closes https://github.com/assimp/assimp/issues/901
Kim Kulling 9 жил өмнө
parent
commit
e2a1a2f751

+ 10 - 6
code/DefaultIOStream.cpp

@@ -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);
-#else
+        mCachedSize = (size_t) (fileStat.st_size);
+#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;
 }
 }
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------

+ 7 - 7
code/DefaultIOStream.h

@@ -59,11 +59,11 @@ class ASSIMP_API DefaultIOStream : public IOStream
 {
 {
     friend class DefaultIOSystem;
     friend class DefaultIOSystem;
 #if __ANDROID__
 #if __ANDROID__
-#if __ANDROID_API__ > 9
-#if defined(AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
+# if __ANDROID_API__ > 9
+#  if defined(AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
     friend class AndroidJNIIOSystem;
     friend class AndroidJNIIOSystem;
-#endif // defined(AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
-#endif // __ANDROID_API__ > 9
+#  endif // defined(AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
+# endif // __ANDROID_API__ > 9
 #endif // __ANDROID__
 #endif // __ANDROID__
 
 
 protected:
 protected:
@@ -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
 }
 }

+ 15 - 3
test/unit/utDefaultIOStream.cpp

@@ -48,7 +48,12 @@ class utDefaultIOStream : public ::testing::Test {
 class TestDefaultIOStream : public DefaultIOStream {
 class TestDefaultIOStream : public DefaultIOStream {
 public:
 public:
     TestDefaultIOStream()
     TestDefaultIOStream()
-        : DefaultIOStream() {
+    : DefaultIOStream() {
+        // empty
+    }
+
+    TestDefaultIOStream( FILE* pFile, const std::string &strFilename )
+    : DefaultIOStream( pFile, strFilename ) {
         // empty
         // empty
     }
     }
 
 
@@ -58,7 +63,14 @@ public:
 };
 };
 
 
 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 );
 }
 }