Browse Source

assimp/issues/702: fix resource leak and use initializer list for all
attributes of the loader instance.

Kim Kulling 9 years ago
parent
commit
6641188a8e
3 changed files with 45 additions and 14 deletions
  1. 32 13
      code/ColladaParser.cpp
  2. 0 1
      code/DefaultIOSystem.cpp
  3. 13 0
      code/OpenGEXImporter.cpp

+ 32 - 13
code/ColladaParser.cpp

@@ -65,27 +65,46 @@ using namespace Assimp::Collada;
 // Constructor to be privately used by Importer
 // Constructor to be privately used by Importer
 ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile)
 ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile)
     : mFileName( pFile)
     : mFileName( pFile)
+    , mReader( NULL )
+    , mDataLibrary()
+    , mAccessorLibrary()
+    , mMeshLibrary()
+    , mNodeLibrary()
+    , mImageLibrary()
+    , mEffectLibrary()
+    , mMaterialLibrary()
+    , mLightLibrary()
+    , mCameraLibrary()
+    , mControllerLibrary()
+    , mRootNode( NULL )
+    , mAnims()
+    , mUnitSize( 1.0f )
+    , mUpDirection( UP_Y )
+    , mFormat(FV_1_5_n )    // We assume the newest file format by default
 {
 {
-    mRootNode = NULL;
-    mUnitSize = 1.0f;
-    mUpDirection = UP_Y;
-
-    // We assume the newest file format by default
-    mFormat = FV_1_5_n;
+    // Validate io-handler instance
+    if ( NULL == pIOHandler ) {
+        throw DeadlyImportError("IOSystem is NULL." );
+    }
 
 
-  // open the file
-  boost::scoped_ptr<IOStream> file( pIOHandler->Open( pFile));
-  if( file.get() == NULL)
-    throw DeadlyImportError( "Failed to open file " + pFile + ".");
+    // open the file
+    boost::scoped_ptr<IOStream> file( pIOHandler->Open( pFile ) );
+    if ( file.get() == NULL ) {
+        throw DeadlyImportError( "Failed to open file " + pFile + "." );
+    }
 
 
     // generate a XML reader for it
     // generate a XML reader for it
-  boost::scoped_ptr<CIrrXML_IOStreamReader> mIOWrapper( new CIrrXML_IOStreamReader( file.get()));
+    boost::scoped_ptr<CIrrXML_IOStreamReader> mIOWrapper( new CIrrXML_IOStreamReader( file.get()));
     mReader = irr::io::createIrrXMLReader( mIOWrapper.get());
     mReader = irr::io::createIrrXMLReader( mIOWrapper.get());
-    if( !mReader)
-        ThrowException( "Collada: Unable to open file.");
+    if (!mReader) {
+        ThrowException("Collada: Unable to open file.");
+    }
 
 
     // start reading
     // start reading
     ReadContents();
     ReadContents();
+
+    // Release file after import
+    pIOHandler->Close( file.get() );
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------

+ 0 - 1
code/DefaultIOSystem.cpp

@@ -176,7 +176,6 @@ std::string DefaultIOSystem::fileName( const std::string &path )
     return ret;
     return ret;
 }
 }
 
 
-
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 std::string DefaultIOSystem::completeBaseName( const std::string &path )
 std::string DefaultIOSystem::completeBaseName( const std::string &path )
 {
 {

+ 13 - 0
code/OpenGEXImporter.cpp

@@ -801,6 +801,19 @@ void OpenGEXImporter::handleColorNode( ODDLParser::DDLNode *node, aiScene *pScen
     }
     }
 }
 }
 
 
+//------------------------------------------------------------------------------------------------
+bool isSpecialRootDir(aiString &texName) {
+    if (texName.length < 2) {
+        return false;
+    }
+
+    if (texName.data[0] = '/' || texName.data[1] == '/') {
+        return true;
+    }
+
+    return false;
+}
+
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------
 void OpenGEXImporter::handleTextureNode( ODDLParser::DDLNode *node, aiScene *pScene ) {
 void OpenGEXImporter::handleTextureNode( ODDLParser::DDLNode *node, aiScene *pScene ) {
     if( NULL == node ) {
     if( NULL == node ) {