From 1644f078fec15cff883f5e2510df7561f8edadd8 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 6 Nov 2020 10:43:34 +1100 Subject: [PATCH] Implement typing indicator serialization --- .../Control Message/ControlMessage.swift | 11 +---- .../Control Message/TypingIndicator.swift | 46 +++++++++++-------- SessionMessagingKit/Messages/Message.swift | 15 ++++-- .../Visible Message/VisibleMessage.swift | 2 +- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/SessionMessagingKit/Messages/Control Message/ControlMessage.swift b/SessionMessagingKit/Messages/Control Message/ControlMessage.swift index 46c1085c2..2d0dd2df7 100644 --- a/SessionMessagingKit/Messages/Control Message/ControlMessage.swift +++ b/SessionMessagingKit/Messages/Control Message/ControlMessage.swift @@ -1,13 +1,4 @@ import SessionProtocolKit @objc(SNControlMessage) -public class ControlMessage : Message { - - public enum Kind { - case readReceipt - case sessionRequest(preKeyBundle: PreKeyBundle) - case typingIndicator - case closedGroupUpdate - case expirationUpdate - } -} +public class ControlMessage : Message { } diff --git a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift index e77a4e505..fe0186317 100644 --- a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift +++ b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift @@ -4,7 +4,8 @@ import SessionUtilities public final class TypingIndicator : ControlMessage { public var kind: Kind? - public enum Kind { + // MARK: Kind + public enum Kind : String { case started, stopped static func fromProto(_ proto: SNProtoTypingMessage.SNProtoTypingMessageAction) -> Kind { @@ -22,37 +23,46 @@ public final class TypingIndicator : ControlMessage { } } - convenience init(sentTimestamp: UInt64, receivedTimestamp: UInt64, kind: Kind) { - self.init() + // MARK: Initialization + init(sentTimestamp: UInt64, receivedTimestamp: UInt64, kind: Kind) { + super.init() self.sentTimestamp = sentTimestamp self.receivedTimestamp = receivedTimestamp self.kind = kind } - public override class func fromSerializedProto(_ serializedProto: Data) -> TypingIndicator? { - do { - let contentProto = try SNProtoContent.parseData(serializedProto) - guard let typingIndicatorProto = contentProto.typingMessage else { - SNLog("Couldn't parse typing indicator from: \(contentProto).") - return nil - } - let timestamp = typingIndicatorProto.timestamp - let now = NSDate.millisecondTimestamp() - let kind = Kind.fromProto(typingIndicatorProto.action) - return TypingIndicator(sentTimestamp: timestamp, receivedTimestamp: now, kind: kind) - } catch { - SNLog("Couldn't deserialize typing indicator.") + // MARK: Coding + public required init?(coder: NSCoder) { + super.init(coder: coder) + if let rawKind = coder.decodeObject(forKey: "kind") as! String? { + kind = Kind(rawValue: rawKind) + } + } + + public override func encode(with coder: NSCoder) { + super.encode(with: coder) + coder.encode(kind?.rawValue, forKey: "kind") + } + + // MARK: Proto Conversion + public override class func fromProto(_ proto: SNProtoContent) -> TypingIndicator? { + guard let typingIndicatorProto = proto.typingMessage else { + SNLog("Couldn't parse typing indicator from: \(proto).") return nil } + let timestamp = typingIndicatorProto.timestamp + let now = NSDate.millisecondTimestamp() + let kind = Kind.fromProto(typingIndicatorProto.action) + return TypingIndicator(sentTimestamp: timestamp, receivedTimestamp: now, kind: kind) } - public override func toSerializedProto() -> Data? { + public override func toProto() -> SNProtoContent? { guard let timestamp = sentTimestamp, let kind = kind else { return nil } let typingIndicatorProto = SNProtoTypingMessage.builder(timestamp: timestamp, action: kind.toProto()) let contentProto = SNProtoContent.builder() do { contentProto.setTypingMessage(try typingIndicatorProto.build()) - return try contentProto.buildSerializedData() + return try contentProto.build() } catch { SNLog("Couldn't construct typing indicator proto from: \(self).") return nil diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index 1a5fb1bdd..23c5e8903 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -9,19 +9,24 @@ public class Message : NSObject, NSCoding { // Not a protocol for YapDatabase co public override init() { } + // MARK: Coding public required init?(coder: NSCoder) { preconditionFailure("init?(coder:) is abstract and must be overridden.") } public func encode(with coder: NSCoder) { - preconditionFailure("encode(with:) is abstract and must be overridden.") + coder.encode(id, forKey: "id") + coder.encode(threadID, forKey: "threadID") + coder.encode(sentTimestamp, forKey: "sentTimestamp") + coder.encode(receivedTimestamp, forKey: "receivedTimestamp") } - public class func fromSerializedProto(_ serializedProto: Data) -> Self? { - preconditionFailure("fromSerializedProto(_:) is abstract and must be overridden.") + // MARK: Proto Conversion + public class func fromProto(_ proto: SNProtoContent) -> Self? { + preconditionFailure("fromProto(_:) is abstract and must be overridden.") } - public func toSerializedProto() -> Data? { - preconditionFailure("toSerializedProto() is abstract and must be overridden.") + public func toProto() -> SNProtoContent? { + preconditionFailure("toProto() is abstract and must be overridden.") } } diff --git a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift index e8b77855e..e9e424f4c 100644 --- a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift +++ b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift @@ -8,7 +8,7 @@ public final class VisibleMessage : Message { public var contact: Contact? public var profile: Profile? - public override class func fromSerializedProto(_ serializedProto: Data) -> VisibleMessage? { + public override class func fromProto(_ proto: SNProtoContent) -> VisibleMessage? { return nil // guard let data = proto.dataMessage, // let text = data.body else { return nil }