From 2d0909b9cb9c4c2ab7cdc331b41044711bcd8a65 Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Wed, 15 Jan 2003 22:36:16 +0000 Subject: [PATCH] Implemented FSCatalogInfo structure support, and used this to implement FSSpec.SetDates() and GetDates(). Closes #662836. --- Lib/plat-mac/macfs.py | 35 ++++++++++++++++++++++++++++----- Mac/Modules/file/_Filemodule.c | 7 +------ Mac/Modules/file/filesupport.py | 7 +------ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/Lib/plat-mac/macfs.py b/Lib/plat-mac/macfs.py index 5822b197e0c..b0132aef0be 100644 --- a/Lib/plat-mac/macfs.py +++ b/Lib/plat-mac/macfs.py @@ -21,6 +21,23 @@ READ = 1 WRITE = 2 smAllScripts = -3 +# +# Find the epoch conversion for file dates in a way that works on OS9 and OSX +import time +if time.gmtime(0)[0] == 1970: + _EPOCHCONVERT = -((1970-1904)*365 + 17) * (24*60*60) + 0x100000000L + def _utc2time(utc): + t = utc[1] + _EPOCHCONVERT + return int(t) + def _time2utc(t): + t = t - _EPOCHCONVERT + if t < -0x7fffffff: + t = t + 0x10000000L + return (0, int(t), 0) +else: + def _utc2time(utc): return utc[1] + def _time2utc(t): return (0, t, 0) + # The old name of the error object: error = Carbon.File.Error @@ -52,12 +69,20 @@ class FSSpec(Carbon.File.FSSpec): return self.FSpSetFInfo(info) def GetDates(self): - import os - statb = os.stat(self.as_pathname()) - return statb.st_ctime, statb.st_mtime, 0 + catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate + catinfo, d1, d2, d3 = FSRef(self).FSGetCatalogInfo(catInfoFlags) + cdate = catinfo.createDate + mdate = catinfo.contentModDate + bdate = catinfo.backupDate + return _utc2time(cdate), _utc2time(mdate), _utc2time(bdate) - def SetDates(self, *dates): - pass # print "FSSpec.SetDates not yet implemented" + def SetDates(self, cdate, mdate, bdate): + catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate + catinfo = Carbon.File.FSCatalogInfo( + createDate = _time2utc(cdate), + contentModDate = _time2utc(mdate), + backupDate = _time2utc(bdate)) + FSRef(self).FSSetCatalogInfo(catInfoFlags, catinfo) class FSRef(Carbon.File.FSRef): def as_fsspec(self): diff --git a/Mac/Modules/file/_Filemodule.c b/Mac/Modules/file/_Filemodule.c index baa379ee788..0e288893557 100644 --- a/Mac/Modules/file/_Filemodule.c +++ b/Mac/Modules/file/_Filemodule.c @@ -370,7 +370,6 @@ static int FSCatalogInfo_tp_init(PyObject *self, PyObject *args, PyObject *kwds) "atributeModDate", "accessDate", "backupDate", - "permissions", "valence", "dataLogicalSize", "dataPhysicalSize", @@ -380,7 +379,7 @@ static int FSCatalogInfo_tp_init(PyObject *self, PyObject *args, PyObject *kwds) "userPrivileges" , 0}; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|HhllO&O&O&O&O&(llll)llllllb", kw, &((FSCatalogInfoObject *)self)->ob_itself.nodeFlags, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|HhllO&O&O&O&O&llllllb", kw, &((FSCatalogInfoObject *)self)->ob_itself.nodeFlags, &((FSCatalogInfoObject *)self)->ob_itself.volume, &((FSCatalogInfoObject *)self)->ob_itself.parentDirID, &((FSCatalogInfoObject *)self)->ob_itself.nodeID, @@ -389,10 +388,6 @@ static int FSCatalogInfo_tp_init(PyObject *self, PyObject *args, PyObject *kwds) UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.attributeModDate, UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.accessDate, UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.backupDate, - &((FSCatalogInfoObject *)self)->ob_itself.permissions[0], - &((FSCatalogInfoObject *)self)->ob_itself.permissions[1], - &((FSCatalogInfoObject *)self)->ob_itself.permissions[2], - &((FSCatalogInfoObject *)self)->ob_itself.permissions[3], &((FSCatalogInfoObject *)self)->ob_itself.valence, &((FSCatalogInfoObject *)self)->ob_itself.dataLogicalSize, &((FSCatalogInfoObject *)self)->ob_itself.dataPhysicalSize, diff --git a/Mac/Modules/file/filesupport.py b/Mac/Modules/file/filesupport.py index b3269e115a3..4f279630244 100644 --- a/Mac/Modules/file/filesupport.py +++ b/Mac/Modules/file/filesupport.py @@ -413,7 +413,7 @@ class FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition): ), ] # The same info, but in a different form - INITFORMAT = "HhllO&O&O&O&O&(llll)llllllb" + INITFORMAT = "HhllO&O&O&O&O&llllllb" INITARGS = """&((FSCatalogInfoObject *)self)->ob_itself.nodeFlags, &((FSCatalogInfoObject *)self)->ob_itself.volume, &((FSCatalogInfoObject *)self)->ob_itself.parentDirID, @@ -423,10 +423,6 @@ class FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition): UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.attributeModDate, UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.accessDate, UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.backupDate, - &((FSCatalogInfoObject *)self)->ob_itself.permissions[0], - &((FSCatalogInfoObject *)self)->ob_itself.permissions[1], - &((FSCatalogInfoObject *)self)->ob_itself.permissions[2], - &((FSCatalogInfoObject *)self)->ob_itself.permissions[3], &((FSCatalogInfoObject *)self)->ob_itself.valence, &((FSCatalogInfoObject *)self)->ob_itself.dataLogicalSize, &((FSCatalogInfoObject *)self)->ob_itself.dataPhysicalSize, @@ -444,7 +440,6 @@ class FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition): "atributeModDate", "accessDate", "backupDate", - "permissions", "valence", "dataLogicalSize", "dataPhysicalSize",