]> git.saurik.com Git - wxWidgets.git/commitdiff
[ 1585270 ] Further fixes to wxPathList
authorRobert Roebling <robert@roebling.de>
Fri, 27 Oct 2006 17:59:32 +0000 (17:59 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 27 Oct 2006 17:59:32 +0000 (17:59 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42538 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/pathlist.tex
include/wx/filefn.h
src/common/filefn.cpp

index e1e90aa3fd067f4269ebcca42848792afd6d6409..934f0170d287a3037b6b043e93110ec9dca6e743 100644 (file)
@@ -2,12 +2,10 @@
 
 The path list is a convenient way of storing a number of directories, and
 when presented with a filename without a directory, searching for an existing file
-in those directories.  Storing the filename only in an application's files and
-using a locally-defined list of directories makes the application and its files more
-portable.
+in those directories.
 
-Use the \helpref{wxFileName::SplitPath}{wxfilenamesplitpath} global function 
-to extract the filename from the path.
+Be sure to look also at \helpref{wxStandardPaths}{wxstandardpaths} if you only
+want to search files in some standard paths.
 
 \wxheading{Derived from}
 
@@ -40,17 +38,19 @@ Constructs the object calling the \helpref{Add}{wxpathlistadd} function.
 \func{void}{AddEnvList}{\param{const wxString\& }{env\_variable}}
 
 Finds the value of the given environment variable, and adds all paths
-to the path list. Useful for finding files in the PATH variable, for
+to the path list. Useful for finding files in the {\tt PATH} variable, for
 example.
 
 
 \membersection{wxPathList::Add}\label{wxpathlistadd}
 
-\func{void}{Add}{\param{const wxString\& }{path}}
+\func{bool}{Add}{\param{const wxString\& }{path}}
 
 \func{void}{Add}{\param{const wxArrayString\& }{arr}}
 
 The first form adds the given directory to the path list, if the path is not already in the list.
+If the path cannot be normalized for some reason, it returns \false.
+
 The second form just calls the first form on all elements of the given array.
 
 The {\it path} is always considered a directory but no existence checks will be done on it
@@ -63,34 +63,42 @@ The {\it path} is always considered a directory but no existence checks will be
 
 \membersection{wxPathList::EnsureFileAccessible}\label{wxpathlistensurefileaccessible}
 
-\func{void}{EnsureFileAccessible}{\param{const wxString\& }{filename}}
+\func{bool}{EnsureFileAccessible}{\param{const wxString\& }{filename}}
+
+Given a full filename (with path), ensures that the file exists and
+then calls \helpref{Add}{wxpathlistadd} with the path of the file.
 
-Given a full filename (with path), ensures that files in the same path
-can be accessed using the pathlist. It does this by stripping the
-filename and adding the path to the list if not already there.
+Returns \false if the file does not exist (and in this case its path won't be added).
 
 
 \membersection{wxPathList::FindAbsoluteValidPath}\label{wxpathlistfindabsolutepath}
 
 \constfunc{wxString}{FindAbsoluteValidPath}{\param{const wxString\& }{file}}
 
-Searches for a full (i.e. absolute) path for an existing file by appending {\it file} to
-successive members of the path list.  If the file wasn't found, an empty
-string is returned.
+Like \helpref{FindValidPath}{wxpathlistfindvalidpath} but this function always
+returns an absolute path (eventually prepending the current working directory
+to the value returned \helpref{FindValidPath}{wxpathlistfindvalidpath}) or an
+empty string.
 
 
 \membersection{wxPathList::FindValidPath}\label{wxpathlistfindvalidpath}
 
 \constfunc{wxString}{FindValidPath}{\param{const wxString\& }{file}}
 
-Searches for a path for an existing file by appending {\it file} to
-successive members of the path list.
-If the file wasn't found, an empty string is returned.
+Searches the given file in all paths stored in this class.
+The first path which concatenated to the given string points to an existing
+file (see \helpref{wxFileExists}{wxfileexists}) is returned.
 
-The returned path may be relative to the current working directory.
+If the file wasn't found in any of the stored paths, an empty string is returned.
 
 The given string must be a file name, eventually with a path prefix (if the path
 prefix is absolute, only its name will be searched); i.e. it must not end with
 a directory separator (see \helpref{wxFileName::GetPathSeparator}{wxfilenamegetpathseparator})
 otherwise an assertion will fail.
 
+The returned path may be relative to the current working directory.
+Note in fact that wxPathList can be used to store both relative and absolute paths so that
+if you \helpref{Add()}{wxpathlistadd}ed relative paths, then the current working directory
+(see \helpref{wxGetCwd}{wxgetcwd} and \helpref{wxSetWorkingDirectory}{wxsetworkingdirectory})
+may affect the value returned by this function!
+
index c2d5eeec3ac0a47fc914115674045a8a9b8daa53..67fae5e069560a697e153b3341674395cc4442a6 100644 (file)
@@ -669,7 +669,7 @@ public:
     void AddEnvList(const wxString& envVariable);
 
     // Adds given path to this list
-    void Add(const wxString& path);
+    bool Add(const wxString& path);
     void Add(const wxArrayString &paths);
 
     // Find the first full path for which the file exists
@@ -680,10 +680,12 @@ public:
     wxString FindAbsoluteValidPath(const wxString& filename) const;
 
     // Given full path and filename, add path to list
-    void EnsureFileAccessible(const wxString& path);
+    bool EnsureFileAccessible(const wxString& path);
 
+#if WXWIN_COMPATIBILITY_2_6
     // Returns true if the path is in the list
     wxDEPRECATED( bool Member(const wxString& path) const );
+#endif
 };
 
 #endif // _WX_FILEFN_H_
index bdfd37b1a7a673259ffd589cce62896292d124e4..d690e66d9dbbbd037eac7feacffee58895923c5c 100644 (file)
@@ -156,7 +156,7 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode )
 // wxPathList
 // ----------------------------------------------------------------------------
 
-void wxPathList::Add(const wxString& path)
+bool wxPathList::Add(const wxString& path)
 {
     // add a path separator to force wxFileName to interpret it always as a directory
     // (i.e. if we are called with '/home/user' we want to consider it a folder and
@@ -164,11 +164,17 @@ void wxPathList::Add(const wxString& path)
     wxFileName fn(path + wxFileName::GetPathSeparator());
 
     // add only normalized relative/absolute paths
-    fn.Normalize(wxPATH_NORM_DOTS|wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS);
+    // NB: we won't do wxPATH_NORM_DOTS in order to avoid problems when trying to
+    //     normalize paths which starts with ".." (which can be normalized only if
+    //     we use also wxPATH_NORM_ABSOLUTE - which we don't want to use).
+    if (!fn.Normalize(wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS))
+        return false;
 
     wxString toadd = fn.GetPath();
     if (Index(toadd) == wxNOT_FOUND)
         wxArrayString::Add(toadd);      // do not add duplicates
+
+    return true;
 }
 
 void wxPathList::Add(const wxArrayString &arr)
@@ -207,21 +213,17 @@ void wxPathList::AddEnvList (const wxString& WXUNUSED_IN_WINCE(envVariable))
 // Given a full filename (with path), ensure that that file can
 // be accessed again USING FILENAME ONLY by adding the path
 // to the list if not already there.
-void wxPathList::EnsureFileAccessible (const wxString& path)
+bool wxPathList::EnsureFileAccessible (const wxString& path)
 {
-    wxString path_only(wxPathOnly(path));
-    if ( !path_only.empty() )
-    {
-        if ( Index(path_only) == wxNOT_FOUND )
-            Add(path_only);
-    }
+    return Add(wxPathOnly(path));
 }
 
-// deprecated !
+#if WXWIN_COMPATIBILITY_2_6
 bool wxPathList::Member (const wxString& path) const
 {
     return Index(path) != wxNOT_FOUND;
 }
+#endif
 
 wxString wxPathList::FindValidPath (const wxString& file) const
 {
@@ -230,8 +232,13 @@ wxString wxPathList::FindValidPath (const wxString& file) const
     wxFileName fn(file);
     wxString strend;
 
-    // NB: normalize without making absolute !
-    fn.Normalize(wxPATH_NORM_DOTS|wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS);
+    // NB: normalize without making absolute otherwise calling this function with
+    //     e.g. "b/c.txt" would result in removing the directory 'b' and the for loop
+    //     below would only add to the paths of this list the 'c.txt' part when doing
+    //     the existence checks...
+    // NB: we don't use wxPATH_NORM_DOTS here, too (see wxPathList::Add for more info)
+    if (!fn.Normalize(wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS))
+        return wxEmptyString;
 
     wxASSERT_MSG(!fn.IsDir(), wxT("Cannot search for directories; only for files"));
     if (fn.IsAbsolute())