feat(xep): Remove Extensible File Thumbnails
This commit is contained in:
parent
a18507cc3a
commit
b14363319a
13
flake.nix
13
flake.nix
@ -12,12 +12,6 @@
|
|||||||
config = {
|
config = {
|
||||||
android_sdk.accept_license = true;
|
android_sdk.accept_license = true;
|
||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
|
|
||||||
# Fix to allow building the NDK package
|
|
||||||
# TODO: Remove once https://github.com/tadfisher/android-nixpkgs/issues/62 is resolved
|
|
||||||
permittedInsecurePackages = [
|
|
||||||
"python-2.7.18.6"
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
# Everything to make Flutter happy
|
# Everything to make Flutter happy
|
||||||
@ -34,13 +28,6 @@
|
|||||||
platforms-android-30
|
platforms-android-30
|
||||||
platforms-android-31
|
platforms-android-31
|
||||||
platforms-android-33
|
platforms-android-33
|
||||||
|
|
||||||
# For flutter_zxing
|
|
||||||
cmake-3-18-1
|
|
||||||
#ndk-21-4-7075529
|
|
||||||
(ndk-21-4-7075529.overrideAttrs (old: {
|
|
||||||
buildInputs = old.buildInputs ++ [ pkgs.python27 ];
|
|
||||||
}))
|
|
||||||
]);
|
]);
|
||||||
lib = pkgs.lib;
|
lib = pkgs.lib;
|
||||||
pinnedJDK = pkgs.jdk17;
|
pinnedJDK = pkgs.jdk17;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
- **BREAKING**: `ChatState.toString()` is now `ChatState.toName()`
|
- **BREAKING**: `ChatState.toString()` is now `ChatState.toName()`
|
||||||
- **BREAKING**: Overriding `BaseOmemoManager` is no longer required. `OmemoManager` now takes callback methods instead.
|
- **BREAKING**: Overriding `BaseOmemoManager` is no longer required. `OmemoManager` now takes callback methods instead.
|
||||||
- Removed `ErrorResponseDiscoError` from the possible XEP-0030 errors.
|
- Removed `ErrorResponseDiscoError` from the possible XEP-0030 errors.
|
||||||
|
- **BREAKING**: Removed "Extensible File Thumbnails" (The `Thumbnail` type)
|
||||||
|
|
||||||
## 0.3.1
|
## 0.3.1
|
||||||
|
|
||||||
|
@ -39,7 +39,6 @@ export 'package:moxxmpp/src/socket.dart';
|
|||||||
export 'package:moxxmpp/src/stanza.dart';
|
export 'package:moxxmpp/src/stanza.dart';
|
||||||
export 'package:moxxmpp/src/stringxml.dart';
|
export 'package:moxxmpp/src/stringxml.dart';
|
||||||
export 'package:moxxmpp/src/util/typed_map.dart';
|
export 'package:moxxmpp/src/util/typed_map.dart';
|
||||||
export 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart';
|
|
||||||
export 'package:moxxmpp/src/xeps/staging/fast.dart';
|
export 'package:moxxmpp/src/xeps/staging/fast.dart';
|
||||||
export 'package:moxxmpp/src/xeps/staging/file_upload_notification.dart';
|
export 'package:moxxmpp/src/xeps/staging/file_upload_notification.dart';
|
||||||
export 'package:moxxmpp/src/xeps/xep_0004.dart';
|
export 'package:moxxmpp/src/xeps/xep_0004.dart';
|
||||||
|
@ -69,6 +69,9 @@ const delayedDeliveryXmlns = 'urn:xmpp:delay';
|
|||||||
// XEP-0234
|
// XEP-0234
|
||||||
const jingleFileTransferXmlns = 'urn:xmpp:jingle:apps:file-transfer:5';
|
const jingleFileTransferXmlns = 'urn:xmpp:jingle:apps:file-transfer:5';
|
||||||
|
|
||||||
|
// XEP-0264
|
||||||
|
const jingleContentThumbnailXmlns = 'urn:xmpp:thumbs:1';
|
||||||
|
|
||||||
// XEP-0280
|
// XEP-0280
|
||||||
const carbonsXmlns = 'urn:xmpp:carbons:2';
|
const carbonsXmlns = 'urn:xmpp:carbons:2';
|
||||||
|
|
||||||
|
@ -1,57 +0,0 @@
|
|||||||
import 'package:moxxmpp/src/stringxml.dart';
|
|
||||||
|
|
||||||
/// NOTE: Specified by https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md
|
|
||||||
|
|
||||||
const fileThumbnailsXmlns = 'proto:urn:xmpp:eft:0';
|
|
||||||
const blurhashThumbnailType = '$fileThumbnailsXmlns:blurhash';
|
|
||||||
|
|
||||||
abstract class Thumbnail {}
|
|
||||||
|
|
||||||
class BlurhashThumbnail extends Thumbnail {
|
|
||||||
BlurhashThumbnail(this.hash);
|
|
||||||
final String hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
Thumbnail? parseFileThumbnailElement(XMLNode node) {
|
|
||||||
assert(
|
|
||||||
node.attributes['xmlns'] == fileThumbnailsXmlns,
|
|
||||||
'Invalid element xmlns',
|
|
||||||
);
|
|
||||||
assert(node.tag == 'file-thumbnail', 'Invalid element name');
|
|
||||||
|
|
||||||
switch (node.attributes['type']!) {
|
|
||||||
case blurhashThumbnailType:
|
|
||||||
{
|
|
||||||
final hash = node.firstTag('blurhash')!.innerText();
|
|
||||||
return BlurhashThumbnail(hash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode? _fromThumbnail(Thumbnail thumbnail) {
|
|
||||||
if (thumbnail is BlurhashThumbnail) {
|
|
||||||
return XMLNode(
|
|
||||||
tag: 'blurhash',
|
|
||||||
text: thumbnail.hash,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode constructFileThumbnailElement(Thumbnail thumbnail) {
|
|
||||||
final node = _fromThumbnail(thumbnail)!;
|
|
||||||
var type = '';
|
|
||||||
if (thumbnail is BlurhashThumbnail) {
|
|
||||||
type = blurhashThumbnailType;
|
|
||||||
}
|
|
||||||
|
|
||||||
return XMLNode.xmlns(
|
|
||||||
tag: 'file-thumbnail',
|
|
||||||
xmlns: fileThumbnailsXmlns,
|
|
||||||
attributes: {'type': type},
|
|
||||||
children: [node],
|
|
||||||
);
|
|
||||||
}
|
|
59
packages/moxxmpp/lib/src/xeps/xep_0264.dart
Normal file
59
packages/moxxmpp/lib/src/xeps/xep_0264.dart
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import 'package:moxxmpp/src/namespaces.dart';
|
||||||
|
import 'package:moxxmpp/src/stringxml.dart';
|
||||||
|
|
||||||
|
extension _StringToInt on String {
|
||||||
|
int toInt() => int.parse(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
class JingleContentThumbnail {
|
||||||
|
const JingleContentThumbnail(
|
||||||
|
this.uri,
|
||||||
|
this.mediaType,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
);
|
||||||
|
|
||||||
|
factory JingleContentThumbnail.fromXML(XMLNode thumbnail) {
|
||||||
|
assert(
|
||||||
|
thumbnail.tag == 'thumbnail',
|
||||||
|
'thumbnail must be Jingle Content Thumbnail',
|
||||||
|
);
|
||||||
|
assert(
|
||||||
|
thumbnail.attributes['xmlns'] == jingleContentThumbnailXmlns,
|
||||||
|
'thumbnail must be Jingle Content Thumbnail',
|
||||||
|
);
|
||||||
|
|
||||||
|
return JingleContentThumbnail(
|
||||||
|
Uri.parse(thumbnail.attributes['uri']! as String),
|
||||||
|
thumbnail.attributes['media-type'] as String?,
|
||||||
|
(thumbnail.attributes['width'] as String?)?.toInt(),
|
||||||
|
(thumbnail.attributes['height'] as String?)?.toInt(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The URI of the thumbnail data.
|
||||||
|
final Uri uri;
|
||||||
|
|
||||||
|
/// The MIME type of the thumbnail
|
||||||
|
final String? mediaType;
|
||||||
|
|
||||||
|
/// The width of the thumbnail.
|
||||||
|
final int? width;
|
||||||
|
|
||||||
|
/// The height of the thumbnail.
|
||||||
|
final int? height;
|
||||||
|
|
||||||
|
/// Convert the thumbnail to its XML representation.
|
||||||
|
XMLNode toXML() {
|
||||||
|
return XMLNode.xmlns(
|
||||||
|
tag: 'thumbnail',
|
||||||
|
xmlns: jingleContentThumbnailXmlns,
|
||||||
|
attributes: {
|
||||||
|
'uri': uri.toString(),
|
||||||
|
if (mediaType != null) 'media-type': mediaType!,
|
||||||
|
if (width != null) 'width': width.toString(),
|
||||||
|
if (height != null) 'height': height.toString(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -5,7 +5,7 @@ import 'package:moxxmpp/src/managers/namespaces.dart';
|
|||||||
import 'package:moxxmpp/src/namespaces.dart';
|
import 'package:moxxmpp/src/namespaces.dart';
|
||||||
import 'package:moxxmpp/src/stanza.dart';
|
import 'package:moxxmpp/src/stanza.dart';
|
||||||
import 'package:moxxmpp/src/stringxml.dart';
|
import 'package:moxxmpp/src/stringxml.dart';
|
||||||
import 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart';
|
import 'package:moxxmpp/src/xeps/xep_0264.dart';
|
||||||
|
|
||||||
class StatelessMediaSharingData implements StanzaHandlerExtension {
|
class StatelessMediaSharingData implements StanzaHandlerExtension {
|
||||||
const StatelessMediaSharingData({
|
const StatelessMediaSharingData({
|
||||||
@ -20,7 +20,7 @@ class StatelessMediaSharingData implements StanzaHandlerExtension {
|
|||||||
final int size;
|
final int size;
|
||||||
final String description;
|
final String description;
|
||||||
final Map<String, String> hashes; // algo -> hash value
|
final Map<String, String> hashes; // algo -> hash value
|
||||||
final List<Thumbnail> thumbnails;
|
final List<JingleContentThumbnail> thumbnails;
|
||||||
|
|
||||||
final String url;
|
final String url;
|
||||||
}
|
}
|
||||||
@ -48,16 +48,11 @@ StatelessMediaSharingData parseSIMSElement(XMLNode node) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
final thumbnails = List<Thumbnail>.empty(growable: true);
|
// Thumbnails
|
||||||
for (final child in file.children) {
|
final thumbnails = List<JingleContentThumbnail>.empty(growable: true);
|
||||||
// TODO(Unknown): Handle other thumbnails
|
for (final i
|
||||||
if (child.tag == 'file-thumbnail' &&
|
in file.findTags('thumbnail', xmlns: jingleContentThumbnailXmlns)) {
|
||||||
child.attributes['xmlns'] == fileThumbnailsXmlns) {
|
thumbnails.add(JingleContentThumbnail.fromXML(i));
|
||||||
final thumb = parseFileThumbnailElement(child);
|
|
||||||
if (thumb != null) {
|
|
||||||
thumbnails.add(thumb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return StatelessMediaSharingData(
|
return StatelessMediaSharingData(
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import 'package:moxxmpp/src/namespaces.dart';
|
import 'package:moxxmpp/src/namespaces.dart';
|
||||||
import 'package:moxxmpp/src/stringxml.dart';
|
import 'package:moxxmpp/src/stringxml.dart';
|
||||||
import 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart';
|
import 'package:moxxmpp/src/xeps/xep_0264.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0300.dart';
|
import 'package:moxxmpp/src/xeps/xep_0300.dart';
|
||||||
|
|
||||||
class FileMetadataData {
|
class FileMetadataData {
|
||||||
@ -39,12 +39,10 @@ class FileMetadataData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Thumbnails
|
// Thumbnails
|
||||||
final thumbnails = List<Thumbnail>.empty(growable: true);
|
final thumbnails = List<JingleContentThumbnail>.empty(growable: true);
|
||||||
for (final i in node.findTags('file-thumbnail')) {
|
for (final i
|
||||||
final thumbnail = parseFileThumbnailElement(i);
|
in node.findTags('thumbnail', xmlns: jingleContentThumbnailXmlns)) {
|
||||||
if (thumbnail != null) {
|
thumbnails.add(JingleContentThumbnail.fromXML(i));
|
||||||
thumbnails.add(thumbnail);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Length and height
|
// Length and height
|
||||||
@ -75,7 +73,7 @@ class FileMetadataData {
|
|||||||
final String? mediaType;
|
final String? mediaType;
|
||||||
final int? width;
|
final int? width;
|
||||||
final int? height;
|
final int? height;
|
||||||
final List<Thumbnail> thumbnails;
|
final List<JingleContentThumbnail> thumbnails;
|
||||||
final String? desc;
|
final String? desc;
|
||||||
final Map<HashFunction, String> hashes;
|
final Map<HashFunction, String> hashes;
|
||||||
final int? length;
|
final int? length;
|
||||||
@ -119,7 +117,7 @@ class FileMetadataData {
|
|||||||
|
|
||||||
for (final thumbnail in thumbnails) {
|
for (final thumbnail in thumbnails) {
|
||||||
node.addChild(
|
node.addChild(
|
||||||
constructFileThumbnailElement(thumbnail),
|
thumbnail.toXML(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,29 +1,22 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://usefulinc.com/ns/doap#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:xmpp="https://linkmauve.fr/ns/xmpp-doap#">
|
||||||
xmlns='http://usefulinc.com/ns/doap#'
|
<Project xml:lang="en">
|
||||||
xmlns:foaf='http://xmlns.com/foaf/0.1/'
|
|
||||||
xmlns:xmpp='https://linkmauve.fr/ns/xmpp-doap#'>
|
|
||||||
<Project xml:lang='en'>
|
|
||||||
<name>moxxmpp</name>
|
<name>moxxmpp</name>
|
||||||
<created>2021-12-26</created>
|
<created>2021-12-26</created>
|
||||||
<homepage rdf:resource='https://codeberg.org/moxxy/moxxmpp'/>
|
<homepage rdf:resource="https://codeberg.org/moxxy/moxxmpp"/>
|
||||||
<os>Linux</os>
|
<os>Linux</os>
|
||||||
<os>Windows</os>
|
<os>Windows</os>
|
||||||
<os>macOS</os>
|
<os>macOS</os>
|
||||||
<os>Android</os>
|
<os>Android</os>
|
||||||
<os>iOS</os>
|
<os>iOS</os>
|
||||||
|
|
||||||
<programming-language>Dart</programming-language>
|
<programming-language>Dart</programming-language>
|
||||||
|
|
||||||
<maintainer>
|
<maintainer>
|
||||||
<foaf:Person>
|
<foaf:Person>
|
||||||
<foaf:name>Alexander "Polynomdivision"</foaf:name>
|
<foaf:name>Alexander "Polynomdivision"</foaf:name>
|
||||||
<foaf:homepage rdf:resource="https://blog.polynom.me"/>
|
<foaf:homepage rdf:resource="https://blog.polynom.me"/>
|
||||||
</foaf:Person>
|
</foaf:Person>
|
||||||
</maintainer>
|
</maintainer>
|
||||||
|
|
||||||
<implements rdf:resource="https://xmpp.org/rfcs/rfc6120.html"/>
|
<implements rdf:resource="https://xmpp.org/rfcs/rfc6120.html"/>
|
||||||
|
|
||||||
<implements>
|
<implements>
|
||||||
<xmpp:SupportedXep>
|
<xmpp:SupportedXep>
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
|
||||||
@ -111,6 +104,13 @@
|
|||||||
<xmpp:version>1.6</xmpp:version>
|
<xmpp:version>1.6</xmpp:version>
|
||||||
</xmpp:SupportedXep>
|
</xmpp:SupportedXep>
|
||||||
</implements>
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0264.html"/>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:version>0.4.1</xmpp:version>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
<implements>
|
<implements>
|
||||||
<xmpp:SupportedXep>
|
<xmpp:SupportedXep>
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/>
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/>
|
||||||
@ -256,14 +256,6 @@
|
|||||||
<xmpp:version>0.2.0</xmpp:version>
|
<xmpp:version>0.2.0</xmpp:version>
|
||||||
</xmpp:SupportedXep>
|
</xmpp:SupportedXep>
|
||||||
</implements>
|
</implements>
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md" />
|
|
||||||
<xmpp:status>partial</xmpp:status>
|
|
||||||
<xmpp:version>0.2.1</xmpp:version>
|
|
||||||
<xmpp:note xml:lang="en">Only Blurhash is implemented</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
<implements>
|
||||||
<xmpp:SupportedXep>
|
<xmpp:SupportedXep>
|
||||||
<xmpp:xep rdf:resource="https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md"/>
|
<xmpp:xep rdf:resource="https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user