content: /*
   * Copyright (C) 2011 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.taobao.android.dx.io;
  
  import com.taobao.android.dex.ClassDef;
  import com.taobao.android.dex.Dex;
  import com.taobao.android.dex.FieldId;
  import com.taobao.android.dex.MethodId;
  import com.taobao.android.dex.ProtoId;
  import com.taobao.android.dex.TableOfContents;
  import java.io.File;
  import java.io.IOException;
  
  /**
   * Executable that prints all indices of a dex file.
   */
  public final class DexIndexPrinter {
      private final Dex dex;
      private final TableOfContents tableOfContents;
  
      public DexIndexPrinter(File file) throws IOException {
          this.dex = new Dex(file);
          this.tableOfContents = dex.getTableOfContents();
      }
  
      private void printMap() {
          for (TableOfContents.Section section : tableOfContents.sections) {
              if (section.off != -1) {
                  System.out.println("section " + Integer.toHexString(section.type)
                          + " off=" + Integer.toHexString(section.off)
                          + " size=" + Integer.toHexString(section.size)
                          + " byteCount=" + Integer.toHexString(section.byteCount));
              }
          }
      }
  
      private void printStrings() throws IOException {
          int index = 0;
          for (String string : dex.strings()) {
              System.out.println("string " + index + ": " + string);
              index++;
          }
      }
  
      private void printTypeIds() throws IOException {
          int index = 0;
          for (Integer type : dex.typeIds()) {
              System.out.println("type " + index + ": " + dex.strings().get(type));
              index++;
          }
      }
  
      private void printProtoIds() throws IOException {
          int index = 0;
          for (ProtoId protoId : dex.protoIds()) {
              System.out.println("proto " + index + ": " + protoId);
              index++;
          }
      }
  
      private void printFieldIds() throws IOException {
          int index = 0;
          for (FieldId fieldId : dex.fieldIds()) {
              System.out.println("field " + index + ": " + fieldId);
              index++;
          }
      }
  
      private void printMethodIds() throws IOException {
          int index = 0;
          for (MethodId methodId : dex.methodIds()) {
              System.out.println("methodId " + index + ": " + methodId);
              index++;
          }
      }
  
      private void printTypeLists() throws IOException {
          if (tableOfContents.typeLists.off == -1) {
              System.out.println("No type lists");
              return;
          }
          Dex.Section in = dex.open(tableOfContents.typeLists.off);
          for (int i = 0; i < tableOfContents.typeLists.size; i++) {
              int size = in.readInt();
              System.out.print("Type list i=" + i + ", size=" + size + ", elements=");
              for (int t = 0; t < size; t++) {
                  System.out.print(" " + dex.typeNames().get((int) in.readShort()));
              }
              if (size % 2 == 1) {
                  in.readShort(); // retain alignment
              }
              System.out.println();
          }
      }
  
      private void printClassDefs() {
          int index = 0;
          for (ClassDef classDef : dex.classDefs()) {
              System.out.println("class def " + index + ": " + classDef);
              index++;
          }
      }
  
      public static void main(String[] args) throws IOException {
          DexIndexPrinter indexPrinter = new DexIndexPrinter(new File(args[0]));
          indexPrinter.printMap();
          indexPrinter.printStrings();
          indexPrinter.printTypeIds();
          indexPrinter.printProtoIds();
          indexPrinter.printFieldIds();
          indexPrinter.printMethodIds();
          indexPrinter.printTypeLists();
          indexPrinter.printClassDefs();
      }
  }
  