diff --git a/Managers/UTMQemuVirtualMachine+Terminal.h b/Managers/UTMQemuVirtualMachine+Terminal.h deleted file mode 100644 index e594afa5..00000000 --- a/Managers/UTMQemuVirtualMachine+Terminal.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright © 2020 osy. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "UTMQemuVirtualMachine.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface UTMQemuVirtualMachine (Terminal) - -- (void)sendInput:(NSString*)inputStr; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Managers/UTMQemuVirtualMachine+Terminal.m b/Managers/UTMQemuVirtualMachine+Terminal.m deleted file mode 100644 index 320f776d..00000000 --- a/Managers/UTMQemuVirtualMachine+Terminal.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// Copyright © 2020 osy. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "UTMQemuVirtualMachine+Terminal.h" -#import "UTMSpiceIO.h" - -@interface UTMQemuVirtualMachine () - -@property (nonatomic, readonly, nullable) UTMSpiceIO *ioService; - -@end - -@implementation UTMQemuVirtualMachine (Terminal) - -- (void)sendInput:(NSString *)inputStr { - abort(); // FIXME: implement with SPICE port -} - -@end diff --git a/Managers/UTMTerminal.h b/Managers/UTMTerminal.h deleted file mode 100644 index 87f35d52..00000000 --- a/Managers/UTMTerminal.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// UTMTerminal.h -// UTM -// -// Created by Kacper Raczy on 29/02/2020. -// Copyright © 2020 Kacper Raczy. All rights reserved. -// - -#import -#import "UTMTerminalDelegate.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface UTMTerminal : NSObject - -@property (nonatomic, readonly) NSURL* outPipeURL; -@property (nonatomic, readonly) NSURL* inPipeURL; -@property (nonatomic, weak, nullable) id delegate; - -- (id)initWithURL: (NSURL*) url; -- (BOOL)connectWithError: (NSError** _Nullable) error; -- (void)disconnect; -- (BOOL)isConnected; -- (void)sendInput: (NSString*) inputStr; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Managers/UTMTerminal.m b/Managers/UTMTerminal.m deleted file mode 100644 index 2a4dc3e9..00000000 --- a/Managers/UTMTerminal.m +++ /dev/null @@ -1,242 +0,0 @@ -// -// UTMTerminal.m -// UTM -// -// Created by Kacper Raczy on 29/02/2020. -// Copyright © 2020 Kacper Raczy. All rights reserved. -// - -#import "UTMLogging.h" -#import "UTMTerminal.h" -#include -#include - -#define kUTMTerminalBufferSize 2048 - -dispatch_io_t createInputIO(NSURL* url, dispatch_queue_t queue) { - const char* cPath = [[url path] cStringUsingEncoding: NSUTF8StringEncoding]; - dispatch_io_t io = - dispatch_io_create_with_path( - DISPATCH_IO_STREAM, - cPath, - O_RDWR | O_NONBLOCK, - 0, - queue, - ^(int error) { - UTMLog(@"Input dispatch_io is being closed"); - }); - - return io; -} - -@interface UTMTerminal () - -@property (strong, nonatomic, nonnull) dispatch_queue_t inputQueue; -@property (strong, nonatomic, nonnull) dispatch_queue_t outputQueue; -@property (strong, nonatomic, nonnull) dispatch_io_t inputPipeIO; -@property (strong, nonatomic, nullable) dispatch_source_t outputObservationSource; - -@end - -@implementation UTMTerminal { - int32_t _outPipeFd; - uint8_t _byteBuffer[kUTMTerminalBufferSize]; -} - -- (id)initWithURL: (NSURL*) url { - self = [super init]; - if (self) { - // serial queues for input/output processing - self->_outputQueue = dispatch_queue_create("com.utmapp.UTM.TerminalOutputQueue", NULL); - self->_inputQueue = dispatch_queue_create("com.utmapp.UTM.TerminalInputQueue", NULL); - - self->_outPipeFd = -1; - if (![self configurePipesUsingURL: url]) { - UTMLog(@"Terminal configutation failed!"); - [self cleanup]; - return nil; - } - // setup non-blocking io for writing - self->_inputPipeIO = createInputIO(_inPipeURL, _inputQueue); - if (self->_inputPipeIO == nil) { - UTMLog(@"Terminal configutation failed!"); - [self cleanup]; - return nil; - } - } - return self; -} - -#pragma mark - Configuration - -- (BOOL)configurePipesUsingURL: (NSURL*) url { - if ([self isConfigured]) { - return YES; - } - - // paths - NSURL* outPipeURL = [url URLByAppendingPathExtension: @"out"]; - NSURL* inPipeURL = [url URLByAppendingPathExtension: @"in"]; - // create named pipes usign mkfifos - const char* outPipeCPath = [[outPipeURL path] cStringUsingEncoding: NSUTF8StringEncoding]; - if (access(outPipeCPath, F_OK) != -1 && remove(outPipeCPath) != 0) { - UTMLog(@"Failed to remove existing out pipe"); - return NO; - } - if (mkfifo(outPipeCPath, 0666) != 0) { - UTMLog(@"Failed to create output pipe using mkfifo!"); - return NO; - } - - const char* inPipeCPath = [[inPipeURL path] cStringUsingEncoding: NSUTF8StringEncoding]; - if (access(inPipeCPath, F_OK) != -1 && remove(inPipeCPath) != 0) { - UTMLog(@"Failed to remove existing in pipe"); - return NO; - } - if (mkfifo(inPipeCPath, 0666) != 0) { - UTMLog(@"Failed to create input pipe using mkfifo!"); - return NO; - } - - self->_outPipeURL = outPipeURL; - self->_inPipeURL = inPipeURL; - - return YES; -} - -- (BOOL)isConfigured { - if (_outPipeURL == nil || _inPipeURL == nil) { - return NO; - } - - return - [[NSFileManager defaultManager] fileExistsAtPath: [_outPipeURL path]] && - [[NSFileManager defaultManager] fileExistsAtPath: [_inPipeURL path]]; -} - -#pragma mark - Connection - -- (BOOL)connectWithError: (NSError** _Nullable) error { - if (![self isConfigured]) { - *error = [UTMTerminal notInitializedError]; - return NO; - } - - const char* pipeCPath = [[_outPipeURL path] cStringUsingEncoding: NSUTF8StringEncoding]; - _outPipeFd = open(pipeCPath, O_RDONLY | O_NONBLOCK); - if (_outPipeFd == -1) { - *error = [UTMTerminal namedPipeError]; - return NO; - } - - _outputObservationSource = [self startObservationUsingDescriptor: _outPipeFd queue: _outputQueue]; - return YES; -} - -- (void)disconnect { - if (_outputObservationSource != nil) { - dispatch_source_cancel(_outputObservationSource); - } - - if (_outPipeFd != -1) { - close(_outPipeFd); - } - - if (_inputPipeIO != nil) { - dispatch_io_close(_inputPipeIO, DISPATCH_IO_STOP); - } - UTMLog(@"Successfuly disconnected!"); -} - -- (BOOL)isConnected { - return _outputObservationSource != nil; -} - -#pragma mark - Output pipe observation - -- (dispatch_source_t)startObservationUsingDescriptor: (int32_t) fd queue: (dispatch_queue_t) queue { - dispatch_source_t source = - dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, fd, 0, queue); - dispatch_source_set_event_handler(source, ^{ - size_t estimated = dispatch_source_get_data(source); - NSData* bytesRead = [self evaluateChangesForDescriptor: fd estimatedSize: estimated]; - if (bytesRead != nil) { - [[self delegate] terminal: self didReceiveData: bytesRead]; - } - }); - dispatch_source_set_cancel_handler(source, ^{ - UTMLog(@"Source got cancelled"); - }); - dispatch_resume(source); - - return source; -} - -- (NSData* _Nullable)evaluateChangesForDescriptor: (int32_t) fd estimatedSize: (size_t) estimated { - NSData* data; - size_t step = (estimated > kUTMTerminalBufferSize) ? kUTMTerminalBufferSize : estimated; - ssize_t bytesRead; - - if ((bytesRead = read(fd, self->_byteBuffer, step)) > 0) { - data = [NSData dataWithBytes: self->_byteBuffer length: bytesRead]; - } - - return data; -} - -- (void)sendInput:(NSString *)inputStr { - const char* bytes = [inputStr UTF8String]; - NSUInteger length = [inputStr lengthOfBytesUsingEncoding: NSUTF8StringEncoding]; - dispatch_data_t messageData = dispatch_data_create(bytes, length, _inputQueue, DISPATCH_DATA_DESTRUCTOR_DEFAULT); - dispatch_io_write(_inputPipeIO, 0, messageData, _inputQueue, ^(bool done, dispatch_data_t _Nullable data, int error) { - UTMLog(@"Input write done: %d with error: %d", done, error); - }); -} - -#pragma mark - Cleanup - -- (void)dealloc { - [self disconnect]; - [self cleanup]; -} - -- (void)cleanup { - NSFileManager* fm = [NSFileManager defaultManager]; - - if (_inputPipeIO != nil) { - dispatch_io_close(_inputPipeIO, DISPATCH_IO_STOP); - } - - if (_inPipeURL != nil) { - [fm removeItemAtURL: _inPipeURL error: nil]; - } - - if (_outPipeURL != nil) { - [fm removeItemAtURL: _outPipeURL error: nil]; - } - UTMLog(@"Cleanup completed!"); -} - -#pragma mark - Custom errors - -+ (NSString*)errorDomain { - return @"com.raczy.TerminalError"; -} - -+ (NSError*)namedPipeError { - NSString* domain = [self errorDomain]; - NSDictionary* userInfo = @{ - NSLocalizedDescriptionKey: @"Unable to create/open named pipe." - }; - return [NSError errorWithDomain: domain code: 1 userInfo: userInfo]; -} - -+ (NSError*)notInitializedError { - NSString* domain = [self errorDomain]; - NSDictionary* userInfo = @{ - NSLocalizedDescriptionKey: @"Terminal not initialized" - }; - return [NSError errorWithDomain: domain code: 1 userInfo: userInfo]; -} - -@end diff --git a/Managers/UTMTerminalDelegate.h b/Managers/UTMTerminalDelegate.h deleted file mode 100644 index ab3d05ca..00000000 --- a/Managers/UTMTerminalDelegate.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// UTMTerminalDelegate.h -// UTM -// -// Created by Kacper Raczy on 29/02/2020. -// Copyright © 2020 Kacper Raczy. All rights reserved. -// - -#import - -@class UTMTerminal; - -NS_ASSUME_NONNULL_BEGIN - -@protocol UTMTerminalDelegate -- (void)terminal: (UTMTerminal*) terminal didReceiveData: (NSData*) data; -@end - -NS_ASSUME_NONNULL_END diff --git a/Platform/Swift-Bridging-Header.h b/Platform/Swift-Bridging-Header.h index 26660797..fc5406bf 100644 --- a/Platform/Swift-Bridging-Header.h +++ b/Platform/Swift-Bridging-Header.h @@ -39,10 +39,7 @@ #include "UTMQemuVirtualMachine.h" #include "UTMQemuVirtualMachine+Drives.h" #include "UTMQemuVirtualMachine+SPICE.h" -#include "UTMQemuVirtualMachine+Terminal.h" #include "UTMSpiceIO.h" -#include "UTMTerminal.h" -#include "UTMTerminalDelegate.h" #if TARGET_OS_IPHONE #include "AppDelegate.h" #include "UIViewController+Extensions.h" diff --git a/UTM.xcodeproj/project.pbxproj b/UTM.xcodeproj/project.pbxproj index 59780e67..9b4416e4 100644 --- a/UTM.xcodeproj/project.pbxproj +++ b/UTM.xcodeproj/project.pbxproj @@ -178,7 +178,6 @@ CE0B6D0024AD56AE00FE012D /* UTMVirtualMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5F165B2261395000F3D56B /* UTMVirtualMachine.m */; }; CE0B6D0124AD56AE00FE012D /* UTMJSONStream.m in Sources */ = {isa = PBXBuildFile; fileRef = CE36B26922763F28004A1435 /* UTMJSONStream.m */; }; CE0B6D0224AD56AE00FE012D /* UTMQemu.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9D197B226542FE00355E14 /* UTMQemu.m */; }; - CE0B6D0324AD56AE00FE012D /* UTMTerminal.m in Sources */ = {isa = PBXBuildFile; fileRef = E28394B3240C20E0006742E2 /* UTMTerminal.m */; }; CE0B6D0424AD56AE00FE012D /* UTMSpiceIO.m in Sources */ = {isa = PBXBuildFile; fileRef = E2D64BC8241DB24B0034E0C6 /* UTMSpiceIO.m */; }; CE0B6D0724AD56AE00FE012D /* UTMQemuManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CE36B280227668D1004A1435 /* UTMQemuManager.m */; }; CE0B6D0824AD56C300FE012D /* qapi-visit-core.c in Sources */ = {isa = PBXBuildFile; fileRef = CECC764F2273A7D50059B955 /* qapi-visit-core.c */; }; @@ -544,7 +543,6 @@ CE2D932024AD46670059923A /* cf-output-visitor.c in Sources */ = {isa = PBXBuildFile; fileRef = CECC76502273A7D50059B955 /* cf-output-visitor.c */; }; CE2D932124AD46670059923A /* qapi-types-audio.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C11423FCEC06001177D6 /* qapi-types-audio.c */; }; CE2D932224AD46670059923A /* VMScroll.m in Sources */ = {isa = PBXBuildFile; fileRef = CE20FAE72448D2BE0059AE11 /* VMScroll.m */; }; - CE2D932324AD46670059923A /* UTMTerminal.m in Sources */ = {isa = PBXBuildFile; fileRef = E28394B3240C20E0006742E2 /* UTMTerminal.m */; }; CE2D932524AD46670059923A /* qapi-types-char.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C12023FCEC07001177D6 /* qapi-types-char.c */; }; CE2D932824AD46670059923A /* qapi-visit-audio.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C0BE23FCEC02001177D6 /* qapi-visit-audio.c */; }; CE2D932924AD46670059923A /* qapi-builtin-visit.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C09623FCEC00001177D6 /* qapi-builtin-visit.c */; }; @@ -824,7 +822,6 @@ CEA45E74263519B5002FA97D /* qapi-types-common.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C0C623FCEC02001177D6 /* qapi-types-common.c */; }; CEA45E75263519B5002FA97D /* qapi-types-transaction.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C13423FCEC08001177D6 /* qapi-types-transaction.c */; }; CEA45E76263519B5002FA97D /* VMConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE31C24A225EA37400A965DD /* VMConfigViewController.m */; }; - CEA45E77263519B5002FA97D /* UTMQemuVirtualMachine+Terminal.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF83ECB24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m */; }; CEA45E78263519B5002FA97D /* VMConfigInputViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE74C27F225D88EC004E4FF1 /* VMConfigInputViewController.m */; }; CEA45E79263519B5002FA97D /* VMRemovableDrivesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4EF26F2506DBFD00E9D33B /* VMRemovableDrivesViewController.swift */; }; CEA45E7A263519B5002FA97D /* UTMSpiceIO.m in Sources */ = {isa = PBXBuildFile; fileRef = E2D64BC8241DB24B0034E0C6 /* UTMSpiceIO.m */; }; @@ -980,7 +977,6 @@ CEA45F18263519B5002FA97D /* VMConfigCreateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE31C24C225EA4A200A965DD /* VMConfigCreateViewController.m */; }; CEA45F19263519B5002FA97D /* VMScroll.m in Sources */ = {isa = PBXBuildFile; fileRef = CE20FAE72448D2BE0059AE11 /* VMScroll.m */; }; CEA45F1A263519B5002FA97D /* VMConfigNetworkPortForwardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2D954D24AD4F980059923A /* VMConfigNetworkPortForwardView.swift */; }; - CEA45F1B263519B5002FA97D /* UTMTerminal.m in Sources */ = {isa = PBXBuildFile; fileRef = E28394B3240C20E0006742E2 /* UTMTerminal.m */; }; CEA45F1D263519B5002FA97D /* VMConfigSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBCAF5324353B3700C2B423 /* VMConfigSwitch.m */; }; CEA45F1E263519B5002FA97D /* qapi-types-char.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C12023FCEC07001177D6 /* qapi-types-char.c */; }; CEA45F20263519B5002FA97D /* qapi-visit-audio.c in Sources */ = {isa = PBXBuildFile; fileRef = CE23C0BE23FCEC02001177D6 /* qapi-visit-audio.c */; }; @@ -1220,8 +1216,6 @@ CEF83EC324F9C9E100557D15 /* UTMDrive.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF83EC124F9C9E100557D15 /* UTMDrive.m */; }; CEF83EC724FB1B9300557D15 /* UTMQemuVirtualMachine+SPICE.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF83EC624FB1B9300557D15 /* UTMQemuVirtualMachine+SPICE.m */; }; CEF83EC824FB1B9300557D15 /* UTMQemuVirtualMachine+SPICE.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF83EC624FB1B9300557D15 /* UTMQemuVirtualMachine+SPICE.m */; }; - CEF83ECC24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF83ECB24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m */; }; - CEF83ECD24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF83ECB24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m */; }; CEF83F262500901300557D15 /* qemu in Resources */ = {isa = PBXBuildFile; fileRef = CE9D18F72265410E00355E14 /* qemu */; }; CEF83F862500947D00557D15 /* gcrypt.20.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE2D63F322653C7400FC7E63 /* gcrypt.20.framework */; }; CEF83F872500948800557D15 /* gpg-error.0.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE2D63F122653C7400FC7E63 /* gpg-error.0.framework */; }; @@ -2170,14 +2164,9 @@ CEF83EC124F9C9E100557D15 /* UTMDrive.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UTMDrive.m; sourceTree = ""; }; CEF83EC624FB1B9300557D15 /* UTMQemuVirtualMachine+SPICE.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UTMQemuVirtualMachine+SPICE.m"; sourceTree = ""; }; CEF83EC924FB1BB200557D15 /* UTMQemuVirtualMachine+SPICE.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UTMQemuVirtualMachine+SPICE.h"; sourceTree = ""; }; - CEF83ECA24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UTMQemuVirtualMachine+Terminal.h"; sourceTree = ""; }; - CEF83ECB24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UTMQemuVirtualMachine+Terminal.m"; sourceTree = ""; }; CEFC6CDC24C25697003F6962 /* VMDriveImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMDriveImage.swift; sourceTree = ""; }; E2151A57241451120008E6AC /* UIViewController+Extensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIViewController+Extensions.h"; sourceTree = ""; }; E2151A58241451120008E6AC /* UIViewController+Extensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+Extensions.m"; sourceTree = ""; }; - E28394B3240C20E0006742E2 /* UTMTerminal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UTMTerminal.m; sourceTree = ""; }; - E28394B4240C20E1006742E2 /* UTMTerminalDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTMTerminalDelegate.h; sourceTree = ""; }; - E28394B5240C20E1006742E2 /* UTMTerminal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTMTerminal.h; sourceTree = ""; }; E28394B8240C219F006742E2 /* terminal.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = terminal.html; sourceTree = ""; }; E28394B9240C219F006742E2 /* terminal.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = terminal.js; sourceTree = ""; }; E28394BD240C22F1006742E2 /* hterm_all.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = hterm_all.js; path = libapps/hterm/dist/js/hterm_all.js; sourceTree = ""; }; @@ -3020,8 +3009,6 @@ CEF83EBD24F9C3BF00557D15 /* UTMQemuVirtualMachine+Drives.m */, CEF83EC924FB1BB200557D15 /* UTMQemuVirtualMachine+SPICE.h */, CEF83EC624FB1B9300557D15 /* UTMQemuVirtualMachine+SPICE.m */, - CEF83ECA24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.h */, - CEF83ECB24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m */, CE2B89352262B2F600C6D9D8 /* UTMVirtualMachineDelegate.h */, CE2B89332262A21E00C6D9D8 /* UTMVirtualMachine.h */, CE5F165B2261395000F3D56B /* UTMVirtualMachine.m */, @@ -3030,9 +3017,6 @@ CE928C2926ABE6690099F293 /* UTMAppleVirtualMachine.swift */, 848F71E7277A2A4E006A0240 /* UTMSerialPort.swift */, 848F71EB277A2F47006A0240 /* UTMSerialPortDelegate.swift */, - E28394B5240C20E1006742E2 /* UTMTerminal.h */, - E28394B3240C20E0006742E2 /* UTMTerminal.m */, - E28394B4240C20E1006742E2 /* UTMTerminalDelegate.h */, E2D64BC7241DB24B0034E0C6 /* UTMSpiceIO.h */, E2D64BC8241DB24B0034E0C6 /* UTMSpiceIO.m */, E2D64BE0241EAEBE0034E0C6 /* UTMSpiceIODelegate.h */, @@ -3717,7 +3701,6 @@ 84B36D2927B790BE00C22685 /* DestructiveButton.swift in Sources */, CE2D92A924AD46670059923A /* qapi-types-transaction.c in Sources */, CEB63A8E24F46E6E00CAF323 /* VMConfigViewController.m in Sources */, - CEF83ECC24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m in Sources */, CEB63A9224F46E6E00CAF323 /* VMConfigInputViewController.m in Sources */, CE4EF2702506DBFD00E9D33B /* VMRemovableDrivesViewController.swift in Sources */, 83034C0726AB630F006B4BAF /* UTMPendingVMView.swift in Sources */, @@ -3896,7 +3879,6 @@ CEB63A8A24F46E6E00CAF323 /* VMConfigCreateViewController.m in Sources */, CE2D932224AD46670059923A /* VMScroll.m in Sources */, CE2D957D24AD4F990059923A /* VMConfigNetworkPortForwardView.swift in Sources */, - CE2D932324AD46670059923A /* UTMTerminal.m in Sources */, CEA905C92603DA0D00801E7C /* VMDisplayViewController+USB.m in Sources */, CEB63A7D24F46E5700CAF323 /* VMConfigSwitch.m in Sources */, CE2D932524AD46670059923A /* qapi-types-char.c in Sources */, @@ -3964,7 +3946,6 @@ CE020BAC24AEE00000B44AB6 /* UTMLoggingSwift.swift in Sources */, 8401FDA2269D3E2500265F0D /* VMConfigAppleNetworkingView.swift in Sources */, CE0B6D7C24AD584D00FE012D /* qapi-visit-char.c in Sources */, - CEF83ECD24FB382B00557D15 /* UTMQemuVirtualMachine+Terminal.m in Sources */, CE9375A224BBDDD10074066F /* VMConfigDriveDetailsView.swift in Sources */, CE2D955824AD4F980059923A /* VMConfigDisplayView.swift in Sources */, CEF83EC324F9C9E100557D15 /* UTMDrive.m in Sources */, @@ -4024,7 +4005,6 @@ CE0B6D3D24AD584C00FE012D /* qapi-visit-block-core.c in Sources */, CE0B6D5C24AD584D00FE012D /* qapi-events-net.c in Sources */, 8401FDA8269D4A4100265F0D /* VMConfigAppleSharingView.swift in Sources */, - CE0B6D0324AD56AE00FE012D /* UTMTerminal.m in Sources */, CE0B6CFC24AD568400FE012D /* UTMQemuConfigurationPortForward.m in Sources */, 8469CAD1277D345700BA5601 /* qapi-visit-compat.c in Sources */, CEF0306C26A2AFDF00667B63 /* VMWizardStartView.swift in Sources */, @@ -4263,7 +4243,6 @@ CEA45E74263519B5002FA97D /* qapi-types-common.c in Sources */, CEA45E75263519B5002FA97D /* qapi-types-transaction.c in Sources */, CEA45E76263519B5002FA97D /* VMConfigViewController.m in Sources */, - CEA45E77263519B5002FA97D /* UTMQemuVirtualMachine+Terminal.m in Sources */, CEA45E78263519B5002FA97D /* VMConfigInputViewController.m in Sources */, CEA45E79263519B5002FA97D /* VMRemovableDrivesViewController.swift in Sources */, CEA45E7A263519B5002FA97D /* UTMSpiceIO.m in Sources */, @@ -4445,7 +4424,6 @@ CEA45F19263519B5002FA97D /* VMScroll.m in Sources */, CEA45F1A263519B5002FA97D /* VMConfigNetworkPortForwardView.swift in Sources */, 8471772927CD3CAB00D3A50B /* DetailedSection.swift in Sources */, - CEA45F1B263519B5002FA97D /* UTMTerminal.m in Sources */, CEA45F1D263519B5002FA97D /* VMConfigSwitch.m in Sources */, CEA45F1E263519B5002FA97D /* qapi-types-char.c in Sources */, CEA45F20263519B5002FA97D /* qapi-visit-audio.c in Sources */,