Skip to content

Commit fba8624

Browse files
committed
Add extract with header feature, implements #2
1 parent 50f036f commit fba8624

File tree

3 files changed

+56
-8
lines changed

3 files changed

+56
-8
lines changed

Source/Main.lfm

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ object frmMain: TfrmMain
44
Top = 650
55
Width = 556
66
AllowDropFiles = True
7-
ClientHeight = 0
8-
ClientWidth = 0
7+
ClientHeight = 364
8+
ClientWidth = 556
99
Color = clBtnFace
1010
Font.CharSet = ANSI_CHARSET
1111
Font.Pitch = fpVariable
@@ -372,14 +372,28 @@ object frmMain: TfrmMain
372372
Caption = 'Copy details to clipboard'
373373
OnClick = itmEditCopyClick
374374
end
375+
object Separator2: TMenuItem
376+
Caption = '-'
377+
end
375378
object itmSaveFileAs: TMenuItem
376379
Caption = 'Save file as...'
377380
OnClick = itmSaveFileAsClick
378381
end
382+
object itmSaveFileWithHeaderAs: TMenuItem
383+
Caption = 'Save file with header as...'
384+
OnClick = itmSaveFileWithHeaderAsClick
385+
end
386+
object Separator3: TMenuItem
387+
Caption = '-'
388+
end
379389
object itmSaveSelectedFilesTo: TMenuItem
380390
Caption = 'Save selected files to...'
381391
OnClick = itmSaveSelectedFilesToClick
382392
end
393+
object itmSaveSelectedFilesWithHeadersTo: TMenuItem
394+
Caption = 'Save selected files with headers to...'
395+
OnClick = itmSaveSelectedFilesWithHeadersToClick
396+
end
383397
end
384398
object dlgFind: TFindDialog
385399
Options = [frDown, frHideUpDown, frDisableWholeWord, frHideEntireScope]

Source/Main.pas

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ TfrmMain = class(TForm)
3333
itmSaveFileAs: TMenuItem;
3434
itmSaveSelectedFilesTo: TMenuItem;
3535
itmCopyMapToClipboard: TMenuItem;
36+
itmSaveFileWithHeaderAs: TMenuItem;
37+
itmSaveSelectedFilesWithHeadersTo: TMenuItem;
3638
mnuMain: TMainMenu;
3739
itmDisk: TMenuItem;
3840
itmOpen: TMenuItem;
@@ -49,6 +51,8 @@ TfrmMain = class(TForm)
4951
dlgSaveBinary: TSaveDialog;
5052
dlgSelectDirectory: TSelectDirectoryDialog;
5153
Separator1: TMenuItem;
54+
Separator2: TMenuItem;
55+
Separator3: TMenuItem;
5256
splVertical: TSplitter;
5357
staBar: TStatusBar;
5458
pnlRight: TPanel;
@@ -91,8 +95,10 @@ TfrmMain = class(TForm)
9195
procedure itmOpenClick(Sender: TObject);
9296
procedure FormCreate(Sender: TObject);
9397
procedure itmOpenRecentClick(Sender: TObject);
98+
procedure itmSaveFileWithHeaderAsClick(Sender: TObject);
9499
procedure itmSaveSelectedFilesToClick(Sender: TObject);
95100
procedure itmSaveFileAsClick(Sender: TObject);
101+
procedure itmSaveSelectedFilesWithHeadersToClick(Sender: TObject);
96102
procedure lvwMainDblClickFile(Sender: TObject);
97103
procedure popListItemPopup(Sender: TObject);
98104
procedure tvwMainChange(Sender: TObject; Node: TTreeNode);
@@ -136,6 +142,8 @@ TfrmMain = class(TForm)
136142
function FindTreeNodeFromData(Node: TTreeNode; Data: TObject): TTreeNode;
137143
function MapByte(Raw: byte): string;
138144

145+
procedure SaveExtractedFile(WithHeader: boolean);
146+
procedure SaveExtractedFilesToFolder(WithHeader: boolean);
139147
procedure WriteSectorLine(Offset: integer; SecHex: string; SecData: string);
140148
procedure SetListSimple;
141149
procedure OnApplicationDropFiles(Sender: TObject; const FileNames: array of string);
@@ -235,7 +243,17 @@ procedure TfrmMain.itmOpenRecentClick(Sender: TObject);
235243
end;
236244
end;
237245

