فهرست منبع

scripting: add qemu additional arguments
read and update qemu additional argument of vm config

Naveenraj M 10 ماه پیش
والد
کامیت
a4a79fea7c
2فایلهای تغییر یافته به همراه48 افزوده شده و 0 حذف شده
  1. 13 0
      Scripting/UTM.sdef
  2. 35 0
      Scripting/UTMScriptingConfigImpl.swift

+ 13 - 0
Scripting/UTM.sdef

@@ -425,6 +425,11 @@
             description="List of serial configuration.">
             <type type="qemu serial configuration" list="yes"/>
           </property>
+          
+          <property name="qemu additional arguments" code="QeAd"
+            description="List of qemu arguments.">
+            <type type="qemu argument" list="yes"/>
+          </property>
         </record-type>
         
         <enumeration name="qemu directory share mode" code="QeSm" description="Method for sharing directory in QEMU.">
@@ -534,6 +539,14 @@
               description="The port number to listen on when the interface is a TCP server."/>
         </record-type>
         
+        <record-type name="qemu argument" code="QeAr" description="QEMU argument configuration.">
+          <property name="string" code="StAg" type="text"
+            description="The QEMU argument as a string."/>
+            
+          <property name="file urls" code="FlUr" type="file" list="yes"
+            description="Optional URLs associated with this argument."/>
+        </record-type>
+        
         <record-type name="apple configuration" code="ApCf" description="Apple virtual machine configuration.">
           <property name="name" code="pnam" type="text"
             description="Virtual machine name."/>

+ 35 - 0
Scripting/UTMScriptingConfigImpl.swift

@@ -107,6 +107,7 @@ extension UTMScriptingConfigImpl {
             "drives": config.drives.map({ serializeQemuDriveExisting($0) }),
             "networkInterfaces": config.networks.enumerated().map({ serializeQemuNetwork($1, index: $0) }),
             "serialPorts": config.serials.enumerated().map({ serializeQemuSerial($1, index: $0) }),
+            "qemuAdditionalArguments": config.qemu.additionalArguments.map({ serializeQemuAdditionalArgument($0)}),
         ]
     }
     
@@ -188,6 +189,19 @@ extension UTMScriptingConfigImpl {
         ]
     }
     
+    private func serializeQemuAdditionalArgument(_ argument: QEMUArgument) -> [AnyHashable: Any] {
+        var serializedArgument: [AnyHashable: Any] = [
+            "string": argument.string
+        ]
+        
+        // Only add fileUrls if it is not nil and contains URLs
+        if let fileUrls = argument.fileUrls, !fileUrls.isEmpty {
+            serializedArgument["fileUrls"] = fileUrls.map({ $0 as AnyHashable })
+        }
+        
+        return serializedArgument
+    }
+    
     private func serializeAppleConfiguration(_ config: UTMAppleConfiguration) -> [AnyHashable : Any] {
         [
             "name": config.information.name,
@@ -338,6 +352,9 @@ extension UTMScriptingConfigImpl {
         if let serialPorts = record["serialPorts"] as? [[AnyHashable : Any]] {
             try updateQemuSerials(from: serialPorts)
         }
+        if let qemuAdditionalArguments = record["qemuAdditionalArguments"] as? [[AnyHashable: Any]] {
+            try updateQemuAdditionalArguments(from: qemuAdditionalArguments)
+        }
     }
     
     private func parseQemuDriveInterface(_ value: AEKeyword?) -> QEMUDriveInterface? {
@@ -500,6 +517,24 @@ extension UTMScriptingConfigImpl {
         }
     }
     
+    private func updateQemuAdditionalArguments(from records: [[AnyHashable: Any]]) throws {
+        let config = config as! UTMQemuConfiguration
+        let additionalArguments = records.compactMap { record -> QEMUArgument? in
+            guard let argumentString = record["string"] as? String else { return nil }
+            var argument = QEMUArgument(argumentString)
+            // Qemu Additional Arguments in UI, only takes strings
+            // So, fileUrls of arguments will never be used
+            // This is here if they support in future
+            if let fileUrls = record["fileUrls"] as? [URL] {
+                argument.fileUrls = fileUrls
+            }
+            return argument
+        }
+        // Update entire additional arguments with new one.
+        config.qemu.additionalArguments = additionalArguments
+    }
+        
+    
     private func updateAppleConfiguration(from record: [AnyHashable : Any]) throws {
         let config = config as! UTMAppleConfiguration
         if let name = record["name"] as? String, !name.isEmpty {