diff --git a/src/CompressedVectorReaderImpl.cpp b/src/CompressedVectorReaderImpl.cpp index c25a02c..934d96d 100644 --- a/src/CompressedVectorReaderImpl.cpp +++ b/src/CompressedVectorReaderImpl.cpp @@ -150,13 +150,16 @@ namespace e57 "packetType=" + toString( dpkt->header.packetType ) ); } - // Have good packet, initialize channels - for ( auto &channel : channels_ ) + // Have good packet, initialize channels if we have records + if ( maxRecordCount_ > 0 ) { - channel.currentPacketLogicalOffset = dataLogicalOffset; - channel.currentBytestreamBufferIndex = 0; - channel.currentBytestreamBufferLength = - dpkt->getBytestreamBufferLength( channel.bytestreamNumber ); + for ( auto &channel : channels_ ) + { + channel.currentPacketLogicalOffset = dataLogicalOffset; + channel.currentBytestreamBufferIndex = 0; + channel.currentBytestreamBufferLength = + dpkt->getBytestreamBufferLength( channel.bytestreamNumber ); + } } } diff --git a/test/src/test_SimpleReader.cpp b/test/src/test_SimpleReader.cpp index e2551f6..0b79508 100644 --- a/test/src/test_SimpleReader.cpp +++ b/test/src/test_SimpleReader.cpp @@ -45,6 +45,42 @@ TEST( SimpleReaderData, Empty ) delete reader; } +TEST( SimpleReaderData, ZeroPoints ) +{ + e57::Reader *reader = nullptr; + + E57_ASSERT_NO_THROW( reader = new e57::Reader( TestData::Path() + "/self/ZeroPoints.e57", {} ) ); + + ASSERT_TRUE( reader->IsOpen() ); + EXPECT_EQ( reader->GetImage2DCount(), 0 ); + EXPECT_EQ( reader->GetData3DCount(), 1 ); + + e57::E57Root fileHeader; + ASSERT_TRUE( reader->GetE57Root( fileHeader ) ); + + CheckFileHeader( fileHeader ); + EXPECT_EQ( fileHeader.guid, "Zero Points GUID" ); + + e57::Data3D data3DHeader; + ASSERT_TRUE( reader->ReadData3D( 0, data3DHeader ) ); + + ASSERT_EQ( data3DHeader.pointCount, 0 ); + + const uint64_t cNumPoints = data3DHeader.pointCount; + + e57::Data3DPointsFloat pointsData( data3DHeader ); + + auto vectorReader = reader->SetUpData3DPointsData( 0, cNumPoints, pointsData ); + + const uint64_t cNumRead = vectorReader.read(); + + vectorReader.close(); + + EXPECT_EQ( cNumRead, cNumPoints ); + + delete reader; +} + TEST( SimpleReaderData, ZeroPointsInvalid ) { e57::Reader *reader = nullptr;