// For memcpy
#include <string.h>
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+#if wxUSE_ICO_CUR
+
+static bool CanReadICOOrCUR(wxInputStream *stream, wxUint16 resourceType);
+
+#endif // wxUSE_ICO_CUR
+
//-----------------------------------------------------------------------------
// wxBMPHandler
//-----------------------------------------------------------------------------
bool wxICOHandler::DoCanRead(wxInputStream& stream)
{
- unsigned char hdr[4];
- if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) // it's ok to modify the stream position here
- return false;
+ return CanReadICOOrCUR(&stream, 1 /*for identifying an icon*/);
- // hdr[2] is one for an icon and two for a cursor
- return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\1' && hdr[3] == '\0';
}
#endif // wxUSE_STREAMS
bool wxCURHandler::DoCanRead(wxInputStream& stream)
{
- unsigned char hdr[4];
- if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) // it's ok to modify the stream position here
- return false;
-
- // hdr[2] is one for an icon and two for a cursor
- return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\2' && hdr[3] == '\0';
+ return CanReadICOOrCUR(&stream, 2 /*for identifying a cursor*/);
}
#endif // wxUSE_STREAMS
return decoder.GetFrameCount();
}
+static bool CanReadICOOrCUR(wxInputStream *stream, wxUint16 resourceType)
+{
+ ICONDIR iconDir;
+ if ( !stream->Read(&iconDir, sizeof(iconDir)) ) // it's ok to modify the stream position here
+ {
+ return false;
+ }
+
+ return !iconDir.idReserved // reserved, must be 0
+ && wxUINT16_SWAP_ON_BE(iconDir.idType) == resourceType // either 1 or 2
+ && iconDir.idCount; // must contain at least one image
+}
+
#endif // wxUSE_STREAMS
#endif // wxUSE_ICO_CUR