Replace unique_ptr and add custom deleter

pull/3385/head
Joshua Hyatt 2020-09-01 10:30:31 -06:00
parent dcf9a7b2d8
commit 638499a278
2 changed files with 15 additions and 13 deletions

View File

@ -141,8 +141,11 @@ void FBXImporter::SetupProperties(const Importer *pImp) {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Imports the given file into the given scene structure. // Imports the given file into the given scene structure.
void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) { void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) {
IOStream* pStream = pIOHandler->Open(pFile, "rb"); auto streamCloser = [&](IOStream *pStream) {
if (!pStream) { pIOHandler->Close(pStream);
};
std::unique_ptr<IOStream, decltype(streamCloser)> stream(pIOHandler->Open(pFile, "rb"), streamCloser);
if (!stream) {
ThrowException("Could not open file for reading"); ThrowException("Could not open file for reading");
} }
@ -154,13 +157,11 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
// streaming for its output data structures so the net win with // streaming for its output data structures so the net win with
// streaming input data would be very low. // streaming input data would be very low.
std::vector<char> contents; std::vector<char> contents;
contents.resize(pStream->FileSize() + 1); contents.resize(stream->FileSize() + 1);
pStream->Read(&*contents.begin(), 1, contents.size() - 1); stream->Read(&*contents.begin(), 1, contents.size() - 1);
contents[contents.size() - 1] = 0; contents[contents.size() - 1] = 0;
const char *const begin = &*contents.begin(); const char *const begin = &*contents.begin();
pIOHandler->Close(pStream);
// broadphase tokenizing pass in which we identify the core // broadphase tokenizing pass in which we identify the core
// syntax elements of FBX (brackets, commas, key:value mappings) // syntax elements of FBX (brackets, commas, key:value mappings)
TokenList tokens; TokenList tokens;

View File

@ -107,22 +107,25 @@ const aiImporterDesc *ObjFileImporter::GetInfo() const {
void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) { void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) {
// Read file into memory // Read file into memory
static const std::string mode = "rb"; static const std::string mode = "rb";
IOStream *pFileStream = pIOHandler->Open(file, mode); auto streamCloser = [&](IOStream *pStream) {
if (!pFileStream) { pIOHandler->Close(pStream);
};
std::unique_ptr<IOStream, decltype(streamCloser)> fileStream(pIOHandler->Open(file, mode), streamCloser);
if (!fileStream.get()) {
throw DeadlyImportError("Failed to open file " + file + "."); throw DeadlyImportError("Failed to open file " + file + ".");
} }
// Get the file-size and validate it, throwing an exception when fails // Get the file-size and validate it, throwing an exception when fails
size_t fileSize = pFileStream->FileSize(); size_t fileSize = fileStream->FileSize();
if (fileSize < ObjMinSize) { if (fileSize < ObjMinSize) {
throw DeadlyImportError("OBJ-file is too small."); throw DeadlyImportError("OBJ-file is too small.");
} }
IOStreamBuffer<char> streamedBuffer; IOStreamBuffer<char> streamedBuffer;
streamedBuffer.open(pFileStream); streamedBuffer.open(fileStream.get());
// Allocate buffer and read file into it // Allocate buffer and read file into it
//TextFileToBuffer( pFileStream,m_Buffer); //TextFileToBuffer( fileStream.get(),m_Buffer);
// Get the model name // Get the model name
std::string modelName, folderName; std::string modelName, folderName;
@ -145,8 +148,6 @@ void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, I
streamedBuffer.close(); streamedBuffer.close();
pIOHandler->Close(pFileStream);
// Clean up allocated storage for the next import // Clean up allocated storage for the next import
m_Buffer.clear(); m_Buffer.clear();