X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd82f4e6e9e03bbfef56349eb4f40cc14c7792a7..7873ca319146f39b4685e8727fde91cf601f4bbe:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 41e11eb45c..e227020173 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "filefn.h" #endif @@ -51,7 +51,7 @@ #endif #if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers + #include "wx/mac/private.h" // includes mac headers #endif #ifdef __WXWINCE__ @@ -80,16 +80,20 @@ #endif #endif -#ifdef __UNIX__ +#ifdef __OS2__ +// need to check for __OS2__ first since currently both +// __OS2__ and __UNIX__ are defined. + #include + #include "wx/os2/private.h" +#ifdef __EMX__ + #include +#endif +#elif defined(__UNIX__) #include #include #include #endif -#ifdef __WXPM__ - #include - #include "wx/os2/private.h" -#endif #if defined(__WINDOWS__) && !defined(__WXMICROWIN__) #if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) && !defined(__WXWINCE__) #include @@ -128,7 +132,7 @@ #endif #ifdef __WINDOWS__ - #include + #include "wx/msw/wrapwin.h" #include "wx/msw/mslu.h" // for _getcwd @@ -196,25 +200,6 @@ const off_t wxInvalidOffset = (off_t)-1; // implementation // ============================================================================ -#if defined(__WXMAC__) && !defined(__DARWIN__) - -WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) -{ - return stat( wxMacStringToCString( file_name ), buf ); -} - -WXDLLEXPORT int wxAccess( const wxChar *pathname, int mode ) -{ - return access( wxMacStringToCString( pathname ), mode ); -} - -WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode ) -{ - return open( wxMacStringToCString( pathname ), flags, mode ); -} - -#endif - #ifdef wxNEED_WX_UNISTD_H WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) @@ -264,7 +249,7 @@ void wxPathList::AddEnvList (const wxString& envVariable) // No environment variables on WinCE #ifndef __WXWINCE__ static const wxChar PATH_TOKS[] = -#ifdef __WINDOWS__ +#if defined(__WINDOWS__) || defined(__OS2__) /* The space has been removed from the tokenizers, otherwise a path such as "C:\Program Files" would be split into 2 paths: @@ -323,7 +308,7 @@ bool wxPathList::Member (const wxString& path) { wxString path2( node->GetData() ); if ( -#if defined(__WINDOWS__) || defined(__VMS__) || defined (__WXMAC__) +#if defined(__WINDOWS__) || defined(__OS2__) || defined(__VMS__) || defined (__WXMAC__) // Case INDEPENDENT path.CompareTo (path2, wxString::ignoreCase) == 0 #else @@ -344,8 +329,7 @@ wxString wxPathList::FindValidPath (const wxString& file) wxChar buf[_MAXPATHLEN]; wxStrcpy(buf, wxFileFunctionsBuffer); - wxChar *filename = (wxChar*) NULL; /* shut up buggy egcs warning */ - filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf; + wxChar *filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf; for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext()) { @@ -423,7 +407,7 @@ wxIsAbsolutePath (const wxString& filename) if ((filename[0] == wxT('[') && filename[1] != wxT('.'))) return TRUE; #endif -#ifdef __WINDOWS__ +#if defined(__WINDOWS__) || defined(__OS2__) // MSDOS like if (filename[0] == wxT('\\') || (wxIsalpha (filename[0]) && filename[1] == wxT(':'))) return TRUE; @@ -505,7 +489,7 @@ wxChar *wxRealPath (wxChar *path) path[0] = SEP; path[1] = wxT('\0'); } -#ifdef __WXMSW__ +#if defined(__WXMSW__) || defined(__OS2__) /* Check that path[2] is NULL! */ else if (path[1] == wxT(':') && !path[2]) { @@ -751,9 +735,9 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin #endif // Handle environment - const wxChar *val = (const wxChar *) NULL; + const wxChar *val; #ifndef __WXWINCE__ - wxChar *tcp = (wxChar *) NULL; + wxChar *tcp; if (envname != WXSTRINGCAST NULL && (val = wxGetenv (WXSTRINGCAST envname)) != NULL && (tcp = wxStrstr (dest, val)) != NULL) { @@ -767,17 +751,22 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin #endif // Handle User's home (ignore root homes!) - size_t len = 0; - if ((val = wxGetUserHome (user)) != NULL && - (len = wxStrlen(val)) > 2 && - wxStrncmp(dest, val, len) == 0) - { - wxStrcpy(wxFileFunctionsBuffer, wxT("~")); - if (user != wxT("")) - wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user); - wxStrcat(wxFileFunctionsBuffer, dest + len); - wxStrcpy (dest, wxFileFunctionsBuffer); - } + val = wxGetUserHome (user); + if (!val) + return dest; + + const size_t len = wxStrlen(val); + if (len <= 2) + return dest; + + if (wxStrncmp(dest, val, len) == 0) + { + wxStrcpy(wxFileFunctionsBuffer, wxT("~")); + if (user != wxT("")) + wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user); + wxStrcat(wxFileFunctionsBuffer, dest + len); + wxStrcpy (dest, wxFileFunctionsBuffer); + } return dest; } @@ -848,7 +837,7 @@ wxPathOnly (wxChar *path) i --; } -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WXMSW__) || defined(__OS2__) // Try Drive specifier if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) { @@ -904,7 +893,7 @@ wxString wxPathOnly (const wxString& path) i --; } -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WXMSW__) || defined(__OS2__) // Try Drive specifier if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) { @@ -929,14 +918,33 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) int i; int j; OSErr theErr; - OSStatus theStatus; + OSStatus theStatus = noErr; Boolean isDirectory = FALSE; Str255 theParentPath = "\p"; FSSpec theParentSpec; FSRef theParentRef; + FSRef theRef ; char theFileName[FILENAME_MAX]; char thePath[FILENAME_MAX]; + // we loose the long filename by merely copying the spec->name + // so try the built-ins, which only work if the file exists, but still... + + theErr = FSpMakeFSRef(spec, &theRef); + if ( theErr == noErr ) + { + CFURLRef fullURLRef; + fullURLRef = ::CFURLCreateFromFSRef(NULL, &theRef); +#ifdef __UNIX__ + CFURLPathStyle pathstyle = kCFURLPOSIXPathStyle; +#else + CFURLPathStyle pathstyle = kCFURLHFSPathStyle; +#endif + CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, pathstyle); + ::CFRelease( fullURLRef ) ; + return wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding()); + } + strcpy(thePath, ""); // GD: Separate file name from path and make a FSRef to the parent @@ -977,7 +985,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) } // create path string for return value - wxString result( thePath ) ; + wxString result( thePath , wxConvLocal) ; #else Handle myPath ; short length ; @@ -991,7 +999,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) (*myPath)[length-1] = 0 ; // create path string for return value - wxString result = wxMacMakeStringFromCString( *myPath ) ; + wxString result( *myPath , wxConvLocal) ; // free allocated handle ::HUnlock( myPath ) ; @@ -1037,7 +1045,7 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) #if wxUSE_UNICODE WXDLLEXPORT void wxMacFilename2FSSpec( const wxChar *path , FSSpec *spec ) { - return wxMacFilename2FSSpec( wxMacStringToCString( wxString( path ) ) , spec ) ; + return wxMacFilename2FSSpec( wxConvFile.cWC2MB(path) , spec ) ; } #endif @@ -1111,7 +1119,7 @@ wxString wxMacFSSpec2UnixFilename( const FSSpec *spec ) return wxMac2UnixFilename( wxMacFSSpec2MacFilename( spec) ) ; } -void wxUnixFilename2FSSpec( const char *path , FSSpec *spec ) +void wxUnixFilename2FSSpec( const wxChar *path , FSSpec *spec ) { wxString var = wxUnix2MacFilename( path ) ; wxMacFilename2FSSpec( var , spec ) ; @@ -1137,14 +1145,14 @@ wxDos2UnixFilename (wxChar *s) } void -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WXMSW__) || defined(__OS2__) wxUnix2DosFilename (wxChar *s) #else wxUnix2DosFilename (wxChar *WXUNUSED(s) ) #endif { // Yes, I really mean this to happen under DOS only! JACS -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WXMSW__) || defined(__OS2__) if (s) while (*s) { @@ -1163,9 +1171,9 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil if ( !wxGetTempFileName( wxT("cat"), outfile) ) return FALSE; - FILE *fp1 = (FILE *) NULL; - FILE *fp2 = (FILE *) NULL; - FILE *fp3 = (FILE *) NULL; + FILE *fp1 wxDUMMY_INITIALIZE(NULL); + FILE *fp2 = NULL; + FILE *fp3 = NULL; // Open the inputs and outputs if ((fp1 = wxFopen ( file1, wxT("rb"))) == NULL || (fp2 = wxFopen ( file2, wxT("rb"))) == NULL || @@ -1210,7 +1218,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) return FALSE; } -#elif defined(__WXPM__) +#elif defined(__OS2__) if ( ::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) != 0 ) return FALSE; #else // !Win32 @@ -1319,7 +1327,9 @@ bool wxRemoveFile(const wxString& file) #if defined(__VISUALC__) \ || defined(__BORLANDC__) \ || defined(__WATCOMC__) \ - || defined(__GNUWIN32__) + || defined(__DMC__) \ + || defined(__GNUWIN32__) \ + || (defined(__MWERKS__) && defined(__MSL__)) int res = wxRemove(file); #elif defined(__WXMAC__) int res = unlink(wxFNCONV(file)); @@ -1339,13 +1349,13 @@ bool wxMkdir(const wxString& dir, int perm) // assume mkdir() has 2 args on non Windows-OS/2 platforms and on Windows too // for the GNU compiler -#if (!(defined(__WXMSW__) || defined(__WXPM__) || defined(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WINE__) || defined(__WXMICROWIN__) +#if (!(defined(__WXMSW__) || defined(__OS2__) || defined(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WINE__) || defined(__WXMICROWIN__) #ifndef MSVCRT if ( mkdir(wxFNCONV(dirname), perm) != 0 ) #else if ( mkdir(wxFNCONV(dirname)) != 0 ) #endif -#elif defined(__WXPM__) +#elif defined(__OS2__) if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? #elif defined(__DOS__) #if defined(__WATCOMC__) @@ -1378,7 +1388,7 @@ bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #ifdef __VMS__ return FALSE; //to be changed since rmdir exists in VMS7.x -#elif defined(__WXPM__) +#elif defined(__OS2__) return (::DosDeleteDir((PSZ)dir.c_str()) == 0); #else @@ -1396,7 +1406,7 @@ bool wxPathExists(const wxChar *pszPathName) { wxString strPath(pszPathName); -#ifdef __WINDOWS__ +#if defined(__WINDOWS__) || defined(__OS2__) // 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 // the pathes "d:\" (which are different from "d:") nor for just "\" @@ -1410,6 +1420,12 @@ bool wxPathExists(const wxChar *pszPathName) } #endif // __WINDOWS__ +#ifdef __OS2__ + // OS/2 can't handle "d:", it wants either "d:\" or "d:." + if (strPath.length() == 2 && strPath[1u] == _T(':')) + strPath << _T('.'); +#endif + #if defined(__WIN32__) && !defined(__WXMICROWIN__) // stat() can't cope with network paths DWORD ret = ::GetFileAttributes(strPath); @@ -1419,7 +1435,7 @@ bool wxPathExists(const wxChar *pszPathName) wxStructStat st; #ifndef __VISAGECPP__ - return wxStat(pszPathName, &st) == 0 && ((st.st_mode & S_IFMT) == S_IFDIR); + return wxStat(strPath.c_str(), &st) == 0 && ((st.st_mode & S_IFMT) == S_IFDIR); #else // S_IFMT not supported in VA compilers.. st_mode is a 2byte value only return wxStat(pszPathName, &st) == 0 && (st.st_mode == S_IFDIR); @@ -1473,7 +1489,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) return wxEmptyString; } - int dirFlags = 0; + int dirFlags; switch (flags) { case wxDIR: dirFlags = wxDIR_DIRS; break; @@ -1522,7 +1538,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) buf = new wxChar[sz + 1]; } - bool ok = FALSE; + bool ok wxDUMMY_INITIALIZE(FALSE); // for the compilers which have Unicode version of _getcwd(), call it // directly, for the others call the ANSI version and do the translation @@ -1579,18 +1595,29 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) { ok = FALSE; } - #elif defined(__VISAGECPP__) || (defined (__OS2__) && defined (__WATCOMC__)) + #elif defined(__OS2__) APIRET rc; - rc = ::DosQueryCurrentDir( 0 // current drive - ,cbuf - ,(PULONG)&sz - ); - ok = rc != 0; + ULONG ulDriveNum = 0; + ULONG ulDriveMap = 0; + rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap); + ok = rc == 0; + if (ok) + { + sz -= 3; + rc = ::DosQueryCurrentDir( 0 // current drive + ,cbuf + 3 + ,(PULONG)&sz + ); + cbuf[0] = 'A' + (ulDriveNum - 1); + cbuf[1] = ':'; + cbuf[2] = '\\'; + ok = rc == 0; + } #else // !Win32/VC++ !Mac !OS2 ok = getcwd(cbuf, sz) != NULL; #endif // platform - #if wxUSE_UNICODE && !defined(__WXMAC__) + #if wxUSE_UNICODE && !(defined(__WXMAC__) && !defined(__DARWIN__)) // finally convert the result to Unicode if needed wxConvFile.MB2WC(buf, cbuf, sz); #endif // wxUSE_UNICODE @@ -1649,10 +1676,10 @@ wxString wxGetCwd() bool wxSetWorkingDirectory(const wxString& d) { -#if defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__) - return (chdir(wxFNSTRINGCAST d.fn_str()) == 0); -#elif defined(__WXPM__) +#if defined(__OS2__) return (::DosSetCurrentDir((PSZ)d.c_str()) == 0); +#elif defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__) + return (chdir(wxFNSTRINGCAST d.fn_str()) == 0); #elif defined(__WINDOWS__) #ifdef __WIN32__