| 35 | |
| 36 | |
| 37 | class ChunkInfo(): |
| 38 | def __init__(self, name): |
| 39 | self.name = decode(name) |
| 40 | self.size = 0 |
| 41 | self.resume = False |
| 42 | self.chunks = [] |
| 43 | |
| 44 | def __repr__(self): |
| 45 | ret = "ChunkInfo: %s, %s\n" % (self.name, self.size) |
| 46 | for i, c in enumerate(self.chunks): |
| 47 | ret += "%s# %s\n" % (i, c[1]) |
| 48 | |
| 49 | return ret |
| 50 | |
| 51 | def setSize(self, size): |
| 52 | self.size = int(size) |
| 53 | |
| 54 | def addChunk(self, name, range): |
| 55 | self.chunks.append((name, range)) |
| 56 | |
| 57 | def clear(self): |
| 58 | self.chunks = [] |
| 59 | |
| 60 | def createChunks(self, chunks): |
| 61 | self.clear() |
| 62 | chunk_size = self.size / chunks |
| 63 | |
| 64 | current = 0 |
| 65 | for i in range(chunks): |
| 66 | end = self.size - 1 if (i == chunks - 1) else current + chunk_size |
| 67 | self.addChunk("%s.chunk%s" % (self.name, i), (current, end)) |
| 68 | current += chunk_size + 1 |
| 69 | |
| 70 | def save(self): |
| 71 | fs_name = fs_encode("%s.chunks" % self.name) |
| 72 | fh = codecs.open(fs_name, "w", "utf_8") |
| 73 | fh.write("name:%s\n" % self.name) |
| 74 | fh.write("size:%s\n" % self.size) |
| 75 | for i, c in enumerate(self.chunks): |
| 76 | fh.write("#%d:\n" % i) |
| 77 | fh.write("\tname:%s\n" % c[0]) |
| 78 | fh.write("\trange:%i-%i\n" % c[1]) |
| 79 | fh.close() |
| 80 | |
| 81 | @staticmethod |
| 82 | def load(name): |
| 83 | fs_name = fs_encode("%s.chunks" % name) |
| 84 | if not os.path.exists(fs_name): |
| 85 | raise IOError() |
| 86 | fh = codecs.open(fs_name, "r", "utf_8") |
| 87 | name = fh.readline()[:-1] |
| 88 | size = fh.readline()[:-1] |
| 89 | if name.startswith("name:") and size.startswith("size:"): |
| 90 | name = name[5:] |
| 91 | size = size[5:] |
| 92 | else: |
| 93 | fh.close() |
| 94 | raise WrongFormat() |