Vectras-VM-Android/app/src/main/java/com/vectras/vm/StartVM.java
2024-04-18 23:01:02 +02:00

184 lines
5.2 KiB
Java

package com.vectras.vm;
import android.app.Activity;
import android.content.Intent;
import com.vectras.qemu.Config;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.qemu.utils.RamInfo;
import com.vectras.vm.utils.FileUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
public class StartVM {
public static String cache;
static String[] qemu = new String[]{"qemu-system-x86_64"};
public static String env(Activity activity, String extras, String img) {
String filesDir = activity.getFilesDir().getAbsolutePath();
ArrayList<String> params = new ArrayList<>(Arrays.asList(qemu));
String ifType = MainSettingsManager.getIfType(activity);
String cdrom;
String hdd1;
String hdd2;
String hdd0 = "-drive";
hdd0 += " index=0";
hdd0 += ",media=disk";
hdd0 += ",if=" + ifType;
hdd0 += ",file='" + img + "'";
params.add(hdd0);
File cdromFile = new File(filesDir + "/data/Vectras/drive.iso");
if (cdromFile.exists()) {
cdrom = "-drive";
cdrom += " index=1";
cdrom += ",media=cdrom";
cdrom += ",file='" + cdromFile.getPath() + "'";
params.add(cdrom);
}
File hdd1File = new File(filesDir + "/data/Vectras/hdd1.qcow2");
if (hdd1File.exists()) {
hdd1 = "-drive";
hdd1 += " index=2";
hdd1 += ",media=disk";
hdd1 += ",if=" + ifType;
hdd1 += ",file='" + hdd1File.getPath() + "'";
params.add(hdd1);
}
File hdd2File = new File(filesDir + "/data/Vectras/hdd2.qcow2");
if (hdd2File.exists()) {
hdd2 = "-drive";
hdd2 += " index=3";
hdd2 += ",media=disk";
hdd2 += ",if=" + ifType;
hdd2 += ",file='" + hdd2File.getPath() + "'";
params.add(hdd2);
}
if (MainSettingsManager.getSharedFolder(activity)) {
params.add("-net user,smb='" + FileUtils.getExternalFilesDirectory(activity).getPath() + "/SharedFolder" + "'");
params.add("-net nic,model=virtio");
}
boolean kvm = MainSettingsManager.getKvm(activity);
boolean avx = MainSettingsManager.getAvx(activity);
String cpuStr = "-cpu " + MainSettingsManager.getCpu(activity);
if (avx)
cpuStr += ",+avx";
String smpCores = "-smp ";
smpCores += MainSettingsManager.getCpuCores(activity);
String memoryStr = "-m ";
memoryStr += RamInfo.vectrasMemory();
String acclerationStr;
if (kvm)
acclerationStr = "-accel kvm";
else
acclerationStr = "-accel tcg,thread=multi";
acclerationStr += ",tb-size=" + MainSettingsManager.getTbSize(activity);
String boot = "-boot ";
boot += MainSettingsManager.getBoot(activity);
String soundDevice = "-audiodev pa,id=pa -device AC97,audiodev=pa";
//params.add(soundDevice);
String bios = "-bios ";
bios += AppConfig.basefiledir + "/bios-vectras.bin";
String machine = "-M ";
machine += "pc";
params.add(machine);
params.add("-overcommit");
params.add("mem-lock=off");
params.add("-rtc");
params.add("base=localtime");
params.add("-nodefaults");
params.add(bios);
params.add(boot);
params.add(memoryStr);
params.add(cpuStr);
params.add(smpCores);
params.add(acclerationStr);
params.add(MainSettingsManager.getCustomParams(activity));
if (MainSettingsManager.getVmUi(activity).equals("VNC")) {
String vncStr = "-vnc ";
//params.add(vncStr);
// Allow connections only from localhost using localsocket without a password
//params.add(Config.defaultVNCHost+":" + Config.defaultVNCPort);
String qmpParams = "unix:";
qmpParams += Config.getLocalVNCSocketPath();
//params.add(qmpParams);
} else if (MainSettingsManager.getVmUi(activity).equals("SPICE")) {
String spiceStr = "-spice ";
spiceStr += "port=6999,disable-ticketing=on";
params.add(spiceStr);
} else if (MainSettingsManager.getVmUi(activity).equals("X11")) {
}
params.add("-monitor");
params.add("vc");
//XXX: monitor, serial, and parallel display crashes cause SDL doesn't support more than 1 window
params.add("-monitor");
params.add("none");
params.add("-serial");
params.add("none");
params.add("-parallel");
params.add("none");
params.add("-k");
params.add("en-us");
params.add("-usb");
if (!MainSettingsManager.getMouse(activity).equals("ps2-mouse")) {
params.add("-device");
params.add(MainSettingsManager.getMouse(activity));
}
if (!MainSettingsManager.getKeyboard(activity).equals("ps2-kbd")) {
params.add("-device");
params.add(MainSettingsManager.getKeyboard(activity));
}
params.add(extras);
params.add(MainSettingsManager.getCustomParams(activity));
return String.join(" ", params);
}
}