// Name: src/common/anidecod.cpp
// Purpose: wxANIDecoder, ANI reader for wxImage and wxAnimation
// Author: Francesco Montorsi
-// RCS-ID: $Id$
// Copyright: (c) Francesco Montorsi
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ANI reading and decoding
//---------------------------------------------------------------------------
-bool wxANIDecoder::CanRead(wxInputStream& stream) const
+bool wxANIDecoder::DoCanRead(wxInputStream& stream) const
{
wxInt32 FCC1, FCC2;
- wxUint32 datalen ;
+ wxUint32 datalen;
wxInt32 riff32;
memcpy( &riff32, "RIFF", 4 );
wxInt32 anih32;
memcpy( &anih32, "anih", 4 );
- stream.SeekI(0);
+ if ( stream.IsSeekable() && stream.SeekI(0) == wxInvalidOffset )
+ {
+ return false;
+ }
+
if ( !stream.Read(&FCC1, 4) )
return false;
}
else
{
- stream.SeekI(stream.TellI() + datalen);
+ if ( stream.SeekI(stream.TellI() + datalen) == wxInvalidOffset )
+ return false;
}
// try to read next data chunk:
wxInt32 seq32;
memcpy( &seq32, "seq ", 4 );
- stream.SeekI(0);
- stream.Read(&FCC1, 4);
+ if ( stream.IsSeekable() && stream.SeekI(0) == wxInvalidOffset )
+ {
+ return false;
+ }
+
+ if ( !stream.Read(&FCC1, 4) )
+ return false;
if ( FCC1 != riff32 )
return false;
m_info.Clear();
// we have a riff file:
- while ( stream.IsOk() )
+ while ( !stream.Eof() )
{
// we always have a data size:
- stream.Read(&datalen, 4);
+ if (!stream.Read(&datalen, 4))
+ return false;
+
datalen = wxINT32_SWAP_ON_BE(datalen);
//data should be padded to make even number of bytes
// now either data or a FCC:
if ( (FCC1 == riff32) || (FCC1 == list32) )
{
- stream.Read(&FCC2, 4);
+ if (!stream.Read(&FCC2, 4))
+ return false;
}
else if ( FCC1 == anih32 )
{
return false; // already parsed an ani header?
struct wxANIHeader header;
- stream.Read(&header, sizeof(wxANIHeader));
+ if (!stream.Read(&header, sizeof(wxANIHeader)))
+ return false;
header.AdjustEndianness();
// we should have a global frame size
wxASSERT(m_info.GetCount() == m_nFrames);
for (unsigned int i=0; i<m_nFrames; i++)
{
- stream.Read(&FCC2, 4);
+ if (!stream.Read(&FCC2, 4))
+ return false;
m_info[i].m_delay = wxINT32_SWAP_ON_BE(FCC2) * 1000 / 60;
}
}
wxASSERT(m_info.GetCount() == m_nFrames);
for (unsigned int i=0; i<m_nFrames; i++)
{
- stream.Read(&FCC2, 4);
+ if (!stream.Read(&FCC2, 4))
+ return false;
m_info[i].m_imageIndex = wxINT32_SWAP_ON_BE(FCC2);
}
}
}
else
{
- stream.SeekI(stream.TellI() + datalen);
+ if ( stream.SeekI(stream.TellI() + datalen) == wxInvalidOffset )
+ return false;
}
// try to read next data chunk:
- stream.Read(&FCC1, 4);
+ if ( !stream.Read(&FCC1, 4) && !stream.Eof())
+ {
+ // we didn't reach the EOF! An other kind of error has occurred...
+ return false;
+ }
+ //else: proceed with the parsing of the next header block or
+ // exiting this loop (if stream.Eof() == true)
}
if (m_nFrames==0)