package com.antfortune.freeline.router.schema;
import android.util.Log;
import com.antfortune.freeline.FreelineCore;
import com.antfortune.freeline.router.ISchemaAction;
import com.antfortune.freeline.server.EmbedHttpServer;
import com.antfortune.freeline.server.LongLinkServer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* Created by huangyong on 16/7/28.
*/
public class PushDexSchema implements ISchemaAction {
private static final String TAG = "Freeline.PushDex";
@Override
public String getDescription() {
return "pushDex";
}
@Override
public void handle(String method, String path, HashMap<String, String> headers, Map<String, String> queries, InputStream input, EmbedHttpServer.ResponseOutputStream response) throws Exception {
String dexName = queries.get("dexName");
File dexDir = new File(FreelineCore.getDynamicDexDir());
File file = new File(dexDir, dexName + ".pending");
File dir = new File(FreelineCore.getDynamicInfoTempDir());
File optDir = new File(dir, "opt");
if (!optDir.exists()) {
optDir.mkdirs();
}
String vmVersion = System.getProperty("java.vm.version");
File finalFile = null;
if (vmVersion != null && vmVersion.startsWith("2")) {
finalFile = new File(dexDir, dexName + ".apk");
} else {
finalFile = new File(dexDir, dexName + ".dex");
}
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[4096];
int l;
while ((l = input.read(buf)) != -1) {
fos.write(buf, 0, l);
}
fos.close();
LongLinkServer.markDexChanged();
response.setStatusCode(201);
boolean rst = file.renameTo(finalFile);
//FreelineCore.applyDynamicDex(finalFile.getAbsolutePath(), optDir.getAbsolutePath());
LongLinkServer.setDynamicDexPath(dexDir.getAbsolutePath());
LongLinkServer.setOptDirPath(optDir.getAbsolutePath());
Log.d(TAG, "dex file received (" + finalFile.length() + " bytes), rename result :" + rst + ", save to " + finalFile.getAbsolutePath());
}
}