含羞草 v2.1.6版本的 MD5 值为:6eb49dcd42f2b660ff6f51c70f543d8b
以下内容为反编译后的 SVGAParser.java 源代码,内容仅作参考
package com.opensource.svgaplayer;
import android.content.Context;
import android.content.res.AssetManager;
import android.net.http.HttpResponseCache;
import android.os.Handler;
import android.os.Looper;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import com.huawei.hms.scankit.C0072e;
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.proto.MovieEntity;
import com.opensource.svgaplayer.utils.log.LogUtils;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.Inflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import kotlin.Deprecated;
import kotlin.Metadata;
import kotlin.ReplaceWith;
import kotlin.Unit;
import kotlin.io.CloseableKt;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.Ref;
import kotlin.text.StringsKt;
import org.json.JSONObject;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
@Metadata(bv = {1, 0, 3}, d1 = {"\u0000|\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0006\n\u0002\u0010\b\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0012\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u000e\u0018\u0000 <2\u00020\u0001:\u0004<=>?B\u000f\u0012\b\u0010\u0002\u001a\u0004\u0018\u00010\u0003¢\u0006\u0002\u0010\u0004J$\u0010\u000f\u001a\u00020\u00102\u0006\u0010\u0011\u001a\u00020\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\n\b\u0002\u0010\u0015\u001a\u0004\u0018\u00010\u0016J$\u0010\u0017\u001a\u00020\u00102\u0006\u0010\u0018\u001a\u00020\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\b\u0010\u0019\u001a\u0004\u0018\u00010\u0012H\u0002JB\u0010\u001a\u001a\u00020\u00102\u0006\u0010\u001b\u001a\u00020\u001c2\u0006\u0010\u0018\u001a\u00020\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\b\b\u0002\u0010\u001d\u001a\u00020\u001e2\n\b\u0002\u0010\u0015\u001a\u0004\u0018\u00010\u00162\n\b\u0002\u0010\u0019\u001a\u0004\u0018\u00010\u0012J.\u0010\u001f\u001a\u00020\u00102\u0006\u0010\u0018\u001a\u00020\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\b\u0010\u0015\u001a\u0004\u0018\u00010\u00162\n\b\u0002\u0010\u0019\u001a\u0004\u0018\u00010\u0012J,\u0010 \u001a\n\u0012\u0004\u0012\u00020\u0010\u0018\u00010!2\u0006\u0010\"\u001a\u00020#2\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\n\b\u0002\u0010\u0015\u001a\u0004\u0018\u00010\u0016J\u0018\u0010$\u001a\u00020\u00102\u0006\u0010%\u001a\u00020&2\u0006\u0010'\u001a\u00020\u0012H\u0002J\u0012\u0010(\u001a\u0004\u0018\u00010)2\u0006\u0010*\u001a\u00020)H\u0002J\u000e\u0010+\u001a\u00020\u00102\u0006\u0010\u0002\u001a\u00020\u0003J$\u0010,\u001a\u00020\u00102\u0006\u0010-\u001a\u00020.2\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\b\u0010\u0019\u001a\u0004\u0018\u00010\u0012H\u0002J(\u0010/\u001a\u00020\u00102\n\u00100\u001a\u000601j\u0002`22\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\b\u0010\u0019\u001a\u0004\u0018\u00010\u0012H\u0002J\u0010\u00103\u001a\u00020\u001e2\u0006\u00104\u001a\u00020)H\u0002J,\u00105\u001a\u00020\u00102\u0006\u0010\u001b\u001a\u00020\u001c2\u0006\u0010\u0018\u001a\u00020\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u00142\b\b\u0002\u0010\u001d\u001a\u00020\u001eH\u0007J\u001a\u00105\u001a\u00020\u00102\u0006\u0010\"\u001a\u00020#2\b\u0010\u0013\u001a\u0004\u0018\u00010\u0014H\u0007J\u001a\u00105\u001a\u00020\u00102\u0006\u00106\u001a\u00020\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u0014H\u0007J\u0012\u00107\u001a\u0004\u0018\u00010)2\u0006\u0010\u001b\u001a\u00020\u001cH\u0002J\u0016\u00108\u001a\u00020\u00102\u0006\u00109\u001a\u00020\r2\u0006\u0010:\u001a\u00020\rJ\u0018\u0010;\u001a\u00020\u00102\u0006\u0010\u001b\u001a\u00020\u001c2\u0006\u0010\u0018\u001a\u00020\u0012H\u0002R\u001a\u0010\u0005\u001a\u00020\u0006X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0007\u0010\b\"\u0004\b\t\u0010\nR\u0010\u0010\u000b\u001a\u0004\u0018\u00010\u0003X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\f\u001a\u00020\rX\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u000e\u001a\u00020\rX\u0082\u000e¢\u0006\u0002\n\u0000¨\u0006@"}, d2 = {"Lcom/opensource/svgaplayer/SVGAParser;", "", "context", "Landroid/content/Context;", "(Landroid/content/Context;)V", "fileDownloader", "Lcom/opensource/svgaplayer/SVGAParser$FileDownloader;", "getFileDownloader", "()Lcom/opensource/svgaplayer/SVGAParser$FileDownloader;", "setFileDownloader", "(Lcom/opensource/svgaplayer/SVGAParser$FileDownloader;)V", "mContext", "mFrameHeight", "", "mFrameWidth", "decodeFromAssets", "", "name", "", "callback", "Lcom/opensource/svgaplayer/SVGAParser$ParseCompletion;", "playCallback", "Lcom/opensource/svgaplayer/SVGAParser$PlayCallback;", "decodeFromCacheKey", "cacheKey", "alias", "decodeFromInputStream", "inputStream", "Ljava/io/InputStream;", "closeInputStream", "", "decodeFromSVGAFileCacheKey", "decodeFromURL", "Lkotlin/Function0;", "url", "Ljava/net/URL;", "ensureUnzipSafety", "outputFile", "Ljava/io/File;", "dstDirPath", "inflate", "", "byteArray", "init", "invokeCompleteCallback", "videoItem", "Lcom/opensource/svgaplayer/SVGAVideoEntity;", "invokeErrorCallback", C0072e.a, "Ljava/lang/Exception;", "Lkotlin/Exception;", "isZipFile", "bytes", "parse", "assetsName", "readAsBytes", "setFrameSize", "frameWidth", "frameHeight", "unzip", "Companion", "FileDownloader", "ParseCompletion", "PlayCallback", BuildConfig.LIBRARY_PACKAGE_NAME}, k = 1, mv = {1, 1, 15})
public final class SVGAParser {
private static final String TAG = "SVGAParser";
private FileDownloader fileDownloader;
private Context mContext;
private volatile int mFrameHeight;
private volatile int mFrameWidth;
public static final Companion INSTANCE = new Companion(null);
private static final AtomicInteger threadNum = new AtomicInteger(0);
private static SVGAParser mShareParser = new SVGAParser(null);
private static ExecutorService threadPoolExecutor = Executors.newCachedThreadPool(new ThreadFactory() {
@Override
public final Thread newThread(Runnable runnable) {
AtomicInteger atomicInteger;
StringBuilder sb = new StringBuilder();
sb.append("SVGAParser-Thread-");
atomicInteger = SVGAParser.threadNum;
sb.append(atomicInteger.getAndIncrement());
return new Thread(runnable, sb.toString());
}
});
@Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\bf\u0018\u00002\u00020\u0001J\u0010\u0010\u0002\u001a\u00020\u00032\u0006\u0010\u0004\u001a\u00020\u0005H&J\b\u0010\u0006\u001a\u00020\u0003H&¨\u0006\u0007"}, d2 = {"Lcom/opensource/svgaplayer/SVGAParser$ParseCompletion;", "", "onComplete", "", "videoItem", "Lcom/opensource/svgaplayer/SVGAVideoEntity;", "onError", BuildConfig.LIBRARY_PACKAGE_NAME}, k = 1, mv = {1, 1, 15})
public interface ParseCompletion {
void onComplete(SVGAVideoEntity videoItem);
void onError();
}
@Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0000\bf\u0018\u00002\u00020\u0001J\u0016\u0010\u0002\u001a\u00020\u00032\f\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00060\u0005H&¨\u0006\u0007"}, d2 = {"Lcom/opensource/svgaplayer/SVGAParser$PlayCallback;", "", "onPlay", "", "file", "", "Ljava/io/File;", BuildConfig.LIBRARY_PACKAGE_NAME}, k = 1, mv = {1, 1, 15})
public interface PlayCallback {
void onPlay(List<? extends File> file);
}
public SVGAParser(Context context) {
this.mContext = context != null ? context.getApplicationContext() : null;
SVGACache.INSTANCE.onCreate(context);
this.fileDownloader = new FileDownloader();
}
@Metadata(bv = {1, 0, 3}, d1 = {"\u0000@\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000b\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\b\u0016\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J`\u0010\t\u001a\b\u0012\u0004\u0012\u00020\u000b0\n2\u0006\u0010\f\u001a\u00020\r2!\u0010\u000e\u001a\u001d\u0012\u0013\u0012\u00110\u0010¢\u0006\f\b\u0011\u0012\b\b\u0012\u0012\u0004\b\b(\u0013\u0012\u0004\u0012\u00020\u000b0\u000f2%\u0010\u0014\u001a!\u0012\u0017\u0012\u00150\u0015j\u0002`\u0016¢\u0006\f\b\u0011\u0012\b\b\u0012\u0012\u0004\b\b(\u0017\u0012\u0004\u0012\u00020\u000b0\u000fH\u0016R\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\b¨\u0006\u0018"}, d2 = {"Lcom/opensource/svgaplayer/SVGAParser$FileDownloader;", "", "()V", "noCache", "", "getNoCache", "()Z", "setNoCache", "(Z)V", "resume", "Lkotlin/Function0;", "", "url", "Ljava/net/URL;", "complete", "Lkotlin/Function1;", "Ljava/io/InputStream;", "Lkotlin/ParameterName;", "name", "inputStream", "failure", "Ljava/lang/Exception;", "Lkotlin/Exception;", C0072e.a, BuildConfig.LIBRARY_PACKAGE_NAME}, k = 1, mv = {1, 1, 15})
public static class FileDownloader {
private boolean noCache;
public final boolean getNoCache() {
return this.noCache;
}
public final void setNoCache(boolean z) {
this.noCache = z;
}
public Function0<Unit> resume(final URL url, final Function1<? super InputStream, Unit> complete, final Function1<? super Exception, Unit> failure) {
Intrinsics.checkParameterIsNotNull(url, "url");
Intrinsics.checkParameterIsNotNull(complete, "complete");
Intrinsics.checkParameterIsNotNull(failure, "failure");
final Ref.BooleanRef booleanRef = new Ref.BooleanRef();
booleanRef.element = false;
Function0<Unit> function0 = new Function0<Unit>() {
{
super(0);
}
@Override
public Unit invoke() {
invoke2();
return Unit.INSTANCE;
}
public final void invoke2() {
Ref.BooleanRef.this.element = true;
}
};
SVGAParser.INSTANCE.getThreadPoolExecutor$com_opensource_svgaplayer().execute(new Runnable() {
@Override
public final void run() {
try {
LogUtils.INSTANCE.info("SVGAParser", "================ svga file download start ================");
if (HttpResponseCache.getInstalled() == null && !SVGAParser.FileDownloader.this.getNoCache()) {
LogUtils.INSTANCE.error("SVGAParser", "SVGAParser can not handle cache before install HttpResponseCache. see https://github.com/yyued/SVGAPlayer-Android#cache");
LogUtils.INSTANCE.error("SVGAParser", "在配置 HttpResponseCache 前 SVGAParser 无法缓存. 查看 https://github.com/yyued/SVGAPlayer-Android#cache ");
}
URLConnection openConnection = url.openConnection();
if (!(openConnection instanceof HttpURLConnection)) {
openConnection = null;
}
HttpURLConnection httpURLConnection = (HttpURLConnection) openConnection;
if (httpURLConnection == null) {
return;
}
httpURLConnection.setConnectTimeout(AccessibilityNodeInfoCompat.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_MAX_LENGTH);
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setRequestProperty("Connection", "close");
httpURLConnection.connect();
ByteArrayInputStream inputStream = httpURLConnection.getInputStream();
try {
InputStream inputStream2 = inputStream;
inputStream = new ByteArrayOutputStream();
try {
ByteArrayOutputStream byteArrayOutputStream = inputStream;
byte[] bArr = new byte[4096];
while (true) {
if (booleanRef.element) {
LogUtils.INSTANCE.warn("SVGAParser", "================ svga file download canceled ================");
break;
}
int read = inputStream2.read(bArr, 0, 4096);
if (read == -1) {
break;
} else {
byteArrayOutputStream.write(bArr, 0, read);
}
}
if (booleanRef.element) {
LogUtils.INSTANCE.warn("SVGAParser", "================ svga file download canceled ================");
CloseableKt.closeFinally(inputStream, null);
CloseableKt.closeFinally(inputStream, null);
return;
}
inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
try {
LogUtils.INSTANCE.info("SVGAParser", "================ svga file download complete ================");
complete.invoke(inputStream);
Unit unit = Unit.INSTANCE;
CloseableKt.closeFinally(inputStream, null);
Unit unit2 = Unit.INSTANCE;
CloseableKt.closeFinally(inputStream, null);
Unit unit3 = Unit.INSTANCE;
CloseableKt.closeFinally(inputStream, null);
} finally {
}
} finally {
}
} finally {
}
} catch (Exception e) {
LogUtils.INSTANCE.error("SVGAParser", "================ svga file download fail ================");
LogUtils.INSTANCE.error("SVGAParser", "error: " + e.getMessage());
e.printStackTrace();
failure.invoke(e);
}
}
});
return function0;
}
}
public final FileDownloader getFileDownloader() {
return this.fileDownloader;
}
public final void setFileDownloader(FileDownloader fileDownloader) {
Intrinsics.checkParameterIsNotNull(fileDownloader, "<set-?>");
this.fileDownloader = fileDownloader;
}
@Metadata(bv = {1, 0, 3}, d1 = {"\u00004\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0006\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u000e\u0010\u0010\u001a\u00020\u00112\u0006\u0010\u0012\u001a\u00020\u0013J\u0006\u0010\u0014\u001a\u00020\u0006R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082T¢\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\bX\u0082\u0004¢\u0006\u0002\n\u0000R\"\u0010\t\u001a\n \u000b*\u0004\u0018\u00010\n0\nX\u0080\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\f\u0010\r\"\u0004\b\u000e\u0010\u000f¨\u0006\u0015"}, d2 = {"Lcom/opensource/svgaplayer/SVGAParser$Companion;", "", "()V", "TAG", "", "mShareParser", "Lcom/opensource/svgaplayer/SVGAParser;", "threadNum", "Ljava/util/concurrent/atomic/AtomicInteger;", "threadPoolExecutor", "Ljava/util/concurrent/ExecutorService;", "kotlin.jvm.PlatformType", "getThreadPoolExecutor$com_opensource_svgaplayer", "()Ljava/util/concurrent/ExecutorService;", "setThreadPoolExecutor$com_opensource_svgaplayer", "(Ljava/util/concurrent/ExecutorService;)V", "setThreadPoolExecutor", "", "executor", "Ljava/util/concurrent/ThreadPoolExecutor;", "shareParser", BuildConfig.LIBRARY_PACKAGE_NAME}, k = 1, mv = {1, 1, 15})
public static final class Companion {
private Companion() {
}
public Companion(DefaultConstructorMarker defaultConstructorMarker) {
this();
}
public final ExecutorService getThreadPoolExecutor$com_opensource_svgaplayer() {
return SVGAParser.threadPoolExecutor;
}
public final void setThreadPoolExecutor$com_opensource_svgaplayer(ExecutorService executorService) {
SVGAParser.threadPoolExecutor = executorService;
}
public final void setThreadPoolExecutor(ThreadPoolExecutor executor) {
Intrinsics.checkParameterIsNotNull(executor, "executor");
setThreadPoolExecutor$com_opensource_svgaplayer(executor);
}
public final SVGAParser shareParser() {
return SVGAParser.mShareParser;
}
}
public final void init(Context context) {
Intrinsics.checkParameterIsNotNull(context, "context");
this.mContext = context.getApplicationContext();
SVGACache.INSTANCE.onCreate(this.mContext);
}
public final void setFrameSize(int frameWidth, int frameHeight) {
this.mFrameWidth = frameWidth;
this.mFrameHeight = frameHeight;
}
public static void decodeFromAssets$default(SVGAParser sVGAParser, String str, ParseCompletion parseCompletion, PlayCallback playCallback, int i, Object obj) {
if ((i & 4) != 0) {
playCallback = null;
}
sVGAParser.decodeFromAssets(str, parseCompletion, playCallback);
}
public final void decodeFromAssets(final String name, final ParseCompletion callback, final PlayCallback playCallback) {
Intrinsics.checkParameterIsNotNull(name, "name");
if (this.mContext == null) {
LogUtils.INSTANCE.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。");
return;
}
LogUtils.INSTANCE.info(TAG, "================ decode " + name + " from assets ================");
threadPoolExecutor.execute(new Runnable() {
@Override
public final void run() {
Context context;
AssetManager assets;
InputStream open;
try {
context = SVGAParser.this.mContext;
if (context == null || (assets = context.getAssets()) == null || (open = assets.open(name)) == null) {
return;
}
SVGAParser.this.decodeFromInputStream(open, SVGACache.INSTANCE.buildCacheKey("file:///assets/" + name), callback, true, playCallback, name);
} catch (Exception e) {
SVGAParser.this.invokeErrorCallback(e, callback, name);
}
}
});
}
public static Function0 decodeFromURL$default(SVGAParser sVGAParser, URL url, ParseCompletion parseCompletion, PlayCallback playCallback, int i, Object obj) {
if ((i & 4) != 0) {
playCallback = null;
}
return sVGAParser.decodeFromURL(url, parseCompletion, playCallback);
}
public final Function0<Unit> decodeFromURL(final URL url, final ParseCompletion callback, final PlayCallback playCallback) {
Intrinsics.checkParameterIsNotNull(url, "url");
if (this.mContext == null) {
LogUtils.INSTANCE.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。");
return null;
}
final String url2 = url.toString();
Intrinsics.checkExpressionValueIsNotNull(url2, "url.toString()");
LogUtils.INSTANCE.info(TAG, "================ decode from url: " + url2 + " ================");
final String buildCacheKey = SVGACache.INSTANCE.buildCacheKey(url);
if (SVGACache.INSTANCE.isCached(buildCacheKey)) {
LogUtils.INSTANCE.info(TAG, "this url cached");
threadPoolExecutor.execute(new Runnable() {
@Override
public final void run() {
if (SVGACache.INSTANCE.isDefaultCache()) {
SVGAParser.this.decodeFromCacheKey(buildCacheKey, callback, url2);
} else {
SVGAParser.this.decodeFromSVGAFileCacheKey(buildCacheKey, callback, playCallback, url2);
}
}
});
return null;
}
LogUtils.INSTANCE.info(TAG, "no cached, prepare to download");
return this.fileDownloader.resume(url, new Function1<InputStream, Unit>() {
{
super(1);
}
@Override
public Unit invoke(InputStream inputStream) {
invoke2(inputStream);
return Unit.INSTANCE;
}
public final void invoke2(InputStream it) {
Intrinsics.checkParameterIsNotNull(it, "it");
SVGAParser.this.decodeFromInputStream(it, buildCacheKey, callback, false, playCallback, url2);
}
}, new Function1<Exception, Unit>() {
{
super(1);
}
@Override
public Unit invoke(Exception exc) {
invoke2(exc);
return Unit.INSTANCE;
}
public final void invoke2(Exception it) {
Intrinsics.checkParameterIsNotNull(it, "it");
LogUtils.INSTANCE.error("SVGAParser", "================ svga file: " + url + " download fail ================");
SVGAParser.this.invokeErrorCallback(it, callback, url2);
}
});
}
public static void decodeFromSVGAFileCacheKey$default(SVGAParser sVGAParser, String str, ParseCompletion parseCompletion, PlayCallback playCallback, String str2, int i, Object obj) {
if ((i & 8) != 0) {
str2 = null;
}
sVGAParser.decodeFromSVGAFileCacheKey(str, parseCompletion, playCallback, str2);
}
public final void decodeFromSVGAFileCacheKey(String cacheKey, ParseCompletion callback, PlayCallback playCallback, String alias) {
Intrinsics.checkParameterIsNotNull(cacheKey, "cacheKey");
threadPoolExecutor.execute(new SVGAParser$decodeFromSVGAFileCacheKey$1(this, alias, cacheKey, callback, playCallback));
}
public static void decodeFromInputStream$default(SVGAParser sVGAParser, InputStream inputStream, String str, ParseCompletion parseCompletion, boolean z, PlayCallback playCallback, String str2, int i, Object obj) {
PlayCallback playCallback2;
String str3;
boolean z2 = (i & 8) != 0 ? false : z;
if ((i & 16) != 0) {
playCallback2 = null;
} else {
playCallback2 = playCallback;
}
if ((i & 32) != 0) {
str3 = null;
} else {
str3 = str2;
}
sVGAParser.decodeFromInputStream(inputStream, str, parseCompletion, z2, playCallback2, str3);
}
public final void decodeFromInputStream(InputStream inputStream, String cacheKey, ParseCompletion callback, boolean closeInputStream, PlayCallback playCallback, String alias) {
Intrinsics.checkParameterIsNotNull(inputStream, "inputStream");
Intrinsics.checkParameterIsNotNull(cacheKey, "cacheKey");
if (this.mContext == null) {
LogUtils.INSTANCE.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。");
return;
}
LogUtils.INSTANCE.info(TAG, "================ decode " + alias + " from input stream ================");
threadPoolExecutor.execute(new SVGAParser$decodeFromInputStream$1(this, inputStream, cacheKey, callback, alias, playCallback, closeInputStream));
}
@Deprecated(message = "This method has been deprecated from 2.4.0.", replaceWith = @ReplaceWith(expression = "this.decodeFromAssets(assetsName, callback)", imports = {}))
public final void parse(String assetsName, ParseCompletion callback) {
Intrinsics.checkParameterIsNotNull(assetsName, "assetsName");
decodeFromAssets(assetsName, callback, null);
}
@Deprecated(message = "This method has been deprecated from 2.4.0.", replaceWith = @ReplaceWith(expression = "this.decodeFromURL(url, callback)", imports = {}))
public final void parse(URL url, ParseCompletion callback) {
Intrinsics.checkParameterIsNotNull(url, "url");
decodeFromURL(url, callback, null);
}
public static void parse$default(SVGAParser sVGAParser, InputStream inputStream, String str, ParseCompletion parseCompletion, boolean z, int i, Object obj) {
if ((i & 8) != 0) {
z = false;
}
sVGAParser.parse(inputStream, str, parseCompletion, z);
}
@Deprecated(message = "This method has been deprecated from 2.4.0.", replaceWith = @ReplaceWith(expression = "this.decodeFromInputStream(inputStream, cacheKey, callback, closeInputStream)", imports = {}))
public final void parse(InputStream inputStream, String cacheKey, ParseCompletion callback, boolean closeInputStream) {
Intrinsics.checkParameterIsNotNull(inputStream, "inputStream");
Intrinsics.checkParameterIsNotNull(cacheKey, "cacheKey");
decodeFromInputStream$default(this, inputStream, cacheKey, callback, closeInputStream, null, null, 32, null);
}
public final void invokeCompleteCallback(final SVGAVideoEntity videoItem, final ParseCompletion callback, final String alias) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public final void run() {
LogUtils.INSTANCE.info("SVGAParser", "================ " + alias + " parser complete ================");
SVGAParser.ParseCompletion parseCompletion = callback;
if (parseCompletion != null) {
parseCompletion.onComplete(videoItem);
}
}
});
}
public final void invokeErrorCallback(Exception e, final ParseCompletion callback, String alias) {
e.printStackTrace();
LogUtils.INSTANCE.error(TAG, "================ " + alias + " parser error ================");
LogUtils.INSTANCE.error(TAG, alias + " parse error", e);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public final void run() {
SVGAParser.ParseCompletion parseCompletion = SVGAParser.ParseCompletion.this;
if (parseCompletion != null) {
parseCompletion.onError();
}
}
});
}
public final void decodeFromCacheKey(String cacheKey, ParseCompletion callback, String alias) {
FileInputStream fileInputStream;
LogUtils.INSTANCE.info(TAG, "================ decode " + alias + " from cache ================");
LogUtils.INSTANCE.debug(TAG, "decodeFromCacheKey called with cacheKey : " + cacheKey);
if (this.mContext == null) {
LogUtils.INSTANCE.error(TAG, "在配置 SVGAParser context 前, 无法解析 SVGA 文件。");
return;
}
try {
File buildCacheDir = SVGACache.INSTANCE.buildCacheDir(cacheKey);
File file = new File(buildCacheDir, "movie.binary");
if (!file.isFile()) {
file = null;
}
if (file != null) {
try {
LogUtils.INSTANCE.info(TAG, "binary change to entity");
fileInputStream = new FileInputStream(file);
try {
LogUtils.INSTANCE.info(TAG, "binary change to entity success");
MovieEntity decode = MovieEntity.ADAPTER.decode(fileInputStream);
Intrinsics.checkExpressionValueIsNotNull(decode, "MovieEntity.ADAPTER.decode(it)");
invokeCompleteCallback(new SVGAVideoEntity(decode, buildCacheDir, this.mFrameWidth, this.mFrameHeight), callback, alias);
Unit unit = Unit.INSTANCE;
CloseableKt.closeFinally(fileInputStream, null);
} finally {
try {
throw th;
} finally {
}
}
} catch (Exception e) {
LogUtils.INSTANCE.error(TAG, "binary change to entity fail", e);
buildCacheDir.delete();
file.delete();
throw e;
}
}
File file2 = new File(buildCacheDir, "movie.spec");
if (!file2.isFile()) {
file2 = null;
}
if (file2 == null) {
return;
}
try {
LogUtils.INSTANCE.info(TAG, "spec change to entity");
fileInputStream = new FileInputStream(file2);
try {
FileInputStream fileInputStream2 = fileInputStream;
fileInputStream = new ByteArrayOutputStream();
try {
ByteArrayOutputStream byteArrayOutputStream = fileInputStream;
byte[] bArr = new byte[2048];
while (true) {
int read = fileInputStream2.read(bArr, 0, 2048);
if (read != -1) {
byteArrayOutputStream.write(bArr, 0, read);
} else {
JSONObject jSONObject = new JSONObject(byteArrayOutputStream.toString());
LogUtils.INSTANCE.info(TAG, "spec change to entity success");
invokeCompleteCallback(new SVGAVideoEntity(jSONObject, buildCacheDir, this.mFrameWidth, this.mFrameHeight), callback, alias);
Unit unit2 = Unit.INSTANCE;
CloseableKt.closeFinally(fileInputStream, null);
Unit unit3 = Unit.INSTANCE;
CloseableKt.closeFinally(fileInputStream, null);
return;
}
}
} finally {
}
} finally {
}
} catch (Exception e2) {
LogUtils.INSTANCE.error(TAG, alias + " movie.spec change to entity fail", e2);
buildCacheDir.delete();
file2.delete();
throw e2;
}
} catch (Exception e3) {
invokeErrorCallback(e3, callback, alias);
}
}
public final byte[] readAsBytes(InputStream inputStream) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ByteArrayOutputStream byteArrayOutputStream2 = byteArrayOutputStream;
byte[] bArr = new byte[2048];
while (true) {
int read = inputStream.read(bArr, 0, 2048);
if (read > 0) {
byteArrayOutputStream2.write(bArr, 0, read);
} else {
byte[] byteArray = byteArrayOutputStream2.toByteArray();
CloseableKt.closeFinally(byteArrayOutputStream, null);
return byteArray;
}
}
} finally {
}
}
public final byte[] inflate(byte[] byteArray) {
Inflater inflater = new Inflater();
inflater.setInput(byteArray, 0, byteArray.length);
byte[] bArr = new byte[2048];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ByteArrayOutputStream byteArrayOutputStream2 = byteArrayOutputStream;
while (true) {
int inflate = inflater.inflate(bArr, 0, 2048);
if (inflate > 0) {
byteArrayOutputStream2.write(bArr, 0, inflate);
} else {
inflater.end();
byte[] byteArray2 = byteArrayOutputStream2.toByteArray();
CloseableKt.closeFinally(byteArrayOutputStream, null);
return byteArray2;
}
}
} finally {
}
}
public final boolean isZipFile(byte[] bytes) {
return bytes.length > 4 && bytes[0] == 80 && bytes[1] == 75 && bytes[2] == 3 && bytes[3] == 4;
}
public final void unzip(InputStream inputStream, String cacheKey) {
LogUtils.INSTANCE.info(TAG, "================ unzip prepare ================");
File buildCacheDir = SVGACache.INSTANCE.buildCacheDir(cacheKey);
buildCacheDir.mkdirs();
try {
FileOutputStream bufferedInputStream = new BufferedInputStream(inputStream);
try {
bufferedInputStream = new ZipInputStream(bufferedInputStream);
try {
ZipInputStream zipInputStream = bufferedInputStream;
while (true) {
ZipEntry nextEntry = zipInputStream.getNextEntry();
if (nextEntry != null) {
String name = nextEntry.getName();
Intrinsics.checkExpressionValueIsNotNull(name, "zipItem.name");
if (!StringsKt.contains$default((CharSequence) name, (CharSequence) "../", false, 2, (Object) null)) {
String name2 = nextEntry.getName();
Intrinsics.checkExpressionValueIsNotNull(name2, "zipItem.name");
if (!StringsKt.contains$default((CharSequence) name2, (CharSequence) "/", false, 2, (Object) null)) {
File file = new File(buildCacheDir, nextEntry.getName());
String absolutePath = buildCacheDir.getAbsolutePath();
Intrinsics.checkExpressionValueIsNotNull(absolutePath, "cacheDir.absolutePath");
ensureUnzipSafety(file, absolutePath);
bufferedInputStream = new FileOutputStream(file);
try {
FileOutputStream fileOutputStream = bufferedInputStream;
byte[] bArr = new byte[2048];
while (true) {
int read = zipInputStream.read(bArr);
if (read <= 0) {
break;
} else {
fileOutputStream.write(bArr, 0, read);
}
}
Unit unit = Unit.INSTANCE;
CloseableKt.closeFinally(bufferedInputStream, null);
LogUtils.INSTANCE.error(TAG, "================ unzip complete ================");
zipInputStream.closeEntry();
} finally {
}
}
}
} else {
Unit unit2 = Unit.INSTANCE;
CloseableKt.closeFinally(bufferedInputStream, null);
Unit unit3 = Unit.INSTANCE;
CloseableKt.closeFinally(bufferedInputStream, null);
return;
}
}
} finally {
}
} finally {
}
} catch (Exception e) {
LogUtils.INSTANCE.error(TAG, "================ unzip error ================");
Exception exc = e;
LogUtils.INSTANCE.error(TAG, IjkMediaPlayer.OnNativeInvokeListener.ARG_ERROR, exc);
SVGACache sVGACache = SVGACache.INSTANCE;
String absolutePath2 = buildCacheDir.getAbsolutePath();
Intrinsics.checkExpressionValueIsNotNull(absolutePath2, "cacheDir.absolutePath");
sVGACache.clearDir$com_opensource_svgaplayer(absolutePath2);
buildCacheDir.delete();
throw exc;
}
}
private final void ensureUnzipSafety(File outputFile, String dstDirPath) {
String dstDirCanonicalPath = new File(dstDirPath).getCanonicalPath();
String outputFileCanonicalPath = outputFile.getCanonicalPath();
Intrinsics.checkExpressionValueIsNotNull(outputFileCanonicalPath, "outputFileCanonicalPath");
Intrinsics.checkExpressionValueIsNotNull(dstDirCanonicalPath, "dstDirCanonicalPath");
if (StringsKt.startsWith$default(outputFileCanonicalPath, dstDirCanonicalPath, false, 2, (Object) null)) {
return;
}
throw new IOException("Found Zip Path Traversal Vulnerability with " + dstDirCanonicalPath);
}
}