X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f172cb8200f08ba1c6735a0d507991c877c0d68f..1bfcd80c2f6ef72fdefba3695a1f6fd8088ba15d:/src/common/file.cpp diff --git a/src/common/file.cpp b/src/common/file.cpp index abcf92a78c..1063e45293 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -80,6 +80,8 @@ char* mktemp( char * path ) { return path ;} #include #include +#elif defined(__WXPALMOS__) + #include "wx/palmos/missing.h" #else #error "Please specify the header with file functions declarations." #endif //Win/UNIX @@ -340,15 +342,15 @@ bool wxFile::Flush() // seek wxFileOffset wxFile::Seek(wxFileOffset ofs, wxSeekMode mode) { - wxASSERT_MSG( IsOpened(), _T("can't seek on closed file") ); + wxASSERT_MSG( IsOpened(), wxT("can't seek on closed file") ); wxCHECK_MSG( ofs != wxInvalidOffset || mode != wxFromStart, wxInvalidOffset, - _T("invalid absolute file offset") ); + wxT("invalid absolute file offset") ); int origin; switch ( mode ) { default: - wxFAIL_MSG(_T("unknown seek origin")); + wxFAIL_MSG(wxT("unknown seek origin")); case wxFromStart: origin = SEEK_SET; @@ -391,6 +393,21 @@ wxFileOffset wxFile::Length() const { wxASSERT( IsOpened() ); + // we use a special method for Linux systems where files in sysfs (i.e. + // those under /sys typically) return length of 4096 bytes even when + // they're much smaller -- this is a problem as it results in errors later + // when we try reading 4KB from them +#ifdef __LINUX__ + struct stat st; + if ( fstat(m_fd, &st) == 0 ) + { + // returning 0 for the special files indicates to the caller that they + // are not seekable + return st.st_blocks ? st.st_size : 0; + } + //else: failed to stat, try the normal method +#endif // __LINUX__ + wxFileOffset iRc = Tell(); if ( iRc != wxInvalidOffset ) { // have to use const_cast :-( @@ -433,14 +450,17 @@ bool wxFile::Eof() const iRc = wxEof(m_fd); #endif // Windows/Unix - if ( iRc == 1) - {} - else if ( iRc == 0 ) + if ( iRc == 0 ) return false; - else if ( iRc == wxInvalidOffset ) + + if ( iRc == wxInvalidOffset ) + { wxLogSysError(_("can't determine if the end of file is reached on descriptor %d"), m_fd); - else - wxFAIL_MSG(_T("invalid eof() return value.")); + } + else if ( iRc != 1 ) + { + wxFAIL_MSG(wxT("invalid eof() return value.")); + } return true; } @@ -543,7 +563,9 @@ void wxTempFile::Discard() { m_file.Close(); if ( wxRemove(m_strTemp) != 0 ) + { wxLogSysError(_("can't remove temporary file '%s'"), m_strTemp.c_str()); + } } #endif // wxUSE_FILE