X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0bf751e7e901fffb9ba9d850948915e33456524a..fcdd53359135f790b85728c4254b97095a56dad8:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index e4d3f4d5dd..24324f04ee 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -33,6 +33,7 @@ #include "wx/crt.h" #endif +#include "wx/dynarray.h" #include "wx/file.h" #include "wx/filename.h" #include "wx/dir.h" @@ -55,7 +56,7 @@ #endif #if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers + #include "wx/osx/private.h" // includes mac headers #endif #ifdef __WINDOWS__ @@ -95,8 +96,8 @@ #define _MAXPATHLEN 1024 #endif -#ifdef __WXMAC__ -# include "MoreFilesX.h" +#ifndef INVALID_FILE_ATTRIBUTES + #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #endif // ---------------------------------------------------------------------------- @@ -317,9 +318,9 @@ wxFileExists (const wxString& filename) #elif defined(__WIN32__) && !defined(__WXMICROWIN__) // we must use GetFileAttributes() instead of the ANSI C functions because // it can cope with network (UNC) paths unlike them - DWORD ret = ::GetFileAttributes(filename); + DWORD ret = ::GetFileAttributes(filename.fn_str()); - return (ret != (DWORD)-1) && !(ret & FILE_ATTRIBUTE_DIRECTORY); + return (ret != INVALID_FILE_ATTRIBUTES) && !(ret & FILE_ATTRIBUTE_DIRECTORY); #else // !__WIN32__ #ifndef S_ISREG #define S_ISREG(mode) ((mode) & S_IFREG) @@ -343,20 +344,9 @@ wxIsAbsolutePath (const wxString& filename) { if (!filename.empty()) { -#if defined(__WXMAC__) && !defined(__DARWIN__) - // Classic or Carbon CodeWarrior like - // Carbon with Apple DevTools is Unix like - - // This seems wrong to me, but there is no fix. since - // "MacOS:MyText.txt" is absolute whereas "MyDir:MyText.txt" - // is not. Or maybe ":MyDir:MyText.txt" has to be used? RR. - if (filename.Find(':') != wxNOT_FOUND && filename[0] != ':') - return true ; -#else // Unix like or Windows if (filename[0] == wxT('/')) return true; -#endif #ifdef __VMS__ if ((filename[0] == wxT('[') && filename[1] != wxT('.'))) return true; @@ -413,11 +403,9 @@ void wxStripExtension(wxString& buffer) template static CharType *wxDoRealPath (CharType *path) { + static const CharType SEP = wxFILE_SEP_PATH; #ifdef __WXMSW__ - static const CharType SEP = wxT('\\'); wxUnix2DosFilename(path); -#else - static const CharType SEP = wxT('/'); #endif if (path[0] && path[1]) { /* MATTHEW: special case "/./x" */ @@ -549,15 +537,15 @@ static CharType *wxDoExpandPath(CharType *buf, const wxString& name) trimchars[2] = wxT('\t'); trimchars[3] = 0; + static const CharType SEP = wxFILE_SEP_PATH; #ifdef __WXMSW__ - const CharType SEP = wxT('\\'); -#else - const CharType SEP = wxT('/'); + //wxUnix2DosFilename(path); #endif + buf[0] = wxT('\0'); if (name.empty()) return buf; - nm = MYcopystring((const CharType*)name.c_str()); // Make a scratch copy + nm = ::MYcopystring(static_cast(name.c_str())); // Make a scratch copy CharType *nm_tmp = nm; /* Skip leading whitespace and cr */ @@ -807,22 +795,12 @@ wxPathOnly (wxChar *path) // Search backward for a backward or forward slash while (i > -1) { -#if defined(__WXMAC__) && !defined(__DARWIN__) - // Classic or Carbon CodeWarrior like - // Carbon with Apple DevTools is Unix like - if (path[i] == wxT(':') ) - { - buf[i] = 0; - return buf; - } -#else // Unix like or Windows if (path[i] == wxT('/') || path[i] == wxT('\\')) { buf[i] = 0; return buf; } -#endif #ifdef __VMS__ if (path[i] == wxT(']')) { @@ -863,15 +841,6 @@ wxString wxPathOnly (const wxString& path) // Search backward for a backward or forward slash while (i > -1) { -#if defined(__WXMAC__) && !defined(__DARWIN__) - // Classic or Carbon CodeWarrior like - // Carbon with Apple DevTools is Unix like - if (path[i] == wxT(':') ) - { - buf[i] = 0; - return wxString(buf); - } -#else // Unix like or Windows if (path[i] == wxT('/') || path[i] == wxT('\\')) { @@ -881,7 +850,6 @@ wxString wxPathOnly (const wxString& path) buf[i] = 0; return wxString(buf); } -#endif #ifdef __VMS__ if (path[i] == wxT(']')) { @@ -910,13 +878,9 @@ wxString wxPathOnly (const wxString& path) // and back again - or we get nasty problems with delimiters. // Also, convert to lower case, since case is significant in UNIX. -#if defined(__WXMAC__) +#if defined(__WXMAC__) && !defined(__WXOSX_IPHONE__) -#if TARGET_API_MAC_OSX #define kDefaultPathStyle kCFURLPOSIXPathStyle -#else -#define kDefaultPathStyle kCFURLHFSPathStyle -#endif wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent ) { @@ -934,13 +898,13 @@ wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathCompon CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, cfString); CFRelease( cfString ); CFStringNormalize(cfMutableString,kCFStringNormalizationFormC); - return wxMacCFStringHolder(cfMutableString).AsString(); + return wxCFStringRef(cfMutableString).AsString(); } OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef ) { OSStatus err = noErr ; - CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, wxMacCFStringHolder(path)); + CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(path)); CFStringNormalize(cfMutableString,kCFStringNormalizationFormD); CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kDefaultPathStyle, false); CFRelease( cfMutableString ); @@ -965,7 +929,7 @@ wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname ) CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, cfname); CFRelease( cfname ); CFStringNormalize(cfMutableString,kCFStringNormalizationFormC); - return wxMacCFStringHolder(cfMutableString).AsString() ; + return wxCFStringRef(cfMutableString).AsString() ; } #ifndef __LP64__ @@ -982,10 +946,11 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) void wxMacFilename2FSSpec( const wxString& path , FSSpec *spec ) { - OSStatus err = noErr ; - FSRef fsRef ; - wxMacPathToFSRef( path , &fsRef ) ; - err = FSRefMakeFSSpec( &fsRef , spec ) ; + OSStatus err = noErr; + FSRef fsRef; + wxMacPathToFSRef( path , &fsRef ); + err = FSGetCatalogInfo(&fsRef, kFSCatInfoNone, NULL, NULL, spec, NULL); + verify_noerr( err ); } #endif @@ -1125,7 +1090,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // instead of our code if available // // NB: 3rd parameter is bFailIfExists i.e. the inverse of overwrite - if ( !::CopyFile(file1, file2, !overwrite) ) + if ( !::CopyFile(file1.fn_str(), file2.fn_str(), !overwrite) ) { wxLogSysError(_("Failed to copy the file '%s' to '%s'"), file1.c_str(), file2.c_str()); @@ -1272,7 +1237,7 @@ bool wxRemoveFile(const wxString& file) || (defined(__MWERKS__) && defined(__MSL__)) int res = wxRemove(file); #elif defined(__WXMAC__) - int res = unlink(wxFNCONV(file)); + int res = unlink(file.fn_str()); #elif defined(__WXPALMOS__) int res = 1; // TODO with VFSFileDelete() @@ -1288,7 +1253,7 @@ bool wxMkdir(const wxString& dir, int perm) #if defined(__WXPALMOS__) return false; #elif defined(__WXMAC__) && !defined(__UNIX__) - return (mkdir( wxFNCONV(dir) , 0 ) == 0); + return (mkdir(dir.fn_str() , 0 ) == 0); #else // !Mac const wxChar *dirname = dir.c_str(); @@ -1376,9 +1341,9 @@ bool wxDirExists(const wxString& pathName) return false; #elif defined(__WIN32__) && !defined(__WXMICROWIN__) // stat() can't cope with network paths - DWORD ret = ::GetFileAttributes(strPath); + DWORD ret = ::GetFileAttributes(strPath.fn_str()); - return (ret != (DWORD)-1) && (ret & FILE_ATTRIBUTE_DIRECTORY); + return (ret != INVALID_FILE_ATTRIBUTES) && (ret & FILE_ATTRIBUTE_DIRECTORY); #elif defined(__OS2__) FILESTATUS3 Info = {{0}}; APIRET rc = ::DosQueryPathInfo((PSZ)(WXSTRINGCAST strPath), FIL_STANDARD, @@ -1408,7 +1373,12 @@ wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) return NULL; if ( buf ) +#ifdef _PACC_VER + // work around the PalmOS pacc compiler bug + wxStrcpy(buf, filename.data()); +#else wxStrcpy(buf, filename); +#endif else buf = MYcopystring(filename); @@ -1442,8 +1412,7 @@ wxString wxFindFirstFile(const wxString& spec, int flags) if ( !wxEndsWithPathSeparator(gs_dirPath ) ) gs_dirPath << wxFILE_SEP_PATH; - if (gs_dir) - delete gs_dir; + delete gs_dir; // can be NULL, this is ok gs_dir = new wxDir(gs_dirPath); if ( !gs_dir->IsOpened() ) @@ -1473,7 +1442,7 @@ wxString wxFindFirstFile(const wxString& spec, int flags) wxString wxFindNextFile() { - wxASSERT_MSG( gs_dir, wxT("You must call wxFindFirstFile before!") ); + wxCHECK_MSG( gs_dir, "", "You must call wxFindFirstFile before!" ); wxString result; gs_dir->GetNext(&result); @@ -1541,16 +1510,6 @@ wxChar *wxDoGetCwd(wxChar *buf, int sz) { #if defined(_MSC_VER) || defined(__MINGW32__) ok = _getcwd(cbuf, sz) != NULL; - #elif defined(__WXMAC__) && !defined(__DARWIN__) - char lbuf[1024] ; - if ( getcwd( lbuf , sizeof( lbuf ) ) ) - { - wxString res( lbuf , *wxConvCurrent ) ; - wxStrcpy( buf , res ) ; - ok = true; - } - else - ok = false ; #elif defined(__OS2__) APIRET rc; ULONG ulDriveNum = 0; @@ -1573,7 +1532,7 @@ wxChar *wxDoGetCwd(wxChar *buf, int sz) ok = getcwd(cbuf, sz) != NULL; #endif // platform - #if wxUSE_UNICODE && !(defined(__WXMAC__) && !defined(__DARWIN__)) + #if wxUSE_UNICODE // finally convert the result to Unicode if needed wxConvFile.MB2WC(buf, cbuf, sz); #endif // wxUSE_UNICODE @@ -1645,11 +1604,11 @@ bool wxSetWorkingDirectory(const wxString& d) #if defined(__OS2__) if (d[1] == ':') { - ::DosSetDefaultDisk(1 + wxToupper(d[0]) - _T('A')); - // do not call DosSetCurrentDir when just changing drive, - // since it requires e.g. "d:." instead of "d:"! - if (d.length() == 2) - return true; + ::DosSetDefaultDisk(wxToupper(d[0]) - _T('A') + 1); + // do not call DosSetCurrentDir when just changing drive, + // since it requires e.g. "d:." instead of "d:"! + if (d.length() == 2) + return true; } return (::DosSetCurrentDir(d.c_str()) == 0); #elif defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__) @@ -1662,7 +1621,7 @@ bool wxSetWorkingDirectory(const wxString& d) wxUnusedVar(d); return false; #else - return (bool)(SetCurrentDirectory(d) != 0); + return (bool)(SetCurrentDirectory(d.fn_str()) != 0); #endif #else // Must change drive, too. @@ -1701,7 +1660,7 @@ wxString wxGetOSDirectory() wxChar buf[256]; GetWindowsDirectory(buf, 256); return wxString(buf); -#elif defined(__WXMAC__) +#elif defined(__WXMAC__) && wxOSX_USE_CARBON return wxMacFindFolder(kOnSystemDisk, 'macs', false); #else return wxEmptyString; @@ -1746,7 +1705,7 @@ bool wxFindFileInPath(wxString *pStr, const wxString& szPath, const wxString& sz return false; } -void WXDLLEXPORT wxSplitPath(const wxString& fileName, +void WXDLLIMPEXP_BASE wxSplitPath(const wxString& fileName, wxString *pstrPath, wxString *pstrName, wxString *pstrExt) @@ -1756,7 +1715,7 @@ void WXDLLEXPORT wxSplitPath(const wxString& fileName, #if wxUSE_DATETIME -time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) +time_t WXDLLIMPEXP_BASE wxFileModificationTime(const wxString& filename) { wxDateTime mtime; if ( !wxFileName(filename).GetTimes(NULL, &mtime, NULL) ) @@ -1772,7 +1731,7 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) // Returns 0 if none or if there's a problem. // filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpeg" -int WXDLLEXPORT wxParseCommonDialogsFilter(const wxString& filterStr, +int WXDLLIMPEXP_BASE wxParseCommonDialogsFilter(const wxString& filterStr, wxArrayString& descriptions, wxArrayString& filters) { @@ -1885,22 +1844,32 @@ 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", but this // doesn't work under Win9x/ME but then it's not needed there anyhow - bool isdir = wxDirExists(path); - if ( isdir && wxGetOsVersion() == wxOS_WINDOWS_9X ) + const DWORD dwAttr = ::GetFileAttributes(path.fn_str()); + if ( dwAttr == INVALID_FILE_ATTRIBUTES ) + { + // file probably doesn't exist at all + return false; + } + + if ( wxGetOsVersion() == wxOS_WINDOWS_9X ) { // FAT directories always allow all access, even if they have the - // readonly flag set - return true; + // readonly flag set, and FAT files can only be read-only + return (dwAttr & FILE_ATTRIBUTE_DIRECTORY) || + (access != GENERIC_WRITE || + !(dwAttr & FILE_ATTRIBUTE_READONLY)); } HANDLE h = ::CreateFile ( - path.wx_str(), + path.t_str(), access, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, - isdir ? FILE_FLAG_BACKUP_SEMANTICS : 0, + dwAttr & FILE_ATTRIBUTE_DIRECTORY + ? FILE_FLAG_BACKUP_SEMANTICS + : 0, NULL ); if ( h != INVALID_HANDLE_VALUE ) @@ -1914,7 +1883,7 @@ bool wxIsWritable(const wxString &path) { #if defined( __UNIX__ ) || defined(__OS2__) // access() will take in count also symbolic links - return access(path.fn_str(), W_OK) == 0; + return wxAccess(path.c_str(), W_OK) == 0; #elif defined( __WINDOWS__ ) return wxCheckWin32Permission(path, GENERIC_WRITE); #else @@ -1928,7 +1897,7 @@ bool wxIsReadable(const wxString &path) { #if defined( __UNIX__ ) || defined(__OS2__) // access() will take in count also symbolic links - return access(path.fn_str(), R_OK) == 0; + return wxAccess(path.c_str(), R_OK) == 0; #elif defined( __WINDOWS__ ) return wxCheckWin32Permission(path, GENERIC_READ); #else @@ -1942,7 +1911,7 @@ bool wxIsExecutable(const wxString &path) { #if defined( __UNIX__ ) || defined(__OS2__) // access() will take in count also symbolic links - return access(path.fn_str(), X_OK) == 0; + return wxAccess(path.c_str(), X_OK) == 0; #elif defined( __WINDOWS__ ) return wxCheckWin32Permission(path, GENERIC_EXECUTE); #else