()
| 29 | } |
| 30 | |
| 31 | private void readFile() |
| 32 | throws DBException, IOException |
| 33 | { |
| 34 | RandomAccessFile in = new RandomAccessFile(this.file, "r"); |
| 35 | |
| 36 | byte[] header = new byte[68]; |
| 37 | int count = in.read(header); |
| 38 | if (count != header.length) { |
| 39 | throw new DBException("KEY header length is incorrect"); |
| 40 | } |
| 41 | String signature = new String(header, 0, 4); |
| 42 | if (!signature.equals("KEY ")) { |
| 43 | throw new DBException("KEY header signature is incorrect"); |
| 44 | } |
| 45 | String version = new String(header, 4, 4); |
| 46 | if (!version.equals("V1.1")) { |
| 47 | throw new DBException("KEY header version " + version + " is not supported"); |
| 48 | } |
| 49 | int fileCount = getInteger(header, 8); |
| 50 | long fileOffset = getInteger(header, 20); |
| 51 | int keyCount = getInteger(header, 12); |
| 52 | long keyOffset = getInteger(header, 24); |
| 53 | |
| 54 | this.archiveNames = new ArrayList(fileCount); |
| 55 | byte[] fileBuffer = new byte[12]; |
| 56 | byte[] nameBuffer = new byte[256]; |
| 57 | for (int i = 0; i < fileCount; i++) { |
| 58 | in.seek(fileOffset); |
| 59 | count = in.read(fileBuffer); |
| 60 | if (count != fileBuffer.length) { |
| 61 | throw new DBException("File table truncated"); |
| 62 | } |
| 63 | long nameOffset = getInteger(fileBuffer, 4); |
| 64 | int nameLength = getInteger(fileBuffer, 8); |
| 65 | if (nameLength > nameBuffer.length) { |
| 66 | nameBuffer = new byte[nameLength]; |
| 67 | } |
| 68 | in.seek(nameOffset); |
| 69 | in.read(nameBuffer, 0, nameLength); |
| 70 | String fileName = new String(nameBuffer, 0, nameLength); |
| 71 | this.archiveNames.add(fileName); |
| 72 | |
| 73 | fileOffset += 12L; |
| 74 | } |
| 75 | |
| 76 | this.keyEntries = new ArrayList(keyCount); |
| 77 | this.keyEntriesMap = new HashMap(keyCount); |
| 78 | byte[] keyBuffer = new byte[26]; |
| 79 | for (int i = 0; i < keyCount; i++) { |
| 80 | in.seek(keyOffset); |
| 81 | count = in.read(keyBuffer); |
| 82 | if (count != keyBuffer.length) { |
| 83 | throw new DBException("Key table truncated"); |
| 84 | } |
| 85 | int nameLength; |
| 86 | for (nameLength = 1; (nameLength < 16) && |
| 87 | (keyBuffer[nameLength] != 0); nameLength++); |
| 88 | String resourceName = new String(keyBuffer, 0, nameLength); |
no test coverage detected