home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2400 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  3.7 KB  |  133 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __all__ = [
  5.     'unpack_archive',
  6.     'unpack_zipfile',
  7.     'unpack_tarfile',
  8.     'default_filter',
  9.     'UnrecognizedFormat',
  10.     'extraction_drivers',
  11.     'unpack_directory']
  12. import zipfile
  13. import tarfile
  14. import os
  15. import shutil
  16. from pkg_resources import ensure_directory
  17. from distutils.errors import DistutilsError
  18.  
  19. class UnrecognizedFormat(DistutilsError):
  20.     pass
  21.  
  22.  
  23. def default_filter(src, dst):
  24.     return dst
  25.  
  26.  
  27. def unpack_archive(filename, extract_dir, progress_filter = default_filter, drivers = None):
  28.     for driver in extraction_drivers:
  29.         
  30.         try:
  31.             driver(filename, extract_dir, progress_filter)
  32.         except UnrecognizedFormat:
  33.             continue
  34.             continue
  35.  
  36.         return None
  37.     raise UnrecognizedFormat('Not a recognized archive type: %s' % filename)
  38.  
  39.  
  40. def unpack_directory(filename, extract_dir, progress_filter = default_filter):
  41.     if not os.path.isdir(filename):
  42.         raise UnrecognizedFormat('%s is not a directory' % (filename,))
  43.     os.path.isdir(filename)
  44.     paths = {
  45.         filename: ('', extract_dir) }
  46.     for base, dirs, files in os.walk(filename):
  47.         (src, dst) = paths[base]
  48.         for d in dirs:
  49.             paths[os.path.join(base, d)] = (src + d + '/', os.path.join(dst, d))
  50.         
  51.         for f in files:
  52.             name = src + f
  53.             target = os.path.join(dst, f)
  54.             target = progress_filter(src + f, target)
  55.             if not target:
  56.                 continue
  57.             
  58.             ensure_directory(target)
  59.             f = os.path.join(base, f)
  60.             shutil.copyfile(f, target)
  61.             shutil.copystat(f, target)
  62.         
  63.     
  64.  
  65.  
  66. def unpack_zipfile(filename, extract_dir, progress_filter = default_filter):
  67.     if not zipfile.is_zipfile(filename):
  68.         raise UnrecognizedFormat('%s is not a zip file' % (filename,))
  69.     zipfile.is_zipfile(filename)
  70.     z = zipfile.ZipFile(filename)
  71.     
  72.     try:
  73.         for info in z.infolist():
  74.             name = info.filename
  75.             if name.startswith('/') or '..' in name:
  76.                 continue
  77.             
  78.             target = os.path.join(extract_dir, *name.split('/'))
  79.             target = progress_filter(name, target)
  80.             if not target:
  81.                 continue
  82.             
  83.             if name.endswith('/'):
  84.                 ensure_directory(target)
  85.                 continue
  86.             ensure_directory(target)
  87.             data = z.read(info.filename)
  88.             f = open(target, 'wb')
  89.             
  90.             try:
  91.                 f.write(data)
  92.             finally:
  93.                 f.close()
  94.                 del data
  95.  
  96.     finally:
  97.         z.close()
  98.  
  99.  
  100.  
  101. def unpack_tarfile(filename, extract_dir, progress_filter = default_filter):
  102.     
  103.     try:
  104.         tarobj = tarfile.open(filename)
  105.     except tarfile.TarError:
  106.         raise UnrecognizedFormat('%s is not a compressed or uncompressed tar file' % (filename,))
  107.  
  108.     
  109.     try:
  110.         
  111.         tarobj.chown = lambda *args: pass
  112.         for member in tarobj:
  113.             if member.isfile() or member.isdir():
  114.                 name = member.name
  115.                 if not name.startswith('/') and '..' not in name:
  116.                     dst = os.path.join(extract_dir, *name.split('/'))
  117.                     dst = progress_filter(name, dst)
  118.                     if dst:
  119.                         if dst.endswith(os.sep):
  120.                             dst = dst[:-1]
  121.                         
  122.                         tarobj._extract_member(member, dst)
  123.                     
  124.                 
  125.             '..' not in name
  126.         
  127.         return True
  128.     finally:
  129.         tarobj.close()
  130.  
  131.  
  132. extraction_drivers = (unpack_directory, unpack_zipfile, unpack_tarfile)
  133.