]>
git.saurik.com Git - wxWidgets.git/blob - src/common/datstrm.cpp
67a2e458050716b9e217faccfdafc981671df2b2
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/common/datstrm.cpp 
   3 // Purpose:     Data stream classes 
   4 // Author:      Guilhem Lavaux 
   5 // Modified by: Mickael Gilabert 
   8 // Copyright:   (c) Guilhem Lavaux 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  21 #include "wx/datstrm.h" 
  24 // --------------------------------------------------------------------------- 
  26 // --------------------------------------------------------------------------- 
  29 wxDataInputStream::wxDataInputStream(wxInputStream
& s
, const wxMBConv
& conv
) 
  30   : m_input(&s
), m_be_order(false), m_conv(conv
) 
  32 wxDataInputStream::wxDataInputStream(wxInputStream
& s
) 
  33   : m_input(&s
), m_be_order(false) 
  39 wxUint64 
wxDataInputStream::Read64() 
  47 wxUint32 
wxDataInputStream::Read32() 
  51   m_input
->Read(&i32
, 4); 
  54     return wxUINT32_SWAP_ON_LE(i32
); 
  56     return wxUINT32_SWAP_ON_BE(i32
); 
  59 wxUint16 
wxDataInputStream::Read16() 
  63   m_input
->Read(&i16
, 2); 
  66     return wxUINT16_SWAP_ON_LE(i16
); 
  68     return wxUINT16_SWAP_ON_BE(i16
); 
  71 wxUint8 
wxDataInputStream::Read8() 
  75   m_input
->Read(&buf
, 1); 
  79 double wxDataInputStream::ReadDouble() 
  84   m_input
->Read(buf
, 10); 
  85   return ConvertFromIeeeExtended((const wxInt8 
*)buf
); 
  91 wxString 
wxDataInputStream::ReadString() 
 100     wxCharBuffer 
tmp(len 
+ 1); 
 101     m_input
->Read(tmp
.data(), len
); 
 102     tmp
.data()[len
] = '\0'; 
 103     wxString 
ret(m_conv
.cMB2WX(tmp
.data())); 
 106     m_input
->Read( wxStringBuffer(ret
, len
), len
); 
 111     return wxEmptyString
; 
 118 void DoReadLL(T 
*buffer
, size_t size
, wxInputStream 
*input
, bool be_order
) 
 121     unsigned char *pchBuffer 
= new unsigned char[size 
* 8]; 
 122     // TODO: Check for overflow when size is of type uint and is > than 512m 
 123     input
->Read(pchBuffer
, size 
* 8); 
 127         for ( size_t uiIndex 
= 0; uiIndex 
!= size
; ++uiIndex 
) 
 129             buffer
[uiIndex
] = 0l; 
 130             for ( unsigned ui 
= 0; ui 
!= 8; ++ui 
) 
 132                 buffer
[uiIndex
] = buffer
[uiIndex
] * 256l + 
 133                             DataType((unsigned long) pchBuffer
[idx_base 
+ ui
]); 
 139     else // little endian 
 141         for ( size_t uiIndex
=0; uiIndex
!=size
; ++uiIndex 
) 
 143             buffer
[uiIndex
] = 0l; 
 144             for ( unsigned ui
=0; ui
!=8; ++ui 
) 
 145                 buffer
[uiIndex
] = buffer
[uiIndex
] * 256l + 
 146                     DataType((unsigned long) pchBuffer
[idx_base 
+ 7 - ui
]); 
 154 static void DoWriteLL(const T 
*buffer
, size_t size
, wxOutputStream 
*output
, bool be_order
) 
 157     unsigned char *pchBuffer 
= new unsigned char[size 
* 8]; 
 161         for ( size_t uiIndex 
= 0; uiIndex 
!= size
; ++uiIndex 
) 
 163             DataType i64 
= buffer
[uiIndex
]; 
 164             for ( unsigned ui 
= 0; ui 
!= 8; ++ui 
) 
 166                 pchBuffer
[idx_base 
+ 7 - ui
] = 
 167                     (unsigned char) (i64
.GetLo() & 255l); 
 174     else // little endian 
 176         for ( size_t uiIndex
=0; uiIndex 
!= size
; ++uiIndex 
) 
 178             DataType i64 
= buffer
[uiIndex
]; 
 179             for (unsigned ui
=0; ui
!=8; ++ui
) 
 181                 pchBuffer
