diff --git a/flutter/android/src/main/jniLibs/arm64-v8a/libmedea_jason.so b/flutter/android/src/main/jniLibs/arm64-v8a/libmedea_jason.so index c8bd875dd..693a52af9 100755 Binary files a/flutter/android/src/main/jniLibs/arm64-v8a/libmedea_jason.so and b/flutter/android/src/main/jniLibs/arm64-v8a/libmedea_jason.so differ diff --git a/flutter/android/src/main/jniLibs/armeabi-v7a/libmedea_jason.so b/flutter/android/src/main/jniLibs/armeabi-v7a/libmedea_jason.so index 796d78f9c..6f33f5d5b 100755 Binary files a/flutter/android/src/main/jniLibs/armeabi-v7a/libmedea_jason.so and b/flutter/android/src/main/jniLibs/armeabi-v7a/libmedea_jason.so differ diff --git a/flutter/android/src/main/jniLibs/x86/libmedea_jason.so b/flutter/android/src/main/jniLibs/x86/libmedea_jason.so index 99acdd44d..f3d2d1a7f 100755 Binary files a/flutter/android/src/main/jniLibs/x86/libmedea_jason.so and b/flutter/android/src/main/jniLibs/x86/libmedea_jason.so differ diff --git a/flutter/android/src/main/jniLibs/x86_64/libmedea_jason.so b/flutter/android/src/main/jniLibs/x86_64/libmedea_jason.so index ac0d460f1..3ea94bf92 100755 Binary files a/flutter/android/src/main/jniLibs/x86_64/libmedea_jason.so and b/flutter/android/src/main/jniLibs/x86_64/libmedea_jason.so differ diff --git a/flutter/lib/src/interface/exceptions.dart b/flutter/lib/src/interface/exceptions.dart index 85c74086e..40fac3e84 100644 --- a/flutter/lib/src/interface/exceptions.dart +++ b/flutter/lib/src/interface/exceptions.dart @@ -37,6 +37,15 @@ enum RpcClientExceptionKind { SessionFinished, } +/// Kind of a [MediaStateTransitionException]. +enum MediaStateTransitionExceptionKind { + /// Media state of a `Sender` transits to an opposite of the requested one. + OppositeState, + + /// Requested state transition is not allowed by `Sender`'s settings. + ProhibitedState, +} + /// Exception thrown when cannot get info of available media devices. abstract class EnumerateDevicesException { /// Returns error that caused this [EnumerateDevicesException]. @@ -120,6 +129,9 @@ abstract class MediaStateTransitionException { /// Returns stacktrace of this [MediaStateTransitionException]. String trace(); + /// Returns concrete error kind of this [MediaStateTransitionException]. + MediaStateTransitionExceptionKind kind(); + @override String toString() { return message(); diff --git a/flutter/lib/src/native/ffi/exception.dart b/flutter/lib/src/native/ffi/exception.dart index 204235211..dacd2066e 100644 --- a/flutter/lib/src/native/ffi/exception.dart +++ b/flutter/lib/src/native/ffi/exception.dart @@ -87,9 +87,11 @@ Object _newRpcClientException(int kind, Pointer message, /// Creates a new [NativeMediaStateTransitionException] with the provided error /// [message] and [stacktrace]. Object _newMediaStateTransitionException( - Pointer message, Pointer stacktrace) { - return NativeMediaStateTransitionException(message.nativeStringToDartString(), - stacktrace.nativeStringToDartString()); + Pointer message, Pointer stacktrace, int kind) { + return NativeMediaStateTransitionException( + message.nativeStringToDartString(), + stacktrace.nativeStringToDartString(), + MediaStateTransitionExceptionKind.values[kind]); } /// Creates a new [InternalException] with the provided error [message], error @@ -254,8 +256,12 @@ class NativeMediaStateTransitionException extends MediaStateTransitionException /// Native stacktrace. late final String _nativeStackTrace; + /// Concrete error kind of this [NativeMediaStateTransitionException]. + late final MediaStateTransitionExceptionKind _kind; + /// Instantiates a new [NativeMediaStateTransitionException]. - NativeMediaStateTransitionException(this._message, this._nativeStackTrace); + NativeMediaStateTransitionException( + this._message, this._nativeStackTrace, this._kind); @override String message() { @@ -266,6 +272,11 @@ class NativeMediaStateTransitionException extends MediaStateTransitionException String trace() { return _nativeStackTrace; } + + @override + MediaStateTransitionExceptionKind kind() { + return _kind; + } } /// Jason's internal exception. diff --git a/flutter/lib/src/native/ffi/exception.g.dart b/flutter/lib/src/native/ffi/exception.g.dart index ca03afb8f..a61cecd9d 100644 --- a/flutter/lib/src/native/ffi/exception.g.dart +++ b/flutter/lib/src/native/ffi/exception.g.dart @@ -26,7 +26,7 @@ void registerFunction( Int64, Pointer, ForeignValue, Pointer)>> newRpcClientException, required Pointer< - NativeFunction, Pointer)>> + NativeFunction, Pointer, Int64)>> newMediaStateTransitionException, required Pointer< NativeFunction< diff --git a/flutter/lib/src/web/exceptions.dart b/flutter/lib/src/web/exceptions.dart index cdfe939a6..f8d3b8501 100644 --- a/flutter/lib/src/web/exceptions.dart +++ b/flutter/lib/src/web/exceptions.dart @@ -206,10 +206,12 @@ class WebMediaSettingsUpdateException extends MediaSettingsUpdateException { class WebMediaStateTransitionException extends MediaStateTransitionException { late String _message; late String _trace; + late MediaStateTransitionExceptionKind _kind; WebMediaStateTransitionException(wasm.MediaStateTransitionException e) { _message = e.message(); _trace = e.trace(); + _kind = MediaStateTransitionExceptionKind.values[e.kind().toInt()]; e.free(); } @@ -224,6 +226,12 @@ class WebMediaStateTransitionException extends MediaStateTransitionException { String trace() { return _trace; } + + /// Returns concrete error kind of this [MediaStateTransitionException]. + @override + MediaStateTransitionExceptionKind kind() { + return _kind; + } } /// Exceptions thrown from an RPC client that implements messaging with a media diff --git a/flutter/lib/src/web/jason_wasm.dart b/flutter/lib/src/web/jason_wasm.dart index 24df57ff7..6b262b8fa 100644 --- a/flutter/lib/src/web/jason_wasm.dart +++ b/flutter/lib/src/web/jason_wasm.dart @@ -171,6 +171,7 @@ class MediaStateTransitionException { external void free(); external String message(); external String trace(); + external num kind(); } @JS() diff --git a/src/api/dart/utils/err.rs b/src/api/dart/utils/err.rs index 376444020..b894c6f4c 100644 --- a/src/api/dart/utils/err.rs +++ b/src/api/dart/utils/err.rs @@ -85,6 +85,7 @@ mod exception { pub fn new_media_state_transition_exception( message: ptr::NonNull, stacktrace: ptr::NonNull, + kind: i64, ) -> Dart_Handle; /// Returns a new Dart [`InternalException`] with the provided error @@ -263,6 +264,7 @@ impl From for DartError { Self::new(exception::new_media_state_transition_exception( string_into_c_str(err.message()), string_into_c_str(err.trace()), + err.kind() as i64, )) } } diff --git a/src/api/err.rs b/src/api/err.rs index ab00b1c05..bc5a4b8a6 100644 --- a/src/api/err.rs +++ b/src/api/err.rs @@ -386,6 +386,22 @@ impl FormatException { } } +/// Kind of a [`MediaStateTransitionException`]. +#[cfg_attr(not(target_os = "android"), wasm_bindgen)] +#[derive(Clone, Copy, Debug)] +pub enum MediaStateTransitionExceptionKind { + /// Media state of a [`Sender`] transits to an opposite of the requested + /// one. + /// + /// [`Sender`]: crate::peer::media::Sender + OppositeState, + + /// Requested state transition is not allowed by [`Sender`]'s settings. + /// + /// [`Sender`]: crate::peer::media::Sender + ProhibitedState, +} + /// Exception thrown when the requested media state transition could not be /// performed. #[cfg_attr(not(target_os = "android"), wasm_bindgen)] @@ -394,6 +410,9 @@ pub struct MediaStateTransitionException { /// Error message describing the problem. message: Cow<'static, str>, + /// Concrete error kind of this [`MediaStateTransitionException`]. + kind: MediaStateTransitionExceptionKind, + /// Stacktrace of this [`MediaStateTransitionException`]. trace: Trace, } @@ -402,10 +421,15 @@ impl MediaStateTransitionException { /// Creates a new [`MediaStateTransitionException`] from the provided error /// `message` and `trace`. #[must_use] - pub fn new>>(message: T, trace: Trace) -> Self { + pub fn new>>( + message: T, + trace: Trace, + kind: MediaStateTransitionExceptionKind, + ) -> Self { Self { message: message.into(), trace, + kind, } } } @@ -424,6 +448,12 @@ impl MediaStateTransitionException { pub fn trace(&self) -> String { self.trace.to_string() } + + /// Returns concrete error kind of this [`MediaStateTransitionException`]. + #[must_use] + pub fn kind(&self) -> MediaStateTransitionExceptionKind { + self.kind + } } /// Errors occurring in [`RoomHandle::set_local_media_settings()`][1] method. @@ -637,12 +667,24 @@ impl From> for Error { ChangeMediaStateError::CouldNotGetLocalMedia(err) => { Traced::compose(err, trace).into() } - ChangeMediaStateError::ProhibitedState(_) - | ChangeMediaStateError::TransitionIntoOppositeState(_) - | ChangeMediaStateError::InvalidLocalTracks(_) => { - MediaStateTransitionException::new(message, trace).into() + ChangeMediaStateError::ProhibitedState(_) => { + MediaStateTransitionException::new( + message, + trace, + MediaStateTransitionExceptionKind::ProhibitedState, + ) + .into() + } + ChangeMediaStateError::TransitionIntoOppositeState(_) => { + MediaStateTransitionException::new( + message, + trace, + MediaStateTransitionExceptionKind::OppositeState, + ) + .into() } - ChangeMediaStateError::InsertLocalTracksError(_) => { + ChangeMediaStateError::InvalidLocalTracks(_) + | ChangeMediaStateError::InsertLocalTracksError(_) => { InternalException::new(message, None, trace).into() } } @@ -682,7 +724,7 @@ impl From> for Error { UE::InvalidLocalTracks(_) | UE::InsertLocalTracksError( IE::InvalidMediaTrack | IE::NotEnoughTracks, - ) => MediaStateTransitionException::new(message, trace).into(), + ) => InternalException::new(message, None, trace).into(), UE::InsertLocalTracksError(IE::CouldNotInsertLocalTrack(_)) => { InternalException::new(message, None, trace).into() } @@ -691,7 +733,12 @@ impl From> for Error { InternalException::new(message, None, trace).into() } ME::SenderCreateError(CreateError::CannotDisableRequiredSender) => { - MediaStateTransitionException::new(message, trace).into() + MediaStateTransitionException::new( + message, + trace, + MediaStateTransitionExceptionKind::ProhibitedState, + ) + .into() } } }