ImageHeader.java revision 10967:e336cbd8b15e
1232633Smp/* 259243Sobrien * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 359243Sobrien * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 459243Sobrien * 559243Sobrien * This code is free software; you can redistribute it and/or modify it 659243Sobrien * under the terms of the GNU General Public License version 2 only, as 759243Sobrien * published by the Free Software Foundation. Oracle designates this 859243Sobrien * particular file as subject to the "Classpath" exception as provided 959243Sobrien * by Oracle in the LICENSE file that accompanied this code. 10232633Smp * 1159243Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT 1259243Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1359243Sobrien * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24*/ 25 26package jdk.internal.jimage; 27 28import java.nio.ByteOrder; 29import java.nio.IntBuffer; 30 31public final class ImageHeader { 32 public static final int MAGIC = 0xCAFEDADA; 33 public static final int BADMAGIC = 0xDADAFECA; 34 public static final short MAJOR_VERSION = 0; 35 public static final short MINOR_VERSION = 1; 36 37 private final int magic; 38 private final short majorVersion; 39 private final short minorVersion; 40 private final int locationCount; 41 private final int locationsSize; 42 private final int stringsSize; 43 44 ImageHeader(int locationCount, int locationsSize, int stringsSize) { 45 this(MAGIC, MAJOR_VERSION, MINOR_VERSION, locationCount, locationsSize, stringsSize); 46 } 47 48 ImageHeader(int magic, short majorVersion, short minorVersion, int locationCount, 49 int locationsSize, int stringsSize) 50 { 51 this.magic = magic; 52 this.majorVersion = majorVersion; 53 this.minorVersion = minorVersion; 54 this.locationCount = locationCount; 55 this.locationsSize = locationsSize; 56 this.stringsSize = stringsSize; 57 } 58 59 static int getHeaderSize() { 60 return 4 + 61 2 + 2 + 62 4 + 63 4 + 64 4; 65 } 66 67 static ImageHeader readFrom(ByteOrder byteOrder, IntBuffer buffer) { 68 int magic = buffer.get(0); 69 int version = buffer.get(1); 70 short majorVersion = (short)(byteOrder == ByteOrder.BIG_ENDIAN ? 71 version >>> 16 : (version & 0xFFFF)); 72 short minorVersion = (short)(byteOrder == ByteOrder.BIG_ENDIAN ? 73 (version & 0xFFFF) : version >>> 16); 74 int locationCount = buffer.get(2); 75 int locationsSize = buffer.get(3); 76 int stringsSize = buffer.get(4); 77 78 return new ImageHeader(magic, majorVersion, minorVersion, locationCount, 79 locationsSize, stringsSize); 80 } 81 82 void writeTo(ImageStream stream) { 83 stream.putInt(magic); 84 stream.putShort(majorVersion); 85 stream.putShort(minorVersion); 86 stream.putInt(locationCount); 87 stream.putInt(locationsSize); 88 stream.putInt(stringsSize); 89 } 90 91 public int getMagic() { 92 return magic; 93 } 94 95 public int getMajorVersion() { 96 return majorVersion; 97 } 98 99 public int getMinorVersion() { 100 return minorVersion; 101 } 102 103 public int getLocationCount() { 104 return locationCount; 105 } 106 107 public int getRedirectSize() { 108 return locationCount* 4; 109 } 110 111 public int getOffsetsSize() { 112 return locationCount* 4; 113 } 114 115 public int getLocationsSize() { 116 return locationsSize; 117 } 118 119 public int getStringsSize() { 120 return stringsSize; 121 } 122 123 public int getIndexSize() { 124 return getHeaderSize() + 125 getRedirectSize() + 126 getOffsetsSize() + 127 getLocationsSize() + 128 getStringsSize(); 129 } 130 131 int getRedirectOffset() { 132 return getHeaderSize(); 133 } 134 135 int getOffsetsOffset() { 136 return getRedirectOffset() + 137 getRedirectSize(); 138 } 139 140 int getLocationsOffset() { 141 return getOffsetsOffset() + 142 getOffsetsSize(); 143 } 144 145 int getStringsOffset() { 146 return getLocationsOffset() + 147 getLocationsSize(); 148 } 149} 150