You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Attachment.s...

94 lines
3.1 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import CoreGraphics
import SessionUtilitiesKit
public extension VisibleMessage {
class VMAttachment: Codable {
public enum Kind: String, Codable {
case voiceMessage, generic
}
public var fileName: String?
public var contentType: String?
public var key: Data?
public var digest: Data?
public var kind: Kind?
public var caption: String?
public var size: CGSize?
public var sizeInBytes: UInt?
public var url: String?
public var isValid: Bool {
// key and digest can be nil for open group attachments
contentType != nil && kind != nil && size != nil && sizeInBytes != nil && url != nil
}
// MARK: - Initialization
internal init(
fileName: String?,
contentType: String?,
key: Data?,
digest: Data?,
kind: Kind?,
caption: String?,
size: CGSize?,
sizeInBytes: UInt?,
url: String?
) {
self.fileName = fileName
self.contentType = contentType
self.key = key
self.digest = digest
self.kind = kind
self.caption = caption
self.size = size
self.sizeInBytes = sizeInBytes
self.url = url
}
// MARK: - Proto Conversion
public static func fromProto(_ proto: SNProtoAttachmentPointer) -> VMAttachment? {
func inferContentType() -> String {
guard
let fileName: String = proto.fileName,
let fileExtension: String = URL(string: fileName)?.pathExtension
else { return OWSMimeTypeApplicationOctetStream }
return (MIMETypeUtil.mimeType(forFileExtension: fileExtension) ?? OWSMimeTypeApplicationOctetStream)
}
return VMAttachment(
fileName: proto.fileName,
contentType: (proto.contentType ?? inferContentType()),
key: proto.key,
digest: proto.digest,
kind: {
if proto.hasFlags && (proto.flags & UInt32(SNProtoAttachmentPointer.SNProtoAttachmentPointerFlags.voiceMessage.rawValue)) > 0 {
return .voiceMessage
}
return .generic
}(),
caption: (proto.hasCaption ? proto.caption : nil),
size: {
if proto.hasWidth && proto.width > 0 && proto.hasHeight && proto.height > 0 {
return CGSize(width: Int(proto.width), height: Int(proto.height))
}
return .zero
}(),
sizeInBytes: (proto.size > 0 ? UInt(proto.size) : nil),
url: proto.url
)
}
public func toProto() -> SNProtoDataMessageQuote? {
fatalError("Not implemented.")
}
}
}