patbef-iOS/Befund/Core/System.swift

566 lines
17 KiB
Swift

//
// System.swift
// Befund
//
// Created by Irakli Abetschkhrischwili on 21.05.22.
// Copyright © 2022 MVZ Dr. Stein und Kollegen. All rights reserved.
import Foundation
import UIKit
import CoreImage.CIFilterBuiltins
extension Core
{
public struct System
{
/**
* Returns application directory path
*/
public static func ApplicationDirectoryPath() -> String
{
return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
}
/**
* Returns settings path
*/
public static func SettingsPath() -> String
{
return ApplicationDirectoryPath() + "/settings.plist"
}
/**
* Returns storage directory path
*/
public static func StorageDirectoryPath() -> String?
{
var result: String? = ApplicationDirectoryPath() + "/storage"
let fileManager = FileManager.default
do
{
var isDir:ObjCBool = true
if(!fileManager.fileExists(atPath: result!, isDirectory: &isDir))
{
try fileManager.createDirectory(atPath: result!, withIntermediateDirectories: true)
}
if(!fileManager.fileExists(atPath: result!, isDirectory: &isDir))
{
result = nil
}
}
catch
{
result = nil
Log.Critical(err: error, namespace: "Core.System", method: "StorageDirectoryPath")
}
return result
}
/**
* Returns encrypted storage directory path
*/
public static func EncryptedStorageDirectoryPath() -> String?
{
var result: String? = nil
do
{
let storagePath = StorageDirectoryPath()
if(storagePath != nil)
{
result = storagePath! + "/encrypted"
let fileManager = FileManager.default
var isDir:ObjCBool = true
if(!fileManager.fileExists(atPath: result!, isDirectory: &isDir))
{
try fileManager.createDirectory(atPath: result!, withIntermediateDirectories: true)
}
if(!fileManager.fileExists(atPath: result!, isDirectory: &isDir))
{
result = nil
}
}
}
catch
{
result = nil
Log.Critical(err: error, namespace: "Core.System", method: "EncryptedStorageDirectoryPath")
}
return result
}
/**
* Returns databases directory path
*/
public static func DatabaseDirectoryPath() -> String?
{
var result: String? = ApplicationDirectoryPath() + "/databases"
let fileManager = FileManager.default
do
{
var isDir:ObjCBool = true
if(!fileManager.fileExists(atPath: result!, isDirectory: &isDir))
{
try fileManager.createDirectory(atPath: result!, withIntermediateDirectories: true)
}
if(!fileManager.fileExists(atPath: result!, isDirectory: &isDir))
{
result = nil
}
}
catch
{
result = nil
Log.Critical(err: error, namespace: "Core.System", method: "DatabaseDirectoryPath")
}
return result
}
/**
* Returns logs database path
*/
public static func LogsDatabasePath() -> String?
{
var result: String? = nil
let dbDirectory = DatabaseDirectoryPath()
if(dbDirectory != nil)
{
result = dbDirectory! + "/logs.db"
}
return result
}
/**
* Returns results database path
*/
public static func ResultsDatabasePath() -> String?
{
var result: String? = nil
let dbDirectory = DatabaseDirectoryPath()
if(dbDirectory != nil)
{
result = dbDirectory! + "/results.db"
}
return result
}
/**
* Checks if file exists
*
* @param atPath - filepath that should be checked if exists
*/
public static func FileExists(atPath: String) -> Bool
{
let fileManager = FileManager.default
return fileManager.fileExists(atPath: atPath)
}
/**
* Deletes file at the path
*
* @param atPath - file that should be deleted
*/
public static func DeleteFile(atPath: String) -> Bool
{
var result = false
do
{
let fileManager = FileManager.default
try fileManager.removeItem(atPath: atPath)
result = !FileExists(atPath: atPath)
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "DeleteFile(string)")
}
return result
}
/**
* Writes content to the file
*
* @param filename - filename where the content should be written
* @param data - data of content
*/
public static func WriteToStorage(filename: String, data: Data) -> Bool
{
var result = false
do
{
let storageDirectory = StorageDirectoryPath()
if(storageDirectory != nil)
{
let filePath = storageDirectory! + "/" + filename
let fileURL = URL.init(fileURLWithPath: filePath)
try data.write(to: fileURL)
result = true
}
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "WriteToStorage(string, data)")
}
return result
}
/**
* Writes content to the encrypted storage
*
* @param filename - filename where the content should be written
* @param data - data of content
*/
public static func WriteToEncryptedStorage(filename: String, data: Data) -> Bool
{
var result = false
do
{
let storageDirectory = EncryptedStorageDirectoryPath()
if(storageDirectory != nil)
{
let filePath = storageDirectory! + "/" + filename
let fileURL = URL.init(fileURLWithPath: filePath)
if(FileExists(atPath: filePath))
{
DeleteFile(atPath: filePath)
}
try data.write(to: fileURL)
result = true
}
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "WriteToEncryptedStorage(string, data)")
}
return result
}
/**
* Reads content of file
*
* @param filename - filename
*/
public static func ReadFromStorage(filename: String) -> Data?
{
var result: Data? = nil
do
{
let storageDirectory = StorageDirectoryPath()
if(storageDirectory != nil)
{
let fileAtPath = storageDirectory! + "/" + filename
if(FileExists(atPath: fileAtPath))
{
let fileURL = URL.init(fileURLWithPath: fileAtPath)
result = try Data(contentsOf: fileURL)
}
}
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "ReadFromStorage(string)")
}
return result
}
public static func GetPathForStorageFile(filename: String) -> String?
{
var result: String? = nil
let storageDirectory = StorageDirectoryPath()
if(storageDirectory != nil)
{
let fileAtPath = storageDirectory! + "/" + filename
if(FileExists(atPath: fileAtPath))
{
result = fileAtPath
}
}
return result
}
/**
* Returns url of storage file
*
*@param filename - filename
*/
public static func GetURLForStorageFile(filename: String) -> URL?
{
return URL.init(fileURLWithPath: GetPathForStorageFile(filename: filename)!)
}
/**
* Reads content of encrypted file
*
* @param filename - encrypted filename
*/
public static func ReadFromEncryptedStorage(filename: String) -> Data?
{
var result: Data? = nil
do
{
let storageDirectory = EncryptedStorageDirectoryPath()
if(storageDirectory != nil)
{
let fileAtPath = storageDirectory! + "/" + filename
if(FileExists(atPath: fileAtPath))
{
let fileURL = URL.init(fileURLWithPath: fileAtPath)
result = try Data(contentsOf: fileURL)
}
}
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "ReadFromEncryptedStorage(string)")
}
return result
}
/**
* Returns url of encrypted file
*
* @param filename - filenaname
*/
public static func GetURLForStorageEncryptedFile(filename: String) -> URL?
{
var result: URL? = nil
let fileAtPath = GetPathForStorageEncryptedFile(filename: filename)
if(FileExists(atPath: fileAtPath!))
{
result = URL.init(fileURLWithPath: fileAtPath!)
}
return result
}
public static func GetPathForStorageEncryptedFile(filename: String) -> String?
{
var result: String? = nil
let storageDirectory = EncryptedStorageDirectoryPath()
if(storageDirectory != nil)
{
result = storageDirectory! + "/" + filename
}
return result
}
/**
* Returns device object
*/
public static func GetDevice() -> Core.Models.System.Device
{
var result = Core.Models.System.Device()
result.udid = UIDevice.current.identifierForVendor?.uuidString
result.name = UIDevice.current.name
result.model = UIDevice.current.model
result.manufacturer = "Apple"
result.os = UIDevice.current.systemVersion
return result
}
/**
* Returns storage info
*/
public static func GetStorageInfo() -> Core.Models.System.StorageInfo?
{
var result: Core.Models.System.StorageInfo? = nil
do
{
let fileManager = FileManager.default
let attributes = try fileManager.attributesOfFileSystem(forPath: ApplicationDirectoryPath())
let fileSystemSizeInBytes = attributes[.systemSize] as? UInt64
let freeFileSystemSizeInBytes = attributes[.systemFreeSize] as? UInt64
if(fileSystemSizeInBytes != nil && freeFileSystemSizeInBytes != nil)
{
result = Core.Models.System.StorageInfo()
result!.total = (Double)(fileSystemSizeInBytes! / 1000000000)
result!.free = (Double)(freeFileSystemSizeInBytes! / 1000000000)
result!.used = (result!.total - result!.free)
}
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "GetStorageInfo")
}
return result
}
/**
* Returns file creation date
*
* @param atPath - filename
*/
public static func GetFileCreationDate(atPath: String) -> Date?
{
var result: Date? = nil
do
{
if(FileExists(atPath: atPath))
{
let fileManager = FileManager.default
let attributes = try fileManager.attributesOfItem(atPath: atPath)
result = attributes[.modificationDate] as? Date
}
}
catch
{
Log.Critical(err: error, namespace: "Core.System", method: "GetFileCreationDate(string)")
}
return result
}
public static func GetOEGDFiles() -> [String]
{
var result: [String] = []
let storagePath = Core.System.StorageDirectoryPath() ?? ""
if (storagePath.count>0)
{
let fileManager = FileManager.default
do{
let files = try fileManager.contentsOfDirectory(atPath: storagePath)
for oneFile in files{
if(oneFile.range(of: ".oegd") != nil)
{
result.append(oneFile)
}
}
}
catch let err{
Core.Log.Error(err: err, namespace: "Core.System", method: "GetOEGDFiles")
}
}
return result
}
public static func GetEncryptedFiles() -> [String]
{
var result: [String] = []
let storagePath = Core.System.EncryptedStorageDirectoryPath() ?? ""
if (storagePath.count>0)
{
let fileManager = FileManager.default
do{
result = try fileManager.contentsOfDirectory(atPath: storagePath)
}
catch let err{
Core.Log.Error(err: err, namespace: "Core.System", method: "GetEncryptedFiles")
}
}
return result
}
public static func DeleteAllFiles() -> Bool
{
//delete all decrypted files
var files = GetEncryptedFiles()
if(files.count > 0)
{
for oneFile in files
{
DeleteFile(atPath: oneFile)
}
}
//delete all OEGD files
files = GetOEGDFiles()
if(files.count > 0)
{
for oneFile in files
{
DeleteFile(atPath: oneFile)
}
}
//delete log and resuld databases
let curPath = DatabaseDirectoryPath() ?? ""
if (curPath.count > 0)
{
DeleteFile(atPath: curPath + "/logs.db")
DeleteFile(atPath: curPath + "/results.db")
}
//delete settings-file
return DeleteFile(atPath: SettingsPath())
}
public static func GenerateQRCode(content: String) -> UIImage
{
let context = CIContext()
let data = Data(content.utf8)
let filter = CIFilter.qrCodeGenerator()
filter.setValue(data, forKey: "inpuMessage")
if let outputImage = filter.outputImage {
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent){
return UIImage(cgImage: cgimg)
}
}
return UIImage(systemName: "xmark.circle") ?? UIImage()
}
}
}