int wxWrite(int fd, const void *buf, unsigned int count);
int wxEof(int fd);
wxFileOffset wxSeek(int fd, wxFileOffset offset, int origin);
- inline HANDLE wxGetOSFHandle(int fd) { return (HANDLE)fd; }
#define wxLSeek wxSeek
wxFileOffset wxTell(int fd);
#endif
#endif // platforms
-#if defined(__WXMSW__) && !defined(__WXWINCE__)
- // get the HANDLE associated with a file descriptor
-# ifdef __CYGWIN__
-# include "wx/msw/private.h" // for HANDLE
-# include <io.h> // for get_osfhandle()
- inline HANDLE wxGetOSFHandle(int fd) { return (HANDLE) get_osfhandle(fd); }
-# else
-# ifdef __BORLANDC__
-# include "wx/msw/private.h" // for HANDLE
-# endif
- inline HANDLE wxGetOSFHandle(int fd) { return (HANDLE) _get_osfhandle(fd); }
-# endif
-#endif
-
#if defined(__VISAGECPP__) && __IBMCPP__ >= 400
//
// VisualAge C++ V4.0 cannot have any external linkage const decs
#define wxZeroMemory(obj) memset((void*) & obj, 0, sizeof(obj))
#endif
+// This one is a macro so that it can be tested with #ifdef, it will be
+// undefined if it cannot be implemented for a given compiler.
+// Vc++, bcc, dmc, ow, mingw, codewarrior (and rsxnt) have _get_osfhandle.
+// Cygwin has get_osfhandle. Others are currently unknown, e.g. Salford,
+// Intel, Visual Age.
+#if defined(__WXWINCE__)
+ #define wxGetOSFHandle(fd) ((HANDLE)fd)
+#elif defined(__CYGWIN__)
+ #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd))
+#elif defined(__VISUALC__) \
+ || defined(__BORLANDC__) \
+ || defined(__WATCOMC__) \
+ || defined(__DMC__) \
+ || (defined(__GNUWIN32__) || defined(__MINGW32__)) \
+ || (defined(__MWERKS__) && defined(__MSL__))
+ #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
+#endif
+
#if wxUSE_GUI
#include <wx/gdicmn.h>
#endif
#ifdef __WINDOWS__
- #include "wx/msw/wrapwin.h"
+ #include "wx/msw/private.h"
#include "wx/msw/mslu.h"
// sys/cygwin.h is needed for cygwin_conv_to_full_win32_path()
#include <sys/cygwin.h>
#endif
#endif // __GNUWIN32__
+
+ // io.h is needed for _get_osfhandle()
+ // Already included by filefn.h for many Windows compilers
+ #if defined __MWERKS__ || defined __CYGWIN__
+ #include <io.h>
+ #endif
#endif // __WINDOWS__
#if defined(__VMS__)
// Return the type of an open file
//
+// Some file types on some platforms seem seekable but in fact are not.
+// The main use of this function is to allow such cases to be detected
+// (IsSeekable() is implemented as wxGetFileKind() == wxFILE_KIND_DISK).
+//
+// This is important for the archive streams, which benefit greatly from
+// being able to seek on a stream, but which will produce corrupt archives
+// if they unknowingly seek on a non-seekable stream.
+//
+// wxFILE_KIND_DISK is a good catch all return value, since other values
+// disable features of the archive streams. Some other value must be returned
+// for a file type that appears seekable but isn't.
+//
+// Known examples:
+// * Pipes on Windows
+// * Files on VMS with a record format other than StreamLF
+//
wxFileKind wxGetFileKind(int fd)
{
-#if !defined(__WXWINCE__) && !defined(__WXPALMOS__)
- if (isatty(fd))
- return wxFILE_KIND_TERMINAL;
-#endif
-
-#if defined(__WXPALMOS__)
- return wxFILE_KIND_UNKNOWN;
-#elif defined(__WXWINCE__)
- return wxFILE_KIND_UNKNOWN;
-#elif defined(__WXMSW__)
+#if defined __WXMSW__ && !defined __WXWINCE__ && defined wxGetOSFHandle
switch (::GetFileType(wxGetOSFHandle(fd)) & ~FILE_TYPE_REMOTE)
{
+ case FILE_TYPE_CHAR:
+ return wxFILE_KIND_TERMINAL;
case FILE_TYPE_DISK:
return wxFILE_KIND_DISK;
case FILE_TYPE_PIPE:
return wxFILE_KIND_UNKNOWN;
#elif defined(__UNIX__)
+ if (isatty(fd))
+ return wxFILE_KIND_TERMINAL;
+
struct stat st;
fstat(fd, &st);
return wxFILE_KIND_DISK;
#else
- if (lseek(fd, 0, SEEK_CUR) != -1)
- return wxFILE_KIND_DISK;
- else
- return wxFILE_KIND_UNKNOWN;
+ (void)fd;
+ return wxFILE_KIND_DISK;
#endif
}