/* * Famedly Matrix SDK * Copyright (C) 2020, 2021 Famedly GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /// Workaround until [File] in dart:io and dart:html is unified import 'dart:typed_data'; import 'package:mime/mime.dart'; import '../../matrix.dart'; class MatrixFile { Uint8List bytes; String name; String mimeType; /// Encrypts this file and returns the /// encryption information as an [EncryptedFile]. Future encrypt() async { return await encryptFile(bytes); } MatrixFile({required this.bytes, required String name, String? mimeType}) : mimeType = mimeType ?? lookupMimeType(name, headerBytes: bytes) ?? 'application/octet-stream', name = name.split('/').last.toLowerCase(); int get size => bytes.length; String get msgType { if (mimeType.toLowerCase().startsWith('image/')) { return MessageTypes.Image; } if (mimeType.toLowerCase().startsWith('video/')) { return MessageTypes.Video; } if (mimeType.toLowerCase().startsWith('audio/')) { return MessageTypes.Audio; } return MessageTypes.File; } Map get info => ({ 'mimetype': mimeType, 'size': size, }); } class MatrixImageFile extends MatrixFile { int? width; int? height; String? blurhash; MatrixImageFile( {required Uint8List bytes, required String name, String? mimeType, this.width, this.height, this.blurhash}) : super(bytes: bytes, name: name, mimeType: mimeType); @override String get msgType => 'm.image'; @override Map get info => ({ ...super.info, if (width != null) 'w': width, if (height != null) 'h': height, if (blurhash != null) 'xyz.amorgan.blurhash': blurhash, }); } class MatrixVideoFile extends MatrixFile { int? width; int? height; int? duration; MatrixVideoFile( {required Uint8List bytes, required String name, String? mimeType, this.width, this.height, this.duration}) : super(bytes: bytes, name: name, mimeType: mimeType); @override String get msgType => 'm.video'; @override Map get info => ({ ...super.info, if (width != null) 'w': width, if (height != null) 'h': height, if (duration != null) 'duration': duration, }); } class MatrixAudioFile extends MatrixFile { int? duration; MatrixAudioFile( {required Uint8List bytes, required String name, String? mimeType, this.duration}) : super(bytes: bytes, name: name, mimeType: mimeType); @override String get msgType => 'm.audio'; @override Map get info => ({ ...super.info, if (duration != null) 'duration': duration, }); } extension ToMatrixFile on EncryptedFile { MatrixFile toMatrixFile() { return MatrixFile( bytes: data, name: 'crypt', mimeType: 'application/octet-stream'); } }