Implement typing indicator serialization

pull/308/head
nielsandriesse 4 years ago
parent 48f166b893
commit 1644f078fe

@ -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 { }

@ -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

@ -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.")
}
}

@ -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 }

Loading…
Cancel
Save