X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/110c50944f08b0e52313c57d4f10a5f1d0923227..ab52bac815bed0189bb0ba3b52a15e093c354533:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 618fdac037..9142e61c23 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -180,11 +180,15 @@ public: if ( m_hFile == INVALID_HANDLE_VALUE ) { if ( mode == Read ) + { wxLogSysError(_("Failed to open '%s' for reading"), filename.c_str()); + } else + { wxLogSysError(_("Failed to open '%s' for writing"), filename.c_str()); + } } } @@ -226,13 +230,13 @@ static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft) FILETIME ftLocal; if ( !::FileTimeToLocalFileTime(&ftcopy, &ftLocal) ) { - wxLogLastError(_T("FileTimeToLocalFileTime")); + wxLogLastError(wxT("FileTimeToLocalFileTime")); } SYSTEMTIME st; if ( !::FileTimeToSystemTime(&ftLocal, &st) ) { - wxLogLastError(_T("FileTimeToSystemTime")); + wxLogLastError(wxT("FileTimeToSystemTime")); } dt->Set(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, @@ -253,12 +257,12 @@ static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt) FILETIME ftLocal; if ( !::SystemTimeToFileTime(&st, &ftLocal) ) { - wxLogLastError(_T("SystemTimeToFileTime")); + wxLogLastError(wxT("SystemTimeToFileTime")); } if ( !::LocalFileTimeToFileTime(&ftLocal, ft) ) { - wxLogLastError(_T("LocalFileTimeToFileTime")); + wxLogLastError(wxT("LocalFileTimeToFileTime")); } } @@ -408,12 +412,11 @@ void wxFileName::SetPath( const wxString& pathOrig, wxPathFormat format ) break; default: - wxFAIL_MSG( _T("Unknown path format") ); + wxFAIL_MSG( wxT("Unknown path format") ); // !! Fall through !! case wxPATH_UNIX: - // the paths of the form "~" or "~username" are absolute - m_relative = leadingChar != wxT('/') && leadingChar != _T('~'); + m_relative = leadingChar != wxT('/'); break; case wxPATH_DOS: @@ -472,26 +475,19 @@ void wxFileName::Assign(const wxString& fullpathOrig, wxString volume, path, name, ext; bool hasExt; - // do some consistency checks in debug mode: the name should be really just - // the filename and the path should be really just a path -#ifdef __WXDEBUG__ + // do some consistency checks: the name should be really just the filename + // and the path should be really just a path wxString volDummy, pathDummy, nameDummy, extDummy; SplitPath(fullname, &volDummy, &pathDummy, &name, &ext, &hasExt, format); wxASSERT_MSG( volDummy.empty() && pathDummy.empty(), - _T("the file name shouldn't contain the path") ); + wxT("the file name shouldn't contain the path") ); SplitPath(fullpath, &volume, &path, &nameDummy, &extDummy, format); wxASSERT_MSG( nameDummy.empty() && extDummy.empty(), - _T("the path shouldn't contain file name nor extension") ); - -#else // !__WXDEBUG__ - SplitPath(fullname, NULL /* no volume */, NULL /* no path */, - &name, &ext, &hasExt, format); - SplitPath(fullpath, &volume, &path, NULL, NULL, format); -#endif // __WXDEBUG__/!__WXDEBUG__ + wxT("the path shouldn't contain file name nor extension") ); Assign(volume, path, name, ext, hasExt, format); } @@ -599,7 +595,7 @@ wxString wxFileName::GetCwd(const wxString& volume) return cwd; } -bool wxFileName::SetCwd() +bool wxFileName::SetCwd() const { return wxFileName::SetCwd( GetPath() ); } @@ -683,7 +679,7 @@ static bool wxTempOpen(wxFFile *file, const wxString& path, bool *deleteOnClose) { #ifndef wx_fdopen *deleteOnClose = false; - return file->Open(path, _T("w+b")); + return file->Open(path, wxT("w+b")); #else // wx_fdopen int fd = wxTempOpen(path, deleteOnClose); if (fd == -1) @@ -751,7 +747,7 @@ static wxString wxCreateTempImpl( if ( !::GetTempFileName(dir.fn_str(), name.fn_str(), 0, wxStringBuffer(path, MAX_PATH + 1)) ) { - wxLogLastError(_T("GetTempFileName")); + wxLogLastError(wxT("GetTempFileName")); path.clear(); } @@ -769,7 +765,7 @@ static wxString wxCreateTempImpl( #if defined(HAVE_MKSTEMP) // scratch space for mkstemp() - path += _T("XXXXXX"); + path += wxT("XXXXXX"); // we need to copy the path to the buffer in which mkstemp() can modify it wxCharBuffer buf(path.fn_str()); @@ -801,7 +797,7 @@ static wxString wxCreateTempImpl( #ifdef wx_fdopen ffileTemp->Attach(wx_fdopen(fdTemp, "r+b")); #else - ffileTemp->Open(path, _T("r+b")); + ffileTemp->Open(path, wxT("r+b")); close(fdTemp); #endif } @@ -816,7 +812,7 @@ static wxString wxCreateTempImpl( #ifdef HAVE_MKTEMP // same as above - path += _T("XXXXXX"); + path += wxT("XXXXXX"); wxCharBuffer buf = wxConvFile.cWX2MB( path ); if ( !mktemp( (char*)(const char*) buf ) ) @@ -839,7 +835,7 @@ static wxString wxCreateTempImpl( for ( size_t n = 0; n < numTries; n++ ) { // 3 hex digits is enough for numTries == 1000 < 4096 - pathTry = path + wxString::Format(_T("%.03x"), (unsigned int) n); + pathTry = path + wxString::Format(wxT("%.03x"), (unsigned int) n); if ( !wxFileName::FileExists(pathTry) ) { break; @@ -1060,7 +1056,7 @@ wxString wxFileName::GetTempDir() #elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) if ( !::GetTempPath(MAX_PATH, wxStringBuffer(dir, MAX_PATH + 1)) ) { - wxLogLastError(_T("GetTempPath")); + wxLogLastError(wxT("GetTempPath")); } #elif defined(__WXMAC__) && wxOSX_USE_CARBON dir = wxMacFindFolder(short(kOnSystemDisk), kTemporaryFolderType, kCreateFolder); @@ -1080,7 +1076,7 @@ wxString wxFileName::GetTempDir() return dir; } -bool wxFileName::Mkdir( int perm, int flags ) +bool wxFileName::Mkdir( int perm, int flags ) const { return wxFileName::Mkdir(GetPath(), perm, flags); } @@ -1124,7 +1120,7 @@ bool wxFileName::Mkdir( const wxString& dir, int perm, int flags ) return ::wxMkdir( dir, perm ); } -bool wxFileName::Rmdir(int flags) +bool wxFileName::Rmdir(int flags) const { return wxFileName::Rmdir( GetPath(), flags ); } @@ -1139,7 +1135,7 @@ bool wxFileName::Rmdir(const wxString& dir, int flags) wxString path(dir); if ( path.Last() == wxFILE_SEP_PATH ) path.RemoveLast(); - path += _T('\0'); + path += wxT('\0'); SHFILEOPSTRUCT fileop; wxZeroMemory(fileop); @@ -1156,7 +1152,7 @@ bool wxFileName::Rmdir(const wxString& dir, int flags) { // SHFileOperation may return non-Win32 error codes, so the error // message can be incorrect - wxLogApiError(_T("SHFileOperation"), ret); + wxLogApiError(wxT("SHFileOperation"), ret); return false; } @@ -1244,25 +1240,15 @@ bool wxFileName::Normalize(int flags, } // handle ~ stuff under Unix only - if ( (format == wxPATH_UNIX) && (flags & wxPATH_NORM_TILDE) ) + if ( (format == wxPATH_UNIX) && (flags & wxPATH_NORM_TILDE) && m_relative ) { if ( !dirs.IsEmpty() ) { wxString dir = dirs[0u]; - if ( !dir.empty() && dir[0u] == _T('~') ) + if ( !dir.empty() && dir[0u] == wxT('~') ) { // to make the path absolute use the home directory curDir.AssignDir(wxGetUserHome(dir.c_str() + 1)); - - // if we are expanding the tilde, then this path - // *should* be already relative (since we checked for - // the tilde only in the first char of the first dir); - // if m_relative==false, it's because it was initialized - // from a string which started with /~; in that case - // we reach this point but then need m_relative=true - // for relative->absolute expansion later - m_relative = true; - dirs.RemoveAt(0u); } } @@ -1291,7 +1277,7 @@ bool wxFileName::Normalize(int flags, // if we used e.g. tilde expansion previously and wxGetUserHome didn't // return for some reason an absolute path, then curDir maybe not be absolute! - if ( curDir.IsAbsolute(format) ) + if ( !curDir.m_relative ) { // we have prepended an absolute path and thus we are now an absolute // file name too @@ -1440,7 +1426,7 @@ bool wxFileName::ReplaceHomeDir(wxPathFormat format) bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, wxString& targetFilename, - wxString* arguments) + wxString* arguments) const { wxString path, file, ext; wxFileName::SplitPath(shortcutPath, & path, & file, & ext); @@ -1506,6 +1492,18 @@ bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, bool wxFileName::IsAbsolute(wxPathFormat format) const { + // unix paths beginning with ~ are reported as being absolute + if ( format == wxPATH_UNIX ) + { + if ( !m_dirs.IsEmpty() ) + { + wxString dir = m_dirs[0u]; + + if (!dir.empty() && dir[0u] == wxT('~')) + return true; + } + } + // if our path doesn't start with a path separator, it's not an absolute // path if ( m_relative ) @@ -1514,7 +1512,7 @@ bool wxFileName::IsAbsolute(wxPathFormat format) const if ( !GetVolumeSeparator(format).empty() ) { // this format has volumes and an absolute path must have one, it's not - // enough to have the full path to bean absolute file under Windows + // enough to have the full path to be an absolute file under Windows if ( GetVolume().empty() ) return false; } @@ -1565,7 +1563,7 @@ bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) // files) if ( m_dirs.IsEmpty() && IsDir() ) { - m_dirs.Add(_T('.')); + m_dirs.Add(wxT('.')); } } @@ -1672,7 +1670,7 @@ wxString wxFileName::GetPathSeparators(wxPathFormat format) break; default: - wxFAIL_MSG( _T("Unknown wxPATH_XXX style") ); + wxFAIL_MSG( wxT("Unknown wxPATH_XXX style") ); // fall through case wxPATH_UNIX: @@ -1698,7 +1696,7 @@ wxString wxFileName::GetPathTerminators(wxPathFormat format) // under VMS the end of the path is ']', not the path separator used to // separate the components - return format == wxPATH_VMS ? wxString(_T(']')) : GetPathSeparators(format); + return format == wxPATH_VMS ? wxString(wxT(']')) : GetPathSeparators(format); } /* static */ @@ -1706,7 +1704,7 @@ bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format) { // wxString::Find() doesn't work as expected with NUL - it will always find // it, so test for it separately - return ch != _T('\0') && GetPathSeparators(format).Find(ch) != wxNOT_FOUND; + return ch != wxT('\0') && GetPathSeparators(format).Find(ch) != wxNOT_FOUND; } // ---------------------------------------------------------------------------- @@ -1717,7 +1715,7 @@ bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format) { if ( dir.empty() ) { - wxFAIL_MSG( _T("empty directory passed to wxFileName::InsertDir()") ); + wxFAIL_MSG( wxT("empty directory passed to wxFileName::InsertDir()") ); return false; } @@ -1727,7 +1725,7 @@ bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format) { if ( dir[n] == GetVolumeSeparator() || IsPathSeparator(dir[n]) ) { - wxFAIL_MSG( _T("invalid directory component in wxFileName") ); + wxFAIL_MSG( wxT("invalid directory component in wxFileName") ); return false; } @@ -1811,13 +1809,7 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const case wxPATH_UNIX: if ( !m_relative ) { - // normally the absolute file names start with a slash - // with one exception: the ones like "~/foo.bar" don't - // have it - if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') ) - { - fullpath += wxFILE_SEP_PATH_UNIX; - } + fullpath += wxFILE_SEP_PATH_UNIX; } break; @@ -1948,13 +1940,13 @@ wxString wxFileName::GetLongPath() const { s_triedToLoad = true; - wxDynamicLibrary dllKernel(_T("kernel32")); + wxDynamicLibrary dllKernel(wxT("kernel32")); - const wxChar* GetLongPathName = _T("GetLongPathName") + const wxChar* GetLongPathName = wxT("GetLongPathName") #if wxUSE_UNICODE - _T("W"); + wxT("W"); #else // ANSI - _T("A"); + wxT("A"); #endif // Unicode/ANSI if ( dllKernel.HasSymbol(GetLongPathName) ) @@ -2159,7 +2151,7 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume, if ( (posLastDot != wxString::npos) && (posLastDot == 0 || IsPathSeparator(fullpath[posLastDot - 1]) || - (format == wxPATH_VMS && fullpath[posLastDot - 1] == _T(']'))) ) + (format == wxPATH_VMS && fullpath[posLastDot - 1] == wxT(']'))) ) { // dot may be (and commonly -- at least under Unix -- is) the first // character of the filename, don't treat the entire filename as @@ -2201,7 +2193,7 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume, // special VMS hack: remove the initial bracket if ( format == wxPATH_VMS ) { - if ( (*pstrPath)[0u] == _T('[') ) + if ( (*pstrPath)[0u] == wxT('[') ) pstrPath->erase(0, 1); } } @@ -2268,6 +2260,14 @@ void wxFileName::SplitPath(const wxString& fullpath, } } +/* static */ +wxString wxFileName::StripExtension(const wxString& fullpath) +{ + wxFileName fn(fullpath); + fn.SetExt(""); + return fn.GetFullPath(); +} + // ---------------------------------------------------------------------------- // time functions // ---------------------------------------------------------------------------- @@ -2276,7 +2276,7 @@ void wxFileName::SplitPath(const wxString& fullpath, bool wxFileName::SetTimes(const wxDateTime *dtAccess, const wxDateTime *dtMod, - const wxDateTime *dtCreate) + const wxDateTime *dtCreate) const { #if defined(__WIN32__) FILETIME ftAccess, ftCreate, ftWrite; @@ -2349,7 +2349,7 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, return false; } -bool wxFileName::Touch() +bool wxFileName::Touch() const { #if defined(__UNIX_LIKE__) // under Unix touching file is simple: just pass NULL to utime() @@ -2607,7 +2607,7 @@ bool wxFileName::MacSetTypeAndCreator( wxUint32 type , wxUint32 creator ) return false ; } -bool wxFileName::MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator ) +bool wxFileName::MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator ) const { FSRef fsRef ; FSCatalogInfo catInfo;