X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e8e1d09e0ebb6da4cd143ae254749cae7f53509b..d9f7f49ea3aca3e0e0beafe648a61e6606e37663:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index fa8481d84e..b9c3a8e7ee 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -845,100 +845,121 @@ wxString wxPathOnly (const wxString& path) #if defined(__WXMAC__) 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) ); + + // create path string for return value + wxString result( thePath ) ; +#else Handle myPath ; short length ; + // get length of path and allocate handle FSpGetFullPath( spec , &length , &myPath ) ; ::SetHandleSize( myPath , length + 1 ) ; ::HLock( myPath ) ; (*myPath)[length] = 0 ; - if ( length > 0 && (*myPath)[length-1] ==':' ) + if ((length > 0) && ((*myPath)[length-1] == ':')) (*myPath)[length-1] = 0 ; - -#ifdef __DARWIN__ - wxString result( wxMac2UnixFilename((char*) *myPath) ) ; -#else + + // create path string for return value wxString result( (char*) *myPath ) ; -#endif + + // free allocated handle ::HUnlock( myPath ) ; ::DisposeHandle( myPath ) ; +#endif + return result ; } void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) { #ifdef __DARWIN__ - const char *s = wxUnix2MacFilename(path); - FSpLocationFromFullPath( strlen(s) , s , spec ) ; + FSRef theRef; + + // get the FSRef associated with the POSIX path + (void) FSPathMakeRef((const UInt8 *) path, &theRef, NULL); + // convert the FSRef to an FSSpec + (void) FSGetCatalogInfo(&theRef, kFSCatInfoNone, NULL, NULL, spec, NULL); #else 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) { char *s = sMacFileNameConversion ; strcpy( s , str ) ; - if (s) - { - memmove( s+1 , s ,strlen( s ) + 1) ; - if ( *s == ':' ) + if (s) + { + memmove( s+1 , s ,strlen( s ) + 1) ; + if ( *s == ':' ) *s = '.' ; - else + else *s = '/' ; - - while (*s) - { + + while (*s) + { if (*s == ':') - *s = '/'; + *s = '/'; else - *s = wxTolower (*s); // Case INDEPENDENT + *s = wxTolower(*s); // Case INDEPENDENT s++; + } } - } - return wxString (sMacFileNameConversion) ; + return wxString(sMacFileNameConversion) ; } wxString wxUnix2MacFilename (const char *str) { char *s = sMacFileNameConversion ; strcpy( s , str ) ; - if (s) - { - if ( *s == '.' ) - { - // relative path , since it goes on with slash which is translated to a : - memmove( s , s+1 ,strlen( s ) ) ; - } - else if ( *s == '/' ) - { - // absolute path -> on mac just start with the drive name - memmove( s , s+1 ,strlen( s ) ) ; - } - else - { - wxASSERT_MSG( 1 , "unkown path beginning" ) ; - } - while (*s) + if (s) { - if (*s == '/' || *s == '\\') - { - // convert any back-directory situations - if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) ) - { - *s = ':'; - memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ; - } - else - *s = ':'; - } - - s++ ; + if ( *s == '.' ) + { + // relative path , since it goes on with slash which is translated to a : + memmove( s , s+1 ,strlen( s ) ) ; + } + else if ( *s == '/' ) + { + // absolute path -> on mac just start with the drive name + memmove( s , s+1 ,strlen( s ) ) ; + } + else + { + wxASSERT_MSG( 1 , "unkown path beginning" ) ; + } + while (*s) + { + if (*s == '/' || *s == '\\') + { + // convert any back-directory situations + if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) ) + { + *s = ':'; + memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ; + } + else + *s = ':'; + } + s++ ; + } } - } - return wxString (sMacFileNameConversion) ; + return wxString (sMacFileNameConversion) ; } wxString wxMacFSSpec2UnixFilename( const FSSpec *spec ) @@ -951,6 +972,7 @@ void wxUnixFilename2FSSpec( const char *path , FSSpec *spec ) wxString var = wxUnix2MacFilename( path ) ; wxMacFilename2FSSpec( var , spec ) ; } +#endif // ! __DARWIN__ #endif // __WXMAC__ @@ -1297,7 +1319,7 @@ bool wxGetTempFileName(const wxString& prefix, wxString& buf) // Get first file name matching given wild card. -#if defined(__UNIX__) && !defined(__WXMAC__) +#if defined(__UNIX__) // Get first file name matching given wild card. // Flags are reserved for future use. @@ -1448,21 +1470,21 @@ struct MacDirectoryIterator static int g_iter_flags ; static MacDirectoryIterator g_iter ; +wxString g_iter_spec ; wxString wxFindFirstFile(const wxChar *spec, int flags) { wxString result; + g_iter_spec = spec ; + g_iter_spec.MakeUpper() ; g_iter_flags = flags; /* MATTHEW: [5] Remember flags */ // Find path only so we can concatenate found file onto path wxString path(wxPathOnly(spec)); - if ( !path.IsEmpty() ) - result << path << wxT('\\'); - FSSpec fsspec ; - wxMacFilename2FSSpec( result , &fsspec ) ; + wxMacFilename2FSSpec( path , &fsspec ) ; g_iter.m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ; g_iter.m_CPB.hFileInfo.ioNamePtr = g_iter.m_name ; g_iter.m_index = 0 ; @@ -1480,37 +1502,44 @@ wxString wxFindNextFile() wxString result; short err = noErr ; - - while ( err == noErr ) + wxString name ; + + while(1) { - g_iter.m_index++ ; - g_iter.m_CPB.dirInfo.ioFDirIndex = g_iter.m_index; - g_iter.m_CPB.dirInfo.ioDrDirID = g_iter.m_dirId; /* we need to do this every time */ - err = PBGetCatInfoSync((CInfoPBPtr)&g_iter.m_CPB); - if ( err != noErr ) - break ; + while ( err == noErr ) + { + g_iter.m_index++ ; + g_iter.m_CPB.dirInfo.ioFDirIndex = g_iter.m_index; + g_iter.m_CPB.dirInfo.ioDrDirID = g_iter.m_dirId; /* we need to do this every time */ + err = PBGetCatInfoSync((CInfoPBPtr)&g_iter.m_CPB); + if ( err != noErr ) + break ; - if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (g_iter_flags & wxDIR) ) // we have a directory - break ; + if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (g_iter_flags & wxDIR) ) // we have a directory + break ; - if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) ) - continue ; + if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) ) + continue ; - // hit ! - break ; - } - if ( err != noErr ) - { - return wxEmptyString ; - } - FSSpec spec ; + // hit ! + break ; + } + if ( err != noErr ) + { + return wxEmptyString ; + } + FSSpec spec ; - FSMakeFSSpecCompat(g_iter.m_CPB.hFileInfo.ioVRefNum, - g_iter.m_dirId, - g_iter.m_name, - &spec) ; + FSMakeFSSpecCompat(g_iter.m_CPB.hFileInfo.ioVRefNum, + g_iter.m_dirId, + g_iter.m_name, + &spec) ; - return wxMacFSSpec2MacFilename( &spec ) ; + wxString name = wxMacFSSpec2MacFilename( &spec ) ; + if ( g_iter_spec.Right(4)==(":*.*") || g_iter_spec.Right(2)==(":*") || name.Upper().Matches(g_iter_spec) ) + return name ; + } + return wxEmptyString ; } #elif defined(__WXMSW__)