12bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson/* 22bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Copyright (C) 2011 The Android Open Source Project 32bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * 42bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 52bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * you may not use this file except in compliance with the License. 62bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * You may obtain a copy of the License at 72bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * 82bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 92bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * 102bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Unless required by applicable law or agreed to in writing, software 112bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 122bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * See the License for the specific language governing permissions and 142bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * limitations under the License. 152bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 162bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 172bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonpackage com.android.dex; 182bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 192bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonimport java.io.IOException; 202bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonimport java.io.UnsupportedEncodingException; 212bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonimport java.util.Arrays; 222bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 232bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson/** 242bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * The file header and map. 252bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 262bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonpublic final class TableOfContents { 272bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 282bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /* 292bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * TODO: factor out ID constants. 302bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 312bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 322bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section header = new Section(0x0000); 332bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section stringIds = new Section(0x0001); 342bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section typeIds = new Section(0x0002); 352bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section protoIds = new Section(0x0003); 362bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section fieldIds = new Section(0x0004); 372bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section methodIds = new Section(0x0005); 382bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section classDefs = new Section(0x0006); 392bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section mapList = new Section(0x1000); 402bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section typeLists = new Section(0x1001); 412bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section annotationSetRefLists = new Section(0x1002); 422bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section annotationSets = new Section(0x1003); 432bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section classDatas = new Section(0x2000); 442bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section codes = new Section(0x2001); 452bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section stringDatas = new Section(0x2002); 462bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section debugInfos = new Section(0x2003); 472bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section annotations = new Section(0x2004); 482bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section encodedArrays = new Section(0x2005); 492bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section annotationsDirectories = new Section(0x2006); 502bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final Section[] sections = { 512bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson header, stringIds, typeIds, protoIds, fieldIds, methodIds, classDefs, mapList, 522bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson typeLists, annotationSetRefLists, annotationSets, classDatas, codes, stringDatas, 532bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson debugInfos, annotations, encodedArrays, annotationsDirectories 542bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson }; 552bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 562bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int checksum; 572bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public byte[] signature; 582bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int fileSize; 592bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int linkSize; 602bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int linkOff; 612bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int dataSize; 622bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int dataOff; 632bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 642bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public TableOfContents() { 652bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson signature = new byte[20]; 662bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 672bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 682bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public void readFrom(Dex dex) throws IOException { 692bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readHeader(dex.open(0)); 702bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readMap(dex.open(mapList.off)); 712bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson computeSizesFromOffsets(); 722bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 732bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 742bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private void readHeader(Dex.Section headerIn) throws UnsupportedEncodingException { 752bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson byte[] magic = headerIn.readByteArray(8); 762bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int apiTarget = DexFormat.magicToApi(magic); 772bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 78eb5fee6dd9c1a77af17cdf2991afe1e3db07e98aJesse Wilson if (apiTarget != DexFormat.API_NO_EXTENDED_OPCODES) { 792bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Unexpected magic: " + Arrays.toString(magic)); 802bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 812bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 822bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checksum = headerIn.readInt(); 832bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson signature = headerIn.readByteArray(20); 842bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson fileSize = headerIn.readInt(); 852bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int headerSize = headerIn.readInt(); 862bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (headerSize != SizeOf.HEADER_ITEM) { 872bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Unexpected header: 0x" + Integer.toHexString(headerSize)); 882bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 892bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int endianTag = headerIn.readInt(); 902bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (endianTag != DexFormat.ENDIAN_TAG) { 912bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Unexpected endian tag: 0x" + Integer.toHexString(endianTag)); 922bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 932bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson linkSize = headerIn.readInt(); 942bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson linkOff = headerIn.readInt(); 952bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson mapList.off = headerIn.readInt(); 962bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (mapList.off == 0) { 972bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Cannot merge dex files that do not contain a map"); 982bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 992bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson stringIds.size = headerIn.readInt(); 1002bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson stringIds.off = headerIn.readInt(); 1012bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson typeIds.size = headerIn.readInt(); 1022bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson typeIds.off = headerIn.readInt(); 1032bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson protoIds.size = headerIn.readInt(); 1042bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson protoIds.off = headerIn.readInt(); 1052bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson fieldIds.size = headerIn.readInt(); 1062bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson fieldIds.off = headerIn.readInt(); 1072bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson methodIds.size = headerIn.readInt(); 1082bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson methodIds.off = headerIn.readInt(); 1092bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson classDefs.size = headerIn.readInt(); 1102bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson classDefs.off = headerIn.readInt(); 1112bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson dataSize = headerIn.readInt(); 1122bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson dataOff = headerIn.readInt(); 1132bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1142bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1152bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private void readMap(Dex.Section in) throws IOException { 1162bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int mapSize = in.readInt(); 1172bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson Section previous = null; 1182bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (int i = 0; i < mapSize; i++) { 1192bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson short type = in.readShort(); 1202bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson in.readShort(); // unused 1212bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson Section section = getSection(type); 1222bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int size = in.readInt(); 1232bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int offset = in.readInt(); 1242bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1252bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if ((section.size != 0 && section.size != size) 1262bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson || (section.off != -1 && section.off != offset)) { 1272bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Unexpected map value for 0x" + Integer.toHexString(type)); 1282bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1292bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1302bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson section.size = size; 1312bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson section.off = offset; 1322bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1332bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (previous != null && previous.off > section.off) { 1342bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Map is unsorted at " + previous + ", " + section); 1352bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1362bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1372bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson previous = section; 1382bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1392bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson Arrays.sort(sections); 1402bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1412bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1422bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public void computeSizesFromOffsets() { 1432bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int end = dataOff + dataSize; 1442bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (int i = sections.length - 1; i >= 0; i--) { 1452bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson Section section = sections[i]; 1462bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (section.off == -1) { 1472bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson continue; 1482bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1492bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (section.off > end) { 1502bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Map is unsorted at " + section); 1512bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1522bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson section.byteCount = end - section.off; 1532bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson end = section.off; 1542bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1552bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1562bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1572bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private Section getSection(short type) { 1582bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (Section section : sections) { 1592bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (section.type == type) { 1602bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return section; 1612bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1622bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1632bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new IllegalArgumentException("No such map item: " + type); 1642bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1652bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1662bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public void writeHeader(Dex.Section out) throws IOException { 167eb5fee6dd9c1a77af17cdf2991afe1e3db07e98aJesse Wilson out.write(DexFormat.apiToMagic(DexFormat.API_NO_EXTENDED_OPCODES).getBytes("UTF-8")); 1682bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(checksum); 1692bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.write(signature); 1702bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(fileSize); 1712bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(SizeOf.HEADER_ITEM); 1722bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(DexFormat.ENDIAN_TAG); 1732bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(linkSize); 1742bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(linkOff); 1752bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(mapList.off); 1762bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(stringIds.size); 1772bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(stringIds.off); 1782bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(typeIds.size); 1792bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(typeIds.off); 1802bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(protoIds.size); 1812bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(protoIds.off); 1822bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(fieldIds.size); 1832bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(fieldIds.off); 1842bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(methodIds.size); 1852bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(methodIds.off); 1862bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(classDefs.size); 1872bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(classDefs.off); 1882bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(dataSize); 1892bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(dataOff); 1902bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1912bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1922bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public void writeMap(Dex.Section out) throws IOException { 1932bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int count = 0; 1942bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (Section section : sections) { 1952bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (section.exists()) { 1962bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson count++; 1972bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1982bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1992bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2002bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(count); 2012bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (Section section : sections) { 2022bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (section.exists()) { 2032bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeShort(section.type); 2042bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeShort((short) 0); 2052bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(section.size); 2062bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson out.writeInt(section.off); 2072bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2082bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2092bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2102bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2112bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static class Section implements Comparable<Section> { 2122bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public final short type; 2132bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int size = 0; 2142bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int off = -1; 2152bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int byteCount = 0; 2162bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2172bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public Section(int type) { 2182bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson this.type = (short) type; 2192bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2202bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2212bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public boolean exists() { 2222bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return size > 0; 2232bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2242bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2252bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int compareTo(Section section) { 2262bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (off != section.off) { 2272bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return off < section.off ? -1 : 1; 2282bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2292bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return 0; 2302bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2312bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2322bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson @Override public String toString() { 2332bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return String.format("Section[type=%#x,off=%#x,size=%#x]", type, off, size); 2342bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2352bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2362bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson} 237