]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
fixed typo in code for setting alternative locale name
[wxWidgets.git] / src / common / filefn.cpp
index 8a8b921abf5ad0d2461b3a9fe855cb22474c9dff..1f87e838c54696320d40b149195f1378198921e7 100644 (file)
@@ -152,6 +152,44 @@ 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
 // ----------------------------------------------------------------------------
@@ -1232,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;
@@ -1537,6 +1575,14 @@ wxString wxGetCwd()
 bool wxSetWorkingDirectory(const wxString& d)
 {
 #if defined(__OS2__)
+    if (d[1] == ':')
+    {
+        ::DosSetDefaultDisk(1 + wxToupper(d[0]) - _T('A'));
+       // do not call DosSetCurrentDir when just changing drive,
+       // since it requires e.g. "d:." instead of "d:"!
+       if (d.length() == 2)
+           return true;
+    }
     return (::DosSetCurrentDir((PSZ)d.c_str()) == 0);
 #elif defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__)
     return (chdir(wxFNSTRINGCAST d.fn_str()) == 0);
@@ -1918,7 +1964,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;