+#include "wx/math.h"
+
+// ---------------------------------------------------------------------------
+// wxDataInputStream
+// ---------------------------------------------------------------------------
+
+#if wxUSE_UNICODE
+wxDataInputStream::wxDataInputStream(wxInputStream& s, const wxMBConv& conv)
+ : m_input(&s), m_be_order(false), m_conv(conv.Clone())
+#else
+wxDataInputStream::wxDataInputStream(wxInputStream& s)
+ : m_input(&s), m_be_order(false)
+#endif
+{
+}
+
+wxDataInputStream::~wxDataInputStream()
+{
+#if wxUSE_UNICODE
+ delete m_conv;
+#endif // wxUSE_UNICODE
+}
+
+#if wxHAS_INT64
+wxUint64 wxDataInputStream::Read64()
+{
+ wxUint64 tmp;
+ Read64(&tmp, 1);
+ return tmp;
+}
+#endif // wxHAS_INT64
+
+wxUint32 wxDataInputStream::Read32()
+{
+ wxUint32 i32;
+
+ m_input->Read(&i32, 4);
+
+ if (m_be_order)
+ return wxUINT32_SWAP_ON_LE(i32);
+ else
+ return wxUINT32_SWAP_ON_BE(i32);
+}
+
+wxUint16 wxDataInputStream::Read16()
+{
+ wxUint16 i16;
+
+ m_input->Read(&i16, 2);
+
+ if (m_be_order)
+ return wxUINT16_SWAP_ON_LE(i16);
+ else
+ return wxUINT16_SWAP_ON_BE(i16);
+}
+
+wxUint8 wxDataInputStream::Read8()
+{
+ wxUint8 buf;
+
+ m_input->Read(&buf, 1);
+ return (wxUint8)buf;
+}
+
+double wxDataInputStream::ReadDouble()
+{
+#if wxUSE_APPLE_IEEE
+ char buf[10];
+
+ m_input->Read(buf, 10);
+ return ConvertFromIeeeExtended((const wxInt8 *)buf);
+#else
+ return 0.0;
+#endif
+}
+
+wxString wxDataInputStream::ReadString()
+{
+ size_t len;
+
+ len = Read32();
+
+ if (len > 0)
+ {
+#if wxUSE_UNICODE
+ wxCharBuffer tmp(len + 1);
+ m_input->Read(tmp.data(), len);
+ tmp.data()[len] = '\0';
+ wxString ret(m_conv->cMB2WX(tmp.data()));
+#else
+ wxString ret;
+ m_input->Read( wxStringBuffer(ret, len), len);
+#endif
+ return ret;
+ }
+ else
+ return wxEmptyString;
+}
+
+#if wxUSE_LONGLONG
+
+template <class T>
+static
+void DoReadLL(T *buffer, size_t size, wxInputStream *input, bool be_order)
+{
+ typedef T DataType;
+ unsigned char *pchBuffer = new unsigned char[size * 8];
+ // TODO: Check for overflow when size is of type uint and is > than 512m
+ input->Read(pchBuffer, size * 8);
+ size_t idx_base = 0;
+ if ( be_order )
+ {
+ for ( size_t uiIndex = 0; uiIndex != size; ++uiIndex )
+ {
+ buffer[uiIndex] = 0l;
+ for ( unsigned ui = 0; ui != 8; ++ui )
+ {
+ buffer[uiIndex] = buffer[uiIndex] * 256l +
+ DataType((unsigned long) pchBuffer[idx_base + ui]);
+ }
+
+ idx_base += 8;
+ }
+ }
+ else // little endian
+ {
+ for ( size_t uiIndex=0; uiIndex!=size; ++uiIndex )
+ {
+ buffer[uiIndex] = 0l;
+ for ( unsigned ui=0; ui!=8; ++ui )
+ buffer[uiIndex] = buffer[uiIndex] * 256l +
+ DataType((unsigned long) pchBuffer[idx_base + 7 - ui]);
+ idx_base += 8;
+ }
+ }
+ delete[] pchBuffer;
+}
+
+template <class T>
+static void DoWriteLL(const T *buffer, size_t size, wxOutputStream *output, bool be_order)
+{
+ typedef T DataType;
+ unsigned char *pchBuffer = new unsigned char[size * 8];
+ size_t idx_base = 0;
+ if ( be_order )
+ {
+ for ( size_t uiIndex = 0; uiIndex != size; ++uiIndex )
+ {
+ DataType i64 = buffer[uiIndex];
+ for ( unsigned ui = 0; ui != 8; ++ui )
+ {
+ pchBuffer[idx_base + 7 - ui] =
+ (unsigned char) (i64.GetLo() & 255l);
+ i64 >>= 8l;
+ }
+
+ idx_base += 8;
+ }
+ }
+ else // little endian
+ {
+ for ( size_t uiIndex=0; uiIndex != size; ++uiIndex )
+ {
+ DataType i64 = buffer[uiIndex];
+ for (unsigned ui=0; ui!=8; ++ui)
+ {
+ pchBuffer[idx_base + ui] =
+ (unsigned char) (i64.GetLo() & 255l);
+ i64 >>= 8l;
+ }
+
+ idx_base += 8;
+ }
+ }
+
+ // TODO: Check for overflow when size is of type uint and is > than 512m
+ output->Write(pchBuffer, size * 8);
+ delete[] pchBuffer;
+}
+
+#endif // wxUSE_LONGLONG
+
+#ifdef wxLongLong_t