X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/564225a113e7bd03aad21c7cdf168da6ee02ba01..090a6d7af9c551cf34c3d50f3a438c6b42e51527:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index c990c980ed..17ab7782d6 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -873,14 +873,56 @@ wxString wxPathOnly (const wxString& path) wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) { #ifdef __DARWIN__ - FSRef theRef; - char thePath[FILENAME_MAX]; - - // 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) ); - + 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); + } + // create path string for return value wxString result( thePath ) ; #else @@ -1329,7 +1371,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 ) @@ -1396,28 +1438,30 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) // 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 + #define cbuf buf #else // wxUSE_UNICODE - bool needsANSI = TRUE; + bool needsANSI = TRUE; - #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU + #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU wxCharBuffer c_buffer(sz); - char *cbuf = (char*)(const char*)c_buffer; - #endif + char *cbuf = (char*)(const char*)c_buffer; + #endif #ifdef HAVE_WGETCWD - #if wxUSE_UNICODE_MSLU - if ( wxGetOsVersion() != wxWIN95 ) - #endif - { - ok = _wgetcwd(buf, sz) != NULL; - needsANSI = FALSE; - } + #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 ) + if ( needsANSI ) #endif // wxUSE_UNICODE - { + { #ifdef _MSC_VER ok = _getcwd(cbuf, sz) != NULL; #elif defined(__WXMAC__) && !defined(__DARWIN__) @@ -1456,7 +1500,12 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #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 + } if ( !ok ) { @@ -1485,17 +1534,12 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) wxString pathUnix = buf; cygwin_conv_to_full_win32_path(pathUnix, buf); #endif // __CYGWIN__ - - // finally convert the result to Unicode if needed -#if wxUSE_UNICODE - wxConvFile.MB2WC(buf, cbuf, sz); -#endif // wxUSE_UNICODE } return buf; #if !wxUSE_UNICODE - #undef cbuf + #undef cbuf #endif }