Commit: b23a5dbcad0fdb4027ad87a7240b44edf23becd9
Author: Sybren A. Stüvel
Date:   Mon Jul 3 12:23:00 2017 +0200
Branches: temp-sybren-alembic-filestreams
https://developer.blender.org/rBb23a5dbcad0fdb4027ad87a7240b44edf23becd9

Alembic: removed our own file streams for reading.

This caused problems with some streams being reused after closing.
Now I just pass the filename to the Alembic library and let that
handle with actually opening & closing the files.

===================================================================

M       source/blender/alembic/intern/abc_archive.cc
M       source/blender/alembic/intern/abc_archive.h

===================================================================

diff --git a/source/blender/alembic/intern/abc_archive.cc 
b/source/blender/alembic/intern/abc_archive.cc
index bd16196cb78..34e8c1a918a 100644
--- a/source/blender/alembic/intern/abc_archive.cc
+++ b/source/blender/alembic/intern/abc_archive.cc
@@ -41,17 +41,24 @@ using Alembic::Abc::kWrapExisting;
 using Alembic::Abc::OArchive;
 
 static IArchive open_archive(const std::string &filename,
-                             const std::vector<std::istream *> &input_streams,
                              bool &is_hdf5)
 {
+       Alembic::AbcCoreAbstract::ReadArraySampleCachePtr cache_ptr;
        is_hdf5 = false;
 
-       try {
-               Alembic::AbcCoreOgawa::ReadArchive 
archive_reader(input_streams);
+#ifdef WIN32
+       UTF16_ENCODE(filename);
+       const std::wstring open_filename(filename_16);
+       UTF16_UN_ENCODE(filename);
+#else
+       const std::string &open_filename = filename;
+#endif
 
-               return IArchive(archive_reader(filename),
-                               kWrapExisting,
-                               ErrorHandler::kThrowPolicy);
+       try {
+               IArchive archive(Alembic::AbcCoreOgawa::ReadArchive(),
+                                open_filename.c_str(),
+                                ErrorHandler::kThrowPolicy, cache_ptr);
+               return archive;
        }
        catch (const Exception &e) {
                std::cerr << e.what() << '\n';
@@ -59,11 +66,9 @@ static IArchive open_archive(const std::string &filename,
 #ifdef WITH_ALEMBIC_HDF5
                try {
                        is_hdf5 = true;
-                       Alembic::AbcCoreAbstract::ReadArraySampleCachePtr 
cache_ptr;
-
                        return IArchive(Alembic::AbcCoreHDF5::ReadArchive(),
-                                       filename.c_str(), 
ErrorHandler::kThrowPolicy,
-                                       cache_ptr);
+                                       open_filename.c_str(),
+                                       ErrorHandler::kThrowPolicy, cache_ptr);
                }
                catch (const Exception &) {
                        std::cerr << e.what() << '\n';
@@ -72,19 +77,19 @@ static IArchive open_archive(const std::string &filename,
 #else
                /* Inspect the file to see whether it's really a HDF5 file. */
                char header[4];  /* char(0x89) + "HDF" */
-               std::ifstream the_file(filename.c_str(), std::ios::in | 
std::ios::binary);
+               std::ifstream the_file(open_filename.c_str(), std::ios::in | 
std::ios::binary);
                if (!the_file) {
-                       std::cerr << "Unable to open " << filename << std::endl;
+                       std::cerr << "Unable to open " << open_filename << 
std::endl;
                }
                else if (!the_file.read(header, sizeof(header))) {
-                       std::cerr << "Unable to read from " << filename << 
std::endl;
+                       std::cerr << "Unable to read from " << open_filename << 
std::endl;
                }
                else if (strncmp(header + 1, "HDF", 3)) {
-                       std::cerr << filename << " has an unknown file format, 
unable to read." << std::endl;
+                       std::cerr << open_filename << " has an unknown file 
format, unable to read." << std::endl;
                }
                else {
                        is_hdf5 = true;
-                       std::cerr << filename << " is in the obsolete HDF5 
format, unable to read." << std::endl;
+                       std::cerr << open_filename << " is in the obsolete HDF5 
format, unable to read." << std::endl;
                }
 
                if (the_file.is_open()) {
@@ -100,24 +105,7 @@ static IArchive open_archive(const std::string &filename,
 
 ArchiveReader::ArchiveReader(const char *filename)
 {
-#ifdef WIN32
-       UTF16_ENCODE(filename);
-       std::wstring wstr(filename_16);
-       m_infile.open(wstr.c_str(), std::ios::in | std::ios::binary);
-       UTF16_UN_ENCODE(filename);
-#else
-       m_infile.open(filename, std::ios::in | std::ios::binary);
-#endif
-
-       m_streams.push_back(&m_infile);
-
-       m_archive = open_archive(filename, m_streams, m_is_hdf5);
-
-       /* We can't open an HDF5 file from a stream, so close it. */
-       if (m_is_hdf5) {
-               m_infile.close();
-               m_streams.clear();
-       }
+       m_archive = open_archive(filename, m_is_hdf5);
 }
 
 bool ArchiveReader::is_hdf5() const
diff --git a/source/blender/alembic/intern/abc_archive.h 
b/source/blender/alembic/intern/abc_archive.h
index 84309fbc9df..2454ef2442b 100644
--- a/source/blender/alembic/intern/abc_archive.h
+++ b/source/blender/alembic/intern/abc_archive.h
@@ -41,9 +41,8 @@
  */
 
 class ArchiveReader {
+       std::string filename;
        Alembic::Abc::IArchive m_archive;
-       std::ifstream m_infile;
-       std::vector<std::istream *> m_streams;
        bool m_is_hdf5;
 
 public:

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to