From 842611754debec7d1814e44e6a2cf302e84c0d66 Mon Sep 17 00:00:00 2001 From: Dustin Mierau Date: Wed, 22 May 2024 17:35:01 -0700 Subject: Support for drag and drop of old Hotline Bookmark files onto the Servers window. --- Hotline/Models/Bookmark.swift | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'Hotline/Models') diff --git a/Hotline/Models/Bookmark.swift b/Hotline/Models/Bookmark.swift index c713bb0..234a196 100644 --- a/Hotline/Models/Bookmark.swift +++ b/Hotline/Models/Bookmark.swift @@ -96,6 +96,45 @@ final class Bookmark { self.serverDescription = server.description } + init?(fileURL bookmarkFileURL: URL) { + guard let fileAttributes = try? FileManager.default.attributesOfItem(atPath: bookmarkFileURL.path(percentEncoded: false)), + let fileSize = fileAttributes[FileAttributeKey.size] as? UInt64, + fileSize <= 2000, + let fileData = try? Data(contentsOf: bookmarkFileURL) else { + return nil + } + + print("Bookmark: Parsing Hotline bookmark file...") + + var fileDataArray: [UInt8] = [UInt8](fileData) + + guard let headerValue = fileDataArray.consumeUInt32(), + headerValue.fourCharCode() == "HTsc", + let versionNumber = fileDataArray.consumeUInt16(), + versionNumber == 1, + fileDataArray.consume(128), // Skip 128 reserved bytes. + let loginLength = fileDataArray.consumeUInt16(), + let loginData: Data = fileDataArray.consumeBytes(32), + let passwordLength = fileDataArray.consumeUInt16(), + let passwordData: Data = fileDataArray.consumeBytes(32), + let addressLength = fileDataArray.consumeUInt16(), + let addressData: Data = fileDataArray.consumeBytes(256), + let addressString = String(data: addressData[0..