2 # vim: set ts=4 sts=4 sw=4 textwidth=92:
6 # PAR2Set-derived types
11 import PAR2Set.ExtractFirstOldRAR
12 import PAR2Set.ExtractFirstNewRAR
13 import PAR2Set.NoExtract
17 class RarslaveDetector (object):
19 # A tuple of tuples with the following definition:
20 # (TYPE_NAME, DETECTION_FUNCTION, PAR2Set-derived class)
22 TYPES = ( (PAR2Set.Join.detector, PAR2Set.Join.Join),
23 (PAR2Set.ZIP.detector, PAR2Set.ZIP.ZIP),
24 (PAR2Set.OldRAR.detector, PAR2Set.OldRAR.OldRAR),
25 (PAR2Set.NewRAR.detector, PAR2Set.NewRAR.NewRAR),
26 (PAR2Set.ExtractFirstOldRAR.detector, PAR2Set.ExtractFirstOldRAR.ExtractFirstOldRAR),
27 (PAR2Set.ExtractFirstNewRAR.detector, PAR2Set.ExtractFirstNewRAR.ExtractFirstNewRAR),
28 (PAR2Set.NoExtract.detector, PAR2Set.NoExtract.NoExtract),
31 def __init__ (self, dir, p2file):
33 # The real "meat" of the class
36 self.basename = rsutil.common.get_basename (p2file)
38 # Find files that match by name only
39 self.name_matched_files = rsutil.common.find_name_matches (self.dir, self.basename)
41 # Find all par2 files for this set using name matches
42 self.all_p2files = rsutil.common.find_par2_files (self.name_matched_files)
44 # Try to get the protected files for this set
45 self.prot_matched_files = rsutil.common.parse_all_par2 (self.dir, self.p2file, self.all_p2files)
47 def runMatchingTypes (self):
48 # Now tries to run every type of PAR2Set-derived class for which the detector
49 # detects that the class is valid.
53 for (detector, classname) in self.TYPES:
54 if detector (self.name_matched_files, self.prot_matched_files):
55 # The detector matched, so we're up and running!
57 p2set = classname (self.dir, self.p2file)
60 logging.debug ('Detected type: %s' % p2set)
62 # Try to have rarslave do it's thing
65 # If something already worked, there is no need to continue,
66 # since we've already finished!
67 if ret == rsutil.common.SUCCESS:
70 logging.error ('Detected type failed for: %s' % self.p2file)
72 # Make sure we detected at least one valid type
74 logging.warning ('Unable to determine type: %s' % self.p2file)
75 logging.debug ('The following information will help in writing a detector:')
76 logging.debug ('name_matches: %s' % self.name_matched_files)
77 logging.debug ('prot_matches: %s' % self.prot_matched_files)
78 return -rsutil.common.EDETECT
80 # Make sure that something worked
81 if ret != rsutil.common.SUCCESS:
82 logging.critical ('All types failed for: %s' % self.p2file)
89 if __name__ == '__main__':