diff --git a/mozilla/modules/libjar/nsJAR.cpp b/mozilla/modules/libjar/nsJAR.cpp index 8467b66d304..d3dd2871a7a 100644 --- a/mozilla/modules/libjar/nsJAR.cpp +++ b/mozilla/modules/libjar/nsJAR.cpp @@ -798,7 +798,8 @@ nsJAR::RestoreModTime(nsZipItem *aItem, nsIFile *aExtractedFile) if (timestr) { if (PR_SUCCESS == PR_ParseTimeString(timestr, PR_FALSE, &prtime)) - rv = aExtractedFile->SetLastModificationDate(prtime); + // nsIFile needs usecs. + rv = aExtractedFile->SetLastModificationDate(prtime / PR_USEC_PER_MSEC); JAR_NULLFREE(timestr); } diff --git a/mozilla/xpcom/io/nsIFile.idl b/mozilla/xpcom/io/nsIFile.idl index 2d851780482..23683b305f3 100644 --- a/mozilla/xpcom/io/nsIFile.idl +++ b/mozilla/xpcom/io/nsIFile.idl @@ -173,6 +173,11 @@ interface nsIFile : nsISupports attribute unsigned long permissions; attribute unsigned long permissionsOfLink; + /** + * File Times are to be in Milliseconds (usecs) from + * midnight (00:00:00), January 1, 1970 Greenwich Mean + * Time (GMT). + */ attribute PRInt64 lastModificationDate; attribute PRInt64 lastModificationDateOfLink; diff --git a/mozilla/xpcom/io/nsLocalFileMac.cpp b/mozilla/xpcom/io/nsLocalFileMac.cpp index aba6cd700ba..003d4325970 100644 --- a/mozilla/xpcom/io/nsLocalFileMac.cpp +++ b/mozilla/xpcom/io/nsLocalFileMac.cpp @@ -374,29 +374,29 @@ static void MacintoshInitializeTime(void) gJanuaryFirst1970Seconds = 2082844800 + GMTDelta(); } -static nsresult ConvertMacTimeToUnixTime( PRInt64* aLastModificationDate, PRInt32 timestamp ) +static nsresult ConvertMacTimeToMilliseconds( PRInt64* aLastModificationDate, PRInt32 timestamp ) { if ( gJanuaryFirst1970Seconds == 0) MacintoshInitializeTime(); timestamp -= gJanuaryFirst1970Seconds; - PRTime oneMillion, dateInMicroSeconds; + PRTime usecPerSec, dateInMicroSeconds; LL_I2L(dateInMicroSeconds, timestamp); - LL_I2L(oneMillion, 1000000UL); - LL_MUL(*aLastModificationDate, oneMillion, dateInMicroSeconds); + LL_I2L(usecPerSec, PR_USEC_PER_SEC); + LL_MUL(*aLastModificationDate, usecPerSec, dateInMicroSeconds); return NS_OK; } -static nsresult ConvertUnixTimeToMacTime(PRInt64 aUnixTime, PRUint32 *aOutMacTime) +static nsresult ConvertMillisecondsToMacTime(PRInt64 aTime, PRUint32 *aOutMacTime) { NS_ENSURE_ARG( aOutMacTime ); - PRTime oneMillion, dateInSeconds; + PRTime usecPerSec, dateInSeconds; dateInSeconds = LL_ZERO; - LL_I2L(oneMillion, 1000000UL); - LL_DIV(dateInSeconds, aUnixTime, oneMillion); // dateInSeconds = aUnixTime/1,000,000 + LL_I2L(usecPerSec, PR_USEC_PER_SEC); + LL_DIV(dateInSeconds, aTime, usecPerSec); // dateInSeconds = aTime/1,000 LL_L2UI(*aOutMacTime, dateInSeconds); - *aOutMacTime += 2082844800; // dateInSeconds + Mac epoch + *aOutMacTime += 2082844800; // date + Mac epoch return NS_OK; } diff --git a/mozilla/xpcom/io/nsLocalFileUnix.cpp b/mozilla/xpcom/io/nsLocalFileUnix.cpp index c4512e8e3df..c5a0b06d1c4 100644 --- a/mozilla/xpcom/io/nsLocalFileUnix.cpp +++ b/mozilla/xpcom/io/nsLocalFileUnix.cpp @@ -827,7 +827,8 @@ nsLocalFile::GetLastModificationDate(PRInt64 *aLastModificationDate) return NSRESULT_FOR_ERRNO(); } // PRTime is a 64 bit value - *aLastModificationDate = info.modifyTime; + // microseconds -> milliseconds + *aLastModificationDate = info.modifyTime / PR_USEC_PER_MSEC; return NS_OK; } @@ -843,7 +844,7 @@ nsLocalFile::SetLastModificationDate(PRInt64 aLastModificationDate) // convert PRTime microsecs to unix seconds since the epoch double dTime; LL_L2D(dTime, aLastModificationDate); - ut.modtime = (time_t)( (PRUint32)(dTime * 1e-6 + 0.5) ); + ut.modtime = (time_t)( (PRUint32)(dTime / PR_MSEC_PER_SEC) ); result = utime(mPath, &ut); } else { result = utime(mPath, NULL); @@ -860,6 +861,10 @@ nsLocalFile::GetLastModificationDateOfLink(PRInt64 *aLastModificationDateOfLink) if (lstat(mPath, &sbuf) == -1) return NSRESULT_FOR_ERRNO(); mLL_II2L(0, (PRUint32)sbuf.st_mtime, *aLastModificationDateOfLink); + + // lstat returns st_mtime in seconds! + *aLastModificationDate *= PR_MSEC_PER_SEC; + return NS_OK; } diff --git a/mozilla/xpcom/io/nsLocalFileWin.cpp b/mozilla/xpcom/io/nsLocalFileWin.cpp index 38460e6a644..358cf6ddc74 100644 --- a/mozilla/xpcom/io/nsLocalFileWin.cpp +++ b/mozilla/xpcom/io/nsLocalFileWin.cpp @@ -1175,7 +1175,8 @@ nsLocalFile::GetLastModificationDate(PRInt64 *aLastModificationDate) if (NS_FAILED(rv)) return rv; - *aLastModificationDate = mFileInfo64.modifyTime; + // microseconds -> milliseconds + *aLastModificationDate = mFileInfo64.modifyTime / PR_USEC_PER_MSEC; return NS_OK; } @@ -1192,7 +1193,9 @@ nsLocalFile::GetLastModificationDateOfLink(PRInt64 *aLastModificationDate) if (NS_FAILED(rv)) return rv; - *aLastModificationDate = mFileInfo64.modifyTime; + // microseconds -> milliseconds + *aLastModificationDate = mFileInfo64.modifyTime / PR_USEC_PER_MSEC; + return NS_OK; } @@ -1238,8 +1241,9 @@ nsLocalFile::SetModDate(PRInt64 aLastModificationDate, PRBool resolveTerminal) FILETIME lft, ft; SYSTEMTIME st; PRExplodedTime pret; - - PR_ExplodeTime(aLastModificationDate, PR_LocalTimeParameters, &pret); + + // PR_ExplodeTime expects usecs... + PR_ExplodeTime(aLastModificationDate * PR_USEC_PER_MSEC, PR_LocalTimeParameters, &pret); st.wYear = pret.tm_year; st.wMonth = pret.tm_month + 1; // Convert start offset -- Win32: Jan=1; NSPR: Jan=0 st.wDayOfWeek = pret.tm_wday;