X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0ea621cc259b9a61df64dbf08dd8ddb8c71fe407..43a997b6e2064a189fa73ca1816908fb740ce297:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index a7409aa0c8..c711152e64 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -638,9 +638,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 *)path.mb_str()); + // we need to copy the path to the buffer in which mkstemp() can modify it + wxCharBuffer buf(path.fn_str()); + + // cast is safe because the string length doesn't change + int fdTemp = mkstemp( (char *)buf.data() ); if ( fdTemp == -1 ) { // this might be not necessary as mkstemp() on most systems should have @@ -649,6 +651,8 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) } else // mkstemp() succeeded { + path = wxConvFile.cMB2WX(buf); + // avoid leaking the fd if ( fileTemp ) { @@ -665,10 +669,15 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) // same as above path += _T("XXXXXX"); - if ( !mktemp((char *)path.mb_str()) ) + wxCharBuffer buf(path.fn_str()); + if ( !mktemp( buf ) ) { path.clear(); } + else + { + path = wxConvFile.cMB2WX(buf); + } #else // !HAVE_MKTEMP (includes __DOS__) // generate the unique file name ourselves #ifndef __DOS__ @@ -912,6 +921,11 @@ bool wxFileName::Normalize(int flags, m_ext.MakeLower(); } + // we do have the path now + // + // NB: need to do this before (maybe) calling Assign() below + m_relative = FALSE; + #if defined(__WIN32__) if ( (flags & wxPATH_NORM_LONG) && (format == wxPATH_DOS) ) { @@ -919,9 +933,6 @@ bool wxFileName::Normalize(int flags, } #endif // Win32 - // we do have the path now - m_relative = FALSE; - return TRUE; } @@ -1144,27 +1155,40 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const } // the leading character - if ( format == wxPATH_MAC ) - { - if ( m_relative ) - fullpath += wxFILE_SEP_PATH_MAC; - } - else if ( format == wxPATH_DOS ) - { - if (!m_relative) - fullpath += wxFILE_SEP_PATH_DOS; - } - else if ( format == wxPATH_UNIX ) + switch ( format ) { - if ( !m_relative ) - { - // normally the absolute file names starts with a slash with one - // exception: file names like "~/foo.bar" don't have it - if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') ) + case wxPATH_MAC: + if ( m_relative ) + fullpath += wxFILE_SEP_PATH_MAC; + break; + + case wxPATH_DOS: + if (!m_relative) + fullpath += wxFILE_SEP_PATH_DOS; + break; + + default: + wxFAIL_MSG( _T("unknown path format") ); + // fall through + + case wxPATH_UNIX: + if ( !m_relative ) { - fullpath += wxFILE_SEP_PATH_UNIX; + // normally the absolute file names starts with a slash with + // one exception: file names like "~/foo.bar" don't have it + if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') ) + { + fullpath += wxFILE_SEP_PATH_UNIX; + } } - } + break; + + case wxPATH_VMS: + // no leading character here but use this place to unset + // wxPATH_GET_SEPARATOR flag: under VMS it doesn't make sense as, + // if I understand correctly, there should never be a dot before + // the closing bracket + flags &= ~wxPATH_GET_SEPARATOR; } // then concatenate all the path components using the path separator @@ -1204,13 +1228,14 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const case wxPATH_VMS: // TODO: What to do with ".." under VMS + // convert back from ".." to nothing if ( m_dirs[i] != wxT("..") ) fullpath += m_dirs[i]; break; } - if ( i != dirCount - 1 ) + if ( (flags & wxPATH_GET_SEPARATOR) || (i != dirCount - 1) ) fullpath += GetPathSeparator(format); } @@ -1220,11 +1245,6 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const } } - if ( (flags & wxPATH_GET_SEPARATOR) && !fullpath.empty() ) - { - fullpath += GetPathSeparator(format); - } - return fullpath; } @@ -1283,6 +1303,9 @@ wxString wxFileName::GetLongPath() const if ( !s_triedToLoad ) { + // suppress the errors about missing GetLongPathName[AW] + wxLogNull noLog; + s_triedToLoad = TRUE; wxDynamicLibrary dllKernel(_T("kernel32")); if ( dllKernel.IsLoaded() ) @@ -1320,6 +1343,7 @@ wxString wxFileName::GetLongPath() const } } } + if (success) return pathOut; #endif // wxUSE_DYNAMIC_LOADER @@ -1586,7 +1610,7 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, utimbuf utm; utm.actime = dtAccess ? dtAccess->GetTicks() : dtMod->GetTicks(); utm.modtime = dtMod ? dtMod->GetTicks() : dtAccess->GetTicks(); - if ( utime(GetFullPath(), &utm) == 0 ) + if ( utime(GetFullPath().fn_str(), &utm) == 0 ) { return TRUE; } @@ -1624,7 +1648,7 @@ bool wxFileName::Touch() { #if defined(__UNIX_LIKE__) // under Unix touching file is simple: just pass NULL to utime() - if ( utime(GetFullPath(), NULL) == 0 ) + if ( utime(GetFullPath().fn_str(), NULL) == 0 ) { return TRUE; } @@ -1645,7 +1669,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, { #if defined(__UNIX_LIKE__) || defined(__WXMAC__) || (defined(__DOS__) && defined(__WATCOMC__)) wxStructStat stBuf; - if ( wxStat(GetFullPath(), &stBuf) == 0 ) + if ( wxStat( GetFullPath().c_str(), &stBuf) == 0 ) { if ( dtAccess ) dtAccess->Set(stBuf.st_atime); @@ -1663,16 +1687,16 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, FILETIME ftAccess, ftCreate, ftWrite; if ( ::GetFileTime(fh, - dtMod ? &ftCreate : NULL, + dtCreate ? &ftCreate : NULL, dtAccess ? &ftAccess : NULL, - dtCreate ? &ftWrite : NULL) ) + dtMod ? &ftWrite : NULL) ) { - if ( dtMod ) - ConvertFileTimeToWx(dtMod, ftCreate); + if ( dtCreate ) + ConvertFileTimeToWx(dtCreate, ftCreate); if ( dtAccess ) ConvertFileTimeToWx(dtAccess, ftAccess); - if ( dtCreate ) - ConvertFileTimeToWx(dtCreate, ftWrite); + if ( dtMod ) + ConvertFileTimeToWx(dtMod, ftWrite); return TRUE; } @@ -1689,29 +1713,52 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, #ifdef __WXMAC__ const short kMacExtensionMaxLength = 16 ; -typedef struct +class MacDefaultExtensionRecord { +public : + MacDefaultExtensionRecord() + { + m_ext[0] = 0 ; + m_type = m_creator = NULL ; + } + MacDefaultExtensionRecord( const MacDefaultExtensionRecord& from ) + { + strcpy( m_ext , from.m_ext ) ; + m_type = from.m_type ; + m_creator = from.m_creator ; + } + MacDefaultExtensionRecord( char * extension , OSType type , OSType creator ) + { + strncpy( m_ext , extension , kMacExtensionMaxLength ) ; + m_ext[kMacExtensionMaxLength] = 0 ; + m_type = type ; + m_creator = creator ; + } char m_ext[kMacExtensionMaxLength] ; OSType m_type ; OSType m_creator ; -} MacDefaultExtensionRecord ; +} ; #include "wx/dynarray.h" WX_DECLARE_OBJARRAY(MacDefaultExtensionRecord, MacDefaultExtensionArray) ; + +bool gMacDefaultExtensionsInited = false ; + #include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(MacDefaultExtensionArray) ; + +WX_DEFINE_EXPORTED_OBJARRAY(MacDefaultExtensionArray) ; MacDefaultExtensionArray gMacDefaultExtensions ; -bool gMacDefaultExtensionsInited = false ; static void MacEnsureDefaultExtensionsLoaded() { if ( !gMacDefaultExtensionsInited ) { + // load the default extensions - MacDefaultExtensionRecord defaults[] = + MacDefaultExtensionRecord defaults[1] = { - { "txt" , 'TEXT' , 'ttxt' } , + MacDefaultExtensionRecord( "txt" , 'TEXT' , 'ttxt' ) , } ; // we could load the pc exchange prefs here too