X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..076fdb21829a408cdd14f0dbcad6888f44686c9a:/src/common/filename.cpp?ds=inline diff --git a/src/common/filename.cpp b/src/common/filename.cpp index f56ec3d5ef..6ccdee80d8 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -6,7 +6,7 @@ // Created: 28.12.2000 // RCS-ID: $Id$ // Copyright: (c) 2000 Robert Roebling -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// /* @@ -86,8 +86,11 @@ // For GetShort/LongPathName #ifdef __WIN32__ -#include -#include "wx/msw/winundef.h" +#include "wx/msw/wrapwin.h" +#endif + +#ifdef __WXWINCE__ +#include "wx/msw/private.h" #endif #if defined(__WXMAC__) @@ -107,10 +110,17 @@ #endif #ifdef __MWERKS__ +#ifdef __MACH__ +#include +#include +#include +#include +#else #include #include #include #endif +#endif #ifdef __WATCOMC__ #include @@ -178,7 +188,7 @@ public: } } - // return TRUE only if the file could be opened successfully + // return true only if the file could be opened successfully bool IsOk() const { return m_hFile != INVALID_HANDLE_VALUE; } // get the handle @@ -194,7 +204,7 @@ private: // private functions // ---------------------------------------------------------------------------- -#if defined(__WIN32__) && !defined(__WXMICROWIN__) +#if wxUSE_DATETIME && defined(__WIN32__) && !defined(__WXMICROWIN__) // convert between wxDateTime and FILETIME which is a 64-bit value representing // the number of 100-nanosecond intervals since January 1, 1601. @@ -241,7 +251,7 @@ static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt) } } -#endif // __WIN32__ +#endif // wxUSE_DATETIME && __WIN32__ // return a string with the volume par static wxString wxGetVolumeString(const wxString& volume, wxPathFormat format) @@ -333,9 +343,13 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format ) case wxPATH_VMS: // TODO: what is the relative path format here? - m_relative = FALSE; + m_relative = false; break; + default: + wxFAIL_MSG( _T("Unknown path format") ); + // !! Fall through !! + case wxPATH_UNIX: // the paths of the form "~" or "~username" are absolute m_relative = leadingChar != wxT('/') && leadingChar != _T('~'); @@ -345,9 +359,6 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format ) m_relative = !IsPathSeparator(leadingChar, my_format); break; - default: - wxFAIL_MSG( wxT("error") ); - break; } // 2) Break up the path into its members. If the original path @@ -376,7 +387,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format ) } else // no path at all { - m_relative = TRUE; + m_relative = true; } } @@ -440,20 +451,20 @@ void wxFileName::Clear() m_ext = wxEmptyString; // we don't have any absolute path for now - m_relative = TRUE; + m_relative = true; } /* static */ -wxFileName wxFileName::FileName(const wxString& file) +wxFileName wxFileName::FileName(const wxString& file, wxPathFormat format) { - return wxFileName(file); + return wxFileName(file, format); } /* static */ -wxFileName wxFileName::DirName(const wxString& dir) +wxFileName wxFileName::DirName(const wxString& dir, wxPathFormat format) { wxFileName fn; - fn.AssignDir(dir); + fn.AssignDir(dir, format); return fn; } @@ -461,7 +472,7 @@ wxFileName wxFileName::DirName(const wxString& dir) // existence tests // ---------------------------------------------------------------------------- -bool wxFileName::FileExists() +bool wxFileName::FileExists() const { return wxFileName::FileExists( GetFullPath() ); } @@ -471,7 +482,7 @@ bool wxFileName::FileExists( const wxString &file ) return ::wxFileExists( file ); } -bool wxFileName::DirExists() +bool wxFileName::DirExists() const { return wxFileName::DirExists( GetFullPath() ); } @@ -557,8 +568,22 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) // use the directory specified by the prefix SplitPath(prefix, &dir, &name, NULL /* extension */); -#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) +#if defined(__WXWINCE__) + if (dir.empty()) + { + // FIXME. Create \temp dir? + dir = wxT("\\"); + } + path = dir + wxT("\\") + prefix; + int i = 1; + while (wxFileExists(path)) + { + path = dir + wxT("\\") + prefix ; + path << i; + i ++; + } +#elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) #ifdef __WIN32__ if ( dir.empty() ) { @@ -687,7 +712,7 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) } #else // !HAVE_MKTEMP (includes __DOS__) // generate the unique file name ourselves - #ifndef __DOS__ + #if !defined(__DOS__) && (!defined(__MWERKS__) || defined(__DARWIN__) ) path << (unsigned int)getpid(); #endif @@ -776,7 +801,14 @@ bool wxFileName::Mkdir( const wxString& dir, int perm, int flags ) size_t count = dirs.GetCount(); for ( size_t i = 0; i < count; i++ ) { - if ( i > 0 || filename.IsAbsolute() ) + if ( i > 0 || +#if defined(__WXMAC__) && !defined(__DARWIN__) + // relative pathnames are exactely the other way round under mac... + !filename.IsAbsolute() +#else + filename.IsAbsolute() +#endif + ) currPath += wxFILE_SEP_PATH; currPath += dirs[i]; @@ -785,12 +817,12 @@ bool wxFileName::Mkdir( const wxString& dir, int perm, int flags ) if (!wxMkdir(currPath, perm)) { // no need to try creating further directories - return FALSE; + return false; } } } - return TRUE; + return true; } @@ -899,7 +931,7 @@ bool wxFileName::Normalize(int flags, { wxLogError(_("The path '%s' contains too many \"..\"!"), GetFullPath().c_str()); - return FALSE; + return false; } m_dirs.RemoveAt(m_dirs.GetCount() - 1); @@ -931,7 +963,7 @@ bool wxFileName::Normalize(int flags, // we do have the path now // // NB: need to do this before (maybe) calling Assign() below - m_relative = FALSE; + m_relative = false; #if defined(__WIN32__) if ( (flags & wxPATH_NORM_LONG) && (format == wxPATH_DOS) ) @@ -940,7 +972,7 @@ bool wxFileName::Normalize(int flags, } #endif // Win32 - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -952,22 +984,22 @@ bool wxFileName::IsAbsolute(wxPathFormat format) const // if our path doesn't start with a path separator, it's not an absolute // path if ( m_relative ) - return FALSE; + return false; 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 if ( GetVolume().empty() ) - return FALSE; + return false; } - return TRUE; + return true; } bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) { - wxFileName fnBase(pathBase, format); + wxFileName fnBase = wxFileName::DirName(pathBase, format); // get cwd only once - small time saving wxString cwd = wxGetCwd(); @@ -980,7 +1012,7 @@ bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) if ( !GetVolume().IsSameAs(fnBase.GetVolume(), withCase) ) { // nothing done - return FALSE; + return false; } // same drive, so we don't need our volume @@ -1012,10 +1044,10 @@ bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) } } - m_relative = TRUE; + m_relative = true; // we were modified - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -1033,12 +1065,12 @@ bool wxFileName::SameAs(const wxFileName& filepath, wxPathFormat format) const fn2.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); if ( fn1.GetFullPath() == fn2.GetFullPath() ) - return TRUE; + return true; // TODO: compare inodes for Unix, this works even when filenames are // different but files are the same (symlinks) (VZ) - return FALSE; + return false; } /* static */ @@ -1048,6 +1080,41 @@ bool wxFileName::IsCaseSensitive( wxPathFormat format ) return GetFormat(format) == wxPATH_UNIX; } +/* static */ +wxString wxFileName::GetForbiddenChars(wxPathFormat format) +{ + // Inits to forbidden characters that are common to (almost) all platforms. + wxString strForbiddenChars = wxT("*?"); + + // If asserts, wxPathFormat has been changed. In case of a new path format + // addition, the following code might have to be updated. + wxCOMPILE_TIME_ASSERT(wxPATH_MAX == 5, wxPathFormatChanged); + switch ( GetFormat(format) ) + { + default : + wxFAIL_MSG( wxT("Unknown path format") ); + // !! Fall through !! + + case wxPATH_UNIX: + break; + + case wxPATH_MAC: + // On a Mac even names with * and ? are allowed (Tested with OS + // 9.2.1 and OS X 10.2.5) + strForbiddenChars = wxEmptyString; + break; + + case wxPATH_DOS: + strForbiddenChars += wxT("\\/:\"<>|"); + break; + + case wxPATH_VMS: + break; + } + + return strForbiddenChars; +} + /* static */ wxString wxFileName::GetVolumeSeparator(wxPathFormat format) { @@ -1076,7 +1143,7 @@ wxString wxFileName::GetPathSeparators(wxPathFormat format) break; default: - wxFAIL_MSG( _T("unknown wxPATH_XXX style") ); + wxFAIL_MSG( _T("Unknown wxPATH_XXX style") ); // fall through case wxPATH_UNIX: @@ -1126,7 +1193,7 @@ void wxFileName::InsertDir( int before, const wxString &dir ) void wxFileName::RemoveDir( int pos ) { - m_dirs.Remove( (size_t)pos ); + m_dirs.RemoveAt( (size_t)pos ); } // ---------------------------------------------------------------------------- @@ -1175,7 +1242,7 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const break; default: - wxFAIL_MSG( _T("unknown path format") ); + wxFAIL_MSG( wxT("Unknown path format") ); // fall through case wxPATH_UNIX: @@ -1225,7 +1292,7 @@ wxString wxFileName::GetPath( int flags, wxPathFormat format ) const break; default: - wxFAIL_MSG( wxT("unexpected path format") ); + wxFAIL_MSG( wxT("Unexpected path format") ); // still fall through case wxPATH_DOS: @@ -1270,7 +1337,7 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const // Return the short form of the path (returns identity on non-Windows platforms) wxString wxFileName::GetShortPath() const { -#if defined(__WXMSW__) && defined(__WIN32__) && !defined(__WXMICROWIN__) +#if defined(__WXMSW__) && defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) wxString path(GetFullPath()); wxString pathOut; DWORD sz = ::GetShortPathName(path, NULL, 0); @@ -1280,10 +1347,9 @@ wxString wxFileName::GetShortPath() const ok = ::GetShortPathName ( path, - pathOut.GetWriteBuf(sz), + wxStringBuffer(pathOut, sz), sz ) != 0; - pathOut.UngetWriteBuf(); } if (ok) return pathOut; @@ -1301,19 +1367,19 @@ wxString wxFileName::GetLongPath() const path = GetFullPath(); #if defined(__WIN32__) && !defined(__WXMICROWIN__) - bool success = FALSE; + bool success = false; #if wxUSE_DYNAMIC_LOADER typedef DWORD (WINAPI *GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD); - static bool s_triedToLoad = FALSE; + static bool s_triedToLoad = false; if ( !s_triedToLoad ) { // suppress the errors about missing GetLongPathName[AW] wxLogNull noLog; - s_triedToLoad = TRUE; + s_triedToLoad = true; wxDynamicLibrary dllKernel(_T("kernel32")); if ( dllKernel.IsLoaded() ) { @@ -1339,12 +1405,10 @@ wxString wxFileName::GetLongPath() const ok = (*s_pfnGetLongPathName) ( path, - pathOut.GetWriteBuf(sz), + wxStringBuffer(pathOut, sz), sz ) != 0; - pathOut.UngetWriteBuf(); - - success = TRUE; + success = true; } } } @@ -1474,7 +1538,7 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume, fullpath[posFirstSlash] = wxFILE_SEP_DSK; // UNC paths are always absolute, right? (FIXME) - fullpath.insert(posFirstSlash + 1, wxFILE_SEP_PATH_DOS); + fullpath.insert(posFirstSlash + 1, 1, wxFILE_SEP_PATH_DOS); } } } @@ -1612,6 +1676,8 @@ void wxFileName::SplitPath(const wxString& fullpath, // time functions // ---------------------------------------------------------------------------- +#if wxUSE_DATETIME + bool wxFileName::SetTimes(const wxDateTime *dtAccess, const wxDateTime *dtMod, const wxDateTime *dtCreate) @@ -1641,7 +1707,7 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, dtAccess ? &ftAccess : NULL, dtMod ? &ftWrite : NULL) ) { - return TRUE; + return true; } } } @@ -1649,7 +1715,7 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, if ( !dtAccess && !dtMod ) { // can't modify the creation time anyhow, don't try - return TRUE; + return true; } // if dtAccess or dtMod is not specified, use the other one (which must be @@ -1659,7 +1725,7 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, utm.modtime = dtMod ? dtMod->GetTicks() : dtAccess->GetTicks(); if ( utime(GetFullPath().fn_str(), &utm) == 0 ) { - return TRUE; + return true; } #else // other platform #endif // platforms @@ -1667,7 +1733,7 @@ bool wxFileName::SetTimes(const wxDateTime *dtAccess, wxLogSysError(_("Failed to modify file times for '%s'"), GetFullPath().c_str()); - return FALSE; + return false; } bool wxFileName::Touch() @@ -1676,12 +1742,12 @@ bool wxFileName::Touch() // under Unix touching file is simple: just pass NULL to utime() if ( utime(GetFullPath().fn_str(), NULL) == 0 ) { - return TRUE; + return true; } wxLogSysError(_("Failed to touch the file '%s'"), GetFullPath().c_str()); - return FALSE; + return false; #else // other platform wxDateTime dtNow = wxDateTime::Now(); @@ -1723,7 +1789,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, } else { - ok = FALSE; + ok = false; } } @@ -1736,7 +1802,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, if ( dtMod ) ConvertFileTimeToWx(dtMod, ftWrite); - return TRUE; + return true; } #elif defined(__UNIX_LIKE__) || defined(__WXMAC__) || (defined(__DOS__) && defined(__WATCOMC__)) wxStructStat stBuf; @@ -1749,7 +1815,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, if ( dtCreate ) dtCreate->Set(stBuf.st_ctime); - return TRUE; + return true; } #else // other platform #endif // platforms @@ -1757,9 +1823,11 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, wxLogSysError(_("Failed to retrieve file times for '%s'"), GetFullPath().c_str()); - return FALSE; + return false; } +#endif // wxUSE_DATETIME + #ifdef __WXMAC__ const short kMacExtensionMaxLength = 16 ; @@ -1773,18 +1841,18 @@ public : } MacDefaultExtensionRecord( const MacDefaultExtensionRecord& from ) { - strcpy( m_ext , from.m_ext ) ; + wxStrcpy( m_ext , from.m_ext ) ; m_type = from.m_type ; m_creator = from.m_creator ; } - MacDefaultExtensionRecord( const char * extension , OSType type , OSType creator ) + MacDefaultExtensionRecord( const wxChar * extension , OSType type , OSType creator ) { - strncpy( m_ext , extension , kMacExtensionMaxLength ) ; + wxStrncpy( m_ext , extension , kMacExtensionMaxLength ) ; m_ext[kMacExtensionMaxLength] = 0 ; m_type = type ; m_creator = creator ; } - char m_ext[kMacExtensionMaxLength] ; + wxChar m_ext[kMacExtensionMaxLength] ; OSType m_type ; OSType m_creator ; } ; @@ -1808,7 +1876,7 @@ static void MacEnsureDefaultExtensionsLoaded() // load the default extensions MacDefaultExtensionRecord defaults[1] = { - MacDefaultExtensionRecord( "txt" , 'TEXT' , 'ttxt' ) , + MacDefaultExtensionRecord( wxT("txt") , 'TEXT' , 'ttxt' ) , } ; // we could load the pc exchange prefs here too @@ -1880,7 +1948,7 @@ void wxFileName::MacRegisterDefaultTypeAndCreator( const wxString& ext , wxUint3 MacDefaultExtensionRecord rec ; rec.m_type = type ; rec.m_creator = creator ; - strncpy( rec.m_ext , ext.Lower().c_str() , kMacExtensionMaxLength ) ; + wxStrncpy( rec.m_ext , ext.Lower().c_str() , kMacExtensionMaxLength ) ; gMacDefaultExtensions.Add( rec ) ; } #endif