]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
sockets work with wxDFB now
[wxWidgets.git] / src / common / filefn.cpp
index bdfd37b1a7a673259ffd589cce62896292d124e4..1d0a96278c72145467a4641de8c3f579d1c6bcd9 100644 (file)
@@ -152,11 +152,49 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode )
 
 #endif // wxNEED_WX_UNISTD_H
 
+#if wxUSE_UNICODE && defined __BORLANDC__ \
+    && __BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551
+
+// BCC 5.5 and 5.5.1 have a bug in _wopen where files are created read only
+// regardless of the mode parameter. This hack works around the problem by
+// setting the mode with _wchmod.
+// 
+int wxOpen(const wchar_t *pathname, int flags, mode_t mode)
+{
+    int moreflags = 0;
+
+    // we only want to fix the mode when the file is actually created, so
+    // when creating first try doing it O_EXCL so we can tell if the file
+    // was already there.
+    if ((flags & O_CREAT) && !(flags & O_EXCL) && (mode & wxS_IWUSR) != 0)
+        moreflags = O_EXCL;
+
+    int fd = _wopen(pathname, flags | moreflags, mode);
+
+    // the file was actually created and needs fixing
+    if (fd != -1 && (flags & O_CREAT) != 0 && (mode & wxS_IWUSR) != 0)
+    {
+        close(fd);
+        _wchmod(pathname, mode);
+        fd = _wopen(pathname, flags & ~(O_EXCL | O_CREAT));
+    }
+    // the open failed, but it may have been because the added O_EXCL stopped
+    // the opening of an existing file, so try again without.
+    else if (fd == -1 && moreflags != 0)
+    {
+        fd = _wopen(pathname, flags & ~O_CREAT);
+    }
+
+    return fd;
+}
+
+#endif
+
 // ----------------------------------------------------------------------------
 // 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 +202,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 +251,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 +270,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())
@@ -1225,7 +1270,7 @@ bool wxRmdir(const wxString& dir, int WXUNUSED(flags))
 #elif defined(__OS2__)
     return (::DosDeleteDir((PSZ)dir.c_str()) == 0);
 #elif defined(__WXWINCE__)
-    return (CreateDirectory(dir, NULL) != 0);
+    return (RemoveDirectory(dir) != 0);
 #elif defined(__WXPALMOS__)
     // TODO with VFSFileRename()
     return false;
@@ -1772,7 +1817,7 @@ int WXDLLEXPORT wxParseCommonDialogsFilter(const wxString& filterStr,
     return filters.GetCount();
 }
 
-#if defined( __WINDOWS__ )
+#if defined(__WINDOWS__) && !(defined(__UNIX__) || defined(__OS2__))
 static bool wxCheckWin32Permission(const wxString& path, DWORD access)
 {
     // quoting the MSDN: "To obtain a handle to a directory, call the
@@ -1911,7 +1956,7 @@ wxFileKind wxGetFileKind(FILE *fp)
 #if defined(wxFILEKIND_STUB) || wxONLY_WATCOM_EARLIER_THAN(1,4)
     (void)fp;
     return wxFILE_KIND_DISK;
-#elif defined(__WINDOWS__) && !defined(__CYGWIN__) && !defined(__WATCOMC__)
+#elif defined(__WINDOWS__) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WINE__)
     return fp ? wxGetFileKind(_fileno(fp)) : wxFILE_KIND_UNKNOWN;
 #else
     return fp ? wxGetFileKind(fileno(fp)) : wxFILE_KIND_UNKNOWN;