1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 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.rop.cst.Constant; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collection; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 2599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * A section of a {@code .dex} file which consists of a sequence of 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Item} objects. Each of the items must have the same size in 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the output. 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class UniformItemSection extends Section { 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. The file offset is initially unknown. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param name {@code null-ok;} the name of this instance, for annotation 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * purposes 3599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} file that this instance is part of 3699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param alignment {@code > 0;} alignment requirement for the final output; 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * must be a power of 2 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public UniformItemSection(String name, DexFile file, int alignment) { 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(name, file, alignment); 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int writeSize() { 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Collection<? extends Item> items = items(); 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = items.size(); 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sz == 0) { 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Since each item has to be the same size, we can pick any. 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sz * items.iterator().next().writeSize(); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the item corresponding to the given {@link Constant}. This 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * will throw an exception if the constant is not found, including 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this instance isn't the sort that maps constants to {@link 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IndexedItem} instances. 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param cst {@code non-null;} constant to look for 6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the corresponding item found in this instance 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract IndexedItem get(Constant cst); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final void prepare0() { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexFile file = getFile(); 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orderItems(); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Item one : items()) { 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project one.addContents(file); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final void writeTo0(AnnotatedOutput out) { 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DexFile file = getFile(); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int alignment = getAlignment(); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Item one : items()) { 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project one.writeTo(file, out); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.alignTo(alignment); 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int getAbsoluteItemOffset(Item item) { 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Since all items must be the same size, we can use the size 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of the one we're given to calculate its offset. 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IndexedItem ii = (IndexedItem) item; 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int relativeOffset = ii.getIndex() * ii.writeSize(); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getAbsoluteOffset(relativeOffset); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Alters or picks the order for items in this instance if desired, 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * so that subsequent calls to {@link #items} will yield a 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * so-ordered collection. If the items in this instance are indexed, 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * then this method should also assign indices. 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected abstract void orderItems(); 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 113