unit UDFSel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, vStrip,
  StdCtrls, ComCtrls;

type
  TUDFSelector = class(TForm)
    TreeViewFiles: TTreeView;
    ComboBoxDrives: TComboBox;
    ButtonScan: TButton;
    ListBoxFiles: TListBox;
    ButtonOK: TButton;
    ButtonCancel: TButton;
    ButtonClear: TButton;
    ButtonRemove: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ButtonScanClick(Sender: TObject);
    procedure ComboBoxDrivesChange(Sender: TObject);
    procedure TreeViewFilesDblClick(Sender: TObject);
    procedure ButtonOKClick(Sender: TObject);
    procedure ButtonCancelClick(Sender: TObject);
    procedure ButtonClearClick(Sender: TObject);
    procedure ButtonRemoveClick(Sender: TObject);
  private
    { Private-Deklarationen }
    Drives: array['C'..'Z'] of Cardinal;
    DrivesFound: Cardinal;
    procedure udf_traverse(address: Cardinal; f: tp_udf_file; parent: TTreeNode; tv: TTreeView);
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.DFM}

procedure TUDFSelector.FormCreate(Sender: TObject);
begin
  ButtonScanClick(Nil);
end;

procedure TUDFSelector.ButtonScanClick(Sender: TObject);
var
  i: Char;
  address, secsize, maxsec: Cardinal;
  f: tp_udf_file;
begin
  DrivesFound := 0;
  TreeViewFiles.Items.Clear();
  ComboBoxDrives.Items.BeginUpdate();
  ComboBoxDrives.Items.Clear();
  for i := Low(Drives) to High(Drives) do begin
    Drives[i] := $ffffffff;
    if (aspi_GetDriveAddress(i, address) and aspi_GetSectorInfo(address, secsize, maxsec) and (secsize = fio_SECTOR_SIZE)) then begin
      f := udf_get_root(address, 0, True);
      if (f <> Nil) then begin
        Drives[i] := address;
        Inc(DrivesFound);
        ComboBoxDrives.Items.Add(i + ':\ [' + f^.name + ']');
        udf_free(f);
      end;
    end;
  end;
  ComboBoxDrives.Items.EndUpdate();
  if (DrivesFound = 1) then begin
    ComboBoxDrives.ItemIndex := 0;
    ComboBoxDrivesChange(Nil);
  end
end;

procedure TUDFSelector.udf_traverse(address: Cardinal; f: tp_udf_file; parent: TTreeNode; tv: TTreeView);
var
  name: String;
  i: Cardinal;
  fs: tp_udf_file;
  startlba, endlba: Cardinal;
  node: TTreeNode;
begin
  while (udf_get_next(address, f) <> Nil) do begin
    if (not f^.is_parent) then begin
      name := f^.name;
      i := 0;
      if (not f^.is_dir) then begin
        i := Length(name);
        if (udf_get_lba(address, f, startlba, endlba)) then
          name := name + ' [' + IntToStr((endlba - startlba) shl 1) + ' kb]';
      end;
      node := tv.Items.AddChildObject(parent, name, Pointer(i));
      if (f^.is_dir) then begin
	fs := udf_get_sub(address, f);
	if (fs <> Nil) then begin
          udf_traverse(address, fs, node, tv);
          udf_free(fs);
        end;
      end;
    end;
  end;
end;

procedure TUDFSelector.ComboBoxDrivesChange(Sender: TObject);
var
  address: Cardinal;
  f: tp_udf_file;
begin
  TreeViewFiles.Items.BeginUpdate();
  TreeViewFiles.Items.Clear();
  if ((DrivesFound > 0) and (ComboBoxDrives.ItemIndex >= 0)) then begin
    address := Drives[ComboBoxDrives.Items[ComboBoxDrives.ItemIndex][1]];
    if (address <> $ffffffff) then begin
      f := udf_get_root(address, 0, True);
      if (f <> Nil) then begin
        udf_traverse(address, f, Nil, TreeViewFiles);
        udf_free(f);
      end;
    end;
  end;
  TreeViewFiles.Items.EndUpdate();
end;

procedure TUDFSelector.TreeViewFilesDblClick(Sender: TObject);
var
  item: TTreeNode;
  fname: String;
begin
  item := TreeViewFiles.Selected;
  if ((item <> Nil) and (Integer(item.Data) > 0)) then begin
    fname := Copy(item.Text, 0, Integer(item.Data));
    item := item.Parent;
    while (item <> Nil) do begin
      fname := item.Text + '\' + fname;
      item := item.Parent;
    end;
    fname := Copy(ComboBoxDrives.Items[ComboBoxDrives.ItemIndex], 0, 3) + fname;
    ListBoxFiles.Items.Add(fname);
  end;
end;

procedure TUDFSelector.ButtonOKClick(Sender: TObject);
begin
  if (ListBoxFiles.Items.Count > 0) then
    ModalResult := ListBoxFiles.Items.Count
  else
    ModalResult := -1;
end;

procedure TUDFSelector.ButtonCancelClick(Sender: TObject);
begin
  ModalResult := -1;
end;

procedure TUDFSelector.ButtonClearClick(Sender: TObject);
begin
  ListBoxFiles.Items.Clear();
end;

procedure TUDFSelector.ButtonRemoveClick(Sender: TObject);
begin
  if (ListBoxFiles.ItemIndex <> -1) then
    ListBoxFiles.Items.Delete(ListBoxFiles.ItemIndex);
end;

end.


syntax highlighted by Code2HTML, v. 0.9.1