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