X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/522d32e508c54eec783123a583dbd9833d27810d..34eeb223b428c2e9ec90d88348e7e62dfeb1cb65:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 5c8e11038e..bdfd37b1a7 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -24,13 +24,15 @@ #pragma hdrstop #endif +#include "wx/filefn.h" + #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" #include "wx/utils.h" #endif -#include "wx/file.h" // This does include filefn.h +#include "wx/file.h" #include "wx/filename.h" #include "wx/dir.h" @@ -115,13 +117,17 @@ const int wxInvalidOffset = -1; // macros // ---------------------------------------------------------------------------- -// we need to translate Mac filenames before passing them to OS functions +// translate the filenames before passing them to OS functions #define OS_FILENAME(s) (s.fn_str()) // ============================================================================ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wrappers around standard POSIX functions +// ---------------------------------------------------------------------------- + #ifdef wxNEED_WX_UNISTD_H WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) @@ -129,6 +135,11 @@ WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) return stat( wxConvFile.cWX2MB( file_name ), buf ); } +WXDLLEXPORT int wxLstat( const wxChar *file_name, wxStructStat *buf ) +{ + return lstat( wxConvFile.cWX2MB( file_name ), buf ); +} + WXDLLEXPORT int wxAccess( const wxChar *pathname, int mode ) { return access( wxConvFile.cWX2MB( pathname ), mode ); @@ -139,8 +150,7 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode ) return open( wxConvFile.cWX2MB( pathname ), flags, mode ); } -#endif - // wxNEED_WX_UNISTD_H +#endif // wxNEED_WX_UNISTD_H // ---------------------------------------------------------------------------- // wxPathList @@ -1232,7 +1242,7 @@ bool wxDirExists(const wxChar *pszPathName) #if defined(__WINDOWS__) || defined(__OS2__) // Windows fails to find directory named "c:\dir\" even if "c:\dir" exists, // so remove all trailing backslashes from the path - but don't do this for - // the pathes "d:\" (which are different from "d:") nor for just "\" + // the paths "d:\" (which are different from "d:") nor for just "\" while ( wxEndsWithPathSeparator(strPath) ) { size_t len = strPath.length(); @@ -1763,46 +1773,43 @@ int WXDLLEXPORT wxParseCommonDialogsFilter(const wxString& filterStr, } #if defined( __WINDOWS__ ) -bool wxCheckGenericPermission(const wxString &path, DWORD access) +static bool wxCheckWin32Permission(const wxString& path, DWORD access) { // quoting the MSDN: "To obtain a handle to a directory, call the - // CreateFile function with the FILE_FLAG_BACKUP_SEMANTICS flag" - wxWinVersion ver = wxGetWinVersion(); + // CreateFile function with the FILE_FLAG_BACKUP_SEMANTICS flag", but this + // doesn't work under Win9x/ME but then it's not needed there anyhow bool isdir = wxDirExists(path); - if (isdir && (ver == wxWinVersion_95 || ver == wxWinVersion_98 || ver == wxWinVersion_ME)) + if ( isdir && wxGetOsVersion() == wxOS_WINDOWS_9X ) { - // however Win95/98/ME do not support FILE_FLAG_BACKUP_SEMANTICS... - if (access == GENERIC_READ) - { - WIN32_FILE_ATTRIBUTE_DATA data; - if (GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &data) == 0) - return false; // cannot query attributes - return (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == 0; - } - - // FIXME: is it true that directories are always writable & executable on Win9X family ? + // FAT directories always allow all access, even if they have the + // readonly flag set return true; } - else - { - HANDLE h = CreateFile(path.c_str(), access, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, - OPEN_EXISTING, isdir ? FILE_FLAG_BACKUP_SEMANTICS : 0, NULL); - if (h != INVALID_HANDLE_VALUE) - CloseHandle(h); - return h != INVALID_HANDLE_VALUE; - } + HANDLE h = ::CreateFile + ( + path.c_str(), + access, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + isdir ? FILE_FLAG_BACKUP_SEMANTICS : 0, + NULL + ); + if ( h != INVALID_HANDLE_VALUE ) + CloseHandle(h); + + return h != INVALID_HANDLE_VALUE; } -#endif +#endif // __WINDOWS__ bool wxIsWritable(const wxString &path) { -#if defined( __UNIX__ ) +#if defined( __UNIX__ ) || defined(__OS2__) // access() will take in count also symbolic links return access(wxConvFile.cWX2MB(path), W_OK) == 0; #elif defined( __WINDOWS__ ) - return wxCheckGenericPermission(path, GENERIC_WRITE); + return wxCheckWin32Permission(path, GENERIC_WRITE); #else wxUnusedVar(path); // TODO @@ -1812,11 +1819,11 @@ bool wxIsWritable(const wxString &path) bool wxIsReadable(const wxString &path) { -#if defined( __UNIX__ ) +#if defined( __UNIX__ ) || defined(__OS2__) // access() will take in count also symbolic links return access(wxConvFile.cWX2MB(path), R_OK) == 0; #elif defined( __WINDOWS__ ) - return wxCheckGenericPermission(path, GENERIC_READ); + return wxCheckWin32Permission(path, GENERIC_READ); #else wxUnusedVar(path); // TODO @@ -1826,11 +1833,11 @@ bool wxIsReadable(const wxString &path) bool wxIsExecutable(const wxString &path) { -#if defined( __UNIX__ ) +#if defined( __UNIX__ ) || defined(__OS2__) // access() will take in count also symbolic links return access(wxConvFile.cWX2MB(path), X_OK) == 0; #elif defined( __WINDOWS__ ) - return wxCheckGenericPermission(path, GENERIC_EXECUTE); + return wxCheckWin32Permission(path, GENERIC_EXECUTE); #else wxUnusedVar(path); // TODO @@ -1838,6 +1845,79 @@ bool wxIsExecutable(const wxString &path) #endif } +// 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 __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_PIPE; + } + + return wxFILE_KIND_UNKNOWN; + +#elif defined(__UNIX__) + if (isatty(fd)) + return wxFILE_KIND_TERMINAL; + + struct stat st; + fstat(fd, &st); + + if (S_ISFIFO(st.st_mode)) + return wxFILE_KIND_PIPE; + if (!S_ISREG(st.st_mode)) + return wxFILE_KIND_UNKNOWN; + + #if defined(__VMS__) + if (st.st_fab_rfm != FAB$C_STMLF) + return wxFILE_KIND_UNKNOWN; + #endif + + return wxFILE_KIND_DISK; + +#else + #define wxFILEKIND_STUB + (void)fd; + return wxFILE_KIND_DISK; +#endif +} + +wxFileKind wxGetFileKind(FILE *fp) +{ + // Note: The watcom rtl dll doesn't have fileno (the static lib does). + // Should be fixed in version 1.4. +#if defined(wxFILEKIND_STUB) || wxONLY_WATCOM_EARLIER_THAN(1,4) + (void)fp; + return wxFILE_KIND_DISK; +#elif defined(__WINDOWS__) && !defined(__CYGWIN__) && !defined(__WATCOMC__) + return fp ? wxGetFileKind(_fileno(fp)) : wxFILE_KIND_UNKNOWN; +#else + return fp ? wxGetFileKind(fileno(fp)) : wxFILE_KIND_UNKNOWN; +#endif +} + //------------------------------------------------------------------------ // wild character routines @@ -1970,77 +2050,6 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) } } -// 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 __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_PIPE; - } - - return wxFILE_KIND_UNKNOWN; - -#elif defined(__UNIX__) - if (isatty(fd)) - return wxFILE_KIND_TERMINAL; - - struct stat st; - fstat(fd, &st); - - if (S_ISFIFO(st.st_mode)) - return wxFILE_KIND_PIPE; - if (!S_ISREG(st.st_mode)) - return wxFILE_KIND_UNKNOWN; - - #if defined(__VMS__) - if (st.st_fab_rfm != FAB$C_STMLF) - return wxFILE_KIND_UNKNOWN; - #endif - - return wxFILE_KIND_DISK; - -#else - #define wxFILEKIND_STUB - (void)fd; - return wxFILE_KIND_DISK; -#endif -} - -wxFileKind wxGetFileKind(FILE *fp) -{ - // Note: The watcom rtl dll doesn't have fileno (the static lib does). - // Should be fixed in version 1.4. -#if defined(wxFILEKIND_STUB) || wxONLY_WATCOM_EARLIER_THAN(1,4) - (void)fp; - return wxFILE_KIND_DISK; -#else - return fp ? wxGetFileKind(fileno(fp)) : wxFILE_KIND_UNKNOWN; -#endif -} - #ifdef __VISUALC__ #pragma warning(default:4706) // assignment within conditional expression #endif // VC++