X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/92980e9076469956e1e2cb94df97d0f8d873114a..008a56c968ed7e0694e32e93c2dbf95dde2ba5c8:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index b639fda809..f56ec3d5ef 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -124,6 +124,10 @@ #endif #endif +#ifdef __EMX__ +#define MAX_PATH _MAX_PATH +#endif + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -434,6 +438,9 @@ void wxFileName::Clear() m_volume = m_name = m_ext = wxEmptyString; + + // we don't have any absolute path for now + m_relative = TRUE; } /* static */ @@ -638,9 +645,11 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) // scratch space for mkstemp() path += _T("XXXXXX"); - // can use the cast here because the length doesn't change and the string - // is not shared - int fdTemp = mkstemp((char*)(const char *)path.mb_str()); + // we need to copy the path to the buffer in which mkstemp() can modify it + wxCharBuffer buf( wxConvFile.cWX2MB( path ) ); + + // cast is safe because the string length doesn't change + int fdTemp = mkstemp( (char*)(const char*) buf ); if ( fdTemp == -1 ) { // this might be not necessary as mkstemp() on most systems should have @@ -649,6 +658,8 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) } else // mkstemp() succeeded { + path = wxConvFile.cMB2WX( (const char*) buf ); + // avoid leaking the fd if ( fileTemp ) { @@ -665,10 +676,15 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) // same as above path += _T("XXXXXX"); - if ( !mktemp((char *)path.mb_str()) ) + wxCharBuffer buf = wxConvFile.cWX2MB( path ); + if ( !mktemp( (const char*) buf ) ) { path.clear(); } + else + { + path = wxConvFile.cMB2WX( (const char*) buf ); + } #else // !HAVE_MKTEMP (includes __DOS__) // generate the unique file name ourselves #ifndef __DOS__ @@ -955,8 +971,8 @@ bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) // get cwd only once - small time saving wxString cwd = wxGetCwd(); - Normalize(wxPATH_NORM_ALL, cwd, format); - fnBase.Normalize(wxPATH_NORM_ALL, cwd, format); + Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); + fnBase.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); bool withCase = IsCaseSensitive(format); @@ -1006,15 +1022,15 @@ bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) // filename kind tests // ---------------------------------------------------------------------------- -bool wxFileName::SameAs(const wxFileName &filepath, wxPathFormat format) +bool wxFileName::SameAs(const wxFileName& filepath, wxPathFormat format) const { wxFileName fn1 = *this, fn2 = filepath; // get cwd only once - small time saving wxString cwd = wxGetCwd(); - fn1.Normalize(wxPATH_NORM_ALL, cwd, format); - fn2.Normalize(wxPATH_NORM_ALL, cwd, format); + fn1.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); + fn2.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); if ( fn1.GetFullPath() == fn2.GetFullPath() ) return TRUE; @@ -1346,7 +1362,13 @@ wxString wxFileName::GetLongPath() const WIN32_FIND_DATA findFileData; HANDLE hFind; - pathOut = wxEmptyString; + + if ( HasVolume() ) + pathOut = GetVolume() + + GetVolumeSeparator(wxPATH_DOS) + + GetPathSeparator(wxPATH_DOS); + else + pathOut = wxEmptyString; wxArrayString dirs = GetDirs(); dirs.Add(GetFullName()); @@ -1364,7 +1386,8 @@ wxString wxFileName::GetLongPath() const if ( tmpPath.empty() ) continue; - if ( tmpPath.Last() == wxT(':') ) + // can't see this being necessary? MF + if ( tmpPath.Last() == GetVolumeSeparator(wxPATH_DOS) ) { // Can't pass a drive and root dir to FindFirstFile, // so continue to next dir @@ -1376,8 +1399,12 @@ wxString wxFileName::GetLongPath() const hFind = ::FindFirstFile(tmpPath, &findFileData); if (hFind == INVALID_HANDLE_VALUE) { - // Error: return immediately with the original path - return path; + // Error: most likely reason is that path doesn't exist, so + // append any unprocessed parts and return + for ( i += 1; i < count; i++ ) + tmpPath += wxFILE_SEP_PATH + dirs[i]; + + return tmpPath; } pathOut += findFileData.cFileName; @@ -1589,7 +1616,36 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, const wxDateTime *dtMod, const wxDateTime *dtCreate) { -#if defined(__UNIX_LIKE__) || (defined(__DOS__) && defined(__WATCOMC__)) +#if defined(__WIN32__) + if ( IsDir() ) + { + // VZ: please let me know how to do this if you can + wxFAIL_MSG( _T("SetTimes() not implemented for the directories") ); + } + else // file + { + wxFileHandle fh(GetFullPath(), wxFileHandle::Write); + if ( fh.IsOk() ) + { + FILETIME ftAccess, ftCreate, ftWrite; + + if ( dtCreate ) + ConvertWxToFileTime(&ftCreate, *dtCreate); + if ( dtAccess ) + ConvertWxToFileTime(&ftAccess, *dtAccess); + if ( dtMod ) + ConvertWxToFileTime(&ftWrite, *dtMod); + + if ( ::SetFileTime(fh, + dtCreate ? &ftCreate : NULL, + dtAccess ? &ftAccess : NULL, + dtMod ? &ftWrite : NULL) ) + { + return TRUE; + } + } + } +#elif defined(__UNIX_LIKE__) || (defined(__DOS__) && defined(__WATCOMC__)) if ( !dtAccess && !dtMod ) { // can't modify the creation time anyhow, don't try @@ -1605,27 +1661,6 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, { return TRUE; } -#elif defined(__WIN32__) - wxFileHandle fh(GetFullPath(), wxFileHandle::Write); - if ( fh.IsOk() ) - { - FILETIME ftAccess, ftCreate, ftWrite; - - if ( dtCreate ) - ConvertWxToFileTime(&ftCreate, *dtCreate); - if ( dtAccess ) - ConvertWxToFileTime(&ftAccess, *dtAccess); - if ( dtMod ) - ConvertWxToFileTime(&ftWrite, *dtMod); - - if ( ::SetFileTime(fh, - dtCreate ? &ftCreate : NULL, - dtAccess ? &ftAccess : NULL, - dtMod ? &ftWrite : NULL) ) - { - return TRUE; - } - } #else // other platform #endif // platforms @@ -1658,7 +1693,52 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, wxDateTime *dtMod, wxDateTime *dtCreate) const { -#if defined(__UNIX_LIKE__) || defined(__WXMAC__) || (defined(__DOS__) && defined(__WATCOMC__)) +#if defined(__WIN32__) + // we must use different methods for the files and directories under + // Windows as CreateFile(GENERIC_READ) doesn't work for the directories and + // CreateFile(FILE_FLAG_BACKUP_SEMANTICS) works -- but only under NT and + // not 9x + bool ok; + FILETIME ftAccess, ftCreate, ftWrite; + if ( IsDir() ) + { + // implemented in msw/dir.cpp + extern bool wxGetDirectoryTimes(const wxString& dirname, + FILETIME *, FILETIME *, FILETIME *); + + // we should pass the path without the trailing separator to + // wxGetDirectoryTimes() + ok = wxGetDirectoryTimes(GetPath(wxPATH_GET_VOLUME), + &ftAccess, &ftCreate, &ftWrite); + } + else // file + { + wxFileHandle fh(GetFullPath(), wxFileHandle::Read); + if ( fh.IsOk() ) + { + ok = ::GetFileTime(fh, + dtCreate ? &ftCreate : NULL, + dtAccess ? &ftAccess : NULL, + dtMod ? &ftWrite : NULL) != 0; + } + else + { + ok = FALSE; + } + } + + if ( ok ) + { + if ( dtCreate ) + ConvertFileTimeToWx(dtCreate, ftCreate); + if ( dtAccess ) + ConvertFileTimeToWx(dtAccess, ftAccess); + if ( dtMod ) + ConvertFileTimeToWx(dtMod, ftWrite); + + return TRUE; + } +#elif defined(__UNIX_LIKE__) || defined(__WXMAC__) || (defined(__DOS__) && defined(__WATCOMC__)) wxStructStat stBuf; if ( wxStat( GetFullPath().c_str(), &stBuf) == 0 ) { @@ -1671,27 +1751,6 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, return TRUE; } -#elif defined(__WIN32__) - wxFileHandle fh(GetFullPath(), wxFileHandle::Read); - if ( fh.IsOk() ) - { - FILETIME ftAccess, ftCreate, ftWrite; - - if ( ::GetFileTime(fh, - dtCreate ? &ftCreate : NULL, - dtAccess ? &ftAccess : NULL, - dtMod ? &ftWrite : NULL) ) - { - if ( dtCreate ) - ConvertFileTimeToWx(dtCreate, ftCreate); - if ( dtAccess ) - ConvertFileTimeToWx(dtAccess, ftAccess); - if ( dtMod ) - ConvertFileTimeToWx(dtMod, ftWrite); - - return TRUE; - } - } #else // other platform #endif // platforms @@ -1718,7 +1777,7 @@ public : m_type = from.m_type ; m_creator = from.m_creator ; } - MacDefaultExtensionRecord( char * extension , OSType type , OSType creator ) + MacDefaultExtensionRecord( const char * extension , OSType type , OSType creator ) { strncpy( m_ext , extension , kMacExtensionMaxLength ) ; m_ext[kMacExtensionMaxLength] = 0 ; @@ -1745,7 +1804,7 @@ static void MacEnsureDefaultExtensionsLoaded() { if ( !gMacDefaultExtensionsInited ) { - + // load the default extensions MacDefaultExtensionRecord defaults[1] = { @@ -1754,7 +1813,7 @@ static void MacEnsureDefaultExtensionsLoaded() } ; // we could load the pc exchange prefs here too - for ( int i = 0 ; i < WXSIZEOF( defaults ) ; ++i ) + for ( size_t i = 0 ; i < WXSIZEOF( defaults ) ; ++i ) { gMacDefaultExtensions.Add( defaults[i] ) ; }