closes https://github.com/assimp/assimp/issues/3178: throw exception in case of invalid export stream.

pull/3197/head
Kim Kulling 2020-05-02 21:06:55 +02:00
parent f8e6512a63
commit 3329e76263
1 changed files with 81 additions and 93 deletions

View File

@ -9,16 +9,16 @@ Licensed under a 3-clause BSD license. See the LICENSE file for more information
#ifndef ASSIMP_BUILD_NO_EXPORT
#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/Exporter.hpp>
#include <assimp/IOStream.hpp>
#include <assimp/IOSystem.hpp>
#include <assimp/scene.h>
#include <assimp/Importer.hpp>
#include <sstream>
#include <limits>
#include <cassert>
#include <limits>
#include <memory>
#include <sstream>
#define CURRENT_FORMAT_VERSION 100
@ -42,10 +42,8 @@ public:
Flag_WriteSpecialFloats = 0x2,
};
JSONWriter(Assimp::IOStream& out, unsigned int flags = 0u)
: out(out)
, first()
, flags(flags) {
JSONWriter(Assimp::IOStream &out, unsigned int flags = 0u) :
out(out), first(), flags(flags) {
// make sure that all formatting happens using the standard, C locale and not the user's current locale
buff.imbue(std::locale("C"));
}
@ -156,8 +154,7 @@ public:
void Delimit() {
if (!first) {
buff << ',';
}
else {
} else {
buff << ' ';
first = false;
}
@ -468,8 +465,7 @@ void Write(JSONWriter& out, const aiMaterial& ai, bool is_elem = true) {
out.Element(reinterpret_cast<float *>(prop->mData)[ii]);
}
out.EndArray();
}
else {
} else {
out.SimpleValue(*reinterpret_cast<float *>(prop->mData));
}
break;
@ -486,19 +482,15 @@ void Write(JSONWriter& out, const aiMaterial& ai, bool is_elem = true) {
}
break;
case aiPTI_String:
{
case aiPTI_String: {
aiString s;
aiGetMaterialString(&ai, prop->mKey.data, prop->mSemantic, prop->mIndex, &s);
out.SimpleValue(s);
}
break;
case aiPTI_Buffer:
{
} break;
case aiPTI_Buffer: {
// binary data is written as series of hex-encoded octets
out.SimpleValue(prop->mData, prop->mDataLength);
}
break;
} break;
default:
assert(false);
}
@ -525,8 +517,7 @@ void Write(JSONWriter& out, const aiTexture& ai, bool is_elem = true) {
out.Key("data");
if (!ai.mHeight) {
out.SimpleValue(ai.pcData, ai.mWidth);
}
else {
} else {
out.StartArray();
for (unsigned int y = 0; y < ai.mHeight; ++y) {
out.StartArray(true);
@ -585,7 +576,6 @@ void Write(JSONWriter& out, const aiLight& ai, bool is_elem = true) {
if (ai.mType != aiLightSource_POINT) {
out.Key("direction");
Write(out, ai.mDirection, false);
}
if (ai.mType != aiLightSource_DIRECTIONAL) {
@ -774,11 +764,10 @@ void Write(JSONWriter& out, const aiScene& ai) {
out.EndObj();
}
void ExportAssimp2Json(const char *file, Assimp::IOSystem *io, const aiScene *scene, const Assimp::ExportProperties *) {
std::unique_ptr<Assimp::IOStream> str(io->Open(file, "wt"));
if (!str) {
//throw Assimp::DeadlyExportError("could not open output file");
throw Assimp::DeadlyExportError("could not open output file");
}
// get a copy of the scene so we can modify it
@ -795,15 +784,14 @@ void ExportAssimp2Json(const char* file, Assimp::IOSystem* io, const aiScene* sc
JSONWriter s(*str, JSONWriter::Flag_WriteSpecialFloats);
Write(s, *scenecopy_tmp);
}
catch (...) {
} catch (...) {
aiFreeScene(scenecopy_tmp);
throw;
}
aiFreeScene(scenecopy_tmp);
}
}
} // namespace Assimp
#endif // ASSIMP_BUILD_NO_ASSJSON_EXPORTER
#endif // ASSIMP_BUILD_NO_EXPORT