190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver/*
290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * Copyright 2016, Google Inc.
390cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * All rights reserved.
490cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver *
590cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * Redistribution and use in source and binary forms, with or without
690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * modification, are permitted provided that the following conditions are
790cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * met:
890cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver *
990cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * Redistributions of source code must retain the above copyright
1090cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * notice, this list of conditions and the following disclaimer.
1190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * Redistributions in binary form must reproduce the above
1290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * copyright notice, this list of conditions and the following disclaimer
1390cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * in the documentation and/or other materials provided with the
1490cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * distribution.
1590cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * Neither the name of Google Inc. nor the names of its
1690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * contributors may be used to endorse or promote products derived from
1790cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * this software without specific prior written permission.
1890cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver *
1990cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2090cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2390cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2490cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2590cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2790cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2890cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2990cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3090cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver */
3190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
3290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverpackage org.jf.baksmali;
3390cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
3490cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverimport com.beust.jcommander.JCommander;
3590cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverimport com.beust.jcommander.Parameter;
3690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverimport com.beust.jcommander.Parameters;
377f20300b92bbe4c2f7cf697848e67ee2bf6a8be8Ben Gruverimport org.jf.dexlib2.iface.ClassDef;
38ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruverimport org.jf.util.jcommander.ExtendedParameters;
3990cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
4090cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverimport javax.annotation.Nonnull;
4190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverimport java.util.List;
4290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
4390cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver@Parameters(commandDescription = "Lists the classes in a dex file.")
44ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver@ExtendedParameters(
45ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver        commandName = "classes",
46ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver        commandAliases = { "class", "c" })
4790cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruverpublic class ListClassesCommand extends DexInputCommand {
4890cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
4990cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver    @Parameter(names = {"-h", "-?", "--help"}, help = true,
5090cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver            description = "Show usage information")
5190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver    private boolean help;
5290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
53ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver    public ListClassesCommand(@Nonnull List<JCommander> commandAncestors) {
54ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver        super(commandAncestors);
5590cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver    }
5690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
5790cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver    @Override public void run() {
5890cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver        if (help || inputList == null || inputList.isEmpty()) {
59ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver            usage();
6090cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver            return;
6190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver        }
6290cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
6390cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver        if (inputList.size() > 1) {
6490cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver            System.err.println("Too many files specified");
65ca48e6f7d06931039352ebe3acda81457bcefcccBen Gruver            usage();
6690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver            return;
6790cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver        }
6890cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
6990cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver        String input = inputList.get(0);
708e1afdda32a3c6572e44ccba9150f18627bf834dBen Gruver        loadDexFile(input);
7190cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver
727f20300b92bbe4c2f7cf697848e67ee2bf6a8be8Ben Gruver        for (ClassDef classDef: dexFile.getClasses()) {
737f20300b92bbe4c2f7cf697848e67ee2bf6a8be8Ben Gruver            System.out.println(classDef.getType());
7490cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver        }
7590cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver    }
7690cacb9d0d153c06dcf5dd6c4887eeb50c8e93c2Ben Gruver}
77