X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0bf751e7e901fffb9ba9d850948915e33456524a..3cfde7c049bddf6fd3b4c2e35a6b8ecdcdc1d74f:/src/common/filefn.cpp?ds=sidebyside diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index e4d3f4d5dd..322f7c16c6 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,16 +96,17 @@ #define _MAXPATHLEN 1024 #endif -#ifdef __WXMAC__ -# include "MoreFilesX.h" +#ifndef INVALID_FILE_ATTRIBUTES + #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #endif // ---------------------------------------------------------------------------- // private globals // ---------------------------------------------------------------------------- -// MT-FIXME: get rid of this horror and all code using it +#if WXWIN_COMPATIBILITY_2_8 static wxChar wxFileFunctionsBuffer[4*_MAXPATHLEN]; +#endif #if defined(__VISAGECPP__) && __IBMCPP__ >= 400 // @@ -292,9 +294,10 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) const } // ---------------------------------------------------------------------------- -// miscellaneous global functions (TOFIX!) +// miscellaneous global functions // ---------------------------------------------------------------------------- +#if WXWIN_COMPATIBILITY_2_8 static inline wxChar* MYcopystring(const wxString& s) { wxChar* copy = new wxChar[s.length() + 1]; @@ -307,6 +310,7 @@ static inline CharType* MYcopystring(const CharType* s) CharType* copy = new CharType[wxStrlen(s) + 1]; return wxStrcpy(copy, s); } +#endif bool @@ -317,9 +321,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 +347,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; @@ -370,6 +363,7 @@ wxIsAbsolutePath (const wxString& filename) return false ; } +#if WXWIN_COMPATIBILITY_2_8 /* * Strip off any extension (dot something) from end of file, * IF one exists. Inserts zero into buffer. @@ -413,11 +407,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" */ @@ -490,7 +482,7 @@ wxString wxRealPath(const wxString& path) wxChar *wxCopyAbsolutePath(const wxString& filename) { if (filename.empty()) - return (wxChar *) NULL; + return NULL; if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) { @@ -549,15 +541,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 */ @@ -723,7 +715,7 @@ wxContractPath (const wxString& filename, static wxChar dest[_MAXPATHLEN]; if (filename.empty()) - return (wxChar *) NULL; + return NULL; wxStrcpy (dest, filename); #ifdef __WXMSW__ @@ -767,6 +759,8 @@ wxContractPath (const wxString& filename, return dest; } +#endif // #if WXWIN_COMPATIBILITY_2_8 + // Return just the filename, not the path (basename) wxChar *wxFileNameFromPath (wxChar *path) { @@ -807,22 +801,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(']')) { @@ -844,7 +828,7 @@ wxPathOnly (wxChar *path) } #endif } - return (wxChar *) NULL; + return NULL; } // Return just the directory, or NULL if no directory @@ -863,15 +847,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 +856,6 @@ wxString wxPathOnly (const wxString& path) buf[i] = 0; return wxString(buf); } -#endif #ifdef __VMS__ if (path[i] == wxT(']')) { @@ -910,13 +884,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 +904,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 +935,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,15 +952,19 @@ 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 #endif // __WXMAC__ + +#if WXWIN_COMPATIBILITY_2_8 + template static void wxDoDos2UnixFilename(T *s) { @@ -1033,6 +1007,8 @@ wxDoUnix2DosFilename(T *WXUNUSED(s) ) void wxUnix2DosFilename(char *s) { wxDoUnix2DosFilename(s); } void wxUnix2DosFilename(wchar_t *s) { wxDoUnix2DosFilename(s); } +#endif // #if WXWIN_COMPATIBILITY_2_8 + // Concatenate two files to form third bool wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& file3) @@ -1125,7 +1101,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 +1248,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 +1264,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 +1352,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, @@ -1400,6 +1376,8 @@ bool wxDirExists(const wxString& pathName) #endif // __WIN32__/!__WIN32__ } +#if WXWIN_COMPATIBILITY_2_8 + // Get a temporary filename, opening and closing the file. wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) { @@ -1408,7 +1386,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); @@ -1429,6 +1412,8 @@ bool wxGetTempFileName(const wxString& prefix, wxString& buf) #endif // wxUSE_FILE/!wxUSE_FILE } +#endif // #if WXWIN_COMPATIBILITY_2_8 + // Get first file name matching given wild card. static wxDir *gs_dir = NULL; @@ -1436,14 +1421,13 @@ static wxString gs_dirPath; wxString wxFindFirstFile(const wxString& spec, int flags) { - wxSplitPath(spec, &gs_dirPath, NULL, NULL); + wxFileName::SplitPath(spec, &gs_dirPath, NULL, NULL); if ( gs_dirPath.empty() ) gs_dirPath = wxT("."); 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 +1457,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 +1525,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; @@ -1561,7 +1535,7 @@ wxChar *wxDoGetCwd(wxChar *buf, int sz) { sz -= 3; rc = ::DosQueryCurrentDir( 0 // current drive - ,cbuf + 3 + ,(PBYTE)cbuf + 3 ,(PULONG)&sz ); cbuf[0] = char('A' + (ulDriveNum - 1)); @@ -1573,7 +1547,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 +1619,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 +1636,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 +1675,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,17 +1720,19 @@ bool wxFindFileInPath(wxString *pStr, const wxString& szPath, const wxString& sz return false; } -void WXDLLEXPORT wxSplitPath(const wxString& fileName, +#if WXWIN_COMPATIBILITY_2_8 +void WXDLLIMPEXP_BASE wxSplitPath(const wxString& fileName, wxString *pstrPath, wxString *pstrName, wxString *pstrExt) { wxFileName::SplitPath(fileName, pstrPath, pstrName, pstrExt); } +#endif // #if WXWIN_COMPATIBILITY_2_8 #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 +1748,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 +1861,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 +1900,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 +1914,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 +1928,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