package org.jf.dexlib2.dexbacked;
import org.jf.dexlib2.Opcodes;
import org.jf.dexlib2.dexbacked.raw.CdexHeaderItem;
import org.jf.dexlib2.dexbacked.raw.HeaderItem;
import org.jf.dexlib2.util.DexUtil;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.UnsupportedEncodingException;
public class CDexBackedDexFile extends DexBackedDexFile {
public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) {
super(opcodes, buf, offset, verifyMagic);
}
public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull DexBuffer buf) {
super(opcodes, buf);
}
public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset) {
super(opcodes, buf, offset);
}
public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf) {
super(opcodes, buf);
}
public static boolean isCdex(byte[] buf, int offset) {
if (offset + 4 > buf.length) {
return false;
}
byte[] cdexMagic;
try {
cdexMagic = "cdex".getBytes("US-ASCII");
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException(ex);
}
return buf[offset] == cdexMagic[0] &&
buf[offset+1] == cdexMagic[1] &&
buf[offset+2] == cdexMagic[2] &&
buf[offset+3] == cdexMagic[3];
}
@Override
protected int getVersion(byte[] buf, int offset, boolean verifyMagic) {
if (verifyMagic) {
return DexUtil.verifyCdexHeader(buf, offset);
} else {
return CdexHeaderItem.getVersion(buf, offset);
}
}
@Override
protected Opcodes getDefaultOpcodes(int version) {
return Opcodes.forApi(28);
}
@Override
public int getBaseDataOffset() {
return getBuffer().readSmallUint(HeaderItem.DATA_START_OFFSET);
}
public int getDebugInfoOffsetsPos() {
return getBuffer().readSmallUint(CdexHeaderItem.DEBUG_INFO_OFFSETS_POS_OFFSET);
}
public int getDebugInfoOffsetsTableOffset() {
return getBuffer().readSmallUint(CdexHeaderItem.DEBUG_INFO_OFFSETS_TABLE_OFFSET);
}
public int getDebugInfoBase() {
return getBuffer().readSmallUint(CdexHeaderItem.DEBUG_INFO_BASE);
}
@Override
protected DexBackedMethodImplementation createMethodImplementation(
@Nonnull DexBackedDexFile dexFile, @Nonnull DexBackedMethod method, int codeOffset) {
return new CDexBackedMethodImplementation(dexFile, method, codeOffset);
}
}