diff --git a/unrar/rarfile.py b/unrar/rarfile.py index d95f6f8..0d30683 100644 --- a/unrar/rarfile.py +++ b/unrar/rarfile.py @@ -270,7 +270,7 @@ def testrar(self): self._close(handle) return error - def extract(self, member, path=None, pwd=None): + def extract(self, member, path=None, pwd=None, callback=None): """Extract a member from the archive to the current working directory, using its full name. Its file information is extracted as accurately as possible. `member' may be a filename or a RarInfo object. You can @@ -282,10 +282,10 @@ def extract(self, member, path=None, pwd=None): if path is None: path = os.getcwd() - self._extract_members([member], path, pwd) + self._extract_members([member], path, pwd, callback) return os.path.join(path, member) - def extractall(self, path=None, members=None, pwd=None): + def extractall(self, path=None, members=None, pwd=None, callback=None): """Extract all members from the archive to the current working directory. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned @@ -293,9 +293,9 @@ def extractall(self, path=None, members=None, pwd=None): """ if members is None: members = self.namelist() - self._extract_members(members, path, pwd) + self._extract_members(members, path, pwd, callback) - def _extract_members(self, members, targetpath, pwd): + def _extract_members(self, members, targetpath, pwd, callback): """Extract the RarInfo objects 'members' to a physical file on the path targetpath. """ @@ -303,6 +303,10 @@ def _extract_members(self, members, targetpath, pwd): self.filename, mode=constants.RAR_OM_EXTRACT) handle = self._open(archive) + if callback is not None: + c_callback = unrarlib.UNRARCALLBACK(callback) + unrarlib.RARSetCallback(handle, c_callback, 0) + password = pwd or self.pwd if password is not None: unrarlib.RARSetPassword(handle, b(password))