1 /*- 2 * Copyright (C) 2007 Erik Larsson 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 package org.catacombae.hfs.types.hfs; 19 20 import org.catacombae.util.Util; 21 import java.io.PrintStream; 22 import org.catacombae.csjc.PrintableStruct; 23 24 /** This class was generated by CStructToJavaClass. */ 25 public class HFSPlusWrapperMDB implements PrintableStruct { 26 /* 27 * struct HFSPlusWrapperMDB 28 * size: 170 bytes 29 * description: 30 * 31 * BP Size Type Identifier Description 32 * ------------------------------------------------------------------------------------------------------ 33 * 0 2 UInt16 drSigWord volume signature 34 * 2 4 UInt32 drCrDate date and time of volume creation 35 * 6 4 UInt32 drLsMod date and time of last modification 36 * 10 2 UInt16 drAtrb volume attributes 37 * 12 2 UInt16 drNmFls number of files in root directory 38 * 14 2 UInt16 drVBMSt first block of volume bitmap 39 * 16 2 UInt16 drAllocPtr start of next allocation search 40 * 18 2 UInt16 drNmAlBlks number of allocation blocks in volume 41 * 20 4 UInt32 drAlBlkSiz size (in bytes) of allocation blocks 42 * 24 4 UInt32 drClpSiz default clump size 43 * 28 2 UInt16 drAlBlSt first allocation block in volume 44 * 30 4 UInt32 drNxtCNID next unused catalog node ID 45 * 34 2 UInt16 drFreeBks number of unused allocation blocks 46 * 36 1 UInt8 drVNLength length of volume name 47 * 37 1*27 Char[27] drVN volume name 48 * 64 4 UInt32 drVolBkUp date and time of last backup 49 * 68 2 UInt16 drVSeqNum volume backup sequence number 50 * 70 4 UInt32 drWrCnt volume write count 51 * 74 4 UInt32 drXTClpSiz clump size for extents overflow file 52 * 78 4 UInt32 drCTClpSiz clump size for catalog file 53 * 82 2 UInt16 drNmRtDirs number of directories in root directory 54 * 84 4 UInt32 drFilCnt number of files in volume 55 * 88 4 UInt32 drDirCnt number of directories in volume 56 * 92 4*8 UInt32[8] drFndrInfo information used by the Finder 57 * 124 2 UInt16 drEmbedSigWord HFS+ Wrapper specific: Must always be 'H+' 58 * 126 4 ExtDescriptor drEmbedExtent HFS+ Wrapper specific: The extent containing the HFS+ volume 59 * 130 4 UInt32 drXTFlSize size of extents overflow file 60 * 134 16 ExtDataRec drXTExtRec extent record for extents overflow file 61 * 150 4 UInt32 drCTFlSize size of catalog file 62 * 154 16 ExtDataRec drCTExtRec extent record for catalog file 63 */ 64 65 public static final int STRUCTSIZE = 170; 66 67 private final byte[] drSigWord = new byte[2]; 68 private final byte[] drCrDate = new byte[4]; 69 private final byte[] drLsMod = new byte[4]; 70 private final byte[] drAtrb = new byte[2]; 71 private final byte[] drNmFls = new byte[2]; 72 private final byte[] drVBMSt = new byte[2]; 73 private final byte[] drAllocPtr = new byte[2]; 74 private final byte[] drNmAlBlks = new byte[2]; 75 private final byte[] drAlBlkSiz = new byte[4]; 76 private final byte[] drClpSiz = new byte[4]; 77 private final byte[] drAlBlSt = new byte[2]; 78 private final byte[] drNxtCNID = new byte[4]; 79 private final byte[] drFreeBks = new byte[2]; 80 private final byte[] drVNLength = new byte[1]; 81 private final byte[] drVN = new byte[1*27]; 82 private final byte[] drVolBkUp = new byte[4]; 83 private final byte[] drVSeqNum = new byte[2]; 84 private final byte[] drWrCnt = new byte[4]; 85 private final byte[] drXTClpSiz = new byte[4]; 86 private final byte[] drCTClpSiz = new byte[4]; 87 private final byte[] drNmRtDirs = new byte[2]; 88 private final byte[] drFilCnt = new byte[4]; 89 private final byte[] drDirCnt = new byte[4]; 90 private final byte[] drFndrInfo = new byte[4*8]; 91 private final byte[] drEmbedSigWord = new byte[2]; 92 private final ExtDescriptor drEmbedExtent; 93 private final byte[] drXTFlSize = new byte[4]; 94 private final ExtDataRec drXTExtRec; 95 private final byte[] drCTFlSize = new byte[4]; 96 private final ExtDataRec drCTExtRec; 97 HFSPlusWrapperMDB(byte[] data, int offset)98 public HFSPlusWrapperMDB(byte[] data, int offset) { 99 System.arraycopy(data, offset+0, drSigWord, 0, 2); 100 System.arraycopy(data, offset+2, drCrDate, 0, 4); 101 System.arraycopy(data, offset+6, drLsMod, 0, 4); 102 System.arraycopy(data, offset+10, drAtrb, 0, 2); 103 System.arraycopy(data, offset+12, drNmFls, 0, 2); 104 System.arraycopy(data, offset+14, drVBMSt, 0, 2); 105 System.arraycopy(data, offset+16, drAllocPtr, 0, 2); 106 System.arraycopy(data, offset+18, drNmAlBlks, 0, 2); 107 System.arraycopy(data, offset+20, drAlBlkSiz, 0, 4); 108 System.arraycopy(data, offset+24, drClpSiz, 0, 4); 109 System.arraycopy(data, offset+28, drAlBlSt, 0, 2); 110 System.arraycopy(data, offset+30, drNxtCNID, 0, 4); 111 System.arraycopy(data, offset+34, drFreeBks, 0, 2); 112 System.arraycopy(data, offset+36, drVNLength, 0, 1); 113 System.arraycopy(data, offset+37, drVN, 0, 1*27); 114 System.arraycopy(data, offset+64, drVolBkUp, 0, 4); 115 System.arraycopy(data, offset+68, drVSeqNum, 0, 2); 116 System.arraycopy(data, offset+70, drWrCnt, 0, 4); 117 System.arraycopy(data, offset+74, drXTClpSiz, 0, 4); 118 System.arraycopy(data, offset+78, drCTClpSiz, 0, 4); 119 System.arraycopy(data, offset+82, drNmRtDirs, 0, 2); 120 System.arraycopy(data, offset+84, drFilCnt, 0, 4); 121 System.arraycopy(data, offset+88, drDirCnt, 0, 4); 122 System.arraycopy(data, offset+92, drFndrInfo, 0, 4*8); 123 System.arraycopy(data, offset+124, drEmbedSigWord, 0, 2); 124 drEmbedExtent = new ExtDescriptor(data, offset+126); 125 System.arraycopy(data, offset+130, drXTFlSize, 0, 4); 126 drXTExtRec = new ExtDataRec(data, offset+134); 127 System.arraycopy(data, offset+150, drCTFlSize, 0, 4); 128 drCTExtRec = new ExtDataRec(data, offset+154); 129 } 130 length()131 public static int length() { return STRUCTSIZE; } 132 133 /** volume signature */ getDrSigWord()134 public short getDrSigWord() { return Util.readShortBE(drSigWord); } 135 /** date and time of volume creation */ getDrCrDate()136 public int getDrCrDate() { return Util.readIntBE(drCrDate); } 137 /** date and time of last modification */ getDrLsMod()138 public int getDrLsMod() { return Util.readIntBE(drLsMod); } 139 /** volume attributes */ getDrAtrb()140 public short getDrAtrb() { return Util.readShortBE(drAtrb); } 141 /** number of files in root directory */ getDrNmFls()142 public short getDrNmFls() { return Util.readShortBE(drNmFls); } 143 /** first block of volume bitmap */ getDrVBMSt()144 public short getDrVBMSt() { return Util.readShortBE(drVBMSt); } 145 /** start of next allocation search */ getDrAllocPtr()146 public short getDrAllocPtr() { return Util.readShortBE(drAllocPtr); } 147 /** number of allocation blocks in volume */ getDrNmAlBlks()148 public short getDrNmAlBlks() { return Util.readShortBE(drNmAlBlks); } 149 /** size (in bytes) of allocation blocks */ getDrAlBlkSiz()150 public int getDrAlBlkSiz() { return Util.readIntBE(drAlBlkSiz); } 151 /** default clump size */ getDrClpSiz()152 public int getDrClpSiz() { return Util.readIntBE(drClpSiz); } 153 /** first allocation block in volume */ getDrAlBlSt()154 public short getDrAlBlSt() { return Util.readShortBE(drAlBlSt); } 155 /** next unused catalog node ID */ getDrNxtCNID()156 public int getDrNxtCNID() { return Util.readIntBE(drNxtCNID); } 157 /** number of unused allocation blocks */ getDrFreeBks()158 public short getDrFreeBks() { return Util.readShortBE(drFreeBks); } 159 /** length of volume name */ getDrVNLength()160 public byte getDrVNLength() { return Util.readByteBE(drVNLength); } 161 /** volume name */ getDrVN()162 public byte[] getDrVN() { return Util.createCopy(drVN); } 163 /** date and time of last backup */ getDrVolBkUp()164 public int getDrVolBkUp() { return Util.readIntBE(drVolBkUp); } 165 /** volume backup sequence number */ getDrVSeqNum()166 public short getDrVSeqNum() { return Util.readShortBE(drVSeqNum); } 167 /** volume write count */ getDrWrCnt()168 public int getDrWrCnt() { return Util.readIntBE(drWrCnt); } 169 /** clump size for extents overflow file */ getDrXTClpSiz()170 public int getDrXTClpSiz() { return Util.readIntBE(drXTClpSiz); } 171 /** clump size for catalog file */ getDrCTClpSiz()172 public int getDrCTClpSiz() { return Util.readIntBE(drCTClpSiz); } 173 /** number of directories in root directory */ getDrNmRtDirs()174 public short getDrNmRtDirs() { return Util.readShortBE(drNmRtDirs); } 175 /** number of files in volume */ getDrFilCnt()176 public int getDrFilCnt() { return Util.readIntBE(drFilCnt); } 177 /** number of directories in volume */ getDrDirCnt()178 public int getDrDirCnt() { return Util.readIntBE(drDirCnt); } 179 /** information used by the Finder */ getDrFndrInfo()180 public int[] getDrFndrInfo() { return Util.readIntArrayBE(drFndrInfo); } 181 /** HFS+ Wrapper specific: Must always be 'H+' */ getDrEmbedSigWord()182 public short getDrEmbedSigWord() { return Util.readShortBE(drEmbedSigWord); } 183 /** HFS+ Wrapper specific: The extent containing the HFS+ volume */ getDrEmbedExtent()184 public ExtDescriptor getDrEmbedExtent() { return drEmbedExtent; } 185 /** size of extents overflow file */ getDrXTFlSize()186 public int getDrXTFlSize() { return Util.readIntBE(drXTFlSize); } 187 /** extent record for extents overflow file */ getDrXTExtRec()188 public ExtDataRec getDrXTExtRec() { return drXTExtRec; } 189 /** size of catalog file */ getDrCTFlSize()190 public int getDrCTFlSize() { return Util.readIntBE(drCTFlSize); } 191 /** extent record for catalog file */ getDrCTExtRec()192 public ExtDataRec getDrCTExtRec() { return drCTExtRec; } 193 printFields(PrintStream ps, String prefix)194 public void printFields(PrintStream ps, String prefix) { 195 ps.println(prefix + " drSigWord: " + getDrSigWord()); 196 ps.println(prefix + " drCrDate: " + getDrCrDate()); 197 ps.println(prefix + " drLsMod: " + getDrLsMod()); 198 ps.println(prefix + " drAtrb: " + getDrAtrb()); 199 ps.println(prefix + " drNmFls: " + getDrNmFls()); 200 ps.println(prefix + " drVBMSt: " + getDrVBMSt()); 201 ps.println(prefix + " drAllocPtr: " + getDrAllocPtr()); 202 ps.println(prefix + " drNmAlBlks: " + getDrNmAlBlks()); 203 ps.println(prefix + " drAlBlkSiz: " + getDrAlBlkSiz()); 204 ps.println(prefix + " drClpSiz: " + getDrClpSiz()); 205 ps.println(prefix + " drAlBlSt: " + getDrAlBlSt()); 206 ps.println(prefix + " drNxtCNID: " + getDrNxtCNID()); 207 ps.println(prefix + " drFreeBks: " + getDrFreeBks()); 208 ps.println(prefix + " drVNLength: " + getDrVNLength()); 209 ps.println(prefix + " drVN: " + getDrVN()); 210 ps.println(prefix + " drVolBkUp: " + getDrVolBkUp()); 211 ps.println(prefix + " drVSeqNum: " + getDrVSeqNum()); 212 ps.println(prefix + " drWrCnt: " + getDrWrCnt()); 213 ps.println(prefix + " drXTClpSiz: " + getDrXTClpSiz()); 214 ps.println(prefix + " drCTClpSiz: " + getDrCTClpSiz()); 215 ps.println(prefix + " drNmRtDirs: " + getDrNmRtDirs()); 216 ps.println(prefix + " drFilCnt: " + getDrFilCnt()); 217 ps.println(prefix + " drDirCnt: " + getDrDirCnt()); 218 ps.println(prefix + " drFndrInfo: " + getDrFndrInfo()); 219 ps.println(prefix + " drEmbedSigWord: " + getDrEmbedSigWord()); 220 ps.println(prefix + " drEmbedExtent: "); 221 getDrEmbedExtent().print(ps, prefix+" "); 222 ps.println(prefix + " drXTFlSize: " + getDrXTFlSize()); 223 ps.println(prefix + " drXTExtRec: "); 224 getDrXTExtRec().print(ps, prefix+" "); 225 ps.println(prefix + " drCTFlSize: " + getDrCTFlSize()); 226 ps.println(prefix + " drCTExtRec: "); 227 getDrCTExtRec().print(ps, prefix+" "); 228 } 229 print(PrintStream ps, String prefix)230 public void print(PrintStream ps, String prefix) { 231 ps.println(prefix + "HFSPlusWrapperMDB:"); 232 printFields(ps, prefix); 233 } 234 getBytes()235 public byte[] getBytes() { 236 byte[] result = new byte[STRUCTSIZE]; 237 byte[] tempData; 238 int offset = 0; 239 System.arraycopy(drSigWord, 0, result, offset, drSigWord.length); offset += drSigWord.length; 240 System.arraycopy(drCrDate, 0, result, offset, drCrDate.length); offset += drCrDate.length; 241 System.arraycopy(drLsMod, 0, result, offset, drLsMod.length); offset += drLsMod.length; 242 System.arraycopy(drAtrb, 0, result, offset, drAtrb.length); offset += drAtrb.length; 243 System.arraycopy(drNmFls, 0, result, offset, drNmFls.length); offset += drNmFls.length; 244 System.arraycopy(drVBMSt, 0, result, offset, drVBMSt.length); offset += drVBMSt.length; 245 System.arraycopy(drAllocPtr, 0, result, offset, drAllocPtr.length); offset += drAllocPtr.length; 246 System.arraycopy(drNmAlBlks, 0, result, offset, drNmAlBlks.length); offset += drNmAlBlks.length; 247 System.arraycopy(drAlBlkSiz, 0, result, offset, drAlBlkSiz.length); offset += drAlBlkSiz.length; 248 System.arraycopy(drClpSiz, 0, result, offset, drClpSiz.length); offset += drClpSiz.length; 249 System.arraycopy(drAlBlSt, 0, result, offset, drAlBlSt.length); offset += drAlBlSt.length; 250 System.arraycopy(drNxtCNID, 0, result, offset, drNxtCNID.length); offset += drNxtCNID.length; 251 System.arraycopy(drFreeBks, 0, result, offset, drFreeBks.length); offset += drFreeBks.length; 252 System.arraycopy(drVNLength, 0, result, offset, drVNLength.length); offset += drVNLength.length; 253 System.arraycopy(drVN, 0, result, offset, drVN.length); offset += drVN.length; 254 System.arraycopy(drVolBkUp, 0, result, offset, drVolBkUp.length); offset += drVolBkUp.length; 255 System.arraycopy(drVSeqNum, 0, result, offset, drVSeqNum.length); offset += drVSeqNum.length; 256 System.arraycopy(drWrCnt, 0, result, offset, drWrCnt.length); offset += drWrCnt.length; 257 System.arraycopy(drXTClpSiz, 0, result, offset, drXTClpSiz.length); offset += drXTClpSiz.length; 258 System.arraycopy(drCTClpSiz, 0, result, offset, drCTClpSiz.length); offset += drCTClpSiz.length; 259 System.arraycopy(drNmRtDirs, 0, result, offset, drNmRtDirs.length); offset += drNmRtDirs.length; 260 System.arraycopy(drFilCnt, 0, result, offset, drFilCnt.length); offset += drFilCnt.length; 261 System.arraycopy(drDirCnt, 0, result, offset, drDirCnt.length); offset += drDirCnt.length; 262 System.arraycopy(drFndrInfo, 0, result, offset, drFndrInfo.length); offset += drFndrInfo.length; 263 System.arraycopy(drEmbedSigWord, 0, result, offset, drEmbedSigWord.length); offset += drEmbedSigWord.length; 264 tempData = drEmbedExtent.getBytes(); 265 System.arraycopy(tempData, 0, result, offset, tempData.length); offset += tempData.length; 266 System.arraycopy(drXTFlSize, 0, result, offset, drXTFlSize.length); offset += drXTFlSize.length; 267 tempData = drXTExtRec.getBytes(); 268 System.arraycopy(tempData, 0, result, offset, tempData.length); offset += tempData.length; 269 System.arraycopy(drCTFlSize, 0, result, offset, drCTFlSize.length); offset += drCTFlSize.length; 270 tempData = drCTExtRec.getBytes(); 271 System.arraycopy(tempData, 0, result, offset, tempData.length); offset += tempData.length; 272 return result; 273 } 274 } 275