BinaryStreamOperator: read and write block size as long long integer on 8 bytes, to accommodate arbitrarily large block size.

When reading check of file version for backward compatibility.
This commit is contained in:
Riccardo Corsi 2017-06-14 16:09:40 +02:00
parent ca20eb2cba
commit eff73bad76

View File

@ -90,9 +90,9 @@ public:
{
if ( mark._name=="{" )
{
int size = 0;
long long size = 0;
_beginPositions.push_back( _out->tellp() );
_out->write( (char*)&size, osgDB::INT_SIZE );
_out->write( (char*)&size, osgDB::INT64_SIZE );
}
else if ( mark._name=="}" && _beginPositions.size()>0 )
{
@ -101,8 +101,8 @@ public:
_out->seekp( beginPos );
std::streampos size64 = pos - beginPos;
int size = (int) size64;
_out->write( (char*)&size, osgDB::INT_SIZE );
long long size = (long long) size64;
_out->write( (char*)&size, osgDB::INT64_SIZE);
_out->seekp( pos );
}
}
@ -244,12 +244,25 @@ public:
{
if ( mark._name=="{" )
{
int size = 0;
_beginPositions.push_back( _in->tellg() );
_in->read( (char*)&size, osgDB::INT_SIZE );
if ( _byteSwap ) osg::swapBytes( (char*)&size, osgDB::INT_SIZE );
_blockSizes.push_back( size );
// since version 149 (osg version > 3.5.6) size is expressed
// on 8 bytes rather than 4 bytes,
// to accommodate any block size.
if (getInputStream() && getInputStream()->getFileVersion() > 148)
{
long long size = 0;
_in->read( (char*)&size, osgDB::INT64_SIZE);
if ( _byteSwap ) osg::swapBytes( (char*)&size, osgDB::INT64_SIZE);
_blockSizes.push_back( size );
}
else
{
int size = 0;
_in->read( (char*)&size, osgDB::INT_SIZE);
if ( _byteSwap ) osg::swapBytes( (char*)&size, osgDB::INT_SIZE);
_blockSizes.push_back( size );
}
}
else if ( mark._name=="}" && _beginPositions.size()>0 )
{
@ -279,7 +292,7 @@ public:
protected:
std::vector<std::streampos> _beginPositions;
std::vector<int> _blockSizes;
std::vector<std::streampos> _blockSizes;
};
#endif