1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.dex.file; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.dex.SizeOf; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.CstString; 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.AnnotatedOutput; 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.Hex; 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Representation of a string inside a Dalvik file. 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class StringIdItem 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson extends IndexedItem implements Comparable { 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the string value */ 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final CstString value; 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code null-ok;} associated string data object, if known */ 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private StringDataItem data; 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constructs an instance. 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param value {@code non-null;} the string value 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public StringIdItem(CstString value) { 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (value == null) { 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("value == null"); 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.value = value; 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.data = null; 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public boolean equals(Object other) { 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (!(other instanceof StringIdItem)) { 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return false; 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StringIdItem otherString = (StringIdItem) other; 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return value.equals(otherString.value); 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int hashCode() { 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return value.hashCode(); 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int compareTo(Object other) { 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StringIdItem otherString = (StringIdItem) other; 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return value.compareTo(otherString.value); 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public ItemType itemType() { 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return ItemType.TYPE_STRING_ID_ITEM; 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int writeSize() { 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return SizeOf.STRING_ID_ITEM; 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public void addContents(DexFile file) { 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (data == null) { 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson // The string data hasn't yet been added, so add it. 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson MixedItemSection stringData = file.getStringData(); 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson data = new StringDataItem(value); 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson stringData.add(data); 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public void writeTo(DexFile file, AnnotatedOutput out) { 98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int dataOff = data.getAbsoluteOffset(); 99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (out.annotates()) { 101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.annotate(0, indexString() + ' ' + value.toQuoted(100)); 102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.annotate(4, " string_data_off: " + Hex.u4(dataOff)); 103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson out.writeInt(dataOff); 106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the string value. 110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the value 112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public CstString getValue() { 114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return value; 115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the associated data object for this instance, if known. 119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code null-ok;} the associated data object or {@code null} 121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * if not yet known 122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public StringDataItem getData() { 124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return data; 125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 127