X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0316942268a5004c3d639fa1cd7df4ea42257dbd..ef8f37e0dbfdd5b3eac3bce7ad13347c8ed450ef:/src/common/filename.cpp diff --git a/src/common/filename.cpp b/src/common/filename.cpp index aae38ea3ef..99832bf995 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -90,6 +90,10 @@ #include "wx/msw/winundef.h" #endif +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + // utime() is POSIX so should normally be available on all Unices #ifdef __UNIX_LIKE__ #include @@ -98,6 +102,10 @@ #include #endif +#ifdef __DJGPP__ +#include +#endif + #ifdef __MWERKS__ #include #include @@ -231,6 +239,15 @@ void wxFileName::Assign(const wxString& volume, const wxString& name, const wxString& ext, wxPathFormat format ) +{ + SetPath( path, format ); + + m_volume = volume; + m_ext = ext; + m_name = name; +} + +void wxFileName::SetPath( const wxString &path, wxPathFormat format ) { wxPathFormat my_format = GetFormat( format ); wxString my_path = path; @@ -297,10 +314,10 @@ void wxFileName::Assign(const wxString& volume, } } } - - m_volume = volume; - m_ext = ext; - m_name = name; + else + { + m_relative = TRUE; + } } void wxFileName::Assign(const wxString& fullpath, @@ -342,7 +359,7 @@ void wxFileName::Assign(const wxString& fullpathOrig, _T("the path shouldn't contain file name nor extension") ); #else // !__WXDEBUG__ - SplitPath(fullname, NULL /* no path */, &name, &ext, format); + SplitPath(fullname, NULL /* no path */, &name, &ext, format); SplitPath(fullpath, &volume, &path, NULL, NULL, format); #endif // __WXDEBUG__/!__WXDEBUG__ @@ -524,8 +541,11 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) #else // !Windows, !OS/2 if ( dir.empty() ) { +#if defined(__WXMAC__) && !defined(__DARWIN__) + dir = wxMacFindFolder( (short) kOnSystemDisk, kTemporaryFolderType, kCreateFolder ) ; +#else // !Mac dir = wxGetenv(_T("TMP")); - if ( path.empty() ) + if ( dir.empty() ) { dir = wxGetenv(_T("TEMP")); } @@ -534,11 +554,12 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) { // default #ifdef __DOS__ - dir = _T("."); + dir = _T("."); #else - dir = _T("/tmp"); + dir = _T("/tmp"); #endif } +#endif // Mac/!Mac } path = dir; @@ -711,7 +732,7 @@ bool wxFileName::Rmdir( const wxString &dir ) // path normalization // ---------------------------------------------------------------------------- -bool wxFileName::Normalize(wxPathNormalize flags, +bool wxFileName::Normalize(int flags, const wxString& cwd, wxPathFormat format) { @@ -1022,8 +1043,10 @@ wxString wxFileName::GetFullName() const return fullname; } -wxString wxFileName::GetPath( bool add_separator, wxPathFormat format ) const +wxString wxFileName::GetPath( bool, wxPathFormat format ) const { + // Should add_seperator parameter be used? + format = GetFormat( format ); wxString fullpath; @@ -1252,19 +1275,17 @@ wxString wxFileName::GetLongPath() const if ( !s_triedToLoad ) { s_triedToLoad = TRUE; - wxDllType dllKernel = wxDllLoader::LoadLibrary(_T("kernel32")); - if ( dllKernel ) + wxDynamicLibrary dllKernel(_T("kernel32")); + if ( dllKernel.IsLoaded() ) { // may succeed or fail depending on the Windows version static GET_LONG_PATH_NAME s_pfnGetLongPathName = NULL; #ifdef _UNICODE - s_pfnGetLongPathName = (GET_LONG_PATH_NAME) wxDllLoader::GetSymbol(dllKernel, _T("GetLongPathNameW")); + s_pfnGetLongPathName = (GET_LONG_PATH_NAME) dllKernel.GetSymbol(_T("GetLongPathNameW")); #else - s_pfnGetLongPathName = (GET_LONG_PATH_NAME) wxDllLoader::GetSymbol(dllKernel, _T("GetLongPathNameA")); + s_pfnGetLongPathName = (GET_LONG_PATH_NAME) dllKernel.GetSymbol(_T("GetLongPathNameA")); #endif - wxDllLoader::UnloadLibrary(dllKernel); - if ( s_pfnGetLongPathName ) { DWORD dwSize = (*s_pfnGetLongPathName)(path, NULL, 0); @@ -1465,7 +1486,10 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume, // the path equal to something like '/', not empty, for the files // immediately under root directory size_t len = posLastSlash; - if ( !len ) + + // this rule does not apply to mac since we do not start with colons (sep) + // except for relative paths + if ( !len && format != wxPATH_MAC) len++; *pstrPath = fullpath.Left(len); @@ -1653,3 +1677,104 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, return FALSE; } +#ifdef __WXMAC__ + +const short kMacExtensionMaxLength = 16 ; +typedef struct +{ + char m_ext[kMacExtensionMaxLength] ; + OSType m_type ; + OSType m_creator ; +} MacDefaultExtensionRecord ; + +#include "wx/dynarray.h" +WX_DECLARE_OBJARRAY(MacDefaultExtensionRecord, MacDefaultExtensionArray) ; +#include "wx/arrimpl.cpp" +WX_DEFINE_OBJARRAY(MacDefaultExtensionArray) ; + +MacDefaultExtensionArray gMacDefaultExtensions ; +bool gMacDefaultExtensionsInited = false ; + +static void MacEnsureDefaultExtensionsLoaded() +{ + if ( !gMacDefaultExtensionsInited ) + { + // load the default extensions + MacDefaultExtensionRecord defaults[] = + { + { "txt" , 'TEXT' , 'ttxt' } , + + } ; + // we could load the pc exchange prefs here too + + for ( int i = 0 ; i < WXSIZEOF( defaults ) ; ++i ) + { + gMacDefaultExtensions.Add( defaults[i] ) ; + } + gMacDefaultExtensionsInited = true ; + } +} +bool wxFileName::MacSetTypeAndCreator( wxUint32 type , wxUint32 creator ) +{ + FInfo fndrInfo ; + FSSpec spec ; + wxMacFilename2FSSpec(GetFullPath(),&spec) ; + OSErr err = FSpGetFInfo( &spec , &fndrInfo ) ; + wxCHECK( err == noErr , false ) ; + + fndrInfo.fdType = type ; + fndrInfo.fdCreator = creator ; + FSpSetFInfo( &spec , &fndrInfo ) ; + return true ; +} + +bool wxFileName::MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator ) +{ + FInfo fndrInfo ; + FSSpec spec ; + wxMacFilename2FSSpec(GetFullPath(),&spec) ; + OSErr err = FSpGetFInfo( &spec , &fndrInfo ) ; + wxCHECK( err == noErr , false ) ; + + *type = fndrInfo.fdType ; + *creator = fndrInfo.fdCreator ; + return true ; +} + +bool wxFileName::MacSetDefaultTypeAndCreator() +{ + wxUint32 type , creator ; + if ( wxFileName::MacFindDefaultTypeAndCreator(GetExt() , &type , + &creator ) ) + { + return MacSetTypeAndCreator( type , creator ) ; + } + return false; +} + +bool wxFileName::MacFindDefaultTypeAndCreator( const wxString& ext , wxUint32 *type , wxUint32 *creator ) +{ + MacEnsureDefaultExtensionsLoaded() ; + wxString extl = ext.Lower() ; + for( int i = gMacDefaultExtensions.Count() - 1 ; i >= 0 ; --i ) + { + if ( gMacDefaultExtensions.Item(i).m_ext == extl ) + { + *type = gMacDefaultExtensions.Item(i).m_type ; + *creator = gMacDefaultExtensions.Item(i).m_creator ; + return true ; + } + } + return false ; +} + +void wxFileName::MacRegisterDefaultTypeAndCreator( const wxString& ext , wxUint32 type , wxUint32 creator ) +{ + MacEnsureDefaultExtensionsLoaded() ; + MacDefaultExtensionRecord rec ; + rec.m_type = type ; + rec.m_creator = creator ; + strncpy( rec.m_ext , ext.Lower().c_str() , kMacExtensionMaxLength ) ; + gMacDefaultExtensions.Add( rec ) ; +} +#endif