[Python-checkins] python/dist/src/Lib/plat-mac applesingle.py, 1.2, 1.3

jackjansen at users.sourceforge.net jackjansen at users.sourceforge.net
Tue Nov 18 18:09:22 EST 2003


Update of /cvsroot/python/python/dist/src/Lib/plat-mac
In directory sc8-pr-cvs1:/tmp/cvs-serv29399

Modified Files:
	applesingle.py 
Log Message:
Modified version by Bob Ippolito. It passes the just-added test_applesingle
after some minor mods. Fixes #803498, but should NOT be backported because
the original problem seems to be unreproducable.


Index: applesingle.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/applesingle.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** applesingle.py	9 Apr 2003 13:25:42 -0000	1.2
--- applesingle.py	18 Nov 2003 23:09:19 -0000	1.3
***************
*** 1,13 ****
! # applesingle - a module to decode AppleSingle files
  import struct
- import MacOS
  import sys
  
! Error="applesingle.Error"
! 
! verbose=0
  
  # File header format: magic, version, unused, number of entries
! AS_HEADER_FORMAT="ll16sh"
  AS_HEADER_LENGTH=26
  # The flag words for AppleSingle
--- 1,30 ----
! r"""Routines to decode AppleSingle files
! """
  import struct
  import sys
+ try:
+     import MacOS
+     import Carbon.File
+ except:
+     class MacOS:
+         def openrf(path, mode):
+             return open(path + '.rsrc', mode)
+         openrf = classmethod(openrf)
+     class Carbon:
+         class File:
+             class FSSpec:
+                 pass
+             class FSRef:
+                 pass
+             class Alias:
+                 pass
  
! # all of the errors in this module are really errors in the input
! # so I think it should test positive against ValueError.
! class Error(ValueError):
!     pass
  
  # File header format: magic, version, unused, number of entries
! AS_HEADER_FORMAT="LL16sh"
  AS_HEADER_LENGTH=26
  # The flag words for AppleSingle
***************
*** 24,88 ****
  AS_IGNORE=(3,4,5,6,8,9,10,11,12,13,14,15)
  
! def decode(input, output, resonly=0):
!     if type(input) == type(''):
!         input = open(input, 'rb')
!     # Should we also test for FSSpecs or FSRefs?
!     header = input.read(AS_HEADER_LENGTH)
!     try:
!         magic, version, dummy, nentry = struct.unpack(AS_HEADER_FORMAT, header)
!     except ValueError, arg:
!         raise Error, "Unpack header error: %s"%arg
!     if verbose:
!         print 'Magic:   0x%8.8x'%magic
!         print 'Version: 0x%8.8x'%version
!         print 'Entries: %d'%nentry
!     if magic != AS_MAGIC:
!         raise Error, 'Unknown AppleSingle magic number 0x%8.8x'%magic
!     if version != AS_VERSION:
!         raise Error, 'Unknown AppleSingle version number 0x%8.8x'%version
!     if nentry <= 0:
!         raise Error, "AppleSingle file contains no forks"
!     headers = [input.read(AS_ENTRY_LENGTH) for i in range(nentry)]
!     didwork = 0
!     for hdr in headers:
          try:
!             id, offset, length = struct.unpack(AS_ENTRY_FORMAT, hdr)
          except ValueError, arg:
!             raise Error, "Unpack entry error: %s"%arg
          if verbose:
!             print 'Fork %d, offset %d, length %d'%(id, offset, length)
!         input.seek(offset)
!         if length == 0:
!             data = ''
!         else:
!             data = input.read(length)
!         if len(data) != length:
!             raise Error, 'Short read: expected %d bytes got %d'%(length, len(data))
!         if id == AS_DATAFORK:
!             if verbose:
!                 print '  (data fork)'
!             if not resonly:
!                 didwork = 1
!                 fp = open(output, 'wb')
!                 fp.write(data)
!                 fp.close()
!         elif id == AS_RESOURCEFORK:
!             didwork = 1
              if verbose:
!                 print '  (resource fork)'
!             if resonly:
!                 fp = open(output, 'wb')
!             else:
!                 fp = MacOS.openrf(output, 'wb')
!             fp.write(data)
              fp.close()
!         elif id in AS_IGNORE:
!             if verbose:
!                 print '  (ignored)'
          else:
!             raise Error, 'Unknown fork type %d'%id
!     if not didwork:
!         raise Error, 'No useful forks found'
  
  def _test():
      if len(sys.argv) < 3 or sys.argv[1] == '-r' and len(sys.argv) != 4:
