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