1959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/*
2959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Copyright (C) 2014 The Android Open Source Project
3959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *
4959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Licensed under the Apache License, Version 2.0 (the "License");
5959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * you may not use this file except in compliance with the License.
6959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * You may obtain a copy of the License at
7959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *
8959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *      http://www.apache.org/licenses/LICENSE-2.0
9959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *
10959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Unless required by applicable law or agreed to in writing, software
11959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * distributed under the License is distributed on an "AS IS" BASIS,
12959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * See the License for the specific language governing permissions and
14959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * limitations under the License.
15959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */
16959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
17959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepackage dexfuzz.rawdex;
18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.Log;
20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.IOException;
22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.ArrayList;
23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List;
24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class MapList implements RawDexObject {
26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  private RawDexFile rawDexFile;
28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public int size;
30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public List<MapItem> mapItems;
31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public MapList(RawDexFile rawDexFile) {
33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    this.rawDexFile = rawDexFile;
34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void read(DexRandomAccessFile file) throws IOException {
38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // Find the map list.
39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    file.seek(rawDexFile.header.mapOff.getOriginalOffset());
40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    file.getOffsetTracker().getNewOffsettable(file, this);
42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // Get the number of entries.
44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    size = file.readUInt();
45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // Allocate and populate the array.
47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    mapItems = new ArrayList<MapItem>(size);
48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (int i = 0; i < size; i++) {
49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      MapItem mapItem = new MapItem();
50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      mapItems.add(mapItem);
51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      mapItem.read(file);
52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    file.getOffsetTracker().rememberPointAfterMapList();
55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // NB: We track the current index into the MapList, so when we encounter the DebugInfoItem
57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // MapItem, we know how to find the next MapItem, so we know how large the DebugInfo
58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // area is, so we can copy it as a blob.
59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    int mapItemIdx = 0;
60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // Iterate through the list, and create all the other data structures.
62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (MapItem mapItem : mapItems) {
63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      file.seek(mapItem.offset.getOriginalOffset());
64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      switch (mapItem.type) {
65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_HEADER_ITEM:
66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          // Already read it; skip.
67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_STRING_ID_ITEM:
69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            StringIdItem newStringId = new StringIdItem();
71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.stringIds.add(newStringId);
72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newStringId.read(file);
73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_TYPE_ID_ITEM:
76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            TypeIdItem newTypeId = new TypeIdItem();
78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.typeIds.add(newTypeId);
79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newTypeId.read(file);
80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_PROTO_ID_ITEM:
83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            ProtoIdItem newProtoId = new ProtoIdItem();
85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.protoIds.add(newProtoId);
86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newProtoId.read(file);
87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_FIELD_ID_ITEM:
90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            FieldIdItem newFieldId = new FieldIdItem();
92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.fieldIds.add(newFieldId);
93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newFieldId.read(file);
94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_METHOD_ID_ITEM:
97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            MethodIdItem newMethodId = new MethodIdItem();
99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.methodIds.add(newMethodId);
100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newMethodId.read(file);
101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_CLASS_DEF_ITEM:
104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            ClassDefItem newClassDef = new ClassDefItem();
106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.classDefs.add(newClassDef);
107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newClassDef.read(file);
108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_MAP_LIST:
111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          // Already read it; skip.
112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_TYPE_LIST:
114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.typeLists = new ArrayList<TypeList>(mapItem.size);
115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            TypeList newTypeList = new TypeList();
117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.typeLists.add(newTypeList);
118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newTypeList.read(file);
119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_ANNOTATION_SET_REF_LIST:
122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.annotationSetRefLists =
123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            new ArrayList<AnnotationSetRefList>(mapItem.size);
124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            AnnotationSetRefList newAnnotationSetRefList = new AnnotationSetRefList();
126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.annotationSetRefLists.add(newAnnotationSetRefList);
127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newAnnotationSetRefList.read(file);
128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_ANNOTATION_SET_ITEM:
131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.annotationSetItems = new ArrayList<AnnotationSetItem>(mapItem.size);
132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            AnnotationSetItem newAnnotationSetItem = new AnnotationSetItem();
134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.annotationSetItems.add(newAnnotationSetItem);
135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newAnnotationSetItem.read(file);
136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_CLASS_DATA_ITEM:
139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.classDatas = new ArrayList<ClassDataItem>(mapItem.size);
140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            ClassDataItem newClassData = new ClassDataItem();
142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.classDatas.add(newClassData);
143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newClassData.read(file);
144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_CODE_ITEM:
147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.codeItems = new ArrayList<CodeItem>(mapItem.size);
148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            CodeItem newCodeItem = new CodeItem();
150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.codeItems.add(newCodeItem);
151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newCodeItem.read(file);
152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_STRING_DATA_ITEM:
155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.stringDatas = new ArrayList<StringDataItem>(mapItem.size);
156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            StringDataItem newStringData = new StringDataItem();
158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.stringDatas.add(newStringData);
159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newStringData.read(file);
160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_DEBUG_INFO_ITEM:
163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        {
164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          // We aren't interested in updating the debug data, so just read it as a blob.
165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          int start = mapItem.offset.getOriginalOffset();
166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          int end = mapItems.get(mapItemIdx + 1).offset.getOriginalOffset();
167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          int size = end - start;
168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.debugInfoItem = new DebugInfoItem(size);
169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.debugInfoItem.read(file);
170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        }
172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_ANNOTATION_ITEM:
173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.annotationItems = new ArrayList<AnnotationItem>(mapItem.size);
174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            AnnotationItem newAnnotationItem = new AnnotationItem();
176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.annotationItems.add(newAnnotationItem);
177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newAnnotationItem.read(file);
178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_ENCODED_ARRAY_ITEM:
181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.encodedArrayItems = new ArrayList<EncodedArrayItem>(mapItem.size);
182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            EncodedArrayItem newEncodedArrayItem = new EncodedArrayItem();
184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.encodedArrayItems.add(newEncodedArrayItem);
185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newEncodedArrayItem.read(file);
186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        case MapItem.TYPE_ANNOTATIONS_DIRECTORY_ITEM:
189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          rawDexFile.annotationsDirectoryItems =
190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          new ArrayList<AnnotationsDirectoryItem>(mapItem.size);
191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          for (int i = 0; i < mapItem.size; i++) {
192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            AnnotationsDirectoryItem newAnnotationsDirectoryItem = new AnnotationsDirectoryItem();
193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            rawDexFile.annotationsDirectoryItems.add(newAnnotationsDirectoryItem);
194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle            newAnnotationsDirectoryItem.read(file);
195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          }
196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          break;
197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        default:
198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle          Log.errorAndQuit("Encountered unknown map item when reading map item list.");
199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      }
200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      mapItemIdx++;
201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void write(DexRandomAccessFile file) throws IOException {
206959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    file.alignForwards(4);
207959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    file.getOffsetTracker().updatePositionOfNextOffsettable(file);
208959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    file.writeUInt(mapItems.size());
209959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (MapItem mapItem : mapItems) {
210959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      mapItem.write(file);
211959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
212959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
213959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
214959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
215959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void incrementIndex(IndexUpdateKind kind, int insertedIdx) {
216959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // Do nothing.
217959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
218959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle}
219