mirror of https://github.com/oxen-io/session-ios
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.
94 lines
3.1 KiB
Swift
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 MimeTypeUtil.MimeType.applicationOctetStream }
|
|
|
|
return (MimeTypeUtil.mimeType(for: fileExtension) ?? MimeTypeUtil.MimeType.applicationOctetStream)
|
|
}
|
|
|
|
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.")
|
|
}
|
|
}
|
|
}
|