[idx_base 
+ ui
] = 
 182                     (unsigned char) (i64
.GetLo() & 255l); 
 190     // TODO: Check for overflow when size is of type uint and is > than 512m 
 191     output
->Write(pchBuffer
, size 
* 8); 
 195 #endif // wxUSE_LONGLONG 
 201 void DoReadI64(T 
*buffer
, size_t size
, wxInputStream 
*input
, bool be_order
) 
 204     unsigned char *pchBuffer 
= (unsigned char*) buffer
; 
 205     // TODO: Check for overflow when size is of type uint and is > than 512m 
 206     input
->Read(pchBuffer
, size 
* 8); 
 209         for ( wxUint32 i 
= 0; i 
< size
; i
++ ) 
 211             DataType v 
= wxUINT64_SWAP_ON_LE(*buffer
); 
 215     else // little endian 
 217         for ( wxUint32 i
=0; i
<size
; i
++ ) 
 219             DataType v 
= wxUINT64_SWAP_ON_BE(*buffer
); 
 227 void DoWriteI64(const T 
*buffer
, size_t size
, wxOutputStream 
*output
, bool be_order
) 
 232     for ( size_t i 
= 0; i 
< size
; i
++ ) 
 234       DataType i64 
= wxUINT64_SWAP_ON_LE(*buffer
); 
 236       output
->Write(&i64
, 8); 
 239   else // little endian 
 241     for ( size_t i
=0; i 
< size
; i
++ ) 
 243       DataType i64 
= wxUINT64_SWAP_ON_BE(*buffer
); 
 245       output
->Write(&i64
, 8); 
 250 #endif // wxLongLong_t 
 254 void wxDataInputStream::Read64(wxUint64 
*buffer
, size_t size
) 
 257     DoReadLL(buffer
, size
, m_input
, m_be_order
); 
 259     DoReadI64(buffer
, size
, m_input
, m_be_order
); 
 263 void wxDataInputStream::Read64(wxInt64 
*buffer
, size_t size
) 
 266     DoReadLL(buffer
, size
, m_input
, m_be_order
); 
 268     DoReadI64(buffer
, size
, m_input
, m_be_order
); 
 271 #endif // wxHAS_INT64 
 273 #if defined(wxLongLong_t) && wxUSE_LONGLONG 
 274 void wxDataInputStream::Read64(wxULongLong 
*buffer
, size_t size
) 
 276     DoReadLL(buffer
, size
, m_input
, m_be_order
); 
 279 void wxDataInputStream::Read64(wxLongLong 
*buffer
, size_t size
) 
 281     DoReadLL(buffer
, size
, m_input
, m_be_order
); 
 283 #endif // wxLongLong_t 
 286 void wxDataInputStream::ReadLL(wxULongLong 
*buffer
, size_t size
) 
 288     DoReadLL(buffer
, size
, m_input
, m_be_order
); 
 291 void wxDataInputStream::ReadLL(wxLongLong 
*buffer
, size_t size
) 
 293     DoReadLL(buffer
, size
, m_input
, m_be_order
); 
 296 wxLongLong 
wxDataInputStream::ReadLL(void) 
 299     DoReadLL(&ll
, (size_t)1, m_input
, m_be_order
); 
 302 #endif // wxUSE_LONGLONG 
 304 void wxDataInputStream::Read32(wxUint32 
*buffer
, size_t size
) 
 306     m_input
->Read(buffer
, size 
* 4); 
 310         for (wxUint32 i
=0; i
<size
; i
++) 
 312             wxUint32 v 
= wxUINT32_SWAP_ON_LE(*buffer
); 
 318         for (wxUint32 i
=0; i
<size
; i
++) 
 320             wxUint32 v 
= wxUINT32_SWAP_ON_BE(*buffer
); 
 326 void wxDataInputStream::Read16(wxUint16 
*buffer
, size_t size
) 
 328   m_input
->Read(buffer
, size 
* 2); 
 332     for (wxUint32 i
=0; i
<size
; i
++) 
 334       wxUint16 v 
= wxUINT16_SWAP_ON_LE(*buffer
); 
 340     for (wxUint32 i
=0; i
<size
; i
++) 
 342       wxUint16 v 
= wxUINT16_SWAP_ON_BE(*buffer
); 
 348 void wxDataInputStream::Read8(wxUint8 
*buffer
, size_t size
) 
 350   m_input
