Vectras-VM-Android/app/src/main/java/com/vectras/vm/StartVM.java
2024-11-05 23:24:27 +02:00

177 lines
5.9 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;
import java.util.Objects;
public class StartVM {
public static String cache;
public static String env(Activity activity, String extras, String img, String cpu) {
String filesDir = activity.getFilesDir().getAbsolutePath();
String[] qemu = new String[0];
String bios = "";
ArrayList<String> params = new ArrayList<>(Arrays.asList(qemu));
if (MainSettingsManager.getArch(activity).equals("I386"))
params.add("qemu-system-i386");
else if (MainSettingsManager.getArch(activity).equals("X86_64"))
params.add("qemu-system-x86_64");
else if (MainSettingsManager.getArch(activity).equals("ARM64"))
params.add("qemu-system-aarch64");
else if (MainSettingsManager.getArch(activity).equals("PPC"))
params.add("qemu-system-ppc");
String ifType;
if (MainSettingsManager.getArch(activity).equals("ARM64"))
ifType = "ahci";
else
ifType= MainSettingsManager.getIfType(activity);
String cdrom;
String hdd1;
if (!(img.length() == 0)) {
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);
}
if (MainSettingsManager.getSharedFolder(activity)) {
String driveParams = "-drive ";
driveParams += "index=3,media=disk,file=fat:";
driveParams += "rw:"; //Disk Drives are always Read/Write
driveParams += FileUtils.getExternalFilesDirectory(activity).getPath() + "/SharedFolder,format=raw";
params.add(driveParams);
}
String memoryStr = "-m ";
memoryStr += RamInfo.vectrasMemory();
String boot = "-boot ";
boot += MainSettingsManager.getBoot(activity);
String soundDevice = "-audiodev pa,id=pa -device AC97,audiodev=pa";
//params.add(soundDevice);
if (MainSettingsManager.getArch(activity).equals("PPC")) {
bios = "-L ";
bios += "openbios-ppc";
} else if (MainSettingsManager.getArch(activity).equals("ARM64")) {
bios = "-pflash ";
bios += AppConfig.basefiledir + "QEMU_EFI.img";
bios += " -pflash ";
bios += AppConfig.basefiledir + "QEMU_VARS.img";
} else {
bios = "-bios ";
bios += AppConfig.basefiledir + "bios-vectras.bin";
}
String machine = "-M ";
if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) {
machine += "pc";
params.add(machine);
} else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM64")) {
machine += "virt";
params.add(machine);
}
params.add("-overcommit");
params.add("mem-lock=off");
params.add("-rtc");
params.add("base=localtime");
//if (!MainSettingsManager.getArch(activity).equals("PPC")) {
//params.add("-nodefaults");
//}
//if (!Objects.equals(MainSettingsManager.getArch(activity), "ARM64")) {
params.add(bios);
//}
params.add(boot);
params.add(memoryStr);
if (MainSettingsManager.getVmUi(activity).equals("VNC")) {
String vncStr = "-vnc ";
params.add(vncStr);
// Allow connections only from localhost using localsocket without a password
if (MainSettingsManager.getVncExternal(activity))
params.add(Config.defaultVNCHost + ":" + Config.defaultVNCPort);
else {
String qmpParams = "unix:";
qmpParams += Config.getLocalVNCSocketPath();
params.add(qmpParams);
}
if (!MainSettingsManager.getArch(activity).equals("PPC")) {
if (!MainSettingsManager.getArch(activity).equals("ARM64")) {
params.add("-monitor");
}
}
if (MainSettingsManager.getArch(activity).equals("ARM64")) {
//params.add("stdio");
} else if (!MainSettingsManager.getArch(activity).equals("PPC")) {
params.add("vc");
}
} 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("-display");
params.add("gtk");
}
params.add("-full-screen");
params.add("-qmp");
params.add("tcp:localhost:4444,server,nowait");
params.add(extras);
return String.join(" ", params);
}
}