#endif
#ifdef __WINDOWS__
-#include "wx/msw/private.h"
+ #include "wx/msw/private.h"
+ #include <shlobj.h> // for CLSID_ShellLink
+ #include "wx/msw/missing.h"
#endif
#if defined(__WXMAC__)
void wxFileName::Clear()
{
- m_dirs.Clear();
-
- m_volume =
- m_name =
- m_ext = wxEmptyString;
+ m_dirs.clear();
+ m_volume.clear();
+ m_name.clear();
+ m_ext.clear();
// we don't have any absolute path for now
m_relative = true;
if ( S_ISDIR(st.st_mode) )
return acceptDir;
if ( S_ISLNK(st.st_mode) )
- return (flags & wxFILE_EXISTS_SYMLINK) != 0;
+ {
+ // Take care to not test for "!= 0" here as this would erroneously
+ // return true if only wxFILE_EXISTS_NO_FOLLOW, which is part of
+ // wxFILE_EXISTS_SYMLINK, is set too.
+ return (flags & wxFILE_EXISTS_SYMLINK) == wxFILE_EXISTS_SYMLINK;
+ }
if ( S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode) )
return (flags & wxFILE_EXISTS_DEVICE) != 0;
if ( S_ISFIFO(st.st_mode) )
if ( !ShouldFollowLink() )
flags |= wxFILE_EXISTS_NO_FOLLOW;
- return Exists(GetFullPath(), flags);
+ return Exists(GetPath(), flags);
}
/* static */
if ( flags != 0 ) // wxPATH_RMDIR_FULL or wxPATH_RMDIR_RECURSIVE
#endif // !__WINDOWS__
{
+#ifndef __WINDOWS__
+ if ( flags & wxPATH_RMDIR_RECURSIVE )
+ {
+ // When deleting the tree recursively, we are supposed to delete
+ // this directory itself even when it is a symlink -- but without
+ // following it. Do it here as wxRmdir() would simply follow if
+ // called for a symlink.
+ if ( wxFileName::Exists(dir, wxFILE_EXISTS_SYMLINK) )
+ {
+ return wxRemoveFile(dir);
+ }
+ }
+#endif // !__WINDOWS__
+
wxString path(dir);
if ( path.Last() != wxFILE_SEP_PATH )
path += wxFILE_SEP_PATH;
wxString filename;
- // first delete all subdirectories
- bool cont = d.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN);
+ // First delete all subdirectories: notice that we don't follow
+ // symbolic links, potentially leading outside this directory, to avoid
+ // unpleasant surprises.
+ bool cont = d.GetFirst(&filename, wxString(),
+ wxDIR_DIRS | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
while ( cont )
{
wxFileName::Rmdir(path + filename, flags);
#ifndef __WINDOWS__
if ( flags & wxPATH_RMDIR_RECURSIVE )
{
- // delete all files too
- cont = d.GetFirst(&filename, "", wxDIR_FILES | wxDIR_HIDDEN);
+ // Delete all files too and, for the same reasons as above, don't
+ // follow symlinks which could refer to the files outside of this
+ // directory and just delete the symlinks themselves.
+ cont = d.GetFirst(&filename, wxString(),
+ wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
while ( cont )
{
::wxRemoveFile(path + filename);
// quotation marks."
#if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE
-// The following lines are necessary under WinCE
-// #include "wx/msw/private.h"
-// #include <ole2.h>
-#include <shlobj.h>
-#if defined(__WXWINCE__)
-#include <shlguid.h>
-#endif
bool wxFileName::GetShortcutTarget(const wxString& shortcutPath,
wxString& targetFilename,
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;
+ strForbiddenChars.clear();
break;
case wxPATH_DOS:
return true;
}
-void wxFileName::AppendDir( const wxString& dir )
+bool wxFileName::AppendDir( const wxString& dir )
{
- if ( IsValidDirComponent(dir) )
- m_dirs.Add( dir );
+ if (!IsValidDirComponent(dir))
+ return false;
+ m_dirs.Add(dir);
+ return true;
}
void wxFileName::PrependDir( const wxString& dir )
InsertDir(0, dir);
}
-void wxFileName::InsertDir(size_t before, const wxString& dir)
+bool wxFileName::InsertDir(size_t before, const wxString& dir)
{
- if ( IsValidDirComponent(dir) )
- m_dirs.Insert(dir, before);
+ if (!IsValidDirComponent(dir))
+ return false;
+ m_dirs.Insert(dir, before);
+ return true;
}
void wxFileName::RemoveDir(size_t pos)
GetVolumeSeparator(wxPATH_DOS) +
GetPathSeparator(wxPATH_DOS);
else
- pathOut = wxEmptyString;
+ pathOut.clear();
wxArrayString dirs = GetDirs();
dirs.Add(GetFullName());