--- 41,126 ----
  AS_IGNORE=(3,4,5,6,8,9,10,11,12,13,14,15)
  
! class AppleSingle(object):
!     datafork = None
!     resourcefork = None
! 
!     def __init__(self, fileobj, verbose=False):
!         header = fileobj.read(AS_HEADER_LENGTH)
          try:
!             magic, version, ig, nentry = struct.unpack(AS_HEADER_FORMAT, header)
          except ValueError, arg:
!             raise Error, "Unpack header error: %s" % (arg,)
          if verbose:
!             print 'Magic:   0x%8.8x' % (magic,)
!             print 'Version: 0x%8.8x' % (version,)
!             print 'Entries: %d' % (nentry,)
!         if magic != AS_MAGIC:
!             raise Error, "Unknown AppleSingle magic number 0x%8.8x" % (magic,)
!         if version != AS_VERSION:
!             raise Error, "Unknown AppleSingle version number 0x%8.8x" % (version,)
!         if nentry <= 0:
!             raise Error, "AppleSingle file contains no forks"
!         headers = [fileobj.read(AS_ENTRY_LENGTH) for i in xrange(nentry)]
!         self.forks = []
!         for hdr in headers:
!             try:
!                 restype, offset, length = struct.unpack(AS_ENTRY_FORMAT, hdr)
!             except ValueError, arg:
!                 raise Error, "Unpack entry error: %s" % (arg,)
              if verbose:
!                 print "Fork %d, offset %d, length %d" % (restype, offset, length)
!             fileobj.seek(offset)
!             data = fileobj.read(length)
!             if len(data) != length:
!                 raise Error, "Short read: expected %d bytes got %d" % (length, len(data))
!             self.forks.append((restype, data))
!             if restype == AS_DATAFORK:
!                 self.datafork = data
!             elif restype == AS_RESOURCEFORK:
!                 self.resourcefork = data
!         
!     def tofile(self, path, resonly=False):
!         outfile = open(path, 'wb')
!         data = False
!         if resonly:
!             if self.resourcefork is None:
!                 raise Error, "No resource fork found"
!             fp = open(path, 'wb')
!             fp.write(self.resourcefork)
              fp.close()
!         elif (self.resourcefork is None and self.datafork is None):
!             raise Error, "No useful forks found"
          else:
!             if self.datafork is not None:
!                 fp = open(path, 'wb')
!                 fp.write(self.datafork)
!                 fp.close()
!             if self.resourcefork is not None:
!                 fp = MacOS.openrf(path, '*wb')
!                 fp.write(self.resourcefork)
!                 fp.close()
!     
! def decode(infile, outpath, resonly=False, verbose=False):
!     """decode(infile, outpath [, resonly=False, verbose=False])
! 
!     Creates a decoded file from an AppleSingle encoded file.
!     If resonly is True, then it will create a regular file at 
!     outpath containing only the resource fork from infile.
!     Otherwise it will create an AppleDouble file at outpath
!     with the data and resource forks from infile.  On platforms 
!     without the MacOS module, it will create inpath and inpath+'.rsrc'
!     with the data and resource forks respectively.
! 
!     """
!     if not hasattr(infile, 'read'):
!         if isinstance(infile, Carbon.File.Alias):
!             infile = infile.ResolveAlias()[0]
!         if isinstance(infile, (Carbon.File.FSSpec, Carbon.File.FSRef)):
!             infile = infile.as_pathname()
!         infile = open(infile, 'rb')
  
+     as = AppleSingle(infile, verbose=verbose)
+     as.tofile(outpath, resonly=resonly)
+     
  def _test():
      if len(sys.argv) < 3 or sys.argv[1] == '-r' and len(sys.argv) != 4:
***************
*** 90,100 ****
          sys.exit(1)
      if sys.argv[1] == '-r':
!         resonly = 1
          del sys.argv[1]
      else:
!         resonly = 0
      decode(sys.argv[1], sys.argv[2], resonly=resonly)
      
  if __name__ == '__main__':
      _test()
-     
\ No newline at end of file
--- 128,137 ----
          sys.exit(1)
      if sys.argv[1] == '-r':
!         resonly = True
          del sys.argv[1]
      else:
!         resonly = False
      decode(sys.argv[1], sys.argv[2], resonly=resonly)
      
  if __name__ == '__main__':
      _test()





More information about the Python-checkins mailing list