X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cb172b4f12fae80b06d5936108a1bc7f2521674..eb749c3e37cada3f22255c8fe6ac080f72e04814:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 92a7946418..fa8481d84e 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -115,11 +115,11 @@ extern wxChar *wxBuffer; -#if defined(__WXMAC__) && !defined(__UNIX__) - #include "morefile.h" - #include "moreextr.h" - #include "fullpath.h" - #include "fspcompa.h" +#ifdef __WXMAC__ +# include "MoreFiles.h" +# include "MoreFilesExtras.h" +# include "FullPath.h" +# include "FSpCompat.h" #endif IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) @@ -143,7 +143,7 @@ const off_t wxInvalidOffset = (off_t)-1; // ---------------------------------------------------------------------------- // we need to translate Mac filenames before passing them to OS functions - #define OS_FILENAME(s) (s.fn_str()) +#define OS_FILENAME(s) (s.fn_str()) // ============================================================================ // implementation @@ -272,8 +272,11 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) bool wxFileExists (const wxString& filename) { -#ifdef __GNUWIN32__ // (fix a B20 bug) - return GetFileAttributes(filename) != 0xFFFFFFFF; +#ifdef __WINDOWS__ + // GetFileAttributes can copy with network paths + DWORD ret = GetFileAttributes(filename); + DWORD isDir = (ret & FILE_ATTRIBUTE_DIRECTORY); + return ((ret != 0xffffffff) && (isDir == 0)); #else wxStructStat stbuf; if ( !filename.empty() && wxStat (OS_FILENAME(filename), &stbuf) == 0 ) @@ -286,29 +289,33 @@ wxFileExists (const wxString& filename) bool wxIsAbsolutePath (const wxString& filename) { -#ifdef __WXMAC__ - if (filename != wxT("")) - { - if( filename.Find(':') != wxNOT_FOUND && filename[0] != ':' ) - return TRUE ; - } - return FALSE ; -#else - if (filename != wxT("")) + if (filename != wxT("")) { - if (filename[0] == wxT('/') +#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. + if (filename.Find(':') != wxNOT_FOUND && filename[0] != ':') + return TRUE ; +#else + // Unix like or Windows + if (filename[0] == wxT('/')) + return TRUE; +#endif #ifdef __VMS__ - || (filename[0] == wxT('[') && filename[1] != wxT('.')) + if ((filename[0] == wxT('[') && filename[1] != wxT('.'))) + return TRUE; #endif #ifdef __WINDOWS__ - /* MSDOS */ - || filename[0] == wxT('\\') || (wxIsalpha (filename[0]) && filename[1] == wxT(':')) + // MSDOS like + if (filename[0] == wxT('\\') || (wxIsalpha (filename[0]) && filename[1] == wxT(':'))) + return TRUE; #endif - ) - return TRUE; } - return FALSE; -#endif + return FALSE ; } /* @@ -651,178 +658,191 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin // (basename) wxChar *wxFileNameFromPath (wxChar *path) { - if (path) + if (path) { - register wxChar *tcp; - - tcp = path + wxStrlen (path); - while (--tcp >= path) + register wxChar *tcp; + + tcp = path + wxStrlen (path); + while (--tcp >= path) { -#ifdef __WXMAC__ - if (*tcp == wxT(':') ) +#if defined(__WXMAC__) && !defined(__DARWIN__) + // Classic or Carbon CodeWarrior like + // Carbon with Apple DevTools is Unix like + if (*tcp == wxT(':')) + return tcp + 1; #else - if (*tcp == wxT('/') || *tcp == wxT('\\') -#ifdef __VMS__ - || *tcp == wxT(':') || *tcp == wxT(']')) -#else - ) + // Unix like or Windows + if (*tcp == wxT('/') || *tcp == wxT('\\')) + return tcp + 1; #endif +#ifdef __VMS__ + if (*tcp == wxT(':') || *tcp == wxT(']')) + return tcp + 1; #endif - return tcp + 1; - } /* while */ + } /* while */ #if defined(__WXMSW__) || defined(__WXPM__) - if (wxIsalpha (*path) && *(path + 1) == wxT(':')) - return path + 2; + // MSDOS like + if (wxIsalpha (*path) && *(path + 1) == wxT(':')) + return path + 2; #endif } - return path; + return path; } wxString wxFileNameFromPath (const wxString& path1) { - if (path1 != wxT("")) - { - - wxChar *path = WXSTRINGCAST path1 ; - register wxChar *tcp; - - tcp = path + wxStrlen (path); - while (--tcp >= path) - { -#ifdef __WXMAC__ - if (*tcp == wxT(':') ) -#else - if (*tcp == wxT('/') || *tcp == wxT('\\') -#ifdef __VMS__ - || *tcp == wxT(':') || *tcp == wxT(']')) + if (path1 != wxT("")) + { + wxChar *path = WXSTRINGCAST path1 ; + register wxChar *tcp; + + tcp = path + wxStrlen (path); + while (--tcp >= path) + { +#if defined(__WXMAC__) && !defined(__DARWIN__) + // Classic or Carbon CodeWarrior like + // Carbon with Apple DevTools is Unix like + if (*tcp == wxT(':') ) + return wxString(tcp + 1); #else - ) -#endif + // Unix like or Windows + if (*tcp == wxT('/') || *tcp == wxT('\\')) + return wxString(tcp + 1); #endif +#ifdef __VMS__ + if (*tcp == wxT(':') || *tcp == wxT(']')) return wxString(tcp + 1); - } /* while */ +#endif + } /* while */ #if defined(__WXMSW__) || defined(__WXPM__) - if (wxIsalpha (*path) && *(path + 1) == wxT(':')) + // MSDOS like + if (wxIsalpha (*path) && *(path + 1) == wxT(':')) return wxString(path + 2); #endif } - // Yes, this should return the path, not an empty string, otherwise - // we get "thing.txt" -> "". - return path1; + // Yes, this should return the path, not an empty string, otherwise + // we get "thing.txt" -> "". + return path1; } // Return just the directory, or NULL if no directory wxChar * wxPathOnly (wxChar *path) { - if (path && *path) + if (path && *path) { - static wxChar buf[_MAXPATHLEN]; - - // Local copy - wxStrcpy (buf, path); - - int l = wxStrlen(path); - bool done = FALSE; - - int i = l - 1; - - // Search backward for a backward or forward slash - while (!done && i > -1) - { - // ] is for VMS -#ifdef __WXMAC__ - if (path[i] == wxT(':') ) + 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) + { +#if defined(__WXMAC__) && !defined(__DARWIN__) + // Classic or Carbon CodeWarrior like + // Carbon with Apple DevTools is Unix like + if (path[i] == wxT(':') ) + { + buf[i] = 0; + return buf; + } #else - if (path[i] == wxT('/') || path[i] == wxT('\\') || path[i] == wxT(']')) + // Unix like or Windows + if (path[i] == wxT('/') || path[i] == wxT('\\')) + { + buf[i] = 0; + return buf; + } #endif - { - done = TRUE; #ifdef __VMS__ - if ( path[i] == wxT(']') ) - buf[i+1] = 0; - else + if (path[i] == wxT(']')) + { + buf[i+1] = 0; + return buf; + } #endif - buf[i] = 0; - - return buf; + i --; } - else i --; - } - + #if defined(__WXMSW__) || defined(__WXPM__) - // Try Drive specifier - if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) + // Try Drive specifier + if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) { - // A:junk --> A:. (since A:.\junk Not A:\junk) - buf[2] = wxT('.'); - buf[3] = wxT('\0'); - return buf; + // A:junk --> A:. (since A:.\junk Not A:\junk) + buf[2] = wxT('.'); + buf[3] = wxT('\0'); + return buf; } #endif } - - return (wxChar *) NULL; + return (wxChar *) NULL; } // Return just the directory, or NULL if no directory wxString wxPathOnly (const wxString& path) { - if (path != wxT("")) + if (path != wxT("")) { - wxChar buf[_MAXPATHLEN]; - - // Local copy - wxStrcpy (buf, WXSTRINGCAST path); - - int l = path.Length(); - bool done = FALSE; - - int i = l - 1; - - // Search backward for a backward or forward slash - while (!done && i > -1) - { - // ] is for VMS -#ifdef __WXMAC__ - if (path[i] == wxT(':') ) + wxChar buf[_MAXPATHLEN]; + + // Local copy + wxStrcpy (buf, WXSTRINGCAST path); + + int l = path.Length(); + int i = l - 1; + + // Search backward for a backward or forward slash + while (i > -1) + { +#if defined(__WXMAC__) && !defined(__DARWIN__) + // Classic or Carbon CodeWarrior like + // Carbon with Apple DevTools is Unix like + if (path[i] == wxT(':') ) + { + buf[i] = 0; + return wxString(buf); + } #else - if (path[i] == wxT('/') || path[i] == wxT('\\') || path[i] == wxT(']')) + // Unix like or Windows + if (path[i] == wxT('/') || path[i] == wxT('\\')) + { + buf[i] = 0; + return wxString(buf); + } #endif - { - done = TRUE; #ifdef __VMS__ - if ( path[i] == wxT(']') ) - buf[i+1] = 0; - else + if (path[i] == wxT(']')) + { + buf[i+1] = 0; + return wxString(buf); + } #endif - buf[i] = 0; - - return wxString(buf); + i --; } - else i --; - } - + #if defined(__WXMSW__) || defined(__WXPM__) - // Try Drive specifier - if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) + // Try Drive specifier + if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) { - // A:junk --> A:. (since A:.\junk Not A:\junk) - buf[2] = wxT('.'); - buf[3] = wxT('\0'); - return wxString(buf); + // A:junk --> A:. (since A:.\junk Not A:\junk) + buf[2] = wxT('.'); + buf[3] = wxT('\0'); + return wxString(buf); } #endif } - - return wxString(wxT("")); + return wxString(wxT("")); } // Utility for converting delimiters in DOS filenames to UNIX style // and back again - or we get nasty problems with delimiters. // Also, convert to lower case, since case is significant in UNIX. -#if defined(__WXMAC__) && !defined(__UNIX__) +#if defined(__WXMAC__) wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) { Handle myPath ; @@ -835,7 +855,11 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) if ( length > 0 && (*myPath)[length-1] ==':' ) (*myPath)[length-1] = 0 ; - wxString result( (char*) *myPath ) ; +#ifdef __DARWIN__ + wxString result( wxMac2UnixFilename((char*) *myPath) ) ; +#else + wxString result( (char*) *myPath ) ; +#endif ::HUnlock( myPath ) ; ::DisposeHandle( myPath ) ; return result ; @@ -843,7 +867,12 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) { - FSpLocationFromFullPath( strlen(path ) , path , spec ) ; +#ifdef __DARWIN__ + const char *s = wxUnix2MacFilename(path); + FSpLocationFromFullPath( strlen(s) , s , spec ) ; +#else + FSpLocationFromFullPath( strlen(path) , path , spec ) ; +#endif } static char sMacFileNameConversion[ 1000 ] ; @@ -923,7 +952,8 @@ void wxUnixFilename2FSSpec( const char *path , FSSpec *spec ) wxMacFilename2FSSpec( var , spec ) ; } -#endif +#endif // __WXMAC__ + void wxDos2UnixFilename (char *s) { @@ -1008,6 +1038,11 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // // NB: 3rd parameter is bFailIfExists i.e. the inverse of overwrite return ::CopyFile(file1, file2, !overwrite) != 0; +#elif defined(__WXPM__) + if (::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) == 0) + return TRUE; + else + return FALSE; #else // !Win32 wxStructStat fbuf; @@ -1134,7 +1169,7 @@ bool wxMkdir(const wxString& dir, int perm) #elif defined(__WXPM__) if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? #else // !MSW and !OS/2 VAC++ - (void)perm; + (void)perm; if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 ) #endif // !MSW/MSW { @@ -1175,13 +1210,20 @@ bool wxPathExists(const wxChar *pszPathName) while ( wxEndsWithPathSeparator(strPath) ) { size_t len = strPath.length(); - if ( len == 1 || strPath[len - 1] == _T(':') ) + if ( len == 1 || (len == 3 && strPath[len - 2] == _T(':')) ) break; strPath.Truncate(len - 1); } #endif // __WINDOWS__ +#ifdef __WINDOWS__ + // 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 + wxStructStat st; #ifndef __VISAGECPP__ return wxStat(wxFNSTRINGCAST strPath.fn_str(), &st) == 0 && @@ -1192,6 +1234,7 @@ bool wxPathExists(const wxChar *pszPathName) (st.st_mode == S_IFDIR); #endif +#endif } // Get a temporary filename, opening and closing the file. @@ -1254,7 +1297,7 @@ bool wxGetTempFileName(const wxString& prefix, wxString& buf) // Get first file name matching given wild card. -#ifdef __UNIX__ +#if defined(__UNIX__) && !defined(__WXMAC__) // Get first file name matching given wild card. // Flags are reserved for future use. @@ -1688,7 +1731,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) char *cbuf = new char[sz+1]; #ifdef _MSC_VER if (_getcwd(cbuf, sz) == NULL) { -#elif defined(__WXMAC__) && !defined(__UNIX__) +#elif defined(__WXMAC__) && !defined(__DARWIN__) enum { SFSaveDisk = 0x214, CurDirStore = 0x398 @@ -1706,42 +1749,42 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #else // wxUnicode #ifdef _MSC_VER if (_getcwd(buf, sz) == NULL) { -#elif defined(__WXMAC__) && !defined(__UNIX__) - FSSpec cwdSpec ; - FCBPBRec pb; - OSErr error; - Str255 fileName ; - pb.ioNamePtr = (StringPtr) &fileName; - pb.ioVRefNum = 0; - pb.ioRefNum = LMGetCurApRefNum(); - pb.ioFCBIndx = 0; - error = PBGetFCBInfoSync(&pb); - if ( error == noErr ) - { - cwdSpec.vRefNum = pb.ioFCBVRefNum; - cwdSpec.parID = pb.ioFCBParID; - cwdSpec.name[0] = 0 ; - wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ; - - strcpy( buf , res ) ; - buf[res.length()-1]=0 ; - } - else - buf[0] = 0 ; - /* - this version will not always give back the application directory on mac - enum - { - SFSaveDisk = 0x214, CurDirStore = 0x398 - }; - FSSpec cwdSpec ; - - FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; - wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; - strcpy( buf , res ) ; - */ - if (0) { -#elif(__VISAGECPP__) +#elif defined(__WXMAC__) && !defined(__DARWIN__) + FSSpec cwdSpec ; + FCBPBRec pb; + OSErr error; + Str255 fileName ; + pb.ioNamePtr = (StringPtr) &fileName; + pb.ioVRefNum = 0; + pb.ioRefNum = LMGetCurApRefNum(); + pb.ioFCBIndx = 0; + error = PBGetFCBInfoSync(&pb); + if ( error == noErr ) + { + cwdSpec.vRefNum = pb.ioFCBVRefNum; + cwdSpec.parID = pb.ioFCBParID; + cwdSpec.name[0] = 0 ; + wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ; + + strcpy( buf , res ) ; + buf[res.length()]=0 ; + } + else + buf[0] = 0 ; + /* + this version will not always give back the application directory on mac + enum + { + SFSaveDisk = 0x214, CurDirStore = 0x398 + }; + FSSpec cwdSpec ; + + FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; + wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; + strcpy( buf , res ) ; + */ + if (0) { +#elif defined(__VISAGECPP__) || (defined (__OS2__) && defined (__WATCOMC__)) APIRET rc; rc = ::DosQueryCurrentDir( 0 // current drive ,buf