Newer
Older
ubixfs-2 / DISKDRV.PAS
@flameshadow flameshadow on 10 Jun 2005 3 KB UbixFS
unit diskDrv;

interface

uses device;

type 
  PDiskDrive = ^TDiskDrive;
  TDiskDrive = object(TDevice)
   private
    diskDrive:file;
    openFile:boolean;
   public
    constructor init(const filename:string);
    function read(ptr:pointer; offset:int64; length:dword):integer; virtual;
    function write(ptr:pointer; offset:int64; length:dword):integer; virtual;
    destructor done; virtual;
  end; // TdiskDrive
//function dev_diskDrive(const filename:string):PDevice;
//function dev_diskDestroy:integer;

implementation

uses dos;

constructor TDiskDrive.init;
begin
  inherited init;
  openFile := FALSE;
  if (filename = '') then exit;
  writeln('filename: ', filename);
  if (fsearch(filename, '') = '') then exit;
  // The file must exist!
  assign(diskDrive, filename);
  {$I-} reset(diskDrive, 512); {$I+}
  if (IOResult() <> 0) then writeln('Could not open file'); //exit; // should yell louder

  major := 1;
  sectors := filesize(diskDrive); // returns the number of records
  writeln('sectors: ', sectors);
  openFile := TRUE;
end; // TDiskDrive.init

function TDiskDrive.read;
begin
  if (offset+length > sectors) then 
    begin
      writeln('offset + length > sectors');
      writeln('offset: ', offset);
      writeln('length: ', length);
      writeln('sectors: ', sectors);
      halt;
    end;
  seek(diskDrive, dword(offset));
  blockread(diskDrive, ptr^, length);
  result := length;
end; // TDiskDrive.read

function TDiskDrive.write;
begin
  if (offset+length > sectors) then 
    begin
      writeln('offset + length > sectors');
      writeln('offset: ', offset);
      writeln('length: ', length);
      writeln('sectors: ', sectors);
      halt;
    end;
  seek(diskDrive, dword(offset));
  blockwrite(diskDrive, ptr^, length);
  result := length;
end;

destructor TDiskDrive.done;
begin
  inherited done;
  if (openFile) then close(diskDrive);
end; // TDiskDrive.done
(*
function diskDrive_read(dev:PDevice; ptr:pointer; offset:int64; length:dword):integer;
begin
  if (offset+length > dev^.sectors) then 
    begin
      writeln('offset + length > dev^.sectors');
      writeln('offset: ', offset);
      writeln('length: ', length);
      writeln('dev^.sectors: ', dev^.sectors);
      halt;
    end;
  seek(diskDrive, dword(offset));
  blockread(diskDrive, ptr^, length);
  result := length;
end; {diskDrive_read}

function diskDrive_write(dev:PDevice; ptr:pointer; offset:int64; length:dword):integer;
begin
  if (offset+length > dev^.sectors) then 
    begin
      writeln('offset + length > dev^.sectors');
      writeln('offset: ', offset);
      writeln('length: ', length);
      writeln('dev^.sectors: ', dev^.sectors);
      halt;
    end;
  seek(diskDrive, dword(offset));
  blockwrite(diskDrive, ptr^, length);
  result := length;
end; {diskDrive_write}

function dev_diskDrive;
var diskDevice : PDevice;
begin
  assign(diskDrive, filename);
  reset(diskDrive, 512);
  new(diskDevice);

  with diskDevice^ do
    begin
      major := 1;
      sectors := filesize(diskDrive);
      read := diskDrive_read;
      write := diskDrive_write;
    end;
  result := diskDevice;

end;

function dev_diskDestroy;
begin
  close(diskDrive);
end;
*)
end.