X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b00a538378ea4976f8dd0d5a23e9fcf43b58f64..9ac71bef070f553f4ecef2c549dba33b10422f06:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index bfa2fe8663..7a30b5eb6f 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -50,6 +50,10 @@ #endif #endif +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + #include #ifndef __MWERKS__ @@ -64,6 +68,7 @@ #ifdef __UNIX__ #include #include + #include #endif #ifdef __WXPM__ @@ -89,13 +94,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. @@ -117,15 +115,34 @@ #ifdef __WINDOWS__ #include + #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 + #define HAVE_WGETCWD #endif // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- -#define _MAXPATHLEN 500 - -extern wxChar *wxBuffer; +#ifndef _MAXPATHLEN + #define _MAXPATHLEN 1024 +#endif #ifdef __WXMAC__ # include "MoreFiles.h" @@ -134,12 +151,11 @@ extern wxChar *wxBuffer; # include "FSpCompat.h" #endif -IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) - // ---------------------------------------------------------------------------- // private globals // ---------------------------------------------------------------------------- +// MT-FIXME: get rid of this horror and all code using it static wxChar wxFileFunctionsBuffer[4*_MAXPATHLEN]; #if defined(__VISAGECPP__) && __IBMCPP__ >= 400 @@ -161,6 +177,32 @@ const off_t wxInvalidOffset = (off_t)-1; // implementation // ============================================================================ +#ifdef wxNEED_WX_UNISTD_H + +WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) +{ + return stat( wxConvFile.cWX2MB( file_name ), buf ); +} + +WXDLLEXPORT int wxAccess( const wxChar *pathname, int mode ) +{ + return access( wxConvFile.cWX2MB( pathname ), mode ); +} + +WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode ) +{ + return open( wxConvFile.cWX2MB( pathname ), flags, mode ); +} + +#endif + // wxNEED_WX_UNISTD_H + +// ---------------------------------------------------------------------------- +// wxPathList +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) + void wxPathList::Add (const wxString& path) { wxStringList::Add (WXSTRINGCAST path); @@ -270,8 +312,8 @@ wxString wxPathList::FindAbsoluteValidPath (const wxString& file) return f; wxString buf; - wxGetWorkingDirectory(buf.GetWriteBuf(_MAXPATHLEN), _MAXPATHLEN - 1); - buf.UngetWriteBuf(); + wxGetWorkingDirectory(wxStringBuffer(buf, _MAXPATHLEN), _MAXPATHLEN); + if ( !wxEndsWithPathSeparator(buf) ) { buf += wxFILE_SEP_PATH; @@ -284,14 +326,14 @@ 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 ) + if ( !filename.empty() && wxStat( filename, &stbuf) == 0 ) return TRUE; return FALSE; @@ -306,7 +348,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. @@ -563,7 +605,6 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) /* Expand ~ and ~user */ nm = lnm; - s = wxT(""); if (nm[0] == wxT('~') && !q) { /* prefix ~ */ @@ -587,7 +628,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) if ((home = WXSTRINGCAST wxGetUserHome(wxString(nm + 1))) == NULL) { if (was_sep) /* replace only if it was there: */ *s = SEP; - s = wxT(""); + s = NULL; } else { nm = nnm; s = home; @@ -654,11 +695,6 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin wxStrcpy(wxFileFunctionsBuffer, wxT("~")); if (user != wxT("")) wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user); -#ifdef __WXMSW__ -// strcat(wxFileFunctionsBuffer, "\\"); -#else -// strcat(wxFileFunctionsBuffer, "/"); -#endif wxStrcat(wxFileFunctionsBuffer, dest + len); wxStrcpy (dest, wxFileFunctionsBuffer); } @@ -666,75 +702,27 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin return dest; } -// Return just the filename, not the path -// (basename) +// Return just the filename, not the path (basename) wxChar *wxFileNameFromPath (wxChar *path) { - if (path) - { - 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 tcp + 1; -#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 - } /* while */ -#if defined(__WXMSW__) || defined(__WXPM__) - // MSDOS like - if (wxIsalpha (*path) && *(path + 1) == wxT(':')) - return path + 2; -#endif - } - return path; + wxString p = path; + wxString n = wxFileNameFromPath(p); + + return path + p.length() - n.length(); } -wxString wxFileNameFromPath (const wxString& path1) +wxString wxFileNameFromPath (const wxString& path) { - if (path1 != wxT("")) + wxString name, ext; + wxFileName::SplitPath(path, NULL, &name, &ext); + + wxString fullname = name; + if ( !ext.empty() ) { - 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 - // 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); -#endif - } /* while */ -#if defined(__WXMSW__) || defined(__WXPM__) - // MSDOS like - if (wxIsalpha (*path) && *(path + 1) == wxT(':')) - return wxString(path + 2); -#endif + fullname << wxFILE_SEP_EXT << ext; } - // Yes, this should return the path, not an empty string, otherwise - // we get "thing.txt" -> "". - return path1; + + return fullname; } // Return just the directory, or NULL if no directory @@ -744,13 +732,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) { @@ -779,7 +767,7 @@ wxPathOnly (wxChar *path) #endif i --; } - + #if defined(__WXMSW__) || defined(__WXPM__) // Try Drive specifier if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) @@ -800,10 +788,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; @@ -835,7 +823,7 @@ wxString wxPathOnly (const wxString& path) #endif i --; } - + #if defined(__WXMSW__) || defined(__WXPM__) // Try Drive specifier if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) @@ -858,14 +846,56 @@ wxString wxPathOnly (const wxString& path) wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) { #ifdef __DARWIN__ - FSRef theRef; - char thePath[FILENAME_MAX]; + int i; + int j; + OSErr theErr; + OSStatus theStatus; + Boolean isDirectory = false; + Str255 theParentPath = "\p"; + FSSpec theParentSpec; + FSRef theParentRef; + char theFileName[FILENAME_MAX]; + char thePath[FILENAME_MAX]; + + strcpy(thePath, ""); + + // GD: Separate file name from path and make a FSRef to the parent + // directory. This is necessary since FSRefs cannot reference files + // that have not yet been created. + // Based on example code from Apple Technical Note TN2022 + // http://developer.apple.com/technotes/tn/tn2022.html + + // check whether we are converting a directory + isDirectory = ((spec->name)[spec->name[0]] == ':'); + // count length of file name + for (i = spec->name[0] - (isDirectory ? 1 : 0); ((spec->name[i] != ':') && (i > 0)); i--); + // copy file name + // prepend path separator since it will later be appended to the path + theFileName[0] = wxFILE_SEP_PATH; + for (j = i + 1; j <= spec->name[0] - (isDirectory ? 1 : 0); j++) { + theFileName[j - i] = spec->name[j]; + } + theFileName[j - i] = '\0'; + // copy path if any + for (j = 1; j <= i; j++) { + theParentPath[++theParentPath[0]] = spec->name[j]; + } + theErr = FSMakeFSSpec(spec->vRefNum, spec->parID, theParentPath, &theParentSpec); + if (theErr == noErr) { + // convert the FSSpec to an FSRef + theErr = FSpMakeFSRef(&theParentSpec, &theParentRef); + } + if (theErr == noErr) { + // get the POSIX path associated with the FSRef + theStatus = FSRefMakePath(&theParentRef, + (UInt8 *)thePath, sizeof(thePath)); + } + if (theStatus == noErr) { + // append file name to path + // includes previously prepended path separator + strcat(thePath, theFileName); + } - // convert the FSSpec to an FSRef - (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 @@ -879,7 +909,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 ) ; @@ -890,26 +920,40 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) return result ; } +#ifndef __DARWIN__ +// Mac file names are POSIX (Unix style) under Darwin +// therefore the conversion functions below are not needed + +static char sMacFileNameConversion[ 1000 ] ; +#endif void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) { + OSStatus err = noErr ; #ifdef __DARWIN__ FSRef theRef; // get the FSRef associated with the POSIX path - (void) FSPathMakeRef((const UInt8 *) path, &theRef, NULL); + err = FSPathMakeRef((const UInt8 *) path, &theRef, NULL); // convert the FSRef to an FSSpec - (void) FSGetCatalogInfo(&theRef, kFSCatInfoNone, NULL, NULL, spec, NULL); + err = FSGetCatalogInfo(&theRef, kFSCatInfoNone, NULL, NULL, spec, NULL); #else - FSpLocationFromFullPath( strlen(path) , path , spec ) ; + if ( strchr( path , ':' ) == NULL ) + { + // try whether it is a volume / or a mounted volume + strncpy( sMacFileNameConversion , path , 1000 ) ; + sMacFileNameConversion[998] = 0 ; + strcat( sMacFileNameConversion , ":" ) ; + err = FSpLocationFromFullPath( strlen(sMacFileNameConversion) , sMacFileNameConversion , spec ) ; + } + else + { + err = FSpLocationFromFullPath( strlen(path) , path , spec ) ; + } #endif } #ifndef __DARWIN__ -// Mac file names are POSIX (Unix style) under Darwin -// therefore the conversion functions below are not needed - -static char sMacFileNameConversion[ 1000 ] ; wxString wxMac2UnixFilename (const char *str) { @@ -922,7 +966,7 @@ wxString wxMac2UnixFilename (const char *str) *s = '.' ; else *s = '/' ; - + while (*s) { if (*s == ':') @@ -1035,9 +1079,9 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil FILE *fp2 = (FILE *) NULL; FILE *fp3 = (FILE *) NULL; // Open the inputs and outputs - if ((fp1 = wxFopen (OS_FILENAME( file1 ), wxT("rb"))) == NULL || - (fp2 = wxFopen (OS_FILENAME( file2 ), wxT("rb"))) == NULL || - (fp3 = wxFopen (OS_FILENAME( outfile ), wxT("wb"))) == NULL) + if ((fp1 = wxFopen ( file1, wxT("rb"))) == NULL || + (fp2 = wxFopen ( file2, wxT("rb"))) == NULL || + (fp3 = wxFopen ( outfile, wxT("wb"))) == NULL) { if (fp1) fclose (fp1); @@ -1071,17 +1115,21 @@ 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; + wxStructStat fbuf; // get permissions of file1 - if ( wxStat(OS_FILENAME(file1), &fbuf) != 0 ) + if ( wxStat( file1.c_str(), &fbuf) != 0 ) { // the file probably doesn't exist or we haven't the rights to read // from it anyhow @@ -1112,6 +1160,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // create file2 with the same permissions than file1 and open it for // writing + wxFile fileOut; if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) ) return FALSE; @@ -1154,9 +1203,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 @@ -1246,6 +1295,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 @@ -1260,24 +1310,22 @@ 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__ - return wxStat(wxFNSTRINGCAST strPath.fn_str(), &st) == 0 && - ((st.st_mode & S_IFMT) == S_IFDIR); + return wxStat(pszPathName, &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(wxFNSTRINGCAST strPath.fn_str(), &st) == 0 && - (st.st_mode == S_IFDIR); + return wxStat(pszPathName, &st) == 0 && (st.st_mode == S_IFDIR); #endif -#endif +#endif // __WIN32__/!__WIN32__ } // Get a temporary filename, opening and closing the file. @@ -1309,7 +1357,7 @@ static wxString gs_dirPath; wxString wxFindFirstFile(const wxChar *spec, int flags) { - gs_dirPath = wxPathOnly(spec); + wxSplitPath(spec, &gs_dirPath, NULL, NULL); if ( gs_dirPath.IsEmpty() ) gs_dirPath = wxT("."); if ( gs_dirPath.Last() != wxFILE_SEP_PATH ) @@ -1318,13 +1366,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) { @@ -1332,9 +1380,9 @@ 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); + gs_dir->GetFirst(&result, wxFileNameFromPath(wxString(spec)), dirFlags); if ( result.IsEmpty() ) { wxDELETE(gs_dir); @@ -1350,13 +1398,13 @@ wxString wxFindNextFile() wxString result; gs_dir->GetNext(&result); - + if ( result.IsEmpty() ) { wxDELETE(gs_dir); return result; } - + return gs_dirPath + result; } @@ -1366,103 +1414,133 @@ wxString wxFindNextFile() // copies into buf. wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) { - if (!buf) - buf = new wxChar[sz+1]; -#if wxUSE_UNICODE - char *cbuf = new char[sz+1]; -#ifdef _MSC_VER - if (_getcwd(cbuf, sz) == NULL) { -#elif defined(__WXMAC__) && !defined(__DARWIN__) - enum + if ( !buf ) { - SFSaveDisk = 0x214, CurDirStore = 0x398 - }; - FSSpec cwdSpec ; - - FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; - wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; - strcpy( buf , res ) ; - if (0) { -#else - if (getcwd(cbuf, sz) == NULL) { -#endif - delete [] cbuf; -#else // wxUnicode -#ifdef _MSC_VER - if (_getcwd(buf, sz) == NULL) { -#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 ) + buf = new wxChar[sz + 1]; + } + + 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 + #define cbuf buf +#else // wxUSE_UNICODE + bool needsANSI = TRUE; + + #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU + // This is not legal code as the compiler + // is allowed destroy the wxCharBuffer. + // wxCharBuffer c_buffer(sz); + // char *cbuf = (char*)(const char*)c_buffer; + char cbuf[_MAXPATHLEN]; + #endif + + #ifdef HAVE_WGETCWD + #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 + + if ( needsANSI ) +#endif // wxUSE_UNICODE { - cwdSpec.vRefNum = pb.ioFCBVRefNum; - cwdSpec.parID = pb.ioFCBParID; - cwdSpec.name[0] = 0 ; - wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ; + #ifdef _MSC_VER + ok = _getcwd(cbuf, sz) != NULL; + #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( cbuf , res ) ; + cbuf[res.length()]=0 ; - strcpy( buf , res ) ; - buf[res.length()]=0 ; + ok = TRUE; + } + else + { + ok = FALSE; + } + #elif defined(__VISAGECPP__) || (defined (__OS2__) && defined (__WATCOMC__)) + APIRET rc; + rc = ::DosQueryCurrentDir( 0 // current drive + ,cbuf + ,(PULONG)&sz + ); + ok = rc != 0; + #else // !Win32/VC++ !Mac !OS2 + ok = getcwd(cbuf, sz) != NULL; + #endif // platform + + #if wxUSE_UNICODE + // finally convert the result to Unicode if needed + wxConvFile.MB2WC(buf, cbuf, sz); + #endif // wxUSE_UNICODE } - 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 - ,(PULONG)&sz - ); - if (rc != 0) { -#else - if (getcwd(buf, sz) == NULL) { -#endif -#endif - buf[0] = wxT('.'); - buf[1] = wxT('\0'); - } -#if wxUSE_UNICODE - else { - wxConvFile.MB2WC(buf, cbuf, sz); - delete [] cbuf; - } -#endif + if ( !ok ) + { + wxLogSysError(_("Failed to get the working directory")); + // VZ: the old code used to return "." on error which didn't make any + // sense at all to me - empty string is a better error indicator + // (NULL might be even better but I'm afraid this could lead to + // problems with the old code assuming the return is never NULL) + buf[0] = _T('\0'); + } + else // ok, but we might need to massage the path into the right format + { #ifdef __DJGPP__ - // VS: DJGPP is Unicodish and uses / instead of \ as path deliminer. We don't like that. - for (wxChar *ch = buf; *ch; ch++) - if (*ch == wxT('/')) *ch = wxT('\\'); -#endif + // VS: DJGPP is a strange mix of DOS and UNIX API and returns paths + // with / deliminers. We don't like that. + for (wxChar *ch = buf; *ch; ch++) + { + if (*ch == wxT('/')) + *ch = wxT('\\'); + } +#endif // __DJGPP__ + +// MBN: we hope that in the case the user is compiling a GTK+/Motif app, +// he needs Unix as opposed to Win32 pathnames +#if defined( __CYGWIN__ ) && defined( __WINDOWS__ ) + // another example of DOS/Unix mix (Cygwin) + wxString pathUnix = buf; + cygwin_conv_to_full_win32_path(pathUnix, buf); +#endif // __CYGWIN__ + } + + return buf; - return buf; +#if !wxUSE_UNICODE + #undef cbuf +#endif } wxString wxGetCwd() { - static const size_t maxPathLen = 1024; - - wxString str; - wxGetWorkingDirectory(str.GetWriteBuf(maxPathLen), maxPathLen); - str.UngetWriteBuf(); - + wxChar *buffer = new wxChar[_MAXPATHLEN]; + wxGetWorkingDirectory(buffer, _MAXPATHLEN); + wxString str( buffer ); + delete [] buffer; + return str; } @@ -1518,11 +1596,9 @@ wxString wxGetOSDirectory() bool wxEndsWithPathSeparator(const wxChar *pszFileName) { - size_t len = wxStrlen(pszFileName); - if ( len == 0 ) - return FALSE; - else - return wxIsPathSeparator(pszFileName[len - 1]); + size_t len = wxStrlen(pszFileName); + + return len && wxIsPathSeparator(pszFileName[len - 1]); } // find a file in a list of directories, returns false if not found @@ -1581,8 +1657,8 @@ void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) { wxStructStat buf; - - wxStat(filename.fn_str(), &buf); + wxStat( filename, &buf); + return buf.st_mtime; } @@ -1609,7 +1685,7 @@ bool wxIsWild( const wxString& pattern ) bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) -#if defined(HAVE_FNMATCH_H) +#ifdef HAVE_FNMATCH { // this probably won't work well for multibyte chars in Unicode mode? if(dot_special) @@ -1617,7 +1693,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) else return fnmatch(pat.fn_str(), text.fn_str(), 0) == 0; } -#else +#else // !HAVE_FNMATCH // #pragma error Broken implementation of wxMatchWild() -- needs fixing! @@ -1758,7 +1834,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) return ((*str == wxT('\0')) && (*pattern == wxT('\0'))); }; -#endif +#endif // HAVE_FNMATCH/!HAVE_FNMATCH #ifdef __VISUALC__ #pragma warning(default:4706) // assignment within conditional expression