diff --git a/AirMessage/Database/DatabaseConverter.swift b/AirMessage/Database/DatabaseConverter.swift index 0327050..3e24bcc 100644 --- a/AirMessage/Database/DatabaseConverter.swift +++ b/AirMessage/Database/DatabaseConverter.swift @@ -154,7 +154,7 @@ class DatabaseConverter { } //Message-specific parameters - let text = cleanMessageText(row[indices["message.text"]!] as! String?) + let text = parseAttributedBody(row[indices["message.attributedBody"]!] as! SQLite.Blob?, withLogID: guid) let subject = row[indices["message.subject"]!] as! String? let sendEffect: String? if #available(macOS 10.12, *) { @@ -260,7 +260,7 @@ class DatabaseConverter { .components(separatedBy: ",") let lastMessageDate = row[indices["message.date"]!] as! Int64 - let lastMessageText = cleanMessageText(row[indices["message.text"]!] as! String?) + let lastMessageText = parseAttributedBody(row[indices["message.attributedBody"]!] as! SQLite.Blob?) let lastMessageSendStyle: String? if #available(macOS 10.12, *) { lastMessageSendStyle = row[indices["message.expressive_send_style_id"]!] as! String? @@ -445,6 +445,28 @@ class DatabaseConverter { //MARK: Helpers + ///Parses an attributed body string and cleans it + static func parseAttributedBody(_ body: SQLite.Blob?, withLogID logID: String? = nil) -> String? { + //Skip if the body is nil + guard let body = body else { + return nil + } + + //Create an unarchiver + guard let unarchiver = NSUnarchiver(forReadingWith: Data.fromDatatypeValue(body)) else { + LogManager.log("Failed to create unarchiver for message \(logID ?? "unknown")", level: .notice) + return nil + } + + //Retrieve the archive contents + guard let attributedString = unarchiver.decodeObject() as? NSAttributedString else { + LogManager.log("Failed to decode object for message \(logID ?? "unknown")", level: .notice) + return nil + } + + return cleanMessageText(attributedString.string) + } + ///Cleans a message string found in the database static func cleanMessageText(_ message: String?) -> String? { //Skip if the message is nil diff --git a/AirMessage/Database/DatabaseManager.swift b/AirMessage/Database/DatabaseManager.swift index 01c76ef..4dd8277 100644 --- a/AirMessage/Database/DatabaseManager.swift +++ b/AirMessage/Database/DatabaseManager.swift @@ -244,7 +244,7 @@ class DatabaseManager { "message.date", "message.item_type", "message.group_action_type", - "message.text", + "message.attributedBody", "message.subject", "message.error", "message.date_read", diff --git a/AirMessage/Database/SQL/QueryAllChatSummary.sql b/AirMessage/Database/SQL/QueryAllChatSummary.sql index 73dcc36..efda9bd 100644 --- a/AirMessage/Database/SQL/QueryAllChatSummary.sql +++ b/AirMessage/Database/SQL/QueryAllChatSummary.sql @@ -2,7 +2,7 @@ SELECT chat.guid AS "chat.guid", chat.display_name AS "chat.display_name", chat.service_name AS "chat.service_name", - message.text AS "message.text", + message.attributedBody AS "message.attributedBody", message.date AS "message.date", message.is_from_me AS "message.is_from_me", handle.id AS "handle.id",