From 9bc385b8a4e668fe2b10c166bcc8202ba9403bdf Mon Sep 17 00:00:00 2001 From: jahorton Date: Mon, 15 Jun 2020 09:27:25 +0700 Subject: [PATCH] feat(ios/engine): temp package cleanup --- .../KeymanEngine/Classes/KeymanPackage.swift | 2 ++ .../KMEI/KeymanEngine/Classes/Migrations.swift | 7 +------ .../PackageInstallViewController.swift | 8 ++++++++ .../ResourceFileManager.swift | 17 +++++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/KeymanPackage.swift b/ios/engine/KMEI/KeymanEngine/Classes/KeymanPackage.swift index 00f06612e8..b86afc8d27 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/KeymanPackage.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/KeymanPackage.swift @@ -26,6 +26,8 @@ public class KeymanPackage { public let sourceFolder: URL public let id: String internal let metadata: KMPMetadata + + // Used to denote Packages pending installation; referenced by ResourceFileManager. internal let isTemp: Bool internal init(metadata: KMPMetadata, folder: URL) { diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Migrations.swift b/ios/engine/KMEI/KeymanEngine/Classes/Migrations.swift index c0733cffe0..b1664a111a 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Migrations.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Migrations.swift @@ -518,12 +518,7 @@ public enum Migrations { allLocalPackages = kmpFiles.compactMap { file in let filePath = cachedKMPsDirectory.appendingPathComponent(file) - do { - return try ResourceFileManager.shared.prepareKMPInstall(from: filePath) - } catch { - log.error("Error occurred when processing existing packages during cloud -> KMP migration: \(String(describing: error))") - return nil as KeymanPackage? - } + return ResourceFileManager.shared.getPackageInfo(for: filePath) } } catch { log.error("Could not check contents of Documents directory for resource-migration assist") diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift index 63a668dd4e..8e6db2b9c7 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift @@ -55,6 +55,14 @@ public class PackageInstallViewController: UIViewController { @objc func cancelBtnHandler() { dismiss(animated: true, completion: nil) + // Note: package.sourceFolder is a temporary directory, as set by preparePackageInstall. + do { + try FileManager.default.removeItem(at: package.sourceFolder) + } catch { + // Our attempt to clean up the temporarily-extracted contents failed. + // At least we extracted to a temp (cache) folder; we'll let iOS + // handle it, then. + } } @objc func installBtnHandler() { diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/ResourceFileManager.swift b/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/ResourceFileManager.swift index 117ed42c2a..507277dcf2 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/ResourceFileManager.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/ResourceFileManager.swift @@ -138,6 +138,23 @@ public class ResourceFileManager { } } + /** + * Similar to `preparePackageInstall`, but the resuting `KeymanPackage` cannot be used for installation. Use when you + * want information about a package's contents when not immediately looking to install its resources. + */ + public func getPackageInfo(for url: URL) -> KeymanPackage? { + // Facilitates clean retrieval of a package's metadata by temporarily extracting + // its contents just long enough to parse the kmp.json. + do { + let package = try self.prepareKMPInstall(from: url) + try FileManager.default.removeItem(at: package.sourceFolder) + return package + } catch { + log.error("Error occurred attempting to extract metadata for KMP at \(String(describing: url)): \(String(describing: error))") + return nil + } + } + public func promptPackageInstall(of package: KeymanPackage, in rootVC: UIViewController, isCustom: Bool,