diff --git a/src/com/bytezone/diskbrowser/disk/DiskFactory.java b/src/com/bytezone/diskbrowser/disk/DiskFactory.java index bd84d22..f045057 100755 --- a/src/com/bytezone/diskbrowser/disk/DiskFactory.java +++ b/src/com/bytezone/diskbrowser/disk/DiskFactory.java @@ -187,7 +187,15 @@ public class DiskFactory // System.out.printf ("Total files: %d%n", totalFiles); if (totalFiles == 0) return null; - nuFX.getDiskBuffer (); + + File tmp = File.createTempFile (suffix, null); + FileOutputStream fos = new FileOutputStream (tmp); + fos.write (nuFX.getDiskBuffer ()); + fos.close (); + tmp.deleteOnExit (); + file = tmp; + suffix = "po"; + compressed = true; } catch (IOException e) { diff --git a/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java index 2f1cc0e..a6a80b5 100644 --- a/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java @@ -112,7 +112,7 @@ public class ProdosDisk } // ---------------------------------------------------------------------------------// - FileEntry addFile (String path, int type) + public FileEntry addFile (String path, int type, byte[] dataBuffer) // ---------------------------------------------------------------------------------// { String[] subdirectories; @@ -160,6 +160,8 @@ public class ProdosDisk fileEntry.headerPointer = catalogBlockNo; fileEntry.fileType = 4; // text + fileEntry.writeFile (dataBuffer); + fileEntry.write (); updateFileCount (fileEntry.headerPointer); @@ -169,6 +171,16 @@ public class ProdosDisk return null; } + // ---------------------------------------------------------------------------------// + public void close () + // ---------------------------------------------------------------------------------// + { + writeVolumeBitMap (); + volumeDirectoryHeader.write (); + for (SubdirectoryHeader subdirectoryHeader : subdirectoryHeaders.values ()) + subdirectoryHeader.write (); + } + // ---------------------------------------------------------------------------------// private FileEntry searchDirectory (int blockNo, String fileName) // ---------------------------------------------------------------------------------// @@ -351,4 +363,11 @@ public class ProdosDisk } } } + + // ---------------------------------------------------------------------------------// + public byte[] getBuffer () + // ---------------------------------------------------------------------------------// + { + return buffer; + } } diff --git a/src/com/bytezone/diskbrowser/utilities/NuFX.java b/src/com/bytezone/diskbrowser/utilities/NuFX.java index cf8da92..488483c 100644 --- a/src/com/bytezone/diskbrowser/utilities/NuFX.java +++ b/src/com/bytezone/diskbrowser/utilities/NuFX.java @@ -7,6 +7,8 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import com.bytezone.diskbrowser.prodos.write.ProdosDisk; + // -----------------------------------------------------------------------------------// public class NuFX // -----------------------------------------------------------------------------------// @@ -24,13 +26,7 @@ public class NuFX // ---------------------------------------------------------------------------------// { buffer = Files.readAllBytes (path); - readBuffer (); - } - // ---------------------------------------------------------------------------------// - private void readBuffer () - // ---------------------------------------------------------------------------------// - { masterHeader = new MasterHeader (buffer); int dataPtr = 48; @@ -86,7 +82,37 @@ public class NuFX } else if (totalFiles > 0) { - listFiles (); + // listFiles (); + try + { + ProdosDisk disk = new ProdosDisk (1600, "DISKBROWSER"); + int count = 0; + for (Record record : records) + { + if (record.hasFile ()) + { + String fileName = record.getFileName (); + int fileSize = record.getFileSize (); + int fileType = record.getFileType (); + int eof = record.getUncompressedSize (); + byte[] buffer = record.getData (); + System.out.printf ("%3d %-35s %,7d %d %,7d %d%n", ++count, fileName, + fileSize, fileType, eof, buffer.length); + if (fileType == 4 && count > 10 && count < 16) + { + disk.addFile (fileName, fileType, buffer); + } + } + } + + disk.close (); + + return disk.getBuffer (); + } + catch (IOException e) + { + e.printStackTrace (); + } } return null; diff --git a/src/com/bytezone/diskbrowser/utilities/Record.java b/src/com/bytezone/diskbrowser/utilities/Record.java index 7c5a825..1df3388 100644 --- a/src/com/bytezone/diskbrowser/utilities/Record.java +++ b/src/com/bytezone/diskbrowser/utilities/Record.java @@ -193,6 +193,16 @@ class Record return 0; } + // ---------------------------------------------------------------------------------// + byte[] getData () + // ---------------------------------------------------------------------------------// + { + for (Thread thread : threads) + if (thread.hasFile ()) + return thread.getData (); + return null; + } + // ---------------------------------------------------------------------------------// @Override public String toString ()