+ ok = false;
+ }
+ }
+
+ if ( ok )
+ {
+ if ( dtCreate )
+ ConvertFileTimeToWx(dtCreate, ftCreate);
+ if ( dtAccess )
+ ConvertFileTimeToWx(dtAccess, ftAccess);
+ if ( dtMod )
+ ConvertFileTimeToWx(dtMod, ftWrite);
+
+ return true;
+ }
+#elif defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__OS2__) || (defined(__DOS__) && defined(__WATCOMC__))
+ wxStructStat stBuf;
+ if ( wxStat( GetFullPath().c_str(), &stBuf) == 0 )
+ {
+ if ( dtAccess )
+ dtAccess->Set(stBuf.st_atime);
+ if ( dtMod )
+ dtMod->Set(stBuf.st_mtime);
+ if ( dtCreate )
+ dtCreate->Set(stBuf.st_ctime);
+
+ return true;
+ }
+#else // other platform
+ wxUnusedVar(dtAccess);
+ wxUnusedVar(dtMod);
+ wxUnusedVar(dtCreate);
+#endif // platforms
+
+ wxLogSysError(_("Failed to retrieve file times for '%s'"),
+ GetFullPath().c_str());
+
+ return false;
+}
+
+#endif // wxUSE_DATETIME
+
+
+// ----------------------------------------------------------------------------
+// file size functions
+// ----------------------------------------------------------------------------
+
+/* static */
+wxULongLong wxFileName::GetSize(const wxString &filename)
+{
+ if (!wxFileExists(filename))
+ return wxInvalidSize;
+
+#ifdef __WIN32__
+ wxFileHandle f(filename, wxFileHandle::Read);
+ if (!f.IsOk())
+ return wxInvalidSize;
+
+ DWORD lpFileSizeHigh;
+ DWORD ret = GetFileSize(f, &lpFileSizeHigh);
+ if (ret == INVALID_FILE_SIZE)
+ return wxInvalidSize;
+
+ // compose the low-order and high-order byte sizes
+ return wxULongLong(ret | (lpFileSizeHigh << sizeof(WORD)*2));
+
+#else // ! __WIN32__
+
+ wxStructStat st;
+#ifndef wxNEED_WX_UNISTD_H
+ if (wxStat( filename.fn_str() , &st) != 0)
+#else
+ if (wxStat( filename, &st) != 0)
+#endif
+ return wxInvalidSize;
+ return wxULongLong(st.st_size);
+#endif
+}
+
+/* static */
+wxString wxFileName::GetHumanReadableSize(const wxULongLong &bs,
+ const wxString &nullsize,
+ int precision)
+{
+ static const double KILOBYTESIZE = 1024.0;
+ static const double MEGABYTESIZE = 1024.0*KILOBYTESIZE;
+ static const double GIGABYTESIZE = 1024.0*MEGABYTESIZE;
+ static const double TERABYTESIZE = 1024.0*GIGABYTESIZE;
+
+ if (bs == 0 || bs == wxInvalidSize)
+ return nullsize;
+
+ double bytesize = bs.ToDouble();
+ if (bytesize < KILOBYTESIZE)
+ return wxString::Format(_("%s B"), bs.ToString().c_str());
+ if (bytesize < MEGABYTESIZE)
+ return wxString::Format(_("%.*f kB"), precision, bytesize/KILOBYTESIZE);
+ if (bytesize < GIGABYTESIZE)
+ return wxString::Format(_("%.*f MB"), precision, bytesize/MEGABYTESIZE);
+ if (bytesize < TERABYTESIZE)
+ return wxString::Format(_("%.*f GB"), precision, bytesize/GIGABYTESIZE);
+
+ return wxString::Format(_("%.*f TB"), precision, bytesize/TERABYTESIZE);
+}
+
+wxULongLong wxFileName::GetSize() const
+{
+ return GetSize(GetFullPath());
+}
+
+wxString wxFileName::GetHumanReadableSize(const wxString &failmsg, int precision) const
+{
+ return GetHumanReadableSize(GetSize(), failmsg, precision);
+}
+
+
+// ----------------------------------------------------------------------------
+// Mac-specific functions
+// ----------------------------------------------------------------------------
+
+#ifdef __WXMAC__
+
+const short kMacExtensionMaxLength = 16 ;
+class MacDefaultExtensionRecord
+{
+public :
+ MacDefaultExtensionRecord()
+ {
+ m_ext[0] = 0 ;
+ m_type = m_creator = 0 ;
+ }
+ MacDefaultExtensionRecord( const MacDefaultExtensionRecord& from )
+ {
+ wxStrcpy( m_ext , from.m_ext ) ;
+ m_type = from.m_type ;
+ m_creator = from.m_creator ;
+ }
+ MacDefaultExtensionRecord( const wxChar * extension , OSType type , OSType creator )
+ {
+ wxStrncpy( m_ext , extension , kMacExtensionMaxLength ) ;
+ m_ext[kMacExtensionMaxLength] = 0 ;
+ m_type = type ;
+ m_creator = creator ;
+ }
+ wxChar m_ext[kMacExtensionMaxLength] ;
+ OSType m_type ;
+ OSType m_creator ;
+} ;
+
+WX_DECLARE_OBJARRAY(MacDefaultExtensionRecord, MacDefaultExtensionArray) ;
+
+bool gMacDefaultExtensionsInited = false ;
+
+#include "wx/arrimpl.cpp"
+
+WX_DEFINE_EXPORTED_OBJARRAY(MacDefaultExtensionArray) ;
+
+MacDefaultExtensionArray gMacDefaultExtensions ;
+
+// load the default extensions
+MacDefaultExtensionRecord gDefaults[] =
+{
+ MacDefaultExtensionRecord( wxT("txt") , 'TEXT' , 'ttxt' ) ,
+ MacDefaultExtensionRecord( wxT("tif") , 'TIFF' , '****' ) ,
+ MacDefaultExtensionRecord( wxT("jpg") , 'JPEG' , '****' ) ,
+} ;
+
+static void MacEnsureDefaultExtensionsLoaded()
+{
+ if ( !gMacDefaultExtensionsInited )
+ {
+ // we could load the pc exchange prefs here too
+ for ( size_t i = 0 ; i < WXSIZEOF( gDefaults ) ; ++i )
+ {
+ gMacDefaultExtensions.Add( gDefaults[i] ) ;
+ }
+ gMacDefaultExtensionsInited = true ;
+ }
+}
+
+bool wxFileName::MacSetTypeAndCreator( wxUint32 type , wxUint32 creator )
+{
+ FSRef fsRef ;
+ FSCatalogInfo catInfo;
+ FileInfo *finfo ;
+
+ if ( wxMacPathToFSRef( GetFullPath() , &fsRef ) == noErr )
+ {
+ if ( FSGetCatalogInfo (&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL) == noErr )
+ {
+ finfo = (FileInfo*)&catInfo.finderInfo;
+ finfo->fileType = type ;
+ finfo->fileCreator = creator ;
+ FSSetCatalogInfo( &fsRef, kFSCatInfoFinderInfo, &catInfo ) ;
+ return true ;
+ }
+ }
+ return false ;
+}
+
+bool wxFileName::MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator )
+{
+ FSRef fsRef ;
+ FSCatalogInfo catInfo;
+ FileInfo *finfo ;
+
+ if ( wxMacPathToFSRef( GetFullPath() , &fsRef ) == noErr )
+ {
+ if ( FSGetCatalogInfo (&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL) == noErr )
+ {
+ finfo = (FileInfo*)&catInfo.finderInfo;
+ *type = finfo->fileType ;
+ *creator = finfo->fileCreator ;
+ return true ;