X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/834c8ade287891232820e8111379cfa1c58f8828..2e14066008229145e2da7b9f05a478ce38631f83:/src/common/filefn.cpp?ds=sidebyside diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 24324f04ee..d7ed0b83fd 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -64,11 +64,13 @@ #include "wx/msw/mslu.h" // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path() + // and for cygwin_conv_path() // // note that it must be included after #ifdef __GNUWIN32__ #ifdef __CYGWIN__ #include + #include #endif #endif // __GNUWIN32__ @@ -96,16 +98,13 @@ #define _MAXPATHLEN 1024 #endif -#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 // @@ -115,13 +114,6 @@ static wxChar wxFileFunctionsBuffer[4*_MAXPATHLEN]; const int wxInvalidOffset = -1; #endif -// ---------------------------------------------------------------------------- -// macros -// ---------------------------------------------------------------------------- - -// translate the filenames before passing them to OS functions -#define OS_FILENAME(s) (s.fn_str()) - // ============================================================================ // implementation // ============================================================================ @@ -137,7 +129,7 @@ const int wxInvalidOffset = -1; // regardless of the mode parameter. This hack works around the problem by // setting the mode with _wchmod. // -int wxCRT_Open(const wchar_t *pathname, int flags, mode_t mode) +int wxCRT_OpenW(const wchar_t *pathname, int flags, mode_t mode) { int moreflags = 0; @@ -293,9 +285,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]; @@ -308,35 +301,13 @@ static inline CharType* MYcopystring(const CharType* s) CharType* copy = new CharType[wxStrlen(s) + 1]; return wxStrcpy(copy, s); } +#endif bool wxFileExists (const wxString& filename) { -#if defined(__WXPALMOS__) - return false; -#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.fn_str()); - - return (ret != INVALID_FILE_ATTRIBUTES) && !(ret & FILE_ATTRIBUTE_DIRECTORY); -#else // !__WIN32__ - #ifndef S_ISREG - #define S_ISREG(mode) ((mode) & S_IFREG) - #endif - wxStructStat st; -#ifndef wxNEED_WX_UNISTD_H - return (wxStat( filename.fn_str() , &st) == 0 && S_ISREG(st.st_mode)) -#ifdef __OS2__ - || (errno == EACCES) // if access is denied something with that name - // exists and is opened in exclusive mode. -#endif - ; -#else - return wxStat( filename , &st) == 0 && S_ISREG(st.st_mode); -#endif -#endif // __WIN32__/!__WIN32__ + return wxFileName::FileExists(filename); } bool @@ -360,6 +331,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. @@ -387,16 +359,7 @@ void wxStripExtension(wchar_t *buffer) { wxDoStripExtension(buffer); } void wxStripExtension(wxString& buffer) { - //RN: Be careful about the handling the case where - //buffer.length() == 0 - for(size_t i = buffer.length() - 1; i != wxString::npos; --i) - { - if (buffer.GetChar(i) == wxT('.')) - { - buffer = buffer.Left(i); - break; - } - } + buffer = wxFileName::StripExtension(buffer); } // Destructive removal of /./ and /../ stuff @@ -478,7 +441,7 @@ wxString wxRealPath(const wxString& path) wxChar *wxCopyAbsolutePath(const wxString& filename) { if (filename.empty()) - return (wxChar *) NULL; + return NULL; if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) { @@ -711,7 +674,7 @@ wxContractPath (const wxString& filename, static wxChar dest[_MAXPATHLEN]; if (filename.empty()) - return (wxChar *) NULL; + return NULL; wxStrcpy (dest, filename); #ifdef __WXMSW__ @@ -755,6 +718,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) { @@ -766,16 +731,7 @@ wxChar *wxFileNameFromPath (wxChar *path) wxString wxFileNameFromPath (const wxString& path) { - wxString name, ext; - wxFileName::SplitPath(path, NULL, &name, &ext); - - wxString fullname = name; - if ( !ext.empty() ) - { - fullname << wxFILE_SEP_EXT << ext; - } - - return fullname; + return wxFileName(path).GetFullName(); } // Return just the directory, or NULL if no directory @@ -822,7 +778,7 @@ wxPathOnly (wxChar *path) } #endif } - return (wxChar *) NULL; + return NULL; } // Return just the directory, or NULL if no directory @@ -949,21 +905,24 @@ void wxMacFilename2FSSpec( const wxString& path , FSSpec *spec ) OSStatus err = noErr; FSRef fsRef; wxMacPathToFSRef( path , &fsRef ); - err = FSGetCatalogInfo(&fsRef, kFSCatInfoNone, NULL, NULL, spec, NULL); + 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) { if (s) while (*s) { - if (*s == _T('\\')) - *s = _T('/'); + if (*s == wxT('\\')) + *s = wxT('/'); #ifdef __WXMSW__ else *s = wxTolower(*s); // Case INDEPENDENT @@ -998,6 +957,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) @@ -1090,7 +1051,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.fn_str(), file2.fn_str(), !overwrite) ) + if ( !::CopyFile(file1.t_str(), file2.t_str(), !overwrite) ) { wxLogSysError(_("Failed to copy the file '%s' to '%s'"), file1.c_str(), file2.c_str()); @@ -1107,7 +1068,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) wxStructStat fbuf; // get permissions of file1 - if ( wxStat( file1.c_str(), &fbuf) != 0 ) + if ( wxStat( file1, &fbuf) != 0 ) { // the file probably doesn't exist or we haven't the rights to read // from it anyhow @@ -1177,7 +1138,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) #if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__) // no chmod in VA. Should be some permission API for HPFS386 partitions // however - if ( chmod(OS_FILENAME(file2), fbuf.st_mode) != 0 ) + if ( chmod(file2.fn_str(), fbuf.st_mode) != 0 ) { wxLogSysError(_("Impossible to set permissions for the file '%s'"), file2.c_str()); @@ -1242,7 +1203,7 @@ bool wxRemoveFile(const wxString& file) int res = 1; // TODO with VFSFileDelete() #else - int res = unlink(OS_FILENAME(file)); + int res = unlink(file.fn_str()); #endif return res == 0; @@ -1252,14 +1213,16 @@ bool wxMkdir(const wxString& dir, int perm) { #if defined(__WXPALMOS__) return false; -#elif defined(__WXMAC__) && !defined(__UNIX__) - return (mkdir(dir.fn_str() , 0 ) == 0); -#else // !Mac - const wxChar *dirname = dir.c_str(); +#else +#if defined(__WXMAC__) && !defined(__UNIX__) + if ( mkdir(dir.fn_str(), 0) != 0 ) // assume mkdir() has 2 args on non Windows-OS/2 platforms and on Windows too // for the GNU compiler -#if (!(defined(__WXMSW__) || defined(__OS2__) || defined(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WINE__) || defined(__WXMICROWIN__) +#elif (!(defined(__WXMSW__) || defined(__OS2__) || defined(__DOS__))) || \ + (defined(__GNUWIN32__) && !defined(__MINGW32__)) || \ + defined(__WINE__) || defined(__WXMICROWIN__) + const wxChar *dirname = dir.c_str(); #if defined(MSVCRT) wxUnusedVar(perm); if ( mkdir(wxFNCONV(dirname)) != 0 ) @@ -1268,8 +1231,9 @@ bool wxMkdir(const wxString& dir, int perm) #endif #elif defined(__OS2__) wxUnusedVar(perm); - if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? + if (::DosCreateDir(dir.c_str(), NULL) != 0) // enhance for EAB's?? #elif defined(__DOS__) + const wxChar *dirname = dir.c_str(); #if defined(__WATCOMC__) (void)perm; if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 ) @@ -1280,91 +1244,53 @@ bool wxMkdir(const wxString& dir, int perm) #endif #else // !MSW, !DOS and !OS/2 VAC++ wxUnusedVar(perm); -#ifdef __WXWINCE__ - if ( !CreateDirectory(dirname, NULL) ) -#else + #ifdef __WXWINCE__ + if ( CreateDirectory(dir.fn_str(), NULL) == 0 ) + #else if ( wxMkDir(dir.fn_str()) != 0 ) -#endif + #endif #endif // !MSW/MSW { - wxLogSysError(_("Directory '%s' couldn't be created"), dirname); - + wxLogSysError(_("Directory '%s' couldn't be created"), dir); return false; } return true; -#endif // Mac/!Mac +#endif // PALMOS/!PALMOS } bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #if defined(__VMS__) return false; //to be changed since rmdir exists in VMS7.x -#elif defined(__OS2__) - return (::DosDeleteDir(dir.c_str()) == 0); -#elif defined(__WXWINCE__) - return (RemoveDirectory(dir) != 0); #elif defined(__WXPALMOS__) // TODO with VFSFileRename() return false; #else - return (wxRmDir(OS_FILENAME(dir)) == 0); -#endif + #if defined(__OS2__) + if ( ::DosDeleteDir(dir.c_str()) != 0 ) + #elif defined(__WXWINCE__) + if ( RemoveDirectory(dir.fn_str()) == 0 ) + #else + if ( wxRmDir(dir.fn_str()) != 0 ) + #endif + { + wxLogSysError(_("Directory '%s' couldn't be deleted"), dir); + return false; + } + + return true; +#endif // PALMOS/!PALMOS } // does the path exists? (may have or not '/' or '\\' at the end) bool wxDirExists(const wxString& pathName) { - wxString strPath(pathName); - -#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 paths "d:\" (which are different from "d:") nor for just "\" - while ( wxEndsWithPathSeparator(strPath) ) - { - size_t len = strPath.length(); - if ( len == 1 || (len == 3 && strPath[len - 2] == _T(':')) ) - break; - - strPath.Truncate(len - 1); - } -#endif // __WINDOWS__ - -#ifdef __OS2__ - // OS/2 can't handle "d:", it wants either "d:\" or "d:." - if (strPath.length() == 2 && strPath[1u] == _T(':')) - strPath << _T('.'); -#endif - -#if defined(__WXPALMOS__) - return false; -#elif defined(__WIN32__) && !defined(__WXMICROWIN__) - // stat() can't cope with network paths - DWORD ret = ::GetFileAttributes(strPath.fn_str()); - - return (ret != INVALID_FILE_ATTRIBUTES) && (ret & FILE_ATTRIBUTE_DIRECTORY); -#elif defined(__OS2__) - FILESTATUS3 Info = {{0}}; - APIRET rc = ::DosQueryPathInfo((PSZ)(WXSTRINGCAST strPath), FIL_STANDARD, - (void*) &Info, sizeof(FILESTATUS3)); - - return ((rc == NO_ERROR) && (Info.attrFile & FILE_DIRECTORY)) || - (rc == ERROR_SHARING_VIOLATION); - // If we got a sharing violation, there must be something with this name. -#else // !__WIN32__ - - wxStructStat st; -#ifndef __VISAGECPP__ - return wxStat(strPath.c_str(), &st) == 0 && ((st.st_mode & S_IFMT) == S_IFDIR); -#else - // S_IFMT not supported in VA compilers.. st_mode is a 2byte value only - return wxStat(strPath.c_str(), &st) == 0 && (st.st_mode == S_IFDIR); -#endif - -#endif // __WIN32__/!__WIN32__ + return wxFileName::DirExists(pathName); } +#if WXWIN_COMPATIBILITY_2_8 + // Get a temporary filename, opening and closing the file. wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) { @@ -1399,6 +1325,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; @@ -1406,7 +1334,7 @@ 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 ) ) @@ -1417,7 +1345,7 @@ wxString wxFindFirstFile(const wxString& spec, int flags) if ( !gs_dir->IsOpened() ) { - wxLogSysError(_("Can not enumerate files '%s'"), spec); + wxLogSysError(_("Cannot enumerate files '%s'"), spec); return wxEmptyString; } @@ -1468,11 +1396,11 @@ wxChar *wxDoGetCwd(wxChar *buf, int sz) { #if defined(__WXPALMOS__) // TODO - if(buf && sz>0) buf[0] = _T('\0'); + if(buf && sz>0) buf[0] = wxT('\0'); return buf; #elif defined(__WXWINCE__) // TODO - if(buf && sz>0) buf[0] = _T('\0'); + if(buf && sz>0) buf[0] = wxT('\0'); return buf; #else if ( !buf ) @@ -1520,7 +1448,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)); @@ -1546,7 +1474,7 @@ wxChar *wxDoGetCwd(wxChar *buf, int sz) // sense at all to me - empty string is a better error indicator // (NULL might be even better but I'm afraid this could lead to // problems with the old code assuming the return is never NULL) - buf[0] = _T('\0'); + buf[0] = wxT('\0'); } else // ok, but we might need to massage the path into the right format { @@ -1566,11 +1494,19 @@ wxChar *wxDoGetCwd(wxChar *buf, int sz) // another example of DOS/Unix mix (Cygwin) wxString pathUnix = buf; #if wxUSE_UNICODE + #if CYGWIN_VERSION_DLL_MAJOR >= 1007 + cygwin_conv_path(CCP_POSIX_TO_WIN_W, pathUnix.mb_str(wxConvFile), buf, sz); + #else char bufA[_MAXPATHLEN]; cygwin_conv_to_full_win32_path(pathUnix.mb_str(wxConvFile), bufA); wxConvFile.MB2WC(buf, bufA, sz); + #endif #else + #if CYGWIN_VERSION_DLL_MAJOR >= 1007 + cygwin_conv_path(CCP_POSIX_TO_WIN_A, pathUnix, buf, sz); + #else cygwin_conv_to_full_win32_path(pathUnix, buf); + #endif #endif // wxUSE_UNICODE #endif // __CYGWIN__ } @@ -1604,7 +1540,7 @@ bool wxSetWorkingDirectory(const wxString& d) #if defined(__OS2__) if (d[1] == ':') { - ::DosSetDefaultDisk(wxToupper(d[0]) - _T('A') + 1); + ::DosSetDefaultDisk(wxToupper(d[0]) - wxT('A') + 1); // do not call DosSetCurrentDir when just changing drive, // since it requires e.g. "d:." instead of "d:"! if (d.length() == 2) @@ -1661,7 +1597,7 @@ wxString wxGetOSDirectory() GetWindowsDirectory(buf, 256); return wxString(buf); #elif defined(__WXMAC__) && wxOSX_USE_CARBON - return wxMacFindFolder(kOnSystemDisk, 'macs', false); + return wxMacFindFolderNoSeparator(kOnSystemDisk, 'macs', false); #else return wxEmptyString; #endif @@ -1677,7 +1613,7 @@ bool wxFindFileInPath(wxString *pStr, const wxString& szPath, const wxString& sz { // we assume that it's not empty wxCHECK_MSG( !szFile.empty(), false, - _T("empty file name in wxFindFileInPath")); + wxT("empty file name in wxFindFileInPath")); // skip path separator in the beginning of the file name if present wxString szFile2; @@ -1705,6 +1641,7 @@ bool wxFindFileInPath(wxString *pStr, const wxString& szPath, const wxString& sz return false; } +#if WXWIN_COMPATIBILITY_2_8 void WXDLLIMPEXP_BASE wxSplitPath(const wxString& fileName, wxString *pstrPath, wxString *pstrName, @@ -1712,6 +1649,7 @@ void WXDLLIMPEXP_BASE wxSplitPath(const wxString& fileName, { wxFileName::SplitPath(fileName, pstrPath, pstrName, pstrExt); } +#endif // #if WXWIN_COMPATIBILITY_2_8 #if wxUSE_DATETIME @@ -1756,7 +1694,7 @@ int WXDLLIMPEXP_BASE wxParseCommonDialogsFilter(const wxString& filterStr, } else { - wxFAIL_MSG( _T("missing '|' in the wildcard string!") ); + wxFAIL_MSG( wxT("missing '|' in the wildcard string!") ); } break; @@ -1807,13 +1745,13 @@ int WXDLLIMPEXP_BASE wxParseCommonDialogsFilter(const wxString& filterStr, { wxString before = descriptions[k].Left(pos); wxString after = descriptions[k].Mid(pos+filters[k].Len()); - pos = before.Find(_T('('),true); - if (pos>before.Find(_T(')'),true)) + pos = before.Find(wxT('('),true); + if (pos>before.Find(wxT(')'),true)) { before = before.Left(pos+1); before << filters[k]; - pos = after.Find(_T(')')); - int pos1 = after.Find(_T('(')); + pos = after.Find(wxT(')')); + int pos1 = after.Find(wxT('(')); if (pos != wxNOT_FOUND && (pos