Merge branch 'feat/remove-eft'
This commit is contained in:
commit
94d6fe4925
2
.gitlint
2
.gitlint
@ -7,7 +7,7 @@ line-length=72
|
|||||||
[title-trailing-punctuation]
|
[title-trailing-punctuation]
|
||||||
[title-hard-tab]
|
[title-hard-tab]
|
||||||
[title-match-regex]
|
[title-match-regex]
|
||||||
regex=^((feat|fix|chore|refactor|docs|release|test)\((meta|tests|style|docs|xep|core|example|all)+(,(meta|tests|style|docs|xep|core|example|all))*\)|release): [A-Z0-9].*$
|
regex=^((feat|fix|chore|refactor|docs|release|test)\((meta|tests|style|docs|xep|core|example|all|flake)+(,(meta|tests|style|docs|xep|core|example|all|flake))*\)|release): [A-Z0-9].*$
|
||||||
|
|
||||||
|
|
||||||
[body-trailing-whitespace]
|
[body-trailing-whitespace]
|
||||||
|
124
flake.lock
124
flake.lock
@ -1,12 +1,72 @@
|
|||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"flake-utils": {
|
"android-nixpkgs": {
|
||||||
|
"inputs": {
|
||||||
|
"devshell": "devshell",
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1678901627,
|
"lastModified": 1689798050,
|
||||||
"narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=",
|
"narHash": "sha256-ZyFPra7N0MF803o55dYQQyX9b/BmXr6QTCyN7slRThY=",
|
||||||
|
"owner": "tadfisher",
|
||||||
|
"repo": "android-nixpkgs",
|
||||||
|
"rev": "9aa0e2990da86de8ca203af313668851dcb9ea6e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tadfisher",
|
||||||
|
"repo": "android-nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devshell": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"android-nixpkgs",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1688380630,
|
||||||
|
"narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689068808,
|
||||||
|
"narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6",
|
"rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1667395993,
|
||||||
|
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -17,27 +77,27 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1676076353,
|
"lastModified": 1689679375,
|
||||||
"narHash": "sha256-mdUtE8Tp40cZETwcq5tCwwLqkJVV1ULJQ5GKRtbshag=",
|
"narHash": "sha256-LHUC52WvyVDi9PwyL1QCpaxYWBqp4ir4iL6zgOkmcb8=",
|
||||||
"owner": "AtaraxiaSjel",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "5deb99bdccbbb97e7562dee4ba8a3ee3021688e6",
|
"rev": "684c17c429c42515bafb3ad775d2a710947f3d67",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "AtaraxiaSjel",
|
"owner": "NixOS",
|
||||||
"ref": "update/flutter",
|
"ref": "nixos-unstable",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1680273054,
|
"lastModified": 1689752456,
|
||||||
"narHash": "sha256-Bs6/5LpvYp379qVqGt9mXxxx9GSE789k3oFc+OAL07M=",
|
"narHash": "sha256-VOChdECcEI8ixz8QY+YC4JaNEFwQd1V8bA0G4B28Ki0=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3364b5b117f65fe1ce65a3cdd5612a078a3b31e3",
|
"rev": "7f256d7da238cb627ef189d56ed590739f42f13b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -49,9 +109,39 @@
|
|||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils",
|
"android-nixpkgs": "android-nixpkgs",
|
||||||
"nixpkgs": "nixpkgs",
|
"flake-utils": "flake-utils_2",
|
||||||
"nixpkgs-unstable": "nixpkgs-unstable"
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
51
flake.nix
51
flake.nix
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
description = "moxxmpp";
|
description = "moxxmpp";
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:AtaraxiaSjel/nixpkgs/update/flutter";
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
android-nixpkgs.url = "github:tadfisher/android-nixpkgs";
|
||||||
flake-utils.url = "github:numtide/flake-utils";
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs, nixpkgs-unstable, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let
|
outputs = { self, nixpkgs, android-nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
inherit system;
|
inherit system;
|
||||||
config = {
|
config = {
|
||||||
@ -14,25 +14,22 @@
|
|||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
unstable = import nixpkgs-unstable {
|
# Everything to make Flutter happy
|
||||||
inherit system;
|
sdk = android-nixpkgs.sdk.${system} (sdkPkgs: with sdkPkgs; [
|
||||||
};
|
cmdline-tools-latest
|
||||||
android = pkgs.androidenv.composeAndroidPackages {
|
build-tools-30-0-3
|
||||||
# TODO: Find a way to pin these
|
build-tools-33-0-2
|
||||||
#toolsVersion = "26.1.1";
|
build-tools-34-0-0
|
||||||
#platformToolsVersion = "31.0.3";
|
platform-tools
|
||||||
#buildToolsVersions = [ "31.0.0" ];
|
emulator
|
||||||
#includeEmulator = true;
|
patcher-v4
|
||||||
#emulatorVersion = "30.6.3";
|
platforms-android-28
|
||||||
platformVersions = [ "28" ];
|
platforms-android-29
|
||||||
includeSources = false;
|
platforms-android-30
|
||||||
includeSystemImages = true;
|
platforms-android-31
|
||||||
systemImageTypes = [ "default" ];
|
platforms-android-33
|
||||||
abiVersions = [ "x86_64" ];
|
]);
|
||||||
includeNDK = false;
|
lib = pkgs.lib;
|
||||||
useGoogleAPIs = false;
|
|
||||||
useGoogleTVAddOns = false;
|
|
||||||
};
|
|
||||||
pinnedJDK = pkgs.jdk17;
|
pinnedJDK = pkgs.jdk17;
|
||||||
|
|
||||||
pythonEnv = pkgs.python3.withPackages (ps: with ps; [
|
pythonEnv = pkgs.python3.withPackages (ps: with ps; [
|
||||||
@ -51,7 +48,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
devShell = let
|
devShell = let
|
||||||
prosody-newer-community-modules = unstable.prosody.overrideAttrs (old: {
|
prosody-newer-community-modules = pkgs.prosody.overrideAttrs (old: {
|
||||||
communityModules = pkgs.fetchhg {
|
communityModules = pkgs.fetchhg {
|
||||||
url = "https://hg.prosody.im/prosody-modules";
|
url = "https://hg.prosody.im/prosody-modules";
|
||||||
rev = "e3a3a6c86a9f";
|
rev = "e3a3a6c86a9f";
|
||||||
@ -71,7 +68,7 @@
|
|||||||
};
|
};
|
||||||
in pkgs.mkShell {
|
in pkgs.mkShell {
|
||||||
buildInputs = with pkgs; [
|
buildInputs = with pkgs; [
|
||||||
flutter pinnedJDK android.platform-tools dart # Dart
|
flutter37 pinnedJDK sdk dart # Dart
|
||||||
gitlint # Code hygiene
|
gitlint # Code hygiene
|
||||||
ripgrep # General utilities
|
ripgrep # General utilities
|
||||||
|
|
||||||
@ -103,7 +100,13 @@
|
|||||||
CPATH = "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include";
|
CPATH = "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include";
|
||||||
LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ atk cairo epoxy gdk-pixbuf glib gtk3 harfbuzz pango ];
|
LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ atk cairo epoxy gdk-pixbuf glib gtk3 harfbuzz pango ];
|
||||||
|
|
||||||
|
ANDROID_SDK_ROOT = "${sdk}/share/android-sdk";
|
||||||
|
ANDROID_HOME = "${sdk}/share/android-sdk";
|
||||||
JAVA_HOME = pinnedJDK;
|
JAVA_HOME = pinnedJDK;
|
||||||
|
|
||||||
|
# Fix an issue with Flutter using an older version of aapt2, which does not know
|
||||||
|
# an used parameter.
|
||||||
|
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdk}/share/android-sdk/build-tools/34.0.0/aapt2";
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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';
|
||||||
|
@ -312,7 +312,7 @@ class XmppConnection {
|
|||||||
|
|
||||||
/// Called when a stream ending error has occurred
|
/// Called when a stream ending error has occurred
|
||||||
Future<void> handleError(XmppError error) async {
|
Future<void> handleError(XmppError error) async {
|
||||||
_log.severe('handleError called with ${error.toString()}');
|
_log.severe('handleError called with $error');
|
||||||
|
|
||||||
// Whenever we encounter an error that would trigger a reconnection attempt while
|
// Whenever we encounter an error that would trigger a reconnection attempt while
|
||||||
// the connection result is being awaited, don't attempt a reconnection but instead
|
// the connection result is being awaited, don't attempt a reconnection but instead
|
||||||
|
@ -55,8 +55,6 @@ class JID {
|
|||||||
|
|
||||||
/// Converts the JID into a bare JID.
|
/// Converts the JID into a bare JID.
|
||||||
JID toBare() {
|
JID toBare() {
|
||||||
if (isBare()) return this;
|
|
||||||
|
|
||||||
return JID(local, domain, '');
|
return JID(local, domain, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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],
|
|
||||||
);
|
|
||||||
}
|
|
@ -5,7 +5,6 @@ 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/xep_0030/errors.dart';
|
|
||||||
import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
|
import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
|
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0045/errors.dart';
|
import 'package:moxxmpp/src/xeps/xep_0045/errors.dart';
|
||||||
|
@ -15,7 +15,6 @@ import 'package:moxxmpp/src/stringxml.dart';
|
|||||||
import 'package:moxxmpp/src/util/list.dart';
|
import 'package:moxxmpp/src/util/list.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0004.dart';
|
import 'package:moxxmpp/src/xeps/xep_0004.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0030/cache.dart';
|
import 'package:moxxmpp/src/xeps/xep_0030/cache.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0030/errors.dart';
|
|
||||||
import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
|
import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
|
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
|
||||||
import 'package:moxxmpp/src/xeps/xep_0300.dart';
|
import 'package:moxxmpp/src/xeps/xep_0300.dart';
|
||||||
|
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"/>
|
||||||
|
@ -58,7 +58,7 @@ List<ExpectationBase> buildAuthenticatedPlay(ConnectionSettings settings) {
|
|||||||
);
|
);
|
||||||
return [
|
return [
|
||||||
StringExpectation(
|
StringExpectation(
|
||||||
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare().toString()}' xml:lang='en'>",
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare()}' xml:lang='en'>",
|
||||||
'''
|
'''
|
||||||
<stream:stream
|
<stream:stream
|
||||||
xmlns="jabber:client"
|
xmlns="jabber:client"
|
||||||
@ -77,7 +77,7 @@ List<ExpectationBase> buildAuthenticatedPlay(ConnectionSettings settings) {
|
|||||||
'<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />',
|
'<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />',
|
||||||
),
|
),
|
||||||
StringExpectation(
|
StringExpectation(
|
||||||
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare().toString()}' xml:lang='en'>",
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare()}' xml:lang='en'>",
|
||||||
'''
|
'''
|
||||||
<stream:stream
|
<stream:stream
|
||||||
xmlns="jabber:client"
|
xmlns="jabber:client"
|
||||||
|
Loading…
Reference in New Issue
Block a user