Subversion Repositories mkgmap

Rev

Rev 3408 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#
# Copyright (C) 2006 Steve Ratcliffe
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License version 2 as
#  published by the Free Software Foundation.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#
# Author: Steve Ratcliffe
# Create date: 18 Dec 2006
#

import sys
import time
from struct import *

class Imgfile:
        def __init__(self, name):
                self.name = name
                self.block_size = 512
                self.fp = open(name, 'r+')

        def close(self):
                self.fp.close()

        def get_block(self, bn):
                pos = bn * self.block_size
                self.fp.seek(pos)
                return self.fp.read(self.block_size)

        def write_block(self, bn, bl):
                pos = bn * self.block_size
                self.fp.seek(pos)
                return self.fp.write(bl)

        def get_dirent(self, type):
                for bn in xrange(2, 12):
                        bl = self.get_block(bn)
                        print bl[9:12], type
                        if bl[9:12] == type:
                                dent = Dirent(self, bl)
                                dent.dir_block_num = bn
                                return dent

        def set_time(self):
                self.fp.seek(0)
                self.fp.read(self.block_size)
                t = time.localtime()
                s = pack("<HBBBBB", t[0], t[1], t[2], t[3], t[4], t[5])
                self.fp.seek(0x39)
                self.fp.write(s)

class Dirent:
        def __init__(self, img, block):
                self.img = img
                self.block = block

        def get_block(self, lbn):
                pbn = self.get_phys_block(lbn)
                return self.img.get_block(pbn)

        def write_block(self, lbn, bl):
                pbn = self.get_phys_block(lbn)
                self.img.write_block(pbn, bl)

        def get_phys_block(self, lbn):
                """Get the physical block number from the logical."""
                loc = 0x20 + 2*lbn
                pbn = unpack("<H", self.block[loc:loc+2])
                return pbn[0]