#ifdef __UNIX_LIKE__
#include <sys/types.h>
#include <utime.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+#endif
+
+#ifdef __MWERKS__
+ #include <stat.h>
+ #include <unistd.h>
+ #include <unix.h>
#endif
// ----------------------------------------------------------------------------
// small helper class which opens and closes the file - we use it just to get
// a file handle for the given file name to pass it to some Win32 API function
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
class wxFileHandle
{
// private functions
// ----------------------------------------------------------------------------
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
// convert between wxDateTime and FILETIME which is a 64-bit value representing
// the number of 100-nanosecond intervals since January 1, 1601.
-static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt)
+// the number of milliseconds between the Unix Epoch (January 1, 1970) and the
+// FILETIME reference point (January 1, 1601)
+static const wxLongLong FILETIME_EPOCH_OFFSET = wxLongLong(0xa97, 0x30b66800);
+
+static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft)
{
- // TODO
+ wxLongLong ll(ft.dwHighDateTime, ft.dwLowDateTime);
+
+ // convert 100ns to ms
+ ll /= 10000;
+
+ // move it to our Epoch
+ ll -= FILETIME_EPOCH_OFFSET;
+
+ *dt = wxDateTime(ll);
}
-static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft)
+static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt)
{
- // TODO
+ // do the reverse of ConvertFileTimeToWx()
+ wxLongLong ll = dt.GetValue();
+ ll *= 10000;
+ ll += FILETIME_EPOCH_OFFSET;
+
+ ft->dwHighDateTime = ll.GetHi();
+ ft->dwLowDateTime = ll.GetLo();
}
#endif // __WIN32__
/* static */
bool wxFileName::IsCaseSensitive( wxPathFormat format )
{
- // only DOS filenames are case-sensitive
- return GetFormat(format) != wxPATH_DOS;
+ // only DOS and OpenVMS filenames are case-sensitive
+ return GetFormat(format) != wxPATH_DOS && GetFormat(format) != wxPATH_VMS;
}
bool wxFileName::IsRelative( wxPathFormat format )
case wxPATH_MAC:
seps = wxFILE_SEP_PATH_MAC;
break;
+
+ case wxPATH_VMS:
+ seps = wxFILE_SEP_PATH_VMS;
+ break;
}
return seps;
}
}
else
+ if (format == wxPATH_VMS)
+ {
+ ret += '[';
+ for (size_t i = 0; i < m_dirs.GetCount(); i++)
+ {
+ ret += '.';
+ ret += m_dirs[i];
+ }
+ ret += ']';
+ }
+ else
{
for (size_t i = 0; i < m_dirs.GetCount(); i++)
{
{
#if defined(__WXMSW__) || defined(__WXPM__)
format = wxPATH_DOS;
-#elif defined(__WXMAC__)
+#elif defined(__WXMAC__) && !defined(__DARWIN__)
format = wxPATH_MAC;
+#elif defined(__VMS)
+ format = wxPATH_VMS;
#else
format = wxPATH_UNIX;
#endif
posLastDot = wxString::npos;
}
}
+ else
+ if ( (posLastDot != wxString::npos) && (format == wxPATH_VMS) )
+ {
+ if ( (posLastDot == 0) ||
+ (fullpath[posLastDot - 1] == ']' ) )
+ {
+ // under OpenVMS, dot may be (and commonly is) the first character of
+ // the filename, don't treat the entire filename as extension in
+ // this case
+ posLastDot = wxString::npos;
+ }
+ }
// if we do have a dot and a slash, check that the dot is in the name part
if ( (posLastDot != wxString::npos) &&
const wxDateTime *dtMod)
{
#if defined(__UNIX_LIKE__)
+ if ( !dtAccess && !dtMod )
+ {
+ // can't modify the creation time anyhow, don't try
+ return TRUE;
+ }
+
+ // if dtAccess or dtMod is not specified, use the other one (which must be
+ // non NULL because of the test above) for both times
utimbuf utm;
- utm.actime = dtAccess ? dtAccess : dtAccess->GetTicks();
- utm.modtime = dtMod ? dtMod : dtMod->GetTicks();
+ utm.actime = dtAccess ? dtAccess->GetTicks() : dtMod->GetTicks();
+ utm.modtime = dtMod ? dtMod->GetTicks() : dtAccess->GetTicks();
if ( utime(GetFullPath(), &utm) == 0 )
{
return TRUE;
wxDateTime *dtMod,
wxDateTime *dtChange) const
{
-#if defined(__UNIX_LIKE__)
+#if defined(__UNIX_LIKE__)
+ wxStructStat stBuf;
+ if ( wxStat(GetFullPath(), &stBuf) == 0 )
+ {
+ if ( dtAccess )
+ dtAccess->Set(stBuf.st_atime);
+ if ( dtMod )
+ dtMod->Set(stBuf.st_mtime);
+ if ( dtChange )
+ dtChange->Set(stBuf.st_ctime);
+
+ return TRUE;
+ }
+#elif defined(__WXMAC__)
wxStructStat stBuf;
if ( wxStat(GetFullPath(), &stBuf) == 0 )
{