11bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver/*
21bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Copyright 2013, Google Inc.
31bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * All rights reserved.
41bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
51bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Redistribution and use in source and binary forms, with or without
61bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * modification, are permitted provided that the following conditions are
71bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * met:
81bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
91bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Redistributions of source code must retain the above copyright
101bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * notice, this list of conditions and the following disclaimer.
111bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Redistributions in binary form must reproduce the above
121bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * copyright notice, this list of conditions and the following disclaimer
131bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * in the documentation and/or other materials provided with the
141bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * distribution.
151bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Neither the name of Google Inc. nor the names of its
161bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * contributors may be used to endorse or promote products derived from
171bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * this software without specific prior written permission.
181bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
191bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
221bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver */
311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpackage org.jf.dexlib2.writer;
331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
341bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.ValueType;
351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.reference.FieldReference;
361bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.reference.MethodReference;
371bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
381bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport javax.annotation.Nonnull;
391bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport java.io.IOException;
401bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport java.util.Collection;
411bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
421bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpublic abstract class EncodedValueWriter<StringKey, TypeKey, FieldRefKey extends FieldReference,
431bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        MethodRefKey extends MethodReference, AnnotationElement, EncodedValue> {
441bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final DexDataWriter writer;
451bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final StringSection<StringKey, ?> stringSection;
461bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final TypeSection<?, TypeKey, ?> typeSection;
4742627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull private final FieldSection<?, ?, FieldRefKey, ?> fieldSection;
4842627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull private final MethodSection<?, ?, ?, MethodRefKey, ?> methodSection;
491bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final AnnotationSection<StringKey, TypeKey, ?, AnnotationElement, EncodedValue> annotationSection;
501bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
511bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public EncodedValueWriter(
521bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            @Nonnull DexDataWriter writer,
531bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            @Nonnull StringSection<StringKey, ?> stringSection,
541bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            @Nonnull TypeSection<?, TypeKey, ?> typeSection,
5542627b850c8f68a594f105e04b97c512b292b698Ben Gruver            @Nonnull FieldSection<?, ?, FieldRefKey, ?> fieldSection,
5642627b850c8f68a594f105e04b97c512b292b698Ben Gruver            @Nonnull MethodSection<?, ?, ?, MethodRefKey, ?> methodSection,
571bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            @Nonnull AnnotationSection<StringKey, TypeKey, ?, AnnotationElement, EncodedValue> annotationSection) {
581bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.writer = writer;
591bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.stringSection = stringSection;
601bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.typeSection = typeSection;
611bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.fieldSection = fieldSection;
621bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.methodSection = methodSection;
631bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.annotationSection = annotationSection;
641bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
651bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
661bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    protected abstract void writeEncodedValue(@Nonnull EncodedValue encodedValue) throws IOException;
671bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
681bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeAnnotation(TypeKey annotationType,
691bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                                Collection<? extends AnnotationElement> elements) throws IOException {
701bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedValueHeader(ValueType.ANNOTATION, 0);
711bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeUleb128(typeSection.getItemIndex(annotationType));
721bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeUleb128(elements.size());
731bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        for (AnnotationElement element: elements) {
741bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            writer.writeUleb128(stringSection.getItemIndex(annotationSection.getElementName(element)));
751bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            writeEncodedValue(annotationSection.getElementValue(element));
761bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        }
771bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
781bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
791bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeArray(Collection<? extends EncodedValue> elements) throws IOException {
801bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedValueHeader(ValueType.ARRAY, 0);
811bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeUleb128(elements.size());
821bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        for (EncodedValue element: elements) {
831bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            writeEncodedValue(element);
841bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        }
851bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
861bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
871bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeBoolean(boolean value) throws IOException {
881bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedValueHeader(ValueType.BOOLEAN, value ? 1 : 0);
891bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
901bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
911bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeByte(byte value) throws IOException {
921bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedInt(ValueType.BYTE, value);
931bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
941bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
951bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeChar(char value) throws IOException {
961bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedUint(ValueType.CHAR, value);
971bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
981bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
991bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeDouble(double value) throws IOException {
1001bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedDouble(ValueType.DOUBLE, value);
1011bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1021bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1031bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeEnum(@Nonnull FieldRefKey value) throws IOException {
1041bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedUint(ValueType.ENUM, fieldSection.getItemIndex(value));
1051bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1061bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1071bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeField(@Nonnull FieldRefKey value) throws IOException {
1081bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedUint(ValueType.FIELD, fieldSection.getItemIndex(value));
1091bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1101bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1111bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeFloat(float value) throws IOException {
1121bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedFloat(ValueType.FLOAT, value);
1131bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1141bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1151bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeInt(int value) throws IOException {
1161bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedInt(ValueType.INT, value);
1171bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1181bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1191bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeLong(long value) throws IOException {
1201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedLong(ValueType.LONG, value);
1211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1221bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeMethod(@Nonnull MethodRefKey value) throws IOException {
1241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedUint(ValueType.METHOD, methodSection.getItemIndex(value));
1251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeNull() throws IOException {
1281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.write(ValueType.NULL);
1291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeShort(int value) throws IOException {
1321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedInt(ValueType.SHORT, value);
1331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1341bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeString(@Nonnull StringKey value) throws IOException {
1361bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedUint(ValueType.STRING, stringSection.getItemIndex(value));
1371bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1381bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1391bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void writeType(@Nonnull TypeKey value) throws IOException {
1401bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        writer.writeEncodedUint(ValueType.TYPE, typeSection.getItemIndex(value));
1411bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1421bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver}
143