246+
procedure TfrmMain.itmSaveSelectedFilesWithHeadersToClick(Sender: TObject);
247+
begin
248+
SaveExtractedFilesToFolder(true);
249+
end;
250+
238251
procedure TfrmMain.itmSaveSelectedFilesToClick(Sender: TObject);
252+
begin
253+
SaveExtractedFilesToFolder(false);
254+
end;
255+
256+
procedure TfrmMain.SaveExtractedFilesToFolder(WithHeader: boolean);
239257
var
240258
ListItem: TListItem;
241259
Folder: string;
@@ -251,7 +269,7 @@ procedure TfrmMain.itmSaveSelectedFilesToClick(Sender: TObject);
251269
begin
252270
DiskFile := TDSKFile(ListItem.Data);
253271
Stream := TFileStream.Create(Folder + DiskFile.FileName, fmCreate);
254-
Data := DiskFile.GetData();
272+
Data := DiskFile.GetData(WithHeader);
255273
try
256274
Stream.WriteBuffer(Pointer(Data)^, Length(Data));
257275
finally
@@ -260,7 +278,17 @@ procedure TfrmMain.itmSaveSelectedFilesToClick(Sender: TObject);
260278
end;
261279
end;
262280

281+
procedure TfrmMain.itmSaveFileWithHeaderAsClick(Sender: TObject);
282+
begin
283+
SaveExtractedFile(true);
284+
end;
285+
263286
procedure TfrmMain.itmSaveFileAsClick(Sender: TObject);
287+
begin
288+
SaveExtractedFile(false);
289+
end;
290+
291+
procedure TfrmMain.SaveExtractedFile(WithHeader: boolean);
264292
var
265293
DiskFile: TDSKFile;
266294
Data: TDiskByteArray;
@@ -275,7 +303,7 @@ procedure TfrmMain.itmSaveFileAsClick(Sender: TObject);
275303
if not dlgSaveBinary.Execute then exit;
276304

277305
Stream := TFileStream.Create(dlgSaveBinary.FileName, fmCreate);
278-
Data := DiskFile.GetData();
306+
Data := DiskFile.GetData(WithHeader);
279307
try
280308
Stream.WriteBuffer(Pointer(Data)^, Length(Data));
281309
finally
@@ -301,13 +329,19 @@ procedure TfrmMain.popListItemPopup(Sender: TObject);
301329
begin
302330
itmSaveSelectedFilesTo.Visible := tvwMain.Selected.Text = 'Files';
303331
itmSaveSelectedFilesTo.Enabled := lvwMain.SelCount > 0;
332+
itmSaveSelectedFilesWithHeadersTo.Visible := itmSaveSelectedFilesTo.Visible;
333+
itmSaveSelectedFilesWithHeadersTo.Enabled := itmSaveSelectedFilesTo.Enabled;
304334

305335
itmSaveFileAs.Visible := False;
336+
itmSaveFileWithHeaderAs.Visible := False;
337+
306338
if (lvwMain.SelCount = 1) and (lvwMain.Selected.Data <> nil) and (TObject(lvwMain.Selected.Data).ClassType = TDSKFile) then
307339
begin
308340
itmSaveFileAs.Visible := True;
341+
itmSaveFileWithHeaderAs.Visible := True;
309342
DiskFile := TDSKFile((lvwMain.Selected).Data);
310343
itmSaveFileAs.Caption := Format('Save %s as...', [DiskFile.FileName]);
344+
itmSaveFileWithHeaderAs.Caption := Format('Save %s with header as...', [DiskFile.FileName]);
311345
end;
312346
end;
313347

Source/filesystem.pas

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ TDSKFile = class(TObject)
6060
Size: integer;
6161
Meta: string;
6262

63-
function GetData: TDiskByteArray;
63+
function GetData(WithHeader: boolean): TDiskByteArray;
6464

6565
constructor Create(ParentFileSystem: TDSKFileSystem);
6666
destructor Destroy; override;
@@ -322,7 +322,7 @@ destructor TDSKFile.Destroy;
322322
inherited Destroy;
323323
end;
324324

325-
function TDSKFile.GetData: TDiskByteArray;
325+
function TDSKFile.GetData(WithHeader:boolean): TDiskByteArray;
326326
var
327327
Block, BytesLeft, TargetIdx, BlockSize, SectorsLeft, SectorsPerBlock: integer;
328328
Disk: TDSKDisk;
@@ -364,8 +364,8 @@ function TDSKFile.GetData: TDiskByteArray;
364364
until SectorsLeft = 0;
365365
end;
366366

367-
// Strip any headers (maybe make this optional in the future)
368-
if (HeaderType = 'PLUS3DOS') or (HeaderType = 'AMSDOS') then
367+
// Strip any headers
368+
if (not WithHeader) and ((HeaderType = 'PLUS3DOS') or (HeaderType = 'AMSDOS')) then
369369
Result := Copy(FileData, 128, Size - 128)
370370
else
371371
Result := FileData;

0 commit comments

Comments
 (0)