Esempio n. 1
0
    def write(self, buf, offset):
        self.inode.rewind()
        found = False
        count = 0
        block = None
        while self.inode.exists_next_block() and not found:
            block = self.inode.next_block()
            found = count + block.size > offset
            if not found:
                count += block.size

        if not found and (self.inode.file_size - offset) <= 0:
            if len(self.free) == 0:
                return

            byte, key = crypt.GenerateKey()
            type = 1

            newblock = Block(self.free[0], key, new=True, prefix=self.prefix)
            self.inode.add_direction(type, newblock.src, newblock.size,
                                     newblock.key)

            del self.free[0]
            block = self.inode.next_block()

        if block is None:
            return

        newfrom = offset
        newsize = len(buf)
        written = 0

        while newsize > 0 and (newfrom - count) < block.size:
            block[newfrom - count] = buf[newfrom - offset]
            newfrom += 1
            newsize -= 1
            written += 1
            if newfrom > self.inode.file_size:
                self.inode.set_size(self.inode.file_size + 1)

        if newsize > 0:
            written += self.write(buf[newfrom - offset:], newfrom)

        return written