X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2fe0ef8a1e4a61e3baab7f6e512b28543ad4c97c..4e5a4c69c540b430fba8efe5dae1bc1ffd5caeca:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 1c498fa3b0..ff0ae4cad9 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -93,13 +93,6 @@ #endif #endif -#ifdef __GNUWIN32__ - #include - #ifndef __TWIN32__ - #include - #endif -#endif - #ifdef __BORLANDC__ // Please someone tell me which version of Borland needs // this (3.1 I believe) and how to test for it. // If this works for Borland 4.0 as well, then no worries. @@ -121,7 +114,21 @@ #ifdef __WINDOWS__ #include -#endif + #include "wx/msw/mslu.h" + + // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path() + // + // note that it must be included after + #ifdef __GNUWIN32__ + #ifdef __CYGWIN__ + #include + #endif + #include + #ifndef __TWIN32__ + #include + #endif + #endif // __GNUWIN32__ +#endif // __WINDOWS__ // TODO: Borland probably has _wgetcwd as well? #ifdef _MSC_VER @@ -136,8 +143,6 @@ #define _MAXPATHLEN 1024 #endif -extern wxChar *wxBuffer; - #ifdef __WXMAC__ # include "MoreFiles.h" # include "MoreFilesExtras.h" @@ -295,11 +300,11 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) bool wxFileExists (const wxString& filename) { -#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) - // GetFileAttributes can copy with network paths - DWORD ret = GetFileAttributes(filename); - DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY); - return ((ret != 0xffffffff) && (isDir == 0)); +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + // GetFileAttributes can copy with network paths unlike stat() + DWORD ret = ::GetFileAttributes(filename); + + return (ret != (DWORD)-1) && !(ret & FILE_ATTRIBUTE_DIRECTORY); #else wxStructStat stbuf; if ( !filename.empty() && wxStat (OS_FILENAME(filename), &stbuf) == 0 ) @@ -317,7 +322,7 @@ wxIsAbsolutePath (const wxString& filename) #if defined(__WXMAC__) && !defined(__DARWIN__) // Classic or Carbon CodeWarrior like // Carbon with Apple DevTools is Unix like - + // This seems wrong to me, but there is no fix. since // "MacOS:MyText.txt" is absolute whereas "MyDir:MyText.txt" // is not. Or maybe ":MyDir:MyText.txt" has to be used? RR. @@ -683,7 +688,7 @@ wxChar *wxFileNameFromPath (wxChar *path) if (path) { register wxChar *tcp; - + tcp = path + wxStrlen (path); while (--tcp >= path) { @@ -717,7 +722,7 @@ wxString wxFileNameFromPath (const wxString& path1) { wxChar *path = WXSTRINGCAST path1 ; register wxChar *tcp; - + tcp = path + wxStrlen (path); while (--tcp >= path) { @@ -754,13 +759,13 @@ wxPathOnly (wxChar *path) if (path && *path) { static wxChar buf[_MAXPATHLEN]; - + // Local copy wxStrcpy (buf, path); - + int l = wxStrlen(path); int i = l - 1; - + // Search backward for a backward or forward slash while (i > -1) { @@ -789,7 +794,7 @@ wxPathOnly (wxChar *path) #endif i --; } - + #if defined(__WXMSW__) || defined(__WXPM__) // Try Drive specifier if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) @@ -810,10 +815,10 @@ wxString wxPathOnly (const wxString& path) if (path != wxT("")) { wxChar buf[_MAXPATHLEN]; - + // Local copy wxStrcpy (buf, WXSTRINGCAST path); - + int l = path.Length(); int i = l - 1; @@ -845,7 +850,7 @@ wxString wxPathOnly (const wxString& path) #endif i --; } - + #if defined(__WXMSW__) || defined(__WXPM__) // Try Drive specifier if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) @@ -875,7 +880,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) (void) FSpMakeFSRef( spec, &theRef ); // get the POSIX path associated with the FSRef (void) FSRefMakePath( &theRef, (UInt8 *)thePath, sizeof(thePath) ); - + // create path string for return value wxString result( thePath ) ; #else @@ -889,7 +894,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) (*myPath)[length] = 0 ; if ((length > 0) && ((*myPath)[length-1] == ':')) (*myPath)[length-1] = 0 ; - + // create path string for return value wxString result( (char*) *myPath ) ; @@ -932,7 +937,7 @@ wxString wxMac2UnixFilename (const char *str) *s = '.' ; else *s = '/' ; - + while (*s) { if (*s == ':') @@ -1081,11 +1086,15 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // instead of our code if available // // NB: 3rd parameter is bFailIfExists i.e. the inverse of overwrite - return ::CopyFile(file1, file2, !overwrite) != 0; + if ( !::CopyFile(file1, file2, !overwrite) ) + { + wxLogSysError(_("Failed to copy the file '%s' to '%s'"), + file1.c_str(), file2.c_str()); + + return FALSE; + } #elif defined(__WXPM__) - if (::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) == 0) - return TRUE; - else + if ( ::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) != 0 ) return FALSE; #else // !Win32 wxStructStat fbuf; @@ -1164,9 +1173,9 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) return FALSE; } #endif // OS/2 || Mac +#endif // __WXMSW__ && __WIN32__ return TRUE; -#endif // __WXMSW__ && __WIN32__ } bool @@ -1256,6 +1265,7 @@ bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) bool wxPathExists(const wxChar *pszPathName) { wxString strPath(pszPathName); + #ifdef __WINDOWS__ // Windows fails to find directory named "c:\dir\" even if "c:\dir" exists, // so remove all trailing backslashes from the path - but don't do this for @@ -1270,12 +1280,12 @@ bool wxPathExists(const wxChar *pszPathName) } #endif // __WINDOWS__ -#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) - // Stat can't cope with network paths - DWORD ret = GetFileAttributes(strPath.c_str()); - DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY); - return ((ret != 0xffffffff) && (isDir != 0)); -#else +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + // stat() can't cope with network paths + DWORD ret = ::GetFileAttributes(strPath); + + return (ret != (DWORD)-1) && (ret & FILE_ATTRIBUTE_DIRECTORY); +#else // !__WIN32__ wxStructStat st; #ifndef __VISAGECPP__ @@ -1287,7 +1297,7 @@ bool wxPathExists(const wxChar *pszPathName) (st.st_mode == S_IFDIR); #endif -#endif +#endif // __WIN32__/!__WIN32__ } // Get a temporary filename, opening and closing the file. @@ -1328,13 +1338,13 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) if (gs_dir) delete gs_dir; gs_dir = new wxDir(gs_dirPath); - + if ( !gs_dir->IsOpened() ) { wxLogSysError(_("Can not enumerate files '%s'"), spec); return wxEmptyString; } - + int dirFlags = 0; switch (flags) { @@ -1342,7 +1352,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) case wxFILE: dirFlags = wxDIR_FILES; break; default: dirFlags = wxDIR_DIRS | wxDIR_FILES; break; } - + wxString result; gs_dir->GetFirst(&result, wxFileNameFromPath(spec), dirFlags); if ( result.IsEmpty() ) @@ -1360,13 +1370,13 @@ wxString wxFindNextFile() wxString result; gs_dir->GetNext(&result); - + if ( result.IsEmpty() ) { wxDELETE(gs_dir); return result; } - + return gs_dirPath + result; } @@ -1381,21 +1391,37 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) buf = new wxChar[sz + 1]; } - bool ok; + bool ok = FALSE; // for the compilers which have Unicode version of _getcwd(), call it // directly, for the others call the ANSI version and do the translation -#if wxUSE_UNICODE +#if !wxUSE_UNICODE + #define cbuf buf +#else // wxUSE_UNICODE + bool needsANSI = TRUE; + + #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU + wxCharBuffer c_buffer(sz); + char *cbuf = (char*)(const char*)c_buffer; + #endif + #ifdef HAVE_WGETCWD - ok = _wgetcwd(buf, sz) != NULL; - #else // !HAVE_WGETCWD - wxCharBuffer cbuf(sz); + #if wxUSE_UNICODE_MSLU + if ( wxGetOsVersion() != wxWIN95 ) + #else + char *cbuf = NULL; // never really used because needsANSI will always be FALSE + #endif + { + ok = _wgetcwd(buf, sz) != NULL; + needsANSI = FALSE; + } #endif -#endif // -#if !wxUSE_UNICODE || !defined(HAVE_WGETCWD) + if ( needsANSI ) +#endif // wxUSE_UNICODE + { #ifdef _MSC_VER - ok = _getcwd(buf, sz) != NULL; + ok = _getcwd(cbuf, sz) != NULL; #elif defined(__WXMAC__) && !defined(__DARWIN__) FSSpec cwdSpec ; FCBPBRec pb; @@ -1413,8 +1439,8 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) cwdSpec.name[0] = 0 ; wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ; - strcpy( buf , res ) ; - buf[res.length()]=0 ; + strcpy( cbuf , res ) ; + cbuf[res.length()]=0 ; ok = TRUE; } @@ -1425,14 +1451,19 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #elif defined(__VISAGECPP__) || (defined (__OS2__) && defined (__WATCOMC__)) APIRET rc; rc = ::DosQueryCurrentDir( 0 // current drive - ,buf + ,cbuf ,(PULONG)&sz ); ok = rc != 0; #else // !Win32/VC++ !Mac !OS2 - ok = getcwd(buf, sz) != NULL; + ok = getcwd(cbuf, sz) != NULL; #endif // platform -#endif // !wxUSE_UNICODE || !HAVE_WGETCWD + + #if wxUSE_UNICODE + // finally convert the result to Unicode if needed + wxConvFile.MB2WC(buf, cbuf, sz); + #endif // wxUSE_UNICODE + } if ( !ok ) { @@ -1456,19 +1487,18 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) } #endif // __DJGPP__ -#ifdef __CYGWIN10__ - // another example of DOS/Unix mix +#ifdef __CYGWIN__ + // another example of DOS/Unix mix (Cygwin) wxString pathUnix = buf; cygwin_conv_to_full_win32_path(pathUnix, buf); -#endif // __CYGWIN10__ - - // finally convert the result to Unicode if needed -#if wxUSE_UNICODE && !defined(HAVE_WGETCWD) - wxConvFile.MB2WC(buf, cbuf, sz); -#endif // wxUSE_UNICODE +#endif // __CYGWIN__ } return buf; + +#if !wxUSE_UNICODE + #undef cbuf +#endif } wxString wxGetCwd() @@ -1780,28 +1810,3 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) #ifdef __VISUALC__ #pragma warning(default:4706) // assignment within conditional expression #endif // VC++ - -//------------------------------------------------------------------------ -// Missing functions in Unicode for Win9x -//------------------------------------------------------------------------ - -// NB: MSLU only covers Win32 API, it doesn't provide Unicode implementation of -// libc functions. Unfortunately, some of MSVCRT wchar_t functions -// (e.g. _wopen) don't work on Windows 9x, so we have to workaround it -// by calling the char version. We still want to use wchar_t version on -// NT/2000/XP, though, because they allow for Unicode file names. -#if wxUSE_UNICODE_MSLU - - #if defined( __VISUALC__ ) \ - || ( defined(__MINGW32__) && wxCHECK_W32API_VERSION( 0, 5 ) ) \ - || ( defined(__MWERKS__) && defined(__WXMSW__) ) - WXDLLEXPORT int wxOpen(const wxChar *name, int flags, int mode) - { - if ( wxGetOsVersion() == wxWINDOWS_NT ) - return _wopen(name, flags, mode); - else - return _open(wxConvFile.cWX2MB(name), flags, mode); - } - #endif - -#endif // wxUSE_UNICODE_MSLU