mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2024-09-27 13:54:55 +00:00
Added Dirent abstract base class and ability for find_dirent to take filename or dirent
This commit is contained in:
parent
4d1f17677d
commit
f4057f6ad5
@ -62,7 +62,7 @@ class AtariDosDirectory(Directory):
|
|||||||
num += 1
|
num += 1
|
||||||
|
|
||||||
|
|
||||||
class AtariDosDirent(object):
|
class AtariDosDirent(Dirent):
|
||||||
# ATR Dirent structure described at http://atari.kensclassics.org/dos.htm
|
# ATR Dirent structure described at http://atari.kensclassics.org/dos.htm
|
||||||
format = np.dtype([
|
format = np.dtype([
|
||||||
('FLAG', 'u1'),
|
('FLAG', 'u1'),
|
||||||
@ -73,7 +73,7 @@ class AtariDosDirent(object):
|
|||||||
])
|
])
|
||||||
|
|
||||||
def __init__(self, image, file_num=0, bytes=None):
|
def __init__(self, image, file_num=0, bytes=None):
|
||||||
self.file_num = file_num
|
Dirent.__init__(self, file_num)
|
||||||
self.flag = 0
|
self.flag = 0
|
||||||
self.opened_output = False
|
self.opened_output = False
|
||||||
self.dos_2 = False
|
self.dos_2 = False
|
||||||
@ -95,6 +95,9 @@ class AtariDosDirent(object):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename, self.ext, self.num_sectors)
|
return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename, self.ext, self.num_sectors)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self.__class__ == other.__class__ and self.filename == other.filename and self.starting_sector == other.starting_sector and self.num_sectors == other.num_sectors
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filename(self):
|
def filename(self):
|
||||||
ext = ("." + self.ext) if self.ext else ""
|
ext = ("." + self.ext) if self.ext else ""
|
||||||
|
@ -282,8 +282,11 @@ class DiskImageBase(object):
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
def find_dirent(self, filename):
|
def find_dirent(self, filename):
|
||||||
|
# check if we've been passed a dirent instead of a filename
|
||||||
|
if hasattr(filename, "filename"):
|
||||||
|
return filename
|
||||||
for dirent in self.files:
|
for dirent in self.files:
|
||||||
if filename == dirent.filename:
|
if filename_or_dirent == dirent.filename:
|
||||||
return dirent
|
return dirent
|
||||||
raise FileNotFound("%s not found on disk" % filename)
|
raise FileNotFound("%s not found on disk" % filename)
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from errors import *
|
from errors import *
|
||||||
from diskimages import BaseHeader, DiskImageBase, Directory, VTOC, WriteableSector, BaseSectorList
|
from diskimages import BaseHeader, DiskImageBase
|
||||||
|
from utils import Directory, VTOC, WriteableSector, BaseSectorList, Dirent
|
||||||
from segments import DefaultSegment, EmptySegment, ObjSegment, RawTrackSectorSegment, SegmentSaver
|
from segments import DefaultSegment, EmptySegment, ObjSegment, RawTrackSectorSegment, SegmentSaver
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -143,7 +144,7 @@ class Dos33Directory(Directory):
|
|||||||
current_sector = next_sector
|
current_sector = next_sector
|
||||||
|
|
||||||
|
|
||||||
class Dos33Dirent(object):
|
class Dos33Dirent(Dirent):
|
||||||
format = np.dtype([
|
format = np.dtype([
|
||||||
('track', 'u1'),
|
('track', 'u1'),
|
||||||
('sector', 'u1'),
|
('sector', 'u1'),
|
||||||
@ -153,7 +154,7 @@ class Dos33Dirent(object):
|
|||||||
])
|
])
|
||||||
|
|
||||||
def __init__(self, image, file_num=0, bytes=None):
|
def __init__(self, image, file_num=0, bytes=None):
|
||||||
self.file_num = file_num
|
Dirent.__init__(self, file_num)
|
||||||
self._file_type = 0
|
self._file_type = 0
|
||||||
self.locked = False
|
self.locked = False
|
||||||
self.deleted = False
|
self.deleted = False
|
||||||
@ -171,6 +172,9 @@ class Dos33Dirent(object):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "File #%-2d (%s) %03d %-30s %03d %03d" % (self.file_num, self.summary, self.num_sectors, self.filename, self.track, self.sector)
|
return "File #%-2d (%s) %03d %-30s %03d %03d" % (self.file_num, self.summary, self.num_sectors, self.filename, self.track, self.sector)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self.__class__ == other.__class__ and self.filename == other.filename and self.track == other.track and self.sector == other.sector and self.num_sectors == other.num_sectors
|
||||||
|
|
||||||
type_map = {
|
type_map = {
|
||||||
0x0: "T", # text
|
0x0: "T", # text
|
||||||
0x1: "I", # integer basic
|
0x1: "I", # integer basic
|
||||||
|
@ -133,6 +133,35 @@ class BaseSectorList(object):
|
|||||||
self.sectors.extend(sectors)
|
self.sectors.extend(sectors)
|
||||||
|
|
||||||
|
|
||||||
|
class Dirent(object):
|
||||||
|
"""Abstract base class for a directory entry
|
||||||
|
|
||||||
|
"""
|
||||||
|
def __init__(self, file_num=0):
|
||||||
|
self.file_num = file_num
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def mark_deleted(self):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def parse_raw_dirent(self, image, bytes):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def encode_dirent(self):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def get_sectors_in_vtoc(self, image):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def start_read(self, image):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def read_sector(self, image):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
class Directory(BaseSectorList):
|
class Directory(BaseSectorList):
|
||||||
def __init__(self, header, num_dirents=-1, sector_class=WriteableSector):
|
def __init__(self, header, num_dirents=-1, sector_class=WriteableSector):
|
||||||
BaseSectorList.__init__(self, header)
|
BaseSectorList.__init__(self, header)
|
||||||
@ -167,6 +196,12 @@ class Directory(BaseSectorList):
|
|||||||
return dirent
|
return dirent
|
||||||
|
|
||||||
def find_dirent(self, filename):
|
def find_dirent(self, filename):
|
||||||
|
if hasattr(filename, "filename"):
|
||||||
|
# we've been passed a dirent instead of a filename
|
||||||
|
for dirent in self.dirents.values():
|
||||||
|
if dirent == filename:
|
||||||
|
return dirent
|
||||||
|
else:
|
||||||
for dirent in self.dirents.values():
|
for dirent in self.dirents.values():
|
||||||
if filename == dirent.filename:
|
if filename == dirent.filename:
|
||||||
return dirent
|
return dirent
|
||||||
|
Loading…
Reference in New Issue
Block a user