->Read(buffer
, size
); 
 353 void wxDataInputStream::ReadDouble(double *buffer
, size_t size
) 
 355   for (wxUint32 i
=0; i
<size
; i
++) 
 357     *(buffer
++) = ReadDouble(); 
 361 wxDataInputStream
& wxDataInputStream::operator>>(wxString
& s
) 
 367 wxDataInputStream
& wxDataInputStream::operator>>(wxInt8
& c
) 
 373 wxDataInputStream
& wxDataInputStream::operator>>(wxInt16
& i
) 
 375   i 
= (wxInt16
)Read16(); 
 379 wxDataInputStream
& wxDataInputStream::operator>>(wxInt32
& i
) 
 381   i 
= (wxInt32
)Read32(); 
 385 wxDataInputStream
& wxDataInputStream::operator>>(wxUint8
& c
) 
 391 wxDataInputStream
& wxDataInputStream::operator>>(wxUint16
& i
) 
 397 wxDataInputStream
& wxDataInputStream::operator>>(wxUint32
& i
) 
 404 wxDataInputStream
& wxDataInputStream::operator>>(wxUint64
& i
) 
 410 wxDataInputStream
& wxDataInputStream::operator>>(wxInt64
& i
) 
 415 #endif // wxHAS_INT64 
 417 #if defined(wxLongLong_t) && wxUSE_LONGLONG 
 418 wxDataInputStream
& wxDataInputStream::operator>>(wxULongLong
& i
) 
 424 wxDataInputStream
& wxDataInputStream::operator>>(wxLongLong
& i
) 
 429 #endif // wxLongLong_t 
 431 wxDataInputStream
& wxDataInputStream::operator>>(double& i
) 
 437 wxDataInputStream
& wxDataInputStream::operator>>(float& f
) 
 439   f 
= (float)ReadDouble(); 
 443 // --------------------------------------------------------------------------- 
 444 // wxDataOutputStream 
 445 // --------------------------------------------------------------------------- 
 448 wxDataOutputStream::wxDataOutputStream(wxOutputStream
& s
, const wxMBConv
& conv
) 
 449   : m_output(&s
), m_be_order(false), m_conv(conv
) 
 451 wxDataOutputStream::wxDataOutputStream(wxOutputStream
& s
) 
 452   : m_output(&s
), m_be_order(false) 
 458 void wxDataOutputStream::Write64(wxUint64 i
) 
 463 void wxDataOutputStream::Write64(wxInt64 i
) 
 467 #endif // wxHAS_INT64 
 469 void wxDataOutputStream::Write32(wxUint32 i
) 
 474     i32 
= wxUINT32_SWAP_ON_LE(i
); 
 476     i32 
= wxUINT32_SWAP_ON_BE(i
); 
 477   m_output
->Write(&i32
, 4); 
 480 void wxDataOutputStream::Write16(wxUint16 i
) 
 485     i16 
= wxUINT16_SWAP_ON_LE(i
); 
 487     i16 
= wxUINT16_SWAP_ON_BE(i
); 
 489   m_output
->Write(&i16
, 2); 
 492 void wxDataOutputStream::Write8(wxUint8 i
) 
 494   m_output
->Write(&i
, 1); 
 497 void wxDataOutputStream::WriteString(const wxString
& string
) 
 500   const wxWX2MBbuf buf 
= string
.mb_str(m_conv
); 
 502   const wxWX2MBbuf buf 
= string
.mb_str(); 
 504   size_t len 
= strlen(buf
); 
 507       m_output
->Write(buf
, len
); 
 510 void wxDataOutputStream::WriteDouble(double d
) 
 515   ConvertToIeeeExtended(d
, (wxInt8 
*)buf
); 
 517 #if !defined(__VMS__) && !defined(__GNUG__) 
 518 # pragma warning "wxDataOutputStream::WriteDouble() not using IeeeExtended - will not work!" 
 522   m_output
