package com.bytezone.diskbrowser.prodos; import java.util.ArrayList; import java.util.List; import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.Utility; // -----------------------------------------------------------------------------------// public class ResourceFork // -----------------------------------------------------------------------------------// { private static String[] resourceTypes = { "", "rIcon", "rPicture", "rControlList", "rControlTemplate", "rC1InputString", "rPString", "rStringList", "rMenuBar", "rMenu", "rMenuItem", "rTextForLETextBox2", "", "rCt1lColorTbl", "rWindParaml", "rWindParam2", "rWindColor", "rTextBlock", "rStyleBlock", "rToolStartup", "rResName", "rAlertString", "rText", "", "", "", "rTwoRects", "", "rListRef", "rcString", "", "", "rErrorString", "rKTransTable", "", "rCloutputString", "", "rTERuler", "", "", "", "", "" }; byte[] buffer; ResourceFileHeader resourceFileHeader; // ---------------------------------------------------------------------------------// public ResourceFork (byte[] buffer) // ---------------------------------------------------------------------------------// { this.buffer = buffer; resourceFileHeader = new ResourceFileHeader (buffer); } public boolean isValid () { return resourceFileHeader.resourceMap != null; } // ---------------------------------------------------------------------------------// @Override public String toString () // ---------------------------------------------------------------------------------// { return resourceFileHeader.toString (); } // ---------------------------------------------------------------------------------// class ResourceFileHeader // ---------------------------------------------------------------------------------// { int fileVersion; int fileToMap; int fileMapSize; ResourceMap resourceMap; // -------------------------------------------------------------------------------// ResourceFileHeader (byte[] buffer) // -------------------------------------------------------------------------------// { fileVersion = Utility.getLong (buffer, 0); fileToMap = Utility.getLong (buffer, 4); fileMapSize = Utility.getLong (buffer, 8); if (fileVersion == 0) resourceMap = new ResourceMap (buffer, fileToMap, fileMapSize); } // -------------------------------------------------------------------------------// @Override public String toString () // -------------------------------------------------------------------------------// { StringBuilder text = new StringBuilder (); text.append (String.format ("Version ....... %04X % resourceFreeBlocks = new ArrayList<> (); List resourceReferenceRecords = new ArrayList<> (); // -------------------------------------------------------------------------------// ResourceMap (byte[] buffer, int ptr, int size) // -------------------------------------------------------------------------------// { int offset = ptr; if (ptr > buffer.length) { System.out.println ("bad"); return; } mapNext = Utility.getLong (buffer, ptr); mapFlags = Utility.getShort (buffer, ptr + 4); mapOffset = Utility.getLong (buffer, ptr + 6); mapSize = Utility.getLong (buffer, ptr + 10); mapToIndex = Utility.getShort (buffer, ptr + 14); mapFileNum = Utility.getShort (buffer, ptr + 16); mapId = Utility.getShort (buffer, ptr + 18); mapIndexSize = Utility.getLong (buffer, ptr + 20); mapIndexUsed = Utility.getLong (buffer, ptr + 24); mapFreeListSize = Utility.getShort (buffer, ptr + 28); mapFreeListUsed = Utility.getShort (buffer, ptr + 30); ptr = offset + 32; for (int i = 0; i < mapFreeListUsed; i++) { resourceFreeBlocks.add (new ResourceFreeBlock (buffer, ptr)); ptr += 8; } ptr = offset + mapToIndex; for (int i = 0; i < mapIndexUsed; i++) { resourceReferenceRecords.add (new ResourceReferenceRecord (buffer, ptr)); ptr += 20; } } // -------------------------------------------------------------------------------// @Override public String toString () // -------------------------------------------------------------------------------// { StringBuilder text = new StringBuilder (); text.append (String.format ("Map next ............ %04X % 0x8000 && index < resourceTypes.length) resourceTypeText = resourceTypes[index]; text.append ( String.format ("Type .......... %04X %s%n", resType, resourceTypeText)); text.append (String.format ("ID ............ %04X %