FSRef transition

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28878 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2004-08-24 19:39:50 +00:00
parent f81f59012d
commit a2b772607a
14 changed files with 303 additions and 855 deletions

View File

@@ -164,14 +164,7 @@
#endif
#ifdef __WXMAC__
# ifdef __DARWIN__
# include "MoreFilesX.h"
# else
# include "MoreFiles.h"
# include "MoreFilesExtras.h"
# include "FullPath.h"
# include "FSpCompat.h"
# endif
#endif
// ----------------------------------------------------------------------------
@@ -915,220 +908,72 @@ wxString wxPathOnly (const wxString& path)
// Also, convert to lower case, since case is significant in UNIX.
#if defined(__WXMAC__)
wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
#if TARGET_API_MAC_OSX
#define kDefaultPathStyle kCFURLPOSIXPathStyle
#else
#define kDefaultPathStyle kCFURLHFSPathStyle
#endif
wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent )
{
#ifdef __DARWIN__
int i;
int j;
OSErr theErr;
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, fsRef);
if ( additionalPathComponent )
{
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());
CFURLRef parentURLRef = fullURLRef ;
fullURLRef = CFURLCreateCopyAppendingPathComponent(NULL, parentURLRef,
additionalPathComponent,false);
CFRelease( parentURLRef ) ;
}
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 , wxConvLocal) ;
#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] == ':'))
(*myPath)[length-1] = 0 ;
// create path string for return value
wxString result( *myPath , wxConvLocal) ;
// free allocated handle
::HUnlock( myPath ) ;
::DisposeHandle( myPath ) ;
#endif
return result ;
CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, kDefaultPathStyle);
CFRelease( fullURLRef ) ;
return wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding());
}
#ifndef __DARWIN__
// Mac file names are POSIX (Unix style) under Darwin
// therefore the conversion functions below are not needed
static wxChar sMacFileNameConversion[ 1000 ] ;
static char scMacFileNameConversion[ 1000 ] ;
#endif
void wxMacFilename2FSSpec( const char *path , FSSpec *spec )
OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef )
{
OSStatus err = noErr ;
#ifdef __DARWIN__
FSRef theRef;
// get the FSRef associated with the POSIX path
err = FSPathMakeRef((const UInt8 *) path, &theRef, NULL);
// convert the FSRef to an FSSpec
err = FSGetCatalogInfo(&theRef, kFSCatInfoNone, NULL, NULL, spec, NULL);
#else
if ( strchr( path , ':' ) == NULL )
{
// try whether it is a volume / or a mounted volume
strncpy( scMacFileNameConversion , path , 1000 ) ;
scMacFileNameConversion[998] = 0 ;
strcat( scMacFileNameConversion , ":" ) ;
err = FSpLocationFromFullPath( strlen(scMacFileNameConversion) , scMacFileNameConversion , spec ) ;
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, wxMacCFStringHolder(path ,wxLocale::GetSystemEncoding() ) , kDefaultPathStyle, false);
if ( NULL != url )
{
if ( CFURLGetFSRef(url, fsRef) == false )
err = fnfErr ;
CFRelease( url ) ;
}
else
{
err = FSpLocationFromFullPath( strlen(path) , path , spec ) ;
err = fnfErr ;
}
#endif
return err ;
}
#if wxUSE_UNICODE
WXDLLEXPORT void wxMacFilename2FSSpec( const wxChar *path , FSSpec *spec )
wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname )
{
return wxMacFilename2FSSpec( wxConvFile.cWC2MB(path) , spec ) ;
CFStringRef cfname = CFStringCreateWithCharacters( kCFAllocatorDefault,
uniname->unicode,
uniname->length );
return wxMacCFStringHolder(cfname).AsString() ;
}
#endif
#ifndef __DARWIN__
wxString wxMac2UnixFilename (const wxChar *str)
wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
{
wxChar *s = sMacFileNameConversion ;
wxStrcpy( s , str ) ;
if (s)
FSRef fsRef ;
if ( FSpMakeFSRef( spec , &fsRef) == noErr )
{
memmove( s+1 , s ,wxStrlen( s ) + 1 * sizeof(wxChar)) ;
if ( *s == ':' )
*s = '.' ;
else
*s = '/' ;
while (*s)
{
if (*s == ':')
*s = '/';
else
*s = wxTolower(*s); // Case INDEPENDENT
s++;
}
return wxMacFSRefToPath( &fsRef ) ;
}
return wxString(sMacFileNameConversion) ;
return wxEmptyString ;
}
wxString wxUnix2MacFilename (const wxChar *str)
void wxMacFilename2FSSpec( const wxString& path , FSSpec *spec )
{
wxChar *s = sMacFileNameConversion ;
wxStrcpy( s , str ) ;
if (s)
{
if ( *s == '.' )
{
// relative path , since it goes on with slash which is translated to a :
memmove( s , s+1 ,wxStrlen( s ) * sizeof(wxChar)) ;
}
else if ( *s == '/' )
{
// absolute path -> on mac just start with the drive name
memmove( s , s+1 ,wxStrlen( s ) * sizeof(wxChar) ) ;
}
else
{
wxASSERT_MSG( 1 , wxT("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 ,(wxStrlen( s+3 ) + 1)*sizeof(wxChar) ) ;
}
else
*s = ':';
}
s++ ;
}
}
return wxString(sMacFileNameConversion) ;
OSStatus err = noErr ;
FSRef fsRef ;
wxMacPathToFSRef( path , &fsRef ) ;
err = FSRefMakeFSSpec( &fsRef , spec ) ;
}
wxString wxMacFSSpec2UnixFilename( const FSSpec *spec )
{
return wxMac2UnixFilename( wxMacFSSpec2MacFilename( spec) ) ;
}
void wxUnixFilename2FSSpec( const wxChar *path , FSSpec *spec )
{
wxString var = wxUnix2MacFilename( path ) ;
wxMacFilename2FSSpec( var , spec ) ;
}
#endif // ! __DARWIN__
#endif // __WXMAC__
void
@@ -1577,28 +1422,15 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
#if defined(_MSC_VER) || defined(__MINGW32__)
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 )
char lbuf[1024] ;
if ( getcwd( lbuf , sizeof( lbuf ) ) )
{
cwdSpec.vRefNum = pb.ioFCBVRefNum;
cwdSpec.parID = pb.ioFCBParID;
cwdSpec.name[0] = 0 ;
wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ;
wxStrcpy( buf , res ) ;
wxString res( lbuf , *wxConvCurrent ) ;
wxStrcpy( buf , res ) ;
ok = true;
}
else
{
ok = false;
}
ok = false ;
#elif defined(__OS2__)
APIRET rc;
ULONG ulDriveNum = 0;