X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/56fc3fa5b3be585a27af0ac3263350e16c992e41..7e559cd8f46964e3f6c4e4d210f3822591903123:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 329a52695c..e5f0263ff9 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -51,7 +51,7 @@ #endif #if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers + #include "wx/mac/private.h" // includes mac headers #endif #ifdef __WXWINCE__ @@ -316,9 +316,9 @@ bool wxPathList::Member (const wxString& path) path.CompareTo (path2) == 0 #endif ) - return TRUE; + return true; } - return FALSE; + return false; } wxString wxPathList::FindValidPath (const wxString& file) @@ -354,7 +354,7 @@ wxString wxPathList::FindValidPath (const wxString& file) wxString wxPathList::FindAbsoluteValidPath (const wxString& file) { wxString f = FindValidPath(file); - if ( wxIsAbsolutePath(f) ) + if ( f.empty() || wxIsAbsolutePath(f) ) return f; wxString buf; @@ -397,23 +397,23 @@ wxIsAbsolutePath (const wxString& filename) // "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 ; + return true ; #else // Unix like or Windows if (filename[0] == wxT('/')) - return TRUE; + return true; #endif #ifdef __VMS__ if ((filename[0] == wxT('[') && filename[1] != wxT('.'))) - return TRUE; + return true; #endif #if defined(__WINDOWS__) || defined(__OS2__) // MSDOS like if (filename[0] == wxT('\\') || (wxIsalpha (filename[0]) && filename[1] == wxT(':'))) - return TRUE; + return true; #endif } - return FALSE ; + return false ; } /* @@ -751,17 +751,22 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin #endif // Handle User's home (ignore root homes!) - size_t len; - if ((val = wxGetUserHome (user)) != NULL && - (len = wxStrlen(val)) > 2 && - wxStrncmp(dest, val, len) == 0) - { - wxStrcpy(wxFileFunctionsBuffer, wxT("~")); - if (user != wxT("")) - wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user); - wxStrcat(wxFileFunctionsBuffer, dest + len); - wxStrcpy (dest, wxFileFunctionsBuffer); - } + val = wxGetUserHome (user); + if (!val) + return dest; + + const size_t len = wxStrlen(val); + if (len <= 2) + return dest; + + if (wxStrncmp(dest, val, len) == 0) + { + wxStrcpy(wxFileFunctionsBuffer, wxT("~")); + if (user != wxT("")) + wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user); + wxStrcat(wxFileFunctionsBuffer, dest + len); + wxStrcpy (dest, wxFileFunctionsBuffer); + } return dest; } @@ -874,6 +879,9 @@ wxString wxPathOnly (const wxString& path) // Unix like or Windows if (path[i] == wxT('/') || path[i] == wxT('\\')) { + // Don't return an empty string + if (i == 0) + i ++; buf[i] = 0; return wxString(buf); } @@ -918,9 +926,28 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) Str255 theParentPath = "\p"; FSSpec theParentSpec; FSRef theParentRef; + FSRef theRef ; char theFileName[FILENAME_MAX]; char thePath[FILENAME_MAX]; + // we loose the long filename by merely copying the spec->name + // so try the built-ins, which only work if the file exists, but still... + + theErr = FSpMakeFSRef(spec, &theRef); + if ( theErr == noErr ) + { + CFURLRef fullURLRef; + fullURLRef = ::CFURLCreateFromFSRef(NULL, &theRef); +#ifdef __UNIX__ + CFURLPathStyle pathstyle = kCFURLPOSIXPathStyle; +#else + CFURLPathStyle pathstyle = kCFURLHFSPathStyle; +#endif + CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, pathstyle); + ::CFRelease( fullURLRef ) ; + return wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding()); + } + strcpy(thePath, ""); // GD: Separate file name from path and make a FSRef to the parent @@ -1095,7 +1122,7 @@ wxString wxMacFSSpec2UnixFilename( const FSSpec *spec ) return wxMac2UnixFilename( wxMacFSSpec2MacFilename( spec) ) ; } -void wxUnixFilename2FSSpec( const char *path , FSSpec *spec ) +void wxUnixFilename2FSSpec( const wxChar *path , FSSpec *spec ) { wxString var = wxUnix2MacFilename( path ) ; wxMacFilename2FSSpec( var , spec ) ; @@ -1145,7 +1172,7 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil { wxString outfile; if ( !wxGetTempFileName( wxT("cat"), outfile) ) - return FALSE; + return false; FILE *fp1 wxDUMMY_INITIALIZE(NULL); FILE *fp2 = NULL; @@ -1161,7 +1188,7 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil fclose (fp2); if (fp3) fclose (fp3); - return FALSE; + return false; } int ch; @@ -1192,11 +1219,11 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) wxLogSysError(_("Failed to copy the file '%s' to '%s'"), file1.c_str(), file2.c_str()); - return FALSE; + return false; } #elif defined(__OS2__) if ( ::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) != 0 ) - return FALSE; + return false; #else // !Win32 wxStructStat fbuf; @@ -1207,13 +1234,13 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // from it anyhow wxLogSysError(_("Impossible to get permissions for file '%s'"), file1.c_str()); - return FALSE; + return false; } // open file1 for reading wxFile fileIn(file1, wxFile::read); if ( !fileIn.IsOpened() ) - return FALSE; + return false; // remove file2, if it exists. This is needed for creating // file2 with the correct permissions in the next step @@ -1221,7 +1248,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { wxLogSysError(_("Impossible to overwrite the file '%s'"), file2.c_str()); - return FALSE; + return false; } #ifdef __UNIX__ @@ -1235,7 +1262,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) wxFile fileOut; if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) ) - return FALSE; + return false; #ifdef __UNIX__ /// restore the old umask @@ -1249,21 +1276,21 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { count = fileIn.Read(buf, WXSIZEOF(buf)); if ( fileIn.Error() ) - return FALSE; + return false; // end of file? if ( !count ) break; if ( fileOut.Write(buf, count) < count ) - return FALSE; + return false; } // we can expect fileIn to be closed successfully, but we should ensure // that fileOut was closed as some write errors (disk full) might not be // detected before doing this if ( !fileIn.Close() || !fileOut.Close() ) - return FALSE; + return false; #if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__) // no chmod in VA. Should be some permission API for HPFS386 partitions @@ -1272,12 +1299,12 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { wxLogSysError(_("Impossible to set permissions for the file '%s'"), file2.c_str()); - return FALSE; + return false; } #endif // OS/2 || Mac #endif // __WXMSW__ && __WIN32__ - return TRUE; + return true; } bool @@ -1286,16 +1313,16 @@ wxRenameFile (const wxString& file1, const wxString& file2) #ifndef __WXWINCE__ // Normal system call if ( wxRename (file1, file2) == 0 ) - return TRUE; + return true; #endif // Try to copy if (wxCopyFile(file1, file2)) { wxRemoveFile(file1); - return TRUE; + return true; } // Give up - return FALSE; + return false; } bool wxRemoveFile(const wxString& file) @@ -1303,7 +1330,9 @@ bool wxRemoveFile(const wxString& file) #if defined(__VISUALC__) \ || defined(__BORLANDC__) \ || defined(__WATCOMC__) \ - || defined(__GNUWIN32__) + || defined(__DMC__) \ + || defined(__GNUWIN32__) \ + || (defined(__MWERKS__) && defined(__MSL__)) int res = wxRemove(file); #elif defined(__WXMAC__) int res = unlink(wxFNCONV(file)); @@ -1324,10 +1353,11 @@ bool wxMkdir(const wxString& dir, int perm) // 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__) - #ifndef MSVCRT - if ( mkdir(wxFNCONV(dirname), perm) != 0 ) - #else + #if defined(MSVCRT) + wxUnusedVar(perm); if ( mkdir(wxFNCONV(dirname)) != 0 ) + #else + if ( mkdir(wxFNCONV(dirname), perm) != 0 ) #endif #elif defined(__OS2__) if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? @@ -1351,17 +1381,17 @@ bool wxMkdir(const wxString& dir, int perm) { wxLogSysError(_("Directory '%s' couldn't be created"), dirname); - return FALSE; + return false; } - return TRUE; + return true; #endif // Mac/!Mac } bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #ifdef __VMS__ - return FALSE; //to be changed since rmdir exists in VMS7.x + return false; //to be changed since rmdir exists in VMS7.x #elif defined(__OS2__) return (::DosDeleteDir((PSZ)dir.c_str()) == 0); #else @@ -1396,7 +1426,7 @@ bool wxPathExists(const wxChar *pszPathName) #ifdef __OS2__ // OS/2 can't handle "d:", it wants either "d:\" or "d:." - if (strPath.length() == 2 && strPath[1] == _T(':')) + if (strPath.length() == 2 && strPath[1u] == _T(':')) strPath << _T('.'); #endif @@ -1512,14 +1542,14 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) buf = new wxChar[sz + 1]; } - bool ok wxDUMMY_INITIALIZE(FALSE); + bool ok wxDUMMY_INITIALIZE(false); // for the compilers which have Unicode version of _getcwd(), call it // directly, for the others call the ANSI version and do the translation #if !wxUSE_UNICODE #define cbuf buf #else // wxUSE_UNICODE - bool needsANSI = TRUE; + bool needsANSI = true; #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU // This is not legal code as the compiler @@ -1533,11 +1563,11 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #if wxUSE_UNICODE_MSLU if ( wxGetOsVersion() != wxWIN95 ) #else - char *cbuf = NULL; // never really used because needsANSI will always be FALSE + char *cbuf = NULL; // never really used because needsANSI will always be false #endif { ok = _wgetcwd(buf, sz) != NULL; - needsANSI = FALSE; + needsANSI = false; } #endif @@ -1563,11 +1593,11 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) cwdSpec.name[0] = 0 ; wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ; wxStrcpy( buf , res ) ; - ok = TRUE; + ok = true; } else { - ok = FALSE; + ok = false; } #elif defined(__OS2__) APIRET rc; @@ -1591,7 +1621,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) ok = getcwd(cbuf, sz) != NULL; #endif // platform - #if wxUSE_UNICODE && !defined(__WXMAC__) + #if wxUSE_UNICODE && !(defined(__WXMAC__) && !defined(__DARWIN__)) // finally convert the result to Unicode if needed wxConvFile.MB2WC(buf, cbuf, sz); #endif // wxUSE_UNICODE @@ -1659,7 +1689,7 @@ bool wxSetWorkingDirectory(const wxString& d) #ifdef __WIN32__ #ifdef __WXWINCE__ // No equivalent in WinCE - return FALSE; + return false; #else return (bool)(SetCurrentDirectory(d) != 0); #endif @@ -1714,11 +1744,11 @@ bool wxEndsWithPathSeparator(const wxChar *pszFileName) return len && wxIsPathSeparator(pszFileName[len - 1]); } -// find a file in a list of directories, returns FALSE if not found +// find a file in a list of directories, returns false if not found bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile) { // we assume that it's not empty - wxCHECK_MSG( !wxIsEmpty(pszFile), FALSE, + wxCHECK_MSG( !wxIsEmpty(pszFile), false, _T("empty file name in wxFindFileInPath")); // skip path separator in the beginning of the file name if present @@ -1753,7 +1783,7 @@ bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFi delete [] szPath; - return pc != NULL; // if TRUE => we breaked from the loop + return pc != NULL; // if true => we breaked from the loop } void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, @@ -1810,6 +1840,116 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) } +// Parses the filterStr, returning the number of filters. +// 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, wxArrayString& descriptions, wxArrayString& filters) +{ + descriptions.Clear(); + filters.Clear(); + + wxString str(filterStr); + + wxString description, filter; + int pos = 0; + while( pos != wxNOT_FOUND ) + { + pos = str.Find(wxT('|')); + if ( pos == wxNOT_FOUND ) + { + // if there are no '|'s at all in the string just take the entire + // string as filter and make description empty for later autocompletion + if ( filters.IsEmpty() ) + { + descriptions.Add(wxEmptyString); + filters.Add(filterStr); + } + else + { + wxFAIL_MSG( _T("missing '|' in the wildcard string!") ); + } + + break; + } + + description = str.Left(pos); + str = str.Mid(pos + 1); + pos = str.Find(wxT('|')); + if ( pos == wxNOT_FOUND ) + { + filter = str; + } + else + { + filter = str.Left(pos); + str = str.Mid(pos + 1); + } + + descriptions.Add(description); + filters.Add(filter); + } + +#if defined(__WXMOTIF__) + // split it so there is one wildcard per entry + for( size_t i = 0 ; i < descriptions.GetCount() ; i++ ) + { + pos = filters[i].Find(wxT(';')); + if (pos != wxNOT_FOUND) + { + // first split only filters + descriptions.Insert(descriptions[i],i+1); + filters.Insert(filters[i].Mid(pos+1),i+1); + filters[i]=filters[i].Left(pos); + + // autoreplace new filter in description with pattern: + // C/C++ Files(*.cpp;*.c;*.h)|*.cpp;*.c;*.h + // cause split into: + // C/C++ Files(*.cpp)|*.cpp + // C/C++ Files(*.c;*.h)|*.c;*.h + // and next iteration cause another split into: + // C/C++ Files(*.cpp)|*.cpp + // C/C++ Files(*.c)|*.c + // C/C++ Files(*.h)|*.h + for ( size_t k=i;kbefore.Find(_T(')'),true)) + { + before = before.Left(pos+1); + before << filters[k]; + pos = after.Find(_T(')')); + int pos1 = after.Find(_T('(')); + if (pos != wxNOT_FOUND && (pos