home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- GLOBAL_HEADER = '!<arch>\n'
- GLOBAL_HEADER_LENGTH = len(GLOBAL_HEADER)
- FILE_HEADER_LENGTH = 60
- FILE_MAGIC = '`\n'
-
- class ArError(Exception):
- pass
-
-
- class ArFile(object):
- ''' Representation of an ar archive, see man 1 ar.
-
- The interface of this class tries to mimick that of the TarFile module in
- the standard library.
-
- ArFile objects have the following (read-only) properties:
- - members same as getmembers()
- '''
-
- def __init__(self, filename = None, mode = 'r', fileobj = None):
- """ Build an ar file representation starting from either a filename or
- an existing file object. The only supported mode is 'r' """
- self._ArFile__members = []
- self._ArFile__members_dict = { }
- self._ArFile__fname = filename
- self._ArFile__fileobj = fileobj
- if mode == 'r':
- self._ArFile__indexArchive()
-
-
-
- def __indexArchive(self):
- if self._ArFile__fname:
- fp = open(self._ArFile__fname, 'rb')
- elif self._ArFile__fileobj:
- fp = self._ArFile__fileobj
- else:
- raise ArError, 'Unable to open valid file'
- if self._ArFile__fname.read(GLOBAL_HEADER_LENGTH) != GLOBAL_HEADER:
- raise ArError, 'Unable to find global header'
- self._ArFile__fname.read(GLOBAL_HEADER_LENGTH) != GLOBAL_HEADER
- while True:
- newmember = ArMember.from_file(fp, self._ArFile__fname)
- if not newmember:
- break
-
- self._ArFile__members.append(newmember)
- self._ArFile__members_dict[newmember.name] = newmember
- if newmember.size % 2 == 0:
- fp.seek(newmember.size, 1)
- continue
- fp.seek(newmember.size + 1, 1)
- if self._ArFile__fname:
- fp.close()
-
-
-
- def getmember(self, name):
- """ Return the (last occurrence of a) member in the archive whose name
- is 'name'. Raise KeyError if no member matches the given name.
-
- Note that in case of name collisions the only way to retrieve all
- members matching a given name is to use getmembers. """
- return self._ArFile__members_dict[name]
-
-
- def getmembers(self):
- ''' Return a list of all members contained in the archive.
-
- The list has the same order of members in the archive and can contain
- duplicate members (i.e. members with the same name) if they are
- duplicate in the archive itself. '''
- return self._ArFile__members
-
- members = property(getmembers)
-
- def getnames(self):
- ''' Return a list of all member names in the archive. '''
- return map((lambda f: f.name), self._ArFile__members)
-
-
- def extractall():
- ''' Not (yet) implemented. '''
- raise NotImpelementedError
-
-
- def extract(self, member, path):
- ''' Not (yet) implemented. '''
- raise NotImpelementedError
-
-
- def extractfile(self, member):
- ''' Return a file object corresponding to the requested member. A member
- can be specified either as a string (its name) or as a ArMember
- instance. '''
- for m in self._ArFile__members:
- if isinstance(member, ArMember) and m.name == member.name:
- return m
- if member == m.name:
- return m
- return None
-
-
-
- def __iter__(self):
- ''' Iterate over the members of the present ar archive. '''
- return iter(self._ArFile__members)
-
-
- def __getitem__(self, name):
- ''' Same as .getmember(name). '''
- return self.getmember(name)
-
-
-
- class ArMember(object):
- ''' Member of an ar archive.
-
- Implements most of a file object interface: read, readline, next,
- readlines, seek, tell, close.
-
- ArMember objects have the following (read-only) properties:
- - name member name in an ar archive
- - mtime modification time
- - owner owner user
- - group owner group
- - fmode file permissions
- - size size in bytes
- - fname file name'''
-
- def __init__(self):
- self._ArMember__name = None
- self._ArMember__mtime = None
- self._ArMember__owner = None
- self._ArMember__group = None
- self._ArMember__fmode = None
- self._ArMember__size = None
- self._ArMember__fname = None
- self._ArMember__fp = None
- self._ArMember__offset = None
- self._ArMember__end = None
-
-
- def from_file(fp, fname):
- '''fp is an open File object positioned on a valid file header inside
- an ar archive. Return a new ArMember on success, None otherwise. '''
- buf = fp.read(FILE_HEADER_LENGTH)
- if not buf:
- return None
- if len(buf) < FILE_HEADER_LENGTH:
- raise IOError, 'Incorrect header length'
- len(buf) < FILE_HEADER_LENGTH
- if buf[58:60] != FILE_MAGIC:
- raise IOError, 'Incorrect file magic'
- buf[58:60] != FILE_MAGIC
- f = ArMember()
- f._ArMember__name = buf[0:16].split('/')[0].strip()
- f._ArMember__mtime = int(buf[16:28])
- f._ArMember__owner = int(buf[28:34])
- f._ArMember__group = int(buf[34:40])
- f._ArMember__fmode = buf[40:48]
- f._ArMember__size = int(buf[48:58])
- f._ArMember__fname = fname
- f._ArMember__offset = fp.tell()
- f._ArMember__end = f._ArMember__offset + f._ArMember__size
- return f
-
- from_file = staticmethod(from_file)
-
- def read(self, size = 0):
- if self._ArMember__fp is None:
- self._ArMember__fp = open(self._ArMember__fname, 'r')
- self._ArMember__fp.seek(self._ArMember__offset)
-
- cur = self._ArMember__fp.tell()
- if size > 0 and size <= self._ArMember__end - cur:
- return self._ArMember__fp.read(size)
- if cur >= self._ArMember__end or cur < self._ArMember__offset:
- return ''
- return self._ArMember__fp.read(self._ArMember__end - cur)
-
-
- def readline(self, size = None):
- if self._ArMember__fp is None:
- self._ArMember__fp = open(self._ArMember__fname, 'r')
- self._ArMember__fp.seek(self._ArMember__offset)
-
- if size is not None:
- buf = self._ArMember__fp.readline(size)
- if self._ArMember__fp.tell() > self._ArMember__end:
- return ''
- return buf
- buf = self._ArMember__fp.readline()
- if self._ArMember__fp.tell() > self._ArMember__end:
- return ''
- return buf
-
-
- def readlines(self, sizehint = 0):
- if self._ArMember__fp is None:
- self._ArMember__fp = open(self._ArMember__fname, 'r')
- self._ArMember__fp.seek(self._ArMember__offset)
-
- buf = None
- lines = []
- while True:
- buf = self.readline()
- if not buf:
- break
-
- lines.append(buf)
- return lines
-
-
- def seek(self, offset, whence = 0):
- if self._ArMember__fp is None:
- self._ArMember__fp = open(self._ArMember__fname, 'r')
- self._ArMember__fp.seek(self._ArMember__offset)
-
- if self._ArMember__fp.tell() < self._ArMember__offset:
- self._ArMember__fp.seek(self._ArMember__offset)
-
- if whence < 2 and offset + self._ArMember__fp.tell() < self._ArMember__offset:
- raise IOError, "Can't seek at %d" % offset
- offset + self._ArMember__fp.tell() < self._ArMember__offset
- if whence == 1:
- self._ArMember__fp.seek(offset, 1)
- elif whence == 0:
- self._ArMember__fp.seek(self._ArMember__offset + offset, 0)
- elif whence == 2:
- self._ArMember__fp.seek(self._ArMember__end + offset, 0)
-
-
-
- def tell(self):
- if self._ArMember__fp is None:
- self._ArMember__fp = open(self._ArMember__fname, 'r')
- self._ArMember__fp.seek(self._ArMember__offset)
-
- cur = self._ArMember__fp.tell()
- if cur < self._ArMember__offset:
- return 0x0L
- return cur - self._ArMember__offset
-
-
- def close(self):
- if self._ArMember__fp is not None:
- self._ArMember__fp.close()
-
-
-
- def next(self):
- return self.readline()
-
-
- def __iter__(self):
-
- def nextline():
- line = self.readline()
- if line:
- yield line
-
-
- return iter(nextline())
-
- name = property((lambda self: self._ArMember__name))
- mtime = property((lambda self: self._ArMember__mtime))
- owner = property((lambda self: self._ArMember__owner))
- group = property((lambda self: self._ArMember__group))
- fmode = property((lambda self: self._ArMember__fmode))
- size = property((lambda self: self._ArMember__size))
- fname = property((lambda self: self._ArMember__fname))
-
- if __name__ == '__main__':
- a = ArFile('test.ar')
- print '\n'.join(a.getnames())
-
-