->Write(buf
, 10); 
 526 void wxDataOutputStream::Write64(const wxUint64 
*buffer
, size_t size
) 
 529     DoWriteLL(buffer
, size
, m_output
, m_be_order
); 
 531     DoWriteI64(buffer
, size
, m_output
, m_be_order
); 
 535 void wxDataOutputStream::Write64(const wxInt64 
*buffer
, size_t size
) 
 538     DoWriteLL(buffer
, size
, m_output
, m_be_order
); 
 540     DoWriteI64(buffer
, size
, m_output
, m_be_order
); 
 543 #endif // wxHAS_INT64 
 545 #if defined(wxLongLong_t) && wxUSE_LONGLONG 
 546 void wxDataOutputStream::Write64(const wxULongLong 
*buffer
, size_t size
) 
 548     DoWriteLL(buffer
, size
, m_output
, m_be_order
); 
 551 void wxDataOutputStream::Write64(const wxLongLong 
*buffer
, size_t size
) 
 553     DoWriteLL(buffer
, size
, m_output
, m_be_order
); 
 555 #endif // wxLongLong_t 
 558 void wxDataOutputStream::WriteLL(const wxULongLong 
*buffer
, size_t size
) 
 560     DoWriteLL(buffer
, size
, m_output
, m_be_order
); 
 563 void wxDataOutputStream::WriteLL(const wxLongLong 
*buffer
, size_t size
) 
 565     DoWriteLL(buffer
, size
, m_output
, m_be_order
); 
 568 void wxDataOutputStream::WriteLL(const wxLongLong 
&ll
) 
 573 void wxDataOutputStream::WriteLL(const wxULongLong 
&ll
) 
 577 #endif // wxUSE_LONGLONG 
 579 void wxDataOutputStream::Write32(const wxUint32 
*buffer
, size_t size
) 
 583     for (wxUint32 i
=0; i
<size 
;i
++) 
 585       wxUint32 i32 
= wxUINT32_SWAP_ON_LE(*buffer
); 
 587       m_output
->Write(&i32
, 4); 
 592     for (wxUint32 i
=0; i
<size 
;i
++) 
 594       wxUint32 i32 
= wxUINT32_SWAP_ON_BE(*buffer
); 
 596       m_output
->Write(&i32
, 4); 
 601 void wxDataOutputStream::Write16(const wxUint16 
*buffer
, size_t size
) 
 605     for (wxUint32 i
=0; i
<size 
;i
++) 
 607       wxUint16 i16 
= wxUINT16_SWAP_ON_LE(*buffer
); 
 609       m_output
->Write(&i16
, 2); 
 614     for (wxUint32 i
=0; i
<size 
;i
++) 
 616       wxUint16 i16 
= wxUINT16_SWAP_ON_BE(*buffer
); 
 618       m_output
->Write(&i16
, 2); 
 623 void wxDataOutputStream::Write8(const wxUint8 
*buffer
, size_t size
) 
 625   m_output
->Write(buffer
, size
); 
 628 void wxDataOutputStream::WriteDouble(const double *buffer
, size_t size
) 
 630   for (wxUint32 i
=0; i
<size
; i
++) 
 632     WriteDouble(*(buffer
++)); 
 636 wxDataOutputStream
& wxDataOutputStream::operator<<(const wxChar 
*string
) 
 638   Write32(wxStrlen(string
)); 
 639   m_output
->Write((const char *)string
, wxStrlen(string
)*sizeof(wxChar
)); 
 643 wxDataOutputStream
& wxDataOutputStream::operator<<(const wxString
& string
) 
 649 wxDataOutputStream
& wxDataOutputStream::operator<<(wxInt8 c
) 
 655 wxDataOutputStream
& wxDataOutputStream::operator<<(wxInt16 i
) 
 657   Write16((wxUint16
)i
); 
 661 wxDataOutputStream
& wxDataOutputStream::operator<<(wxInt32 i
) 
 663   Write32((wxUint32
)i
); 
 667 wxDataOutputStream
& wxDataOutputStream::operator<<(wxUint8 c
) 
 673 wxDataOutputStream
& wxDataOutputStream::operator<<(wxUint16 i
) 
 679 wxDataOutputStream
& wxDataOutputStream::operator<<(wxUint32 i
) 
 686 wxDataOutputStream
& wxDataOutputStream::operator<<(wxUint64 i
) 
 692 wxDataOutputStream
& wxDataOutputStream::operator<<(wxInt64 i
) 
 697 #endif // wxHAS_INT64 
 699 #if defined(wxLongLong_t) && wxUSE_LONGLONG 
 700 wxDataOutputStream
& wxDataOutputStream::operator<<(const wxULongLong 
&i
) 
 706 wxDataOutputStream
& wxDataOutputStream::operator<<(const wxLongLong 
&i
) 
 711 #endif // wxLongLong_t 
 713 wxDataOutputStream
& wxDataOutputStream::operator<<(double f
) 
 719 wxDataOutputStream
& wxDataOutputStream::operator<<(float f
) 
 721   WriteDouble((double)f
);