1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.file; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class that represents a map item. 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class MapItem extends OffsettedItem { 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** file alignment of this class, in bytes */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int ALIGNMENT = 4; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** write size of this class, in bytes: three {@code uint}s */ 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int WRITE_SIZE = (4 * 3); 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} item type this instance covers */ 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final ItemType type; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} section this instance covers */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Section section; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 4199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} first item covered or {@code null} if this is 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a self-reference 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Item firstItem; 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 4799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} last item covered or {@code null} if this is 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a self-reference 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Item lastItem; 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code > 0;} count of items covered; {@code 1} if this 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is a self-reference 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final int itemCount; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a list item with instances of this class representing 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the contents of the given array of sections, adding it to the 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given map section. 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param sections {@code non-null;} the sections 6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param mapSection {@code non-null;} the section that the resulting map 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be added to; it should be empty on entry to this method 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void addMap(Section[] sections, 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MixedItemSection mapSection) { 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sections == null) { 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("sections == null"); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mapSection.items().size() != 0) { 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException( 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "mapSection.items().size() != 0"); 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 77de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<MapItem> items = new ArrayList<MapItem>(50); 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Section section : sections) { 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ItemType currentType = null; 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Item firstItem = null; 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Item lastItem = null; 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int count = 0; 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Item item : section.items()) { 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ItemType type = item.itemType(); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (type != currentType) { 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (count != 0) { 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project items.add(new MapItem(currentType, section, 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project firstItem, lastItem, count)); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project currentType = type; 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project firstItem = item; 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project count = 0; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lastItem = item; 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project count++; 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (count != 0) { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Add a MapItem for the final items in the section. 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project items.add(new MapItem(currentType, section, 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project firstItem, lastItem, count)); 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (section == mapSection) { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Add a MapItem for the self-referential section. 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project items.add(new MapItem(mapSection)); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mapSection.add( 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new UniformListItem<MapItem>(ItemType.TYPE_MAP_LIST, items)); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 114de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 117de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 11899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param type {@code non-null;} item type this instance covers 11999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param section {@code non-null;} section this instance covers 12099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param firstItem {@code non-null;} first item covered 12199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param lastItem {@code non-null;} last item covered 12299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param itemCount {@code > 0;} count of items covered 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private MapItem(ItemType type, Section section, Item firstItem, 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Item lastItem, int itemCount) { 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(ALIGNMENT, WRITE_SIZE); 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (type == null) { 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("type == null"); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (section == null) { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("section == null"); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (firstItem == null) { 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("firstItem == null"); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (lastItem == null) { 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("lastItem == null"); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (itemCount <= 0) { 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("itemCount <= 0"); 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.type = type; 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.section = section; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.firstItem = firstItem; 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.lastItem = lastItem; 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.itemCount = itemCount; 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a self-referential instance. This instance is meant to 15799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * represent the section containing the {@code map_list}. 158de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 15999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param section {@code non-null;} section this instance covers 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private MapItem(Section section) { 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(ALIGNMENT, WRITE_SIZE); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (section == null) { 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("section == null"); 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.type = ItemType.TYPE_MAP_LIST; 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.section = section; 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.firstItem = null; 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.lastItem = null; 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.itemCount = 1; 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ItemType itemType() { 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ItemType.TYPE_MAP_ITEM; 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() { 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer sb = new StringBuffer(100); 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(getClass().getName()); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('{'); 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(section.toString()); 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(' '); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(type.toHuman()); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('}'); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addContents(DexFile file) { 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // We have nothing to add. 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String toHuman() { 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return toString(); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected void writeTo0(DexFile file, AnnotatedOutput out) { 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int value = type.getMapValue(); 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int offset; 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (firstItem == null) { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project offset = section.getFileOffset(); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project offset = section.getAbsoluteItemOffset(firstItem); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (out.annotates()) { 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, offsetString() + ' ' + type.getTypeName() + 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project " map"); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(2, " type: " + Hex.u2(value) + " // " + 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project type.toString()); 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(2, " unused: 0"); 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " size: " + Hex.u4(itemCount)); 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " offset: " + Hex.u4(offset)); 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(value); 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(0); // unused 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(itemCount); 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(offset); 234de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro } 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 236