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