diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 82378bcd..f1e64d56 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -26,4 +26,3 @@ jobs: channel: 'stable' - run: flutter packages get - run: flutter format lib/ test/ --set-exit-if-changed - - run: flutter pub run import_sorter:main --no-comments --exit-if-changed diff --git a/analysis_options.yaml b/analysis_options.yaml index 6b0b30b6..6f71e31c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,4 +1,4 @@ -include: package:pedantic/analysis_options.yaml +include: package:lints/recommended.yaml linter: rules: @@ -45,7 +45,6 @@ analyzer: slash_for_doc_comments: ignore library_prefixes: ignore unused_field: ignore - top_level_function_literal_block: ignore avoid_init_to_null: ignore prefer_is_empty: ignore unused_element: ignore @@ -59,6 +58,8 @@ analyzer: unused_import: ignore must_be_immutable: ignore todo: ignore + non_constant_identifier_names: ignore + unnecessary_null_comparison: ignore exclude: - lib/src/grammar_parser.dart diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index 9aaad78c..61b6c4de 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -1,6 +1,29 @@ -include: package:pedantic/analysis_options.yaml +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. -analyzer: - strong-mode: - implicit-casts: false - implicit-dynamic: false \ No newline at end of file +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/example/lib/main.dart b/example/lib/main.dart index cb9c16e3..ecc9c157 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,13 +1,13 @@ import 'package:flutter/foundation.dart' show debugDefaultTargetPlatformOverride; - import 'package:flutter/material.dart'; -import 'package:sip_ua/sip_ua.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; -import 'src/register.dart'; -import 'src/dialpad.dart'; -import 'src/callscreen.dart'; +import 'package:sip_ua/sip_ua.dart'; + import 'src/about.dart'; +import 'src/callscreen.dart'; +import 'src/dialpad.dart'; +import 'src/register.dart'; void main() { if (WebRTC.platformIsDesktop) { @@ -17,23 +17,23 @@ void main() { } typedef PageContentBuilder = Widget Function( - [SIPUAHelper helper, Object arguments]); + [SIPUAHelper? helper, Object? arguments]); // ignore: must_be_immutable class MyApp extends StatelessWidget { final SIPUAHelper _helper = SIPUAHelper(); Map routes = { - '/': ([SIPUAHelper helper, Object arguments]) => DialPadWidget(helper), - '/register': ([SIPUAHelper helper, Object arguments]) => + '/': ([SIPUAHelper? helper, Object? arguments]) => DialPadWidget(helper), + '/register': ([SIPUAHelper? helper, Object? arguments]) => RegisterWidget(helper), - '/callscreen': ([SIPUAHelper helper, Object arguments]) => - CallScreenWidget(helper, arguments as Call), - '/about': ([SIPUAHelper helper, Object arguments]) => AboutWidget(), + '/callscreen': ([SIPUAHelper? helper, Object? arguments]) => + CallScreenWidget(helper, arguments as Call?), + '/about': ([SIPUAHelper? helper, Object? arguments]) => AboutWidget(), }; - Route _onGenerateRoute(RouteSettings settings) { - final String name = settings.name; - final PageContentBuilder pageContentBuilder = routes[name]; + Route? _onGenerateRoute(RouteSettings settings) { + final String? name = settings.name; + final PageContentBuilder? pageContentBuilder = routes[name!]; if (pageContentBuilder != null) { if (settings.arguments != null) { final Route route = MaterialPageRoute( diff --git a/example/lib/src/callscreen.dart b/example/lib/src/callscreen.dart index a2d17d0f..e2e9cf1d 100644 --- a/example/lib/src/callscreen.dart +++ b/example/lib/src/callscreen.dart @@ -3,61 +3,61 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:sip_ua/sip_ua.dart'; import 'widgets/action_button.dart'; -import 'package:sip_ua/sip_ua.dart'; class CallScreenWidget extends StatefulWidget { - final SIPUAHelper _helper; - final Call _call; - CallScreenWidget(this._helper, this._call, {Key key}) : super(key: key); + final SIPUAHelper? _helper; + final Call? _call; + CallScreenWidget(this._helper, this._call, {Key? key}) : super(key: key); @override _MyCallScreenWidget createState() => _MyCallScreenWidget(); } class _MyCallScreenWidget extends State implements SipUaHelperListener { - RTCVideoRenderer _localRenderer = RTCVideoRenderer(); - RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); - double _localVideoHeight; - double _localVideoWidth; - EdgeInsetsGeometry _localVideoMargin; - MediaStream _localStream; - MediaStream _remoteStream; + RTCVideoRenderer? _localRenderer = RTCVideoRenderer(); + RTCVideoRenderer? _remoteRenderer = RTCVideoRenderer(); + double? _localVideoHeight; + double? _localVideoWidth; + EdgeInsetsGeometry? _localVideoMargin; + MediaStream? _localStream; + MediaStream? _remoteStream; bool _showNumPad = false; String _timeLabel = '00:00'; - Timer _timer; + late Timer _timer; bool _audioMuted = false; bool _videoMuted = false; bool _speakerOn = false; bool _hold = false; - String _holdOriginator; + String? _holdOriginator; CallStateEnum _state = CallStateEnum.NONE; - SIPUAHelper get helper => widget._helper; + SIPUAHelper? get helper => widget._helper; bool get voiceonly => - (_localStream == null || _localStream.getVideoTracks().isEmpty) && - (_remoteStream == null || _remoteStream.getVideoTracks().isEmpty); + (_localStream == null || _localStream!.getVideoTracks().isEmpty) && + (_remoteStream == null || _remoteStream!.getVideoTracks().isEmpty); - String get remote_identity => call.remote_identity; + String? get remote_identity => call!.remote_identity; - String get direction => call.direction; + String get direction => call!.direction; - Call get call => widget._call; + Call? get call => widget._call; @override initState() { super.initState(); _initRenderers(); - helper.addSipUaHelperListener(this); + helper!.addSipUaHelperListener(this); _startTimer(); } @override deactivate() { super.deactivate(); - helper.removeSipUaHelperListener(this); + helper!.removeSipUaHelperListener(this); _disposeRenderers(); } @@ -78,20 +78,20 @@ class _MyCallScreenWidget extends State void _initRenderers() async { if (_localRenderer != null) { - await _localRenderer.initialize(); + await _localRenderer!.initialize(); } if (_remoteRenderer != null) { - await _remoteRenderer.initialize(); + await _remoteRenderer!.initialize(); } } void _disposeRenderers() { if (_localRenderer != null) { - _localRenderer.dispose(); + _localRenderer!.dispose(); _localRenderer = null; } if (_remoteRenderer != null) { - _remoteRenderer.dispose(); + _remoteRenderer!.dispose(); _remoteRenderer = null; } } @@ -107,15 +107,15 @@ class _MyCallScreenWidget extends State } if (callState.state == CallStateEnum.MUTED) { - if (callState.audio) _audioMuted = true; - if (callState.video) _videoMuted = true; + if (callState.audio!) _audioMuted = true; + if (callState.video!) _videoMuted = true; this.setState(() {}); return; } if (callState.state == CallStateEnum.UNMUTED) { - if (callState.audio) _audioMuted = false; - if (callState.video) _videoMuted = false; + if (callState.audio!) _audioMuted = false; + if (callState.video!) _videoMuted = false; this.setState(() {}); return; } @@ -154,10 +154,10 @@ class _MyCallScreenWidget extends State void registrationStateChanged(RegistrationState state) {} void _cleanUp() { - _localStream?.getTracks()?.forEach((track) { + _localStream?.getTracks().forEach((track) { track.stop(); }); - _localStream.dispose(); + _localStream!.dispose(); _localStream = null; } @@ -170,19 +170,19 @@ class _MyCallScreenWidget extends State } void _handelStreams(CallState event) async { - MediaStream stream = event.stream; + MediaStream? stream = event.stream; if (event.originator == 'local') { if (_localRenderer != null) { - _localRenderer.srcObject = stream; + _localRenderer!.srcObject = stream; } if (!kIsWeb && !WebRTC.platformIsDesktop) { - event.stream?.getAudioTracks()?.first?.enableSpeakerphone(false); + event.stream?.getAudioTracks().first.enableSpeakerphone(false); } _localStream = stream; } if (event.originator == 'remote') { if (_remoteRenderer != null) { - _remoteRenderer.srcObject = stream; + _remoteRenderer!.srcObject = stream; } _remoteStream = stream; } @@ -205,12 +205,12 @@ class _MyCallScreenWidget extends State } void _handleHangup() { - call.hangup(); + call!.hangup(); _timer.cancel(); } void _handleAccept() async { - bool remote_has_video = call.remote_has_video; + bool remote_has_video = call!.remote_has_video; final mediaConstraints = { 'audio': true, 'video': remote_has_video @@ -229,41 +229,41 @@ class _MyCallScreenWidget extends State mediaStream = await navigator.mediaDevices.getUserMedia(mediaConstraints); } - call.answer(helper.buildCallOptions(!remote_has_video), + call!.answer(helper!.buildCallOptions(!remote_has_video), mediaStream: mediaStream); } void _switchCamera() { if (_localStream != null) { - _localStream.getVideoTracks()[0].switchCamera(); + Helper.switchCamera(_localStream!.getVideoTracks()[0]); } } void _muteAudio() { if (_audioMuted) { - call.unmute(true, false); + call!.unmute(true, false); } else { - call.mute(true, false); + call!.mute(true, false); } } void _muteVideo() { if (_videoMuted) { - call.unmute(false, true); + call!.unmute(false, true); } else { - call.mute(false, true); + call!.mute(false, true); } } void _handleHold() { if (_hold) { - call.unhold(); + call!.unhold(); } else { - call.hold(); + call!.hold(); } } - String _tansfer_target; + late String _tansfer_target; void _handleTransfer() { showDialog( context: context, @@ -286,7 +286,7 @@ class _MyCallScreenWidget extends State TextButton( child: Text('Ok'), onPressed: () { - call.refer(_tansfer_target); + call!.refer(_tansfer_target); Navigator.of(context).pop(); }, ), @@ -304,7 +304,7 @@ class _MyCallScreenWidget extends State void _handleDtmf(String tone) { print('Dtmf tone => $tone'); - call.sendDTMF(tone); + call!.sendDTMF(tone); } void _handleKeyPad() { @@ -317,7 +317,7 @@ class _MyCallScreenWidget extends State if (_localStream != null) { _speakerOn = !_speakerOn; if (!kIsWeb) { - _localStream.getAudioTracks()[0].enableSpeakerphone(_speakerOn); + _localStream!.getAudioTracks()[0].enableSpeakerphone(_speakerOn); } } } @@ -502,14 +502,14 @@ class _MyCallScreenWidget extends State if (!voiceonly && _remoteStream != null) { stackWidgets.add(Center( - child: RTCVideoView(_remoteRenderer), + child: RTCVideoView(_remoteRenderer!), )); } if (!voiceonly && _localStream != null) { stackWidgets.add(Container( child: AnimatedContainer( - child: RTCVideoView(_localRenderer), + child: RTCVideoView(_localRenderer!), height: _localVideoHeight, width: _localVideoWidth, alignment: Alignment.topRight, @@ -536,7 +536,7 @@ class _MyCallScreenWidget extends State child: Text( (voiceonly ? 'VOICE CALL' : 'VIDEO CALL') + (_hold - ? ' PAUSED BY ${this._holdOriginator.toUpperCase()}' + ? ' PAUSED BY ${this._holdOriginator!.toUpperCase()}' : ''), style: TextStyle(fontSize: 24, color: Colors.black54), ))), diff --git a/example/lib/src/dialpad.dart b/example/lib/src/dialpad.dart index c3b13725..8b12ce20 100644 --- a/example/lib/src/dialpad.dart +++ b/example/lib/src/dialpad.dart @@ -1,26 +1,26 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:sip_ua/sip_ua.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sip_ua/sip_ua.dart'; import 'widgets/action_button.dart'; class DialPadWidget extends StatefulWidget { - final SIPUAHelper _helper; - DialPadWidget(this._helper, {Key key}) : super(key: key); + final SIPUAHelper? _helper; + DialPadWidget(this._helper, {Key? key}) : super(key: key); @override _MyDialPadWidget createState() => _MyDialPadWidget(); } class _MyDialPadWidget extends State implements SipUaHelperListener { - String _dest; - SIPUAHelper get helper => widget._helper; - TextEditingController _textController; - SharedPreferences _preferences; + String? _dest; + SIPUAHelper? get helper => widget._helper; + TextEditingController? _textController; + late SharedPreferences _preferences; - String receivedMsg; + String? receivedMsg; @override initState() { @@ -34,18 +34,18 @@ class _MyDialPadWidget extends State _preferences = await SharedPreferences.getInstance(); _dest = _preferences.getString('dest') ?? 'sip:hello_jssip@tryit.jssip.net'; _textController = TextEditingController(text: _dest); - _textController.text = _dest; + _textController!.text = _dest!; this.setState(() {}); } void _bindEventListeners() { - helper.addSipUaHelperListener(this); + helper!.addSipUaHelperListener(this); } - Future _handleCall(BuildContext context, + Future _handleCall(BuildContext context, [bool voiceonly = false]) async { - var dest = _textController.text; + var dest = _textController?.text; if (dest == null || dest.isEmpty) { showDialog( context: context, @@ -84,24 +84,24 @@ class _MyDialPadWidget extends State mediaStream = await navigator.mediaDevices.getUserMedia(mediaConstraints); } - helper.call(dest, voiceonly: voiceonly, mediaStream: mediaStream); + helper!.call(dest, voiceonly: voiceonly, mediaStream: mediaStream); _preferences.setString('dest', dest); return null; } void _handleBackSpace([bool deleteAll = false]) { - var text = _textController.text; + var text = _textController!.text; if (text.isNotEmpty) { this.setState(() { text = deleteAll ? '' : text.substring(0, text.length - 1); - _textController.text = text; + _textController!.text = text; }); } } void _handleNum(String number) { this.setState(() { - _textController.text += number; + _textController!.text += number; }); } @@ -267,7 +267,7 @@ class _MyDialPadWidget extends State padding: const EdgeInsets.all(6.0), child: Center( child: Text( - 'Status: ${EnumHelper.getName(helper.registerState.state)}', + 'Status: ${EnumHelper.getName(helper!.registerState.state)}', style: TextStyle(fontSize: 14, color: Colors.black54), )), ), @@ -306,7 +306,7 @@ class _MyDialPadWidget extends State @override void onNewMessage(SIPMessageRequest msg) { //Save the incoming message to DB - String msgBody = msg.request.body as String; + String? msgBody = msg.request.body as String?; setState(() { receivedMsg = msgBody; }); diff --git a/example/lib/src/register.dart b/example/lib/src/register.dart index 926ba11a..0e18339f 100644 --- a/example/lib/src/register.dart +++ b/example/lib/src/register.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:sip_ua/sip_ua.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sip_ua/sip_ua.dart'; class RegisterWidget extends StatefulWidget { - final SIPUAHelper _helper; - RegisterWidget(this._helper, {Key key}) : super(key: key); + final SIPUAHelper? _helper; + RegisterWidget(this._helper, {Key? key}) : super(key: key); @override _MyRegisterWidget createState() => _MyRegisterWidget(); } @@ -17,26 +17,26 @@ class _MyRegisterWidget extends State TextEditingController _displayNameController = TextEditingController(); TextEditingController _authorizationUserController = TextEditingController(); Map _wsExtraHeaders = { - 'Origin': ' https://tryit.jssip.net', - 'Host': 'tryit.jssip.net:10443' + // 'Origin': ' https://tryit.jssip.net', + // 'Host': 'tryit.jssip.net:10443' }; - SharedPreferences _preferences; - RegistrationState _registerState; + late SharedPreferences _preferences; + late RegistrationState _registerState; - SIPUAHelper get helper => widget._helper; + SIPUAHelper? get helper => widget._helper; @override initState() { super.initState(); - _registerState = helper.registerState; - helper.addSipUaHelperListener(this); + _registerState = helper!.registerState; + helper!.addSipUaHelperListener(this); _loadSettings(); } @override deactivate() { super.deactivate(); - helper.removeSipUaHelperListener(this); + helper!.removeSipUaHelperListener(this); _saveSettings(); } @@ -49,8 +49,9 @@ class _MyRegisterWidget extends State _preferences.getString('sip_uri') ?? 'hello_flutter@tryit.jssip.net'; _displayNameController.text = _preferences.getString('display_name') ?? 'Flutter SIP UA'; - _passwordController.text = _preferences.getString('password'); - _authorizationUserController.text = _preferences.getString('auth_user'); + _passwordController.text = _preferences.getString('password') ?? ''; + _authorizationUserController.text = + _preferences.getString('auth_user') ?? ''; }); } @@ -91,9 +92,9 @@ class _MyRegisterWidget extends State } void _handleSave(BuildContext context) { - if (_wsUriController.text == null) { + if (_wsUriController.text == '') { _alert(context, "WebSocket URL"); - } else if (_sipUriController.text == null) { + } else if (_sipUriController.text == '') { _alert(context, "SIP URI"); } @@ -111,7 +112,7 @@ class _MyRegisterWidget extends State settings.userAgent = 'Dart SIP Client v1.0.0'; settings.dtmfMode = DtmfMode.RFC2833; - helper.start(settings); + helper!.start(settings); } @override @@ -202,11 +203,9 @@ class _MyRegisterWidget extends State contentPadding: EdgeInsets.all(10.0), border: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black12)), - hintText: - _authorizationUserController.text?.isEmpty ?? - true - ? '[Empty]' - : null, + hintText: _authorizationUserController.text.isEmpty + ? '[Empty]' + : null, ), ), ), @@ -231,7 +230,7 @@ class _MyRegisterWidget extends State contentPadding: EdgeInsets.all(10.0), border: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black12)), - hintText: _passwordController.text?.isEmpty ?? true + hintText: _passwordController.text.isEmpty ? '[Empty]' : null, ), diff --git a/example/lib/src/widgets/action_button.dart b/example/lib/src/widgets/action_button.dart index 5a5993a3..345922eb 100644 --- a/example/lib/src/widgets/action_button.dart +++ b/example/lib/src/widgets/action_button.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; class ActionButton extends StatefulWidget { - final String title; + final String? title; final String subTitle; - final IconData icon; + final IconData? icon; final bool checked; final bool number; - final Color fillColor; - final Function() onPressed; - final Function() onLongPress; + final Color? fillColor; + final Function()? onPressed; + final Function()? onLongPress; const ActionButton( - {Key key, + {Key? key, this.title, this.subTitle = '', this.icon, @@ -85,7 +85,7 @@ class _ActionButtonState extends State { child: (widget.number || widget.title == null) ? null : Text( - widget.title, + widget.title!, style: TextStyle( fontSize: 15.0, color: widget.fillColor != null diff --git a/example/pubspec.yaml b/example/pubspec.yaml index b9f6e27b..61b1ea89 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -12,6 +12,7 @@ description: A new Flutter project. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html version: 1.0.0+1 +publish_to: none environment: sdk: ">=2.12.0 <3.0.0" diff --git a/lib/src/config.dart b/lib/src/config.dart index 2aa07782..8c65d252 100644 --- a/lib/src/config.dart +++ b/lib/src/config.dart @@ -12,19 +12,19 @@ import 'utils.dart' as Utils; // Default settings. class Settings { // SIP authentication. - String authorization_user; - String password; - String realm; - String ha1; + String? authorization_user; + String? password; + String? realm; + String? ha1; // SIP account. - String display_name; + String? display_name; dynamic uri; dynamic contact_uri; String user_agent = DartSIP_C.USER_AGENT; // SIP instance id (GRUU). - String instance_id = null; + String? instance_id = null; // Preloaded SIP Route header field. bool use_preloaded_route = false; @@ -35,16 +35,16 @@ class Settings { int no_answer_timeout = 60; // Registration parameters. - bool register = true; - int register_expires = 600; + bool? register = true; + int? register_expires = 600; dynamic registrar_server; - Map register_extra_contact_uri_params; + Map? register_extra_contact_uri_params; // Dtmf mode DtmfMode dtmf_mode = DtmfMode.INFO; // Connection options. - List sockets = []; + List? sockets = []; int connection_recovery_max_interval = 30; int connection_recovery_min_interval = 2; @@ -52,12 +52,12 @@ class Settings { * Host address. * Value to be set in Via sent_by and host part of Contact FQDN. */ - String via_host = '${Utils.createRandomToken(12)}.invalid'; + String? via_host = '${Utils.createRandomToken(12)}.invalid'; // DartSIP ID - String jssip_id; + String? jssip_id; - String hostport_params; + String? hostport_params; /// ICE Gathering Timeout (in millisecond). int ice_gathering_timeout = 500; @@ -65,10 +65,10 @@ class Settings { // Configuration checks. class Checks { - Map mandatory = - { - 'sockets': (Settings src, Settings dst) { - List sockets = src.sockets; + Map mandatory = + { + 'sockets': (Settings src, Settings? dst) { + List? sockets = src.sockets; /* Allow defining sockets parameter as: * Socket: socket * List of Socket: [socket1, socket2] @@ -76,7 +76,7 @@ class Checks { * List of Objects and Socket: [{socket: socket1}, socket2] */ List copy = []; - if (sockets is List && sockets.length > 0) { + if (sockets is List && sockets!.length > 0) { for (WebSocketInterface socket in sockets) { if (Socket.isSocket(socket)) { copy.add(socket); @@ -86,11 +86,11 @@ class Checks { throw Exceptions.ConfigurationError('sockets', sockets); } - dst.sockets = copy; + dst!.sockets = copy; }, - 'uri': (Settings src, Settings dst) { + 'uri': (Settings src, Settings? dst) { dynamic uri = src.uri; - if (src.uri == null && dst.uri == null) { + if (src.uri == null && dst!.uri == null) { throw Exceptions.ConfigurationError('uri', null); } if (!uri.contains(RegExp(r'^sip:', caseSensitive: false))) { @@ -102,61 +102,61 @@ class Checks { } else if (parsed.user == null) { throw Exceptions.ConfigurationError('uri', parsed); } else { - dst.uri = parsed; + dst!.uri = parsed; } } }; - Map optional = - { - 'authorization_user': (Settings src, Settings dst) { - String authorization_user = src.authorization_user; + Map optional = + { + 'authorization_user': (Settings src, Settings? dst) { + String? authorization_user = src.authorization_user; if (authorization_user == null) return; if (Grammar.parse('"$authorization_user"', 'quoted_string') == -1) { return; } else { - dst.authorization_user = authorization_user; + dst!.authorization_user = authorization_user; } }, - 'user_agent': (Settings src, Settings dst) { + 'user_agent': (Settings src, Settings? dst) { String user_agent = src.user_agent; if (user_agent == null) return; - if (user_agent is String) { - dst.user_agent = user_agent; - } + dst!.user_agent = user_agent; }, - 'connection_recovery_max_interval': (Settings src, Settings dst) { + 'connection_recovery_max_interval': (Settings src, Settings? dst) { int connection_recovery_max_interval = src.connection_recovery_max_interval; if (connection_recovery_max_interval == null) return; if (connection_recovery_max_interval > 0) { - dst.connection_recovery_max_interval = connection_recovery_max_interval; + dst!.connection_recovery_max_interval = + connection_recovery_max_interval; } }, - 'connection_recovery_min_interval': (Settings src, Settings dst) { + 'connection_recovery_min_interval': (Settings src, Settings? dst) { int connection_recovery_min_interval = src.connection_recovery_min_interval; if (connection_recovery_min_interval == null) return; if (connection_recovery_min_interval > 0) { - dst.connection_recovery_min_interval = connection_recovery_min_interval; + dst!.connection_recovery_min_interval = + connection_recovery_min_interval; } }, - 'contact_uri': (Settings src, Settings dst) { + 'contact_uri': (Settings src, Settings? dst) { dynamic contact_uri = src.contact_uri; if (contact_uri == null) return; if (contact_uri is String) { dynamic uri = Grammar.parse(contact_uri, 'SIP_URI'); if (uri != -1) { - dst.contact_uri = uri; + dst!.contact_uri = uri; } } }, - 'display_name': (Settings src, Settings dst) { - String display_name = src.display_name; + 'display_name': (Settings src, Settings? dst) { + String? display_name = src.display_name; if (display_name == null) return; - dst.display_name = display_name; + dst!.display_name = display_name; }, - 'instance_id': (Settings src, Settings dst) { - String instance_id = src.instance_id; + 'instance_id': (Settings src, Settings? dst) { + String? instance_id = src.instance_id; if (instance_id == null) return; if (instance_id.contains(RegExp(r'^uuid:', caseSensitive: false))) { instance_id = instance_id.substring(5); @@ -164,59 +164,55 @@ class Checks { if (Grammar.parse(instance_id, 'uuid') == -1) { return; } else { - dst.instance_id = instance_id; + dst!.instance_id = instance_id; } }, - 'no_answer_timeout': (Settings src, Settings dst) { + 'no_answer_timeout': (Settings src, Settings? dst) { int no_answer_timeout = src.no_answer_timeout; if (no_answer_timeout == null) return; if (no_answer_timeout > 0) { - dst.no_answer_timeout = no_answer_timeout; + dst!.no_answer_timeout = no_answer_timeout; } }, - 'session_timers': (Settings src, Settings dst) { + 'session_timers': (Settings src, Settings? dst) { bool session_timers = src.session_timers; if (session_timers == null) return; - if (session_timers is bool) { - dst.session_timers = session_timers; - } + dst!.session_timers = session_timers; }, - 'session_timers_refresh_method': (Settings src, Settings dst) { + 'session_timers_refresh_method': (Settings src, Settings? dst) { SipMethod method = src.session_timers_refresh_method; if (method == SipMethod.INVITE || method == SipMethod.UPDATE) { - dst.session_timers_refresh_method = method; + dst!.session_timers_refresh_method = method; } }, - 'password': (Settings src, Settings dst) { - String password = src.password; + 'password': (Settings src, Settings? dst) { + String? password = src.password; if (password == null) return; - dst.password = password.toString(); + dst!.password = password.toString(); }, - 'realm': (Settings src, Settings dst) { - String realm = src.realm; + 'realm': (Settings src, Settings? dst) { + String? realm = src.realm; if (realm == null) return; - dst.realm = realm.toString(); + dst!.realm = realm.toString(); }, - 'ha1': (Settings src, Settings dst) { - String ha1 = src.ha1; + 'ha1': (Settings src, Settings? dst) { + String? ha1 = src.ha1; if (ha1 == null) return; - dst.ha1 = ha1.toString(); + dst!.ha1 = ha1.toString(); }, - 'register': (Settings src, Settings dst) { - bool register = src.register; + 'register': (Settings src, Settings? dst) { + bool? register = src.register; if (register == null) return; - if (register is bool) { - dst.register = register; - } + dst!.register = register; }, - 'register_expires': (Settings src, Settings dst) { - int register_expires = src.register_expires; + 'register_expires': (Settings src, Settings? dst) { + int? register_expires = src.register_expires; if (register_expires == null) return; if (register_expires > 0) { - dst.register_expires = register_expires; + dst!.register_expires = register_expires; } }, - 'registrar_server': (Settings src, Settings dst) { + 'registrar_server': (Settings src, Settings? dst) { dynamic registrar_server = src.registrar_server; if (registrar_server == null) return; if (!registrar_server.contains(RegExp(r'^sip:', caseSensitive: false))) { @@ -226,49 +222,43 @@ class Checks { if (parsed == null || parsed.user != null) { return; } else { - dst.registrar_server = parsed; + dst!.registrar_server = parsed; } }, - 'register_extra_contact_uri_params': (Settings src, Settings dst) { - Map register_extra_contact_uri_params = + 'register_extra_contact_uri_params': (Settings src, Settings? dst) { + Map? register_extra_contact_uri_params = src.register_extra_contact_uri_params; if (register_extra_contact_uri_params == null) return; - if (register_extra_contact_uri_params is Map) { - dst.register_extra_contact_uri_params = - register_extra_contact_uri_params; - } + dst!.register_extra_contact_uri_params = + register_extra_contact_uri_params; }, - 'use_preloaded_route': (Settings src, Settings dst) { + 'use_preloaded_route': (Settings src, Settings? dst) { bool use_preloaded_route = src.use_preloaded_route; if (use_preloaded_route == null) return; - if (use_preloaded_route is bool) { - dst.use_preloaded_route = use_preloaded_route; - } + dst!.use_preloaded_route = use_preloaded_route; }, - 'dtmf_mode': (Settings src, Settings dst) { + 'dtmf_mode': (Settings src, Settings? dst) { DtmfMode dtmf_mode = src.dtmf_mode; if (dtmf_mode == null) return; - if (dtmf_mode is DtmfMode) { - dst.dtmf_mode = dtmf_mode; - } + dst!.dtmf_mode = dtmf_mode; }, }; } final Checks checks = Checks(); -void load(Settings src, Settings dst) { +void load(Settings src, Settings? dst) { try { // Check Mandatory parameters. checks.mandatory - .forEach((String parameter, Null Function(Settings, Settings) fun) { + .forEach((String parameter, Null Function(Settings, Settings?) fun) { logger.info('Check mandatory parameter => $parameter.'); fun(src, dst); }); // Check Optional parameters. checks.optional - .forEach((String parameter, Null Function(Settings, Settings) fun) { + .forEach((String parameter, Null Function(Settings, Settings?) fun) { logger.debug('Check optional parameter => $parameter.'); fun(src, dst); }); diff --git a/lib/src/constants.dart b/lib/src/constants.dart index 974dd435..878354ee 100644 --- a/lib/src/constants.dart +++ b/lib/src/constants.dart @@ -47,7 +47,7 @@ Map> SIP_ERROR_CAUSES = >{ Causes.AUTHENTICATION_ERROR: [401, 407] }; -class causes { +class CausesType { static const String CONNECTION_ERROR = Causes.CONNECTION_ERROR; static const String REQUEST_TIMEOUT = Causes.REQUEST_TIMEOUT; static const String SIP_FAILURE_CODE = Causes.SIP_FAILURE_CODE; @@ -110,12 +110,12 @@ enum SipMethod { } class SipMethodHelper { - static String getName(SipMethod method) { + static String getName(SipMethod? method) { int period = method.toString().indexOf('.'); return method.toString().substring(period + 1); } - static SipMethod fromString(String name) { + static SipMethod? fromString(String? name) { if (name != null) { String cleanName = name.toUpperCase(); for (SipMethod method in SipMethod.values) { diff --git a/lib/src/data.dart b/lib/src/data.dart index 998196d6..916ce420 100644 --- a/lib/src/data.dart +++ b/lib/src/data.dart @@ -6,51 +6,51 @@ import 'uri.dart'; class ParsedData { ParsedData(); - String host; - int port; - String host_type; - int cseq; - String method_str; - String reason_phrase; - URI uri; + String? host; + int? port; + String? host_type; + int? cseq; + String? method_str; + String? reason_phrase; + URI? uri; Map> uri_headers = >{}; - Map uri_params = {}; - String scheme; - String user; - String sip_version; - int status_code; - bool stale; - String algorithm; - Map params = {}; + Map? uri_params = {}; + String? scheme; + String? user; + String? sip_version; + int? status_code; + bool? stale; + String? algorithm; + Map? params = {}; List> multi_header = >[]; - String call_id; - String display_name; - String nonce; - String from_tag; - bool early_only; - String opaque; - String password; - List qop = []; - String protocol; - String realm; - Map auth_params = {}; - int cause; - int expires; - String refresher; - int rport; - String reason; - String retry_after; - String branch; - String maddr; - int ttl; - Map received = {}; - String tag; - String to_tag; - String state; - String event; - String transport; - String text; - String uuid; + late String call_id; + String? display_name; + String? nonce; + String? from_tag; + bool? early_only; + String? opaque; + String? password; + List qop = []; + String? protocol; + String? realm; + Map auth_params = {}; + int? cause; + int? expires; + String? refresher; + int? rport; + String? reason; + String? retry_after; + String? branch; + String? maddr; + int? ttl; + Map? received = {}; + String? tag; + String? to_tag; + String? state; + String? event; + String? transport; + String? text; + String? uuid; - SipMethod get method => SipMethodHelper.fromString(method_str); + SipMethod? get method => SipMethodHelper.fromString(method_str); } diff --git a/lib/src/dialog.dart b/lib/src/dialog.dart index 0e175dcd..78b6ec3d 100644 --- a/lib/src/dialog.dart +++ b/lib/src/dialog.dart @@ -11,7 +11,7 @@ import 'ua.dart'; import 'uri.dart'; import 'utils.dart' as Utils; -class Dialog_C { +class DialogStatus { // Dialog states. static const int STATUS_EARLY = 1; static const int STATUS_CONFIRMED = 2; @@ -24,20 +24,20 @@ class Id { return Id(map['call_id'], map['local_tag'], map['remote_tag']); } - String call_id; - String local_tag; - String remote_tag; + String? call_id; + String? local_tag; + String? remote_tag; @override String toString() { - return call_id + local_tag + remote_tag; + return call_id! + local_tag! + remote_tag!; } } // RFC 3261 12.1. class Dialog { - Dialog(RTCSession owner, dynamic message, String type, [int state]) { - state = state ?? Dialog_C.STATUS_CONFIRMED; + Dialog(RTCSession owner, dynamic message, String type, [int? state]) { + state = state ?? DialogStatus.STATUS_CONFIRMED; _owner = owner; _ua = owner.ua; @@ -48,8 +48,8 @@ class Dialog { if (message is IncomingResponse) { state = (message.status_code < 200) - ? Dialog_C.STATUS_EARLY - : Dialog_C.STATUS_CONFIRMED; + ? DialogStatus.STATUS_EARLY + : DialogStatus.STATUS_CONFIRMED; } dynamic contact = message.parseHeader('contact'); @@ -86,32 +86,32 @@ class Dialog { _ack_seqnum = null; } - _ua.newDialog(this); + _ua!.newDialog(this); logger.debug( - '$type dialog created with status ${_state == Dialog_C.STATUS_EARLY ? 'EARLY' : 'CONFIRMED'}'); + '$type dialog created with status ${_state == DialogStatus.STATUS_EARLY ? 'EARLY' : 'CONFIRMED'}'); } - RTCSession _owner; - UA _ua; + RTCSession? _owner; + UA? _ua; bool uac_pending_reply = false; bool uas_pending_reply = false; - int _state; - int _remote_seqnum; - URI _local_uri; - URI _remote_uri; - URI _remote_target; - List _route_set; - int _ack_seqnum; - Id _id; - num local_seqnum; + int? _state; + int? _remote_seqnum; + URI? _local_uri; + URI? _remote_uri; + URI? _remote_target; + List? _route_set; + int? _ack_seqnum; + Id? _id; + num? local_seqnum; - UA get ua => _ua; - Id get id => _id; + UA? get ua => _ua; + Id? get id => _id; - RTCSession get owner => _owner; + RTCSession? get owner => _owner; void update(dynamic message, String type) { - _state = Dialog_C.STATUS_CONFIRMED; + _state = DialogStatus.STATUS_CONFIRMED; logger.debug('dialog ${_id.toString()} changed to CONFIRMED state'); @@ -123,20 +123,22 @@ class Dialog { void terminate() { logger.debug('dialog ${_id.toString()} deleted'); - _ua.destroyDialog(this); + _ua!.destroyDialog(this); } - OutgoingRequest sendRequest(SipMethod method, Map options) { + OutgoingRequest sendRequest(SipMethod method, Map? options) { options = options ?? {}; - List extraHeaders = Utils.cloneArray(options['extraHeaders']); + List extraHeaders = options['extraHeaders'] != null + ? Utils.cloneArray(options['extraHeaders']) + : []; EventManager eventHandlers = - options['eventHandlers'] as EventManager ?? EventManager(); - String body = options['body'] ?? null; + options['eventHandlers'] as EventManager? ?? EventManager(); + String? body = options['body'] ?? null; OutgoingRequest request = _createRequest(method, extraHeaders, body); // Increase the local CSeq on authentication. eventHandlers.on(EventOnAuthenticated(), (EventOnAuthenticated event) { - local_seqnum += 1; + local_seqnum = local_seqnum! + 1; }); DialogRequestSender request_sender = @@ -163,19 +165,19 @@ class Dialog { _ack_seqnum = request.cseq; } - _owner.receiveRequest(request); + _owner!.receiveRequest(request); } // RFC 3261 12.2.1.1. OutgoingRequest _createRequest( - SipMethod method, List extraHeaders, String body) { + SipMethod method, List extraHeaders, String? body) { extraHeaders = Utils.cloneArray(extraHeaders); local_seqnum ??= Utils.Math.floor(Utils.Math.randomDouble() * 10000); - num cseq = (method == SipMethod.CANCEL || method == SipMethod.ACK) + num? cseq = (method == SipMethod.CANCEL || method == SipMethod.ACK) ? local_seqnum - : local_seqnum += 1; + : local_seqnum = local_seqnum! + 1; OutgoingRequest request = OutgoingRequest( method, @@ -183,11 +185,11 @@ class Dialog { _ua, { 'cseq': cseq, - 'call_id': _id.call_id, + 'call_id': _id!.call_id, 'from_uri': _local_uri, - 'from_tag': _id.local_tag, + 'from_tag': _id!.local_tag, 'to_uri': _remote_uri, - 'to_tag': _id.remote_tag, + 'to_tag': _id!.remote_tag, 'route_set': _route_set }, extraHeaders, @@ -200,7 +202,7 @@ class Dialog { bool _checkInDialogRequest(IncomingRequest request) { if (_remote_seqnum == null) { _remote_seqnum = request.cseq; - } else if (request.cseq < _remote_seqnum) { + } else if (request.cseq! < _remote_seqnum!) { if (request.method == SipMethod.ACK) { // We are not expecting any ACK with lower seqnum than the current one. // Or this is not the ACK we are waiting for. @@ -212,10 +214,10 @@ class Dialog { return false; } - } else if (request.cseq > _remote_seqnum) { + } else if (request.cseq! > _remote_seqnum!) { _remote_seqnum = request.cseq; } - EventManager eventHandlers = request.server_transaction; + EventManager? eventHandlers = request.server_transaction; // RFC3261 14.2 Modifying an Existing Session -UAS BEHAVIOR-. if (request.method == SipMethod.INVITE || (request.method == SipMethod.UPDATE && request.body != null)) { @@ -227,22 +229,23 @@ class Dialog { return false; } else { uas_pending_reply = true; - void Function(EventStateChanged state) stateChanged; + void Function(EventStateChanged state)? stateChanged; stateChanged = (EventStateChanged state) { - if (request.server_transaction.state == TransactionState.ACCEPTED || - request.server_transaction.state == TransactionState.COMPLETED || - request.server_transaction.state == TransactionState.TERMINATED) { + if (request.server_transaction!.state == TransactionState.ACCEPTED || + request.server_transaction!.state == TransactionState.COMPLETED || + request.server_transaction!.state == + TransactionState.TERMINATED) { uas_pending_reply = false; - eventHandlers.remove(EventStateChanged(), stateChanged); + eventHandlers!.remove(EventStateChanged(), stateChanged); } }; - eventHandlers.on(EventStateChanged(), stateChanged); + eventHandlers!.on(EventStateChanged(), stateChanged); } // RFC3261 12.2.2 Replace the dialog's remote target URI if the request is accepted. if (request.hasHeader('contact')) { - eventHandlers.on(EventStateChanged(), (EventStateChanged state) { - if (request.server_transaction.state == TransactionState.ACCEPTED) { + eventHandlers!.on(EventStateChanged(), (EventStateChanged state) { + if (request.server_transaction!.state == TransactionState.ACCEPTED) { _remote_target = request.parseHeader('contact').uri; } }); @@ -250,8 +253,8 @@ class Dialog { } else if (request.method == SipMethod.NOTIFY) { // RFC6665 3.2 Replace the dialog's remote target URI if the request is accepted. if (request.hasHeader('contact')) { - eventHandlers.on(EventStateChanged(), (EventStateChanged state) { - if (request.server_transaction.state == TransactionState.COMPLETED) { + eventHandlers!.on(EventStateChanged(), (EventStateChanged state) { + if (request.server_transaction!.state == TransactionState.COMPLETED) { _remote_target = request.parseHeader('contact').uri; } }); diff --git a/lib/src/dialog/request_sender.dart b/lib/src/dialog/request_sender.dart index 2f729dac..f0240684 100644 --- a/lib/src/dialog/request_sender.dart +++ b/lib/src/dialog/request_sender.dart @@ -15,7 +15,7 @@ class DialogRequestSender { DialogRequestSender( Dialog dialog, OutgoingRequest request, EventManager eventHandlers) { _dialog = dialog; - _ua = dialog.ua; + _ua = dialog.ua!; _request = request; _eventHandlers = eventHandlers; @@ -44,7 +44,7 @@ class DialogRequestSender { _eventHandlers.emit(EventOnAuthenticated(request: event.request)); }); handlers.on(EventOnReceiveResponse(), (EventOnReceiveResponse event) { - _receiveResponse(event.response); + _receiveResponse(event.response!); }); _request_sender = RequestSender(_ua, _request, handlers); @@ -87,11 +87,11 @@ class DialogRequestSender { _eventHandlers.emit(EventOnErrorResponse(response: response)); } } else { - _dialog.local_seqnum += 1; - _request.cseq = _dialog.local_seqnum.toInt(); + _dialog.local_seqnum = _dialog.local_seqnum! + 1; + _request.cseq = _dialog.local_seqnum!.toInt(); _reattemptTimer = setTimeout(() { // TODO(cloudwebrtc): look at dialog state instead. - if (_dialog.owner.status != RTCSession.C.STATUS_TERMINATED) { + if (_dialog.owner!.status != RTCSession.C.STATUS_TERMINATED) { _reattempt = true; _request_sender.send(); } diff --git a/lib/src/digest_authentication.dart b/lib/src/digest_authentication.dart index e5ff54af..889e9c7d 100644 --- a/lib/src/digest_authentication.dart +++ b/lib/src/digest_authentication.dart @@ -9,11 +9,11 @@ class Challenge { return Challenge(map['algorithm'], map['realm'], map['nonce'], map['opaque'], map['stale'], map['qop']); } - String algorithm; - String realm; - String nonce; - String opaque; - bool stale; + String? algorithm; + String? realm; + String? nonce; + String? opaque; + bool? stale; dynamic qop; // String or List } @@ -36,10 +36,10 @@ class DigestAuthentication { int _nc = 0; String _ncHex = '00000000'; String? _algorithm; - late String _realm; - late String _nonce; - late String _opaque; - late bool _stale; + String? _realm; + String? _nonce; + String? _opaque; + bool? _stale; String? _qop; late SipMethod _method; dynamic _uri; @@ -234,7 +234,7 @@ class DigestAuthentication { auth_params.add('nc=$_ncHex'); } if (_stale != null) { - auth_params.add('stale=${_stale ? 'true' : 'false'}'); + auth_params.add('stale=${_stale! ? 'true' : 'false'}'); } return 'Digest ${auth_params.join(', ')}'; } diff --git a/lib/src/event_manager/call_events.dart b/lib/src/event_manager/call_events.dart index 8cd3a435..632b6351 100644 --- a/lib/src/event_manager/call_events.dart +++ b/lib/src/event_manager/call_events.dart @@ -6,103 +6,104 @@ import 'events.dart'; class CallEvent extends EventType { CallEvent(this.session); - RTCSession session; - String get id => session.id; + RTCSession? session; + String? get id => session!.id; } class EventNewRTCSession extends CallEvent { - EventNewRTCSession({RTCSession session, String originator, dynamic request}) + EventNewRTCSession({RTCSession? session, String? originator, dynamic request}) : super(session); - String originator; + String? originator; dynamic request; } class EventCallConnecting extends CallEvent { - EventCallConnecting({RTCSession session, dynamic request}) : super(session); + EventCallConnecting({RTCSession? session, dynamic request}) : super(session); } class EventCallEnded extends CallEvent { EventCallEnded( - {RTCSession session, this.originator, this.cause, this.request}) + {RTCSession? session, this.originator, this.cause, this.request}) : super(session); - String originator; - ErrorCause cause; - IncomingRequest request; + String? originator; + ErrorCause? cause; + IncomingRequest? request; } class EventCallProgress extends CallEvent { - EventCallProgress({RTCSession session, this.originator, this.response}) + EventCallProgress({RTCSession? session, this.originator, this.response}) : super(session); - String originator; + String? originator; dynamic response; } class EventCallConfirmed extends CallEvent { - EventCallConfirmed({RTCSession session, this.originator, this.ack}) + EventCallConfirmed({RTCSession? session, this.originator, this.ack}) : super(session); - String originator; + String? originator; dynamic ack; } class EventCallHold extends CallEvent { - EventCallHold({RTCSession session, this.originator}) : super(session); - String originator; + EventCallHold({RTCSession? session, this.originator}) : super(session); + String? originator; } class EventCallUnhold extends CallEvent { - EventCallUnhold({RTCSession session, String originator}) : super(session); - String originator; + EventCallUnhold({RTCSession? session, String? originator}) : super(session); + String? originator; } class EventCallMuted extends CallEvent { - EventCallMuted({RTCSession session, this.audio, this.video}) : super(session); - bool audio; - bool video; + EventCallMuted({RTCSession? session, this.audio, this.video}) + : super(session); + bool? audio; + bool? video; } class EventCallUnmuted extends CallEvent { - EventCallUnmuted({RTCSession session, this.audio, this.video}) + EventCallUnmuted({RTCSession? session, this.audio, this.video}) : super(session); - bool audio; - bool video; + bool? audio; + bool? video; } class EventCallAccepted extends CallEvent { - EventCallAccepted({RTCSession session, this.originator, this.response}) + EventCallAccepted({RTCSession? session, this.originator, this.response}) : super(session); - String originator; + String? originator; dynamic response; } class EventCallFailed extends CallEvent { EventCallFailed( - {RTCSession session, - String state, + {RTCSession? session, + String? state, this.response, this.originator, - MediaStream stream, + MediaStream? stream, this.cause, this.request, this.status_line}) : super(session); dynamic response; - String originator; - ErrorCause cause; + String? originator; + ErrorCause? cause; dynamic request; - String status_line; + String? status_line; } class EventStream extends CallEvent { - EventStream({RTCSession session, this.originator, this.stream}) + EventStream({RTCSession? session, this.originator, this.stream}) : super(session); - String originator; - MediaStream stream; + String? originator; + MediaStream? stream; } class EventCallRefer extends CallEvent { - EventCallRefer({RTCSession session, this.aor, this.accept, this.reject}) + EventCallRefer({RTCSession? session, this.aor, this.accept, this.reject}) : super(session); - String aor; + String? aor; //bool Function([Function initCallback, dynamic options]) accept; dynamic accept; diff --git a/lib/src/event_manager/event_manager.dart b/lib/src/event_manager/event_manager.dart index 8196ffab..14c6b76d 100644 --- a/lib/src/event_manager/event_manager.dart +++ b/lib/src/event_manager/event_manager.dart @@ -30,7 +30,7 @@ class EventManager { /// returns true if there are any listeners associated with the EventType for this instance of EventManager bool hasListeners(EventType event) { - List targets = listeners[event.runtimeType]; + List? targets = listeners[event.runtimeType]; if (targets != null) { return targets.isNotEmpty; } @@ -60,7 +60,7 @@ class EventManager { assert(listener != null, 'Null listener'); assert(runtimeType != null, 'Null runtimeType'); try { - List targets = listeners[runtimeType]; + List? targets = listeners[runtimeType]; if (targets == null) { targets = []; listeners[runtimeType] = targets; @@ -68,22 +68,22 @@ class EventManager { targets.remove(listener); targets.add(listener); } catch (e, s) { - logger.error(e, null, s); + logger.error(e.toString(), null, s); } } /// add all event handlers from an other instance of EventManager to this one. void addAllEventHandlers(EventManager other) { other.listeners.forEach((Type runtimeType, List otherListeners) { - otherListeners.forEach((dynamic otherListener) { + for (dynamic otherListener in otherListeners) { _addListener(runtimeType, otherListener); - }); + } }); } void remove( - T eventType, void Function(T event) listener) { - List targets = listeners[eventType.runtimeType]; + T eventType, void Function(T event)? listener) { + List? targets = listeners[eventType.runtimeType]; if (targets == null) { return; } @@ -96,20 +96,20 @@ class EventManager { /// send the supplied event to all of the listeners that are subscribed to that EventType void emit(T event) { event.sanityCheck(); - List targets = listeners[event.runtimeType]; + List? targets = listeners[event.runtimeType]; if (targets != null) { // avoid concurrent modification List copy = List.from(targets); - copy.forEach((dynamic target) { + for (dynamic target in copy) { try { // logger.warn("invoking $event on $target"); target(event); } catch (e, s) { logger.error(e.toString(), null, s); } - }); + } } } } diff --git a/lib/src/event_manager/events.dart b/lib/src/event_manager/events.dart index 297038d8..58e64ff7 100644 --- a/lib/src/event_manager/events.dart +++ b/lib/src/event_manager/events.dart @@ -26,7 +26,7 @@ class ErrorCause { return 'Code: [$status_code], Cause: $cause, Reason: $reason_phrase'; } - int status_code; - String cause; - String reason_phrase; + int? status_code; + String? cause; + String? reason_phrase; } diff --git a/lib/src/event_manager/internal_events.dart b/lib/src/event_manager/internal_events.dart index 619c1119..e9031101 100644 --- a/lib/src/event_manager/internal_events.dart +++ b/lib/src/event_manager/internal_events.dart @@ -13,34 +13,34 @@ class EventStateChanged extends EventType {} class EventNewTransaction extends EventType { EventNewTransaction({this.transaction}); - TransactionBase transaction; + TransactionBase? transaction; } class EventTransactionDestroyed extends EventType { EventTransactionDestroyed({this.transaction}); - TransactionBase transaction; + TransactionBase? transaction; } class EventSipEvent extends EventType { EventSipEvent({this.request}); - IncomingRequest request; + IncomingRequest? request; } class EventOnAuthenticated extends EventType { EventOnAuthenticated({this.request}); - OutgoingRequest request; + OutgoingRequest? request; } class EventSdp extends EventType { EventSdp({this.originator, this.type, this.sdp}); - String originator; - String type; - String sdp; + String? originator; + String? type; + String? sdp; } class EventSending extends EventType { EventSending({this.request}); - OutgoingRequest request; + OutgoingRequest? request; } class EventSetRemoteDescriptionFailed extends EventType { @@ -55,8 +55,8 @@ class EventSetLocalDescriptionFailed extends EventType { class EventFailedUnderScore extends EventType { EventFailedUnderScore({this.originator, this.cause}); - String originator; - ErrorCause cause; + String? originator; + ErrorCause? cause; } class EventGetUserMediaFailed extends EventType { @@ -66,48 +66,48 @@ class EventGetUserMediaFailed extends EventType { class EventNewDTMF extends EventType { EventNewDTMF({this.originator, this.request, this.dtmf}); - String originator; + String? originator; dynamic request; - DTMF dtmf; + DTMF? dtmf; } class EventNewInfo extends EventType { EventNewInfo({this.originator, this.request, this.info}); - String originator; + String? originator; dynamic request; - Info info; + Info? info; } class EventPeerConnection extends EventType { EventPeerConnection(this.peerConnection); - RTCPeerConnection peerConnection; + RTCPeerConnection? peerConnection; } class EventReplaces extends EventType { EventReplaces({this.request, this.accept, this.reject}); dynamic request; - void Function(InitSuccessCallback) accept; - void Function() reject; + void Function(InitSuccessCallback)? accept; + void Function()? reject; } class EventUpdate extends EventType { EventUpdate({this.request, this.callback, this.reject}); dynamic request; - bool Function(Map options) callback; - bool Function(Map options) reject; + bool Function(Map options)? callback; + bool Function(Map options)? reject; } class EventReinvite extends EventType { EventReinvite({this.request, this.callback, this.reject}); dynamic request; - bool Function(Map options) callback; - bool Function(Map options) reject; + bool Function(Map options)? callback; + bool Function(Map options)? reject; } class EventIceCandidate extends EventType { EventIceCandidate(this.candidate, this.ready); RTCIceCandidate candidate; - Future Function() ready; + Future Function() ready; } class EventCreateAnswerFialed extends EventType { @@ -124,8 +124,8 @@ class EventOnFialed extends EventType {} class EventSucceeded extends EventType { EventSucceeded({this.response, this.originator}); - String originator; - IncomingMessage response; + String? originator; + IncomingMessage? response; } class EventOnTransportError extends EventType { @@ -134,12 +134,12 @@ class EventOnTransportError extends EventType { class EventOnRequestTimeout extends EventType { EventOnRequestTimeout({this.request}); - IncomingMessage request; + IncomingMessage? request; } class EventOnReceiveResponse extends EventType { EventOnReceiveResponse({this.response}); - IncomingResponse response; + IncomingResponse? response; @override void sanityCheck() { @@ -149,15 +149,15 @@ class EventOnReceiveResponse extends EventType { class EventOnDialogError extends EventType { EventOnDialogError({this.response}); - IncomingMessage response; + IncomingMessage? response; } class EventOnSuccessResponse extends EventType { EventOnSuccessResponse({this.response}); - IncomingMessage response; + IncomingMessage? response; } class EventOnErrorResponse extends EventType { EventOnErrorResponse({this.response}); - IncomingMessage response; + IncomingMessage? response; } diff --git a/lib/src/event_manager/message_events.dart b/lib/src/event_manager/message_events.dart index f72b7e49..ccc15b68 100644 --- a/lib/src/event_manager/message_events.dart +++ b/lib/src/event_manager/message_events.dart @@ -4,6 +4,6 @@ import 'events.dart'; class EventNewMessage extends EventType { EventNewMessage({this.message, this.originator, this.request}); dynamic request; - String originator; - Message message; + String? originator; + Message? message; } diff --git a/lib/src/event_manager/refer_events.dart b/lib/src/event_manager/refer_events.dart index 98ceb7dc..ca5f38f2 100644 --- a/lib/src/event_manager/refer_events.dart +++ b/lib/src/event_manager/refer_events.dart @@ -2,26 +2,26 @@ import 'events.dart'; class EventReferTrying extends EventType { EventReferTrying({this.status_line, this.request}); - String status_line; + String? status_line; dynamic request; } class EventReferProgress extends EventType { EventReferProgress({this.status_line, this.request}); - String status_line; + String? status_line; dynamic request; } class EventReferAccepted extends EventType { EventReferAccepted({this.status_line, this.request}); - String status_line; + String? status_line; dynamic request; } class EventReferFailed extends EventType { EventReferFailed({this.request, this.status_line}); dynamic request; - String status_line; + String? status_line; } class EventReferRequestSucceeded extends EventType { @@ -32,5 +32,5 @@ class EventReferRequestSucceeded extends EventType { class EventReferRequestFailed extends EventType { EventReferRequestFailed({this.response, this.cause}); dynamic response; - ErrorCause cause; + ErrorCause? cause; } diff --git a/lib/src/event_manager/register_events.dart b/lib/src/event_manager/register_events.dart index 0508af42..aeb931db 100644 --- a/lib/src/event_manager/register_events.dart +++ b/lib/src/event_manager/register_events.dart @@ -6,15 +6,15 @@ class EventRegistrationExpiring extends EventType { class EventRegistered extends EventType { EventRegistered({this.cause}); - ErrorCause cause; + ErrorCause? cause; } class EventRegistrationFailed extends EventType { EventRegistrationFailed({this.cause}); - ErrorCause cause; + ErrorCause? cause; } class EventUnregister extends EventType { EventUnregister({this.cause}); - ErrorCause cause; + ErrorCause? cause; } diff --git a/lib/src/event_manager/transport_events.dart b/lib/src/event_manager/transport_events.dart index 26be58bf..1c128662 100644 --- a/lib/src/event_manager/transport_events.dart +++ b/lib/src/event_manager/transport_events.dart @@ -3,16 +3,16 @@ import 'events.dart'; class EventSocketConnected extends EventType { EventSocketConnected({this.socket}); - WebSocketInterface socket; + WebSocketInterface? socket; } class EventSocketConnecting extends EventType { EventSocketConnecting({this.socket}); - WebSocketInterface socket; + WebSocketInterface? socket; } class EventSocketDisconnected extends EventType { - EventSocketDisconnected({WebSocketInterface socket, this.cause}); - WebSocketInterface socket; - ErrorCause cause; + EventSocketDisconnected({WebSocketInterface? socket, this.cause}); + WebSocketInterface? socket; + ErrorCause? cause; } diff --git a/lib/src/exceptions.dart b/lib/src/exceptions.dart index db6a123a..0abb320c 100644 --- a/lib/src/exceptions.dart +++ b/lib/src/exceptions.dart @@ -4,9 +4,9 @@ class ErrorImpl extends Error { int? code; String? name; String? parameter; - dynamic? value; + dynamic value; String? message; - dynamic? status; + dynamic status; } class ConfigurationError extends ErrorImpl { diff --git a/lib/src/grammar_parser.dart b/lib/src/grammar_parser.dart index f1819f5a..5383dc1c 100644 --- a/lib/src/grammar_parser.dart +++ b/lib/src/grammar_parser.dart @@ -3,7 +3,6 @@ import 'dart:core'; -import 'constants.dart'; import 'data.dart'; import 'name_addr_header.dart'; import 'uri.dart'; @@ -2682,35 +2681,35 @@ class GrammarParser { [33, 126, 128, 65535] ]; - List> _cache; + List> _cache = []; - List _cachePos; + List _cachePos = []; - List _cacheable; + List _cacheable = []; - int _ch; + late int _ch; - int _cursor; + late int _cursor; - List _errors; + List _errors = []; - List _expected; + List _expected = []; - int _failurePos; + late int _failurePos; - List _input; + List _input = []; - int _inputLen; + late int _inputLen; - int _startPos; + late int _startPos; - int _testing; + late int _testing; - int _token; + int? _token; - int _tokenStart; + int? _tokenStart; - bool success; + late bool success; final String text; @@ -2732,7 +2731,7 @@ class GrammarParser { map[start] = [result, _cursor, success]; } - void _failure([List expected]) { + void _failure(List expected) { if (_failurePos > _cursor) { return; } @@ -2741,26 +2740,24 @@ class GrammarParser { _failurePos = _cursor; } if (_token != null) { - var alias = _tokenAliases[_token]; - var flag = _tokenFlags[_token]; - var name = _tokenNames[_token]; - if (_failurePos > _tokenStart && + var alias = _tokenAliases[_token!]; + var flag = _tokenFlags[_token!]; + var name = _tokenNames[_token!]; + if (_failurePos > _tokenStart! && _failurePos == _inputLen && (flag & 1) != 0) { var message = "Unterminated '$name'"; _errors.add(new GrammarParserError(GrammarParserError.UNTERMINATED, - _failurePos, _tokenStart, message)); + _failurePos, _tokenStart!, message)); _expected.addAll(expected); - } else if (_failurePos > _tokenStart && (flag & 1) != 0) { + } else if (_failurePos > _tokenStart! && (flag & 1) != 0) { var message = "Malformed '$name'"; _errors.add(new GrammarParserError( - GrammarParserError.MALFORMED, _failurePos, _tokenStart, message)); + GrammarParserError.MALFORMED, _failurePos, _tokenStart!, message)); _expected.addAll(expected); } else { _expected.add(alias); } - } else if (expected == null) { - _expected.add(null); } else { _expected.addAll(expected); } @@ -2859,17 +2856,7 @@ class GrammarParser { return state + 1; } - List _list(Object first, List next) { - var length = next.length; - var list = new List(length + 1); - list[0] = first; - for (var i = 0; i < length; i++) { - list[i + 1] = next[i][1]; - } - return list; - } - - String _matchAny() { + String? _matchAny() { success = _cursor < _inputLen; if (success) { String result; @@ -2888,7 +2875,7 @@ class GrammarParser { return null; } - String _matchChar(int ch, String string) { + String? _matchChar(int ch, String string) { success = _ch == ch; if (success) { var result = string; @@ -2902,7 +2889,7 @@ class GrammarParser { return null; } - String _matchMapping(int start, int end, List mapping) { + String? _matchMapping(int start, int end, List mapping) { success = _ch >= start && _ch <= end; if (success) { if (mapping[_ch - start]) { @@ -2924,7 +2911,7 @@ class GrammarParser { return null; } - String _matchRange(int start, int end) { + String? _matchRange(int start, int end) { success = _ch >= start && _ch <= end; if (success) { String result; @@ -2943,7 +2930,7 @@ class GrammarParser { return null; } - String _matchRanges(List ranges) { + String? _matchRanges(List ranges) { var length = ranges.length; for (var i = 0; i < length; i += 2) { if (_ch >= ranges[i]) { @@ -2969,7 +2956,7 @@ class GrammarParser { return null; } - String _matchString(List codePoints, String string, + String? _matchString(List codePoints, String string, [bool ignoreCase = false]) { var length = codePoints.length; success = _cursor + length <= _inputLen; @@ -3149,7 +3136,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -3212,7 +3199,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(44, ','); if (!success) break; seq[1] = $$; @@ -3467,7 +3454,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(61, '='); if (!success) break; seq[1] = $$; @@ -3553,7 +3540,7 @@ class GrammarParser { } } if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -3706,7 +3693,7 @@ class GrammarParser { while (true) { $$ = _parse_dec_octet(); if (!success) break; - var seq = new List(7)..[0] = $$; + var seq = List.filled(7, null, growable: false)..[0] = $$; $$ = _matchChar(46, '.'); if (!success) break; seq[1] = $$; @@ -3795,7 +3782,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(13)..[0] = $$; + var seq = List.filled(13, null, growable: false) + ..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -3846,7 +3834,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(11)..[0] = $$; + var seq = List.filled(11, null, growable: false) + ..[0] = $$; $$ = _matchString(_strings3, '::', false); if (!success) break; seq[1] = $$; @@ -3891,7 +3880,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(10)..[0] = $$; + var seq = List.filled(10, null, growable: false) + ..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -3906,7 +3896,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -3969,7 +3960,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(9)..[0] = $$; + var seq = List.filled(9, null, growable: false) + ..[0] = $$; var testing1 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -3984,7 +3976,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4023,7 +4016,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4080,7 +4074,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; var testing3 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -4095,7 +4090,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4134,7 +4130,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4173,7 +4170,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4224,7 +4222,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(7)..[0] = $$; + var seq = List.filled(7, null, growable: false) + ..[0] = $$; var testing6 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -4239,7 +4238,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4278,7 +4278,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4317,7 +4318,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4356,7 +4358,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4401,7 +4404,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; var testing10 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -4416,7 +4420,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4455,7 +4460,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4494,7 +4500,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4533,7 +4540,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4572,7 +4580,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4617,7 +4626,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; var testing15 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -4632,7 +4642,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4671,7 +4682,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4710,7 +4722,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4749,7 +4762,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4788,7 +4802,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4827,7 +4842,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4873,7 +4889,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(12)..[0] = $$; + var seq = List.filled(12, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4921,7 +4938,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(10)..[0] = $$; + var seq = List.filled(10, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4963,7 +4981,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -4999,7 +5018,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(6)..[0] = $$; + var seq = List.filled(6, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5029,7 +5049,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5053,7 +5074,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_ls32(); if (!success) break; seq[1] = $$; @@ -5071,7 +5093,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5097,7 +5120,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(13)..[0] = $$; + var seq = List.filled(13, null, growable: false) + ..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -5148,7 +5172,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(12)..[0] = $$; + var seq = List.filled(12, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5196,7 +5221,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(10)..[0] = $$; + var seq = List.filled(10, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5238,7 +5264,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5274,7 +5301,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(6)..[0] = $$; + var seq = List.filled(6, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5304,7 +5332,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5328,7 +5357,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_ls32(); if (!success) break; seq[1] = $$; @@ -5346,7 +5376,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings3, '::', false); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5364,7 +5395,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(11)..[0] = $$; + var seq = List.filled(11, null, growable: false) + ..[0] = $$; $$ = _matchString(_strings3, '::', false); if (!success) break; seq[1] = $$; @@ -5409,7 +5441,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(10)..[0] = $$; + var seq = List.filled(10, null, growable: false) + ..[0] = $$; var testing21 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -5424,7 +5457,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5487,7 +5521,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(9)..[0] = $$; + var seq = List.filled(9, null, growable: false) + ..[0] = $$; var testing22 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -5502,7 +5537,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5541,7 +5577,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5598,7 +5635,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; var testing24 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -5613,7 +5651,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5652,7 +5691,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5691,7 +5731,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5742,7 +5783,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(7)..[0] = $$; + var seq = List.filled(7, null, growable: false) + ..[0] = $$; var testing27 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -5757,7 +5799,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5796,7 +5839,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5835,7 +5879,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5874,7 +5919,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5919,7 +5965,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; var testing31 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -5934,7 +5981,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -5973,7 +6021,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6012,7 +6061,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6051,7 +6101,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6090,7 +6141,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6135,7 +6187,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(8)..[0] = $$; + var seq = List.filled(8, null, growable: false) + ..[0] = $$; var testing36 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -6150,7 +6203,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6189,7 +6243,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6228,7 +6283,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6267,7 +6323,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6306,7 +6363,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6345,7 +6403,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_h16(); if (!success) break; seq[1] = $$; @@ -6443,7 +6502,7 @@ class GrammarParser { while (true) { $$ = _matchChar(91, '['); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_IPv6address(); if (!success) break; seq[1] = $$; @@ -6514,7 +6573,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _matchChar(60, '<'); if (!success) break; seq[1] = $$; @@ -6576,7 +6635,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_DQUOTE(); if (!success) break; seq[1] = $$; @@ -6629,7 +6688,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(40, '('); if (!success) break; seq[1] = $$; @@ -6708,7 +6767,8 @@ class GrammarParser { } } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_CRLF(); if (!success) break; seq[1] = $$; @@ -6732,7 +6792,7 @@ class GrammarParser { success = true; _testing = testing0; if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing2; for (var first = true, reps;;) { $$ = _parse_WSP(); @@ -7079,7 +7139,7 @@ class GrammarParser { while (true) { $$ = _matchChar(62, '>'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_SWS(); if (!success) break; seq[1] = $$; @@ -7141,7 +7201,7 @@ class GrammarParser { while (true) { $$ = _parse_DQUOTE(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_SWS(); if (!success) break; seq[1] = $$; @@ -7252,7 +7312,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(41, ')'); if (!success) break; seq[1] = $$; @@ -7404,7 +7464,7 @@ class GrammarParser { while (true) { $$ = _parse_Method(); if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false)..[0] = $$; $$ = _parse_SP(); if (!success) break; seq[1] = $$; @@ -7532,7 +7592,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(59, ';'); if (!success) break; seq[1] = $$; @@ -7598,7 +7658,7 @@ class GrammarParser { while (true) { $$ = _parse_uri_scheme(); if (!success) break; - var seq = new List(6)..[0] = $$; + var seq = List.filled(6, null, growable: false)..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -7638,12 +7698,12 @@ class GrammarParser { try { data.uri = URI(data.scheme, data.user, data.host, data.port, data.uri_params, data.uri_headers); - data.scheme = null; - data.user = null; - data.host = null; - data.host_type = null; - data.port = null; - data.uri_params = null; + // data.scheme = null; + // data.user = null; + // data.host = null; + // data.host_type = null; + // data.port = null; + // data.uri_params = null; if (startRule == 'SIP_URI') { $$ = data.uri; @@ -7691,7 +7751,7 @@ class GrammarParser { while (true) { $$ = _parse_uri_scheme(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -7717,11 +7777,11 @@ class GrammarParser { ///CODE_START try { data.uri = URI(data.scheme, data.user, data.host, data.port); - data.scheme = null; - data.user = null; - data.host = null; - data.host_type = null; - data.port = null; + // data.scheme = null; + // data.user = null; + // data.host = null; + // data.host_type = null; + // data.port = null; } catch (e) { $$ = -1; } @@ -7770,7 +7830,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings18, 'SIP', true); if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false)..[0] = $$; $$ = _matchChar(47, '/'); if (!success) break; seq[1] = $$; @@ -7887,7 +7947,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(47, '/'); if (!success) break; seq[1] = $$; @@ -7985,7 +8045,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(42, '*'); if (!success) break; seq[1] = $$; @@ -8134,7 +8194,7 @@ class GrammarParser { while (true) { $$ = _parse_SIP_Version(); if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false)..[0] = $$; $$ = _parse_SP(); if (!success) break; seq[1] = $$; @@ -8213,7 +8273,7 @@ class GrammarParser { } } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing1 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -8237,7 +8297,8 @@ class GrammarParser { } } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_TEXT_UTF8char(); if (!success) break; seq[1] = $$; @@ -8536,7 +8597,7 @@ class GrammarParser { while (true) { $$ = _matchChar(47, '/'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_path_segments(); if (!success) break; seq[1] = $$; @@ -8582,7 +8643,7 @@ class GrammarParser { while (true) { $$ = _parse_scheme(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -8710,7 +8771,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings51, 'algorithm', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -8865,7 +8926,7 @@ class GrammarParser { while (true) { $$ = _parse_auth_param_name(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -9052,7 +9113,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings28, 'expires', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -9069,7 +9130,7 @@ class GrammarParser { $$ = ((offset, expires) { ///CODE_START if (data.params == null) data.params = {}; - data.params['expires'] = expires; + data.params!['expires'] = expires; ///CODE_END })($start, $3); @@ -9107,7 +9168,7 @@ class GrammarParser { while (true) { $$ = _matchChar(113, 'q'); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -9124,7 +9185,7 @@ class GrammarParser { $$ = ((offset, q) { ///CODE_START if (data.params == null) data.params = {}; - data.params['q'] = q; + data.params!['q'] = q; ///CODE_END })($start, $3); @@ -9158,7 +9219,7 @@ class GrammarParser { while (true) { $$ = _parse_word(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -9172,7 +9233,8 @@ class GrammarParser { while (true) { $$ = _matchChar(64, '@'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_word(); if (!success) break; seq[1] = $$; @@ -9270,7 +9332,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings45, 'Digest', true); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false) + ..[0] = $$; $$ = _parse_LWS(); if (!success) break; seq[1] = $$; @@ -9292,7 +9355,9 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = + List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_digest_cln(); if (!success) break; seq[1] = $$; @@ -9498,7 +9563,7 @@ class GrammarParser { _failure(_expect81); } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -9514,7 +9579,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_contact_params(); if (!success) break; seq[1] = $$; @@ -9559,9 +9625,9 @@ class GrammarParser { try { header = NameAddrHeader(data.uri, data.display_name, data.params); - data.uri = null; - data.display_name = null; - data.params = null; + // data.uri = null; + // data.display_name = null; + // data.params = null; } catch (e) { header = null; } @@ -9762,7 +9828,7 @@ class GrammarParser { while (true) { $$ = _matchChar(49, '1'); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_DIGIT(); if (!success) break; seq[1] = $$; @@ -9783,7 +9849,7 @@ class GrammarParser { while (true) { $$ = _matchRange(49, 57); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_DIGIT(); if (!success) break; seq[1] = $$; @@ -9810,7 +9876,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings4, '25', false); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _matchRange(48, 53); if (!success) break; seq[1] = $$; @@ -9828,7 +9894,7 @@ class GrammarParser { while (true) { $$ = _matchChar(50, '2'); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchRange(48, 52); if (!success) break; seq[1] = $$; @@ -9849,7 +9915,7 @@ class GrammarParser { while (true) { $$ = _matchRange(49, 57); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_DIGIT(); if (!success) break; seq[1] = $$; @@ -9876,7 +9942,7 @@ class GrammarParser { while (true) { $$ = _matchRange(49, 57); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_DIGIT(); if (!success) break; seq[1] = $$; @@ -10441,7 +10507,7 @@ class GrammarParser { success = true; _testing = testing0; if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; switch (_getState(_transitions59)) { case 0: var startPos2 = _startPos; @@ -10457,7 +10523,8 @@ class GrammarParser { while (true) { $$ = _parse_token(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; var testing2 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -10469,7 +10536,9 @@ class GrammarParser { while (true) { $$ = _parse_LWS(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = + List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_token(); if (!success) break; seq[1] = $$; @@ -10628,7 +10697,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings47, 'domain', true); if (!success) break; - var seq = new List(6)..[0] = $$; + var seq = List.filled(6, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -10674,7 +10743,8 @@ class GrammarParser { } } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_URI(); if (!success) break; seq[1] = $$; @@ -10739,7 +10809,7 @@ class GrammarParser { while (true) { $$ = _parse_alphanum(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -10874,7 +10944,8 @@ class GrammarParser { while (true) { $$ = _matchChar(37, '%'); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_HEXDIG(); if (!success) break; seq[1] = $$; @@ -11151,7 +11222,7 @@ class GrammarParser { while (true) { $$ = _parse_event_package(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -11166,7 +11237,8 @@ class GrammarParser { while (true) { $$ = _matchChar(46, '.'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_event_template(); if (!success) break; seq[1] = $$; @@ -11247,7 +11319,7 @@ class GrammarParser { while (true) { $$ = _parse_DIGIT(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_DIGIT(); if (!success) break; seq[1] = $$; @@ -11428,7 +11500,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings84, 'from-tag', false); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -11541,7 +11613,7 @@ class GrammarParser { while (true) { $$ = _parse_token(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -11556,7 +11628,8 @@ class GrammarParser { while (true) { $$ = _parse_EQUAL(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_gen_value(); if (!success) break; seq[1] = $$; @@ -11596,7 +11669,7 @@ class GrammarParser { if (param.toLowerCase() == 'branch') { data.branch = value; } - data.params[param.toLowerCase()] = value; + data.params![param.toLowerCase()] = value; ///CODE_END })($start, $1, $2); @@ -11644,7 +11717,7 @@ class GrammarParser { while (true) { $$ = _parse_HEXDIG(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; $$ = _parse_HEXDIG(); @@ -11705,7 +11778,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings33, 'handling', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -11794,7 +11867,7 @@ class GrammarParser { while (true) { $$ = _parse_hname(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _matchChar(61, '='); if (!success) break; seq[1] = $$; @@ -11816,7 +11889,7 @@ class GrammarParser { if (data.uri_headers[hname] == null) { data.uri_headers[hname] = [hvalue]; } else { - data.uri_headers[hname].add(hvalue); + data.uri_headers[hname]!.add(hvalue); } ///CODE_END @@ -11951,7 +12024,7 @@ class GrammarParser { while (true) { $$ = _matchChar(63, '?'); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_header(); if (!success) break; seq[1] = $$; @@ -11970,7 +12043,8 @@ class GrammarParser { while (true) { $$ = _matchChar(38, '&'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_header(); if (!success) break; seq[1] = $$; @@ -12031,7 +12105,7 @@ class GrammarParser { while (true) { $$ = _parse_hex4(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_hex4(); if (!success) break; seq[1] = $$; @@ -12068,7 +12142,7 @@ class GrammarParser { while (true) { $$ = _parse_HEXDIG(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_HEXDIG(); if (!success) break; seq[1] = $$; @@ -12108,7 +12182,7 @@ class GrammarParser { while (true) { $$ = _parse_hex4(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_hex4(); if (!success) break; seq[1] = $$; @@ -12174,7 +12248,7 @@ class GrammarParser { _failure(_expect61); } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -12189,7 +12263,8 @@ class GrammarParser { while (true) { $$ = _matchChar(63, '?'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_query(); if (!success) break; seq[1] = $$; @@ -12520,7 +12595,8 @@ class GrammarParser { while (true) { $$ = _parse_domainlabel(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _matchChar(46, '.'); if (!success) break; seq[1] = $$; @@ -12551,7 +12627,8 @@ class GrammarParser { } } if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_toplabel(); if (!success) break; seq[1] = $$; @@ -12630,7 +12707,7 @@ class GrammarParser { while (true) { $$ = _parse_host(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -12645,7 +12722,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_port(); if (!success) break; seq[1] = $$; @@ -12850,7 +12928,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings16, 'lr', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -12864,7 +12942,8 @@ class GrammarParser { while (true) { $$ = _matchChar(61, '='); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_token(); if (!success) break; seq[1] = $$; @@ -12899,7 +12978,7 @@ class GrammarParser { { ///CODE_START if (data.uri_params == null) data.uri_params = {}; - data.uri_params['lr'] = null; + data.uri_params!['lr'] = null; ///CODE_END } @@ -12947,7 +13026,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -12992,7 +13072,8 @@ class GrammarParser { while (true) { $$ = _parse_h16(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _matchChar(58, ':'); if (!success) break; seq[1] = $$; @@ -13063,7 +13144,7 @@ class GrammarParser { while (true) { $$ = _parse_m_attribute(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -13197,7 +13278,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings15, 'maddr=', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_host(); if (!success) break; seq[1] = $$; @@ -13210,7 +13291,7 @@ class GrammarParser { $$ = ((offset, maddr) { ///CODE_START if (data.uri_params == null) data.uri_params = {}; - data.uri_params['maddr'] = maddr; + data.uri_params!['maddr'] = maddr; ///CODE_END })($start, $2); @@ -13317,7 +13398,7 @@ class GrammarParser { while (true) { $$ = _parse_m_type(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_SLASH(); if (!success) break; seq[1] = $$; @@ -13339,7 +13420,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_m_parameter(); if (!success) break; seq[1] = $$; @@ -13404,7 +13486,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings13, 'method=', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_Method(); if (!success) break; seq[1] = $$; @@ -13417,7 +13499,7 @@ class GrammarParser { $$ = ((offset, method) { ///CODE_START if (data.uri_params == null) data.uri_params = {}; - data.uri_params['method'] = method; + data.uri_params!['method'] = method; ///CODE_END })($start, $2); @@ -13488,7 +13570,7 @@ class GrammarParser { success = true; _testing = testing0; if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_LAQUOT(); if (!success) break; seq[1] = $$; @@ -13535,7 +13617,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings17, '//', false); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_authority(); if (!success) break; seq[1] = $$; @@ -13580,7 +13662,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings48, 'nonce', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -13658,7 +13740,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings49, 'opaque', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -13709,7 +13791,7 @@ class GrammarParser { while (true) { $$ = _parse_uric_no_slash(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -13788,7 +13870,7 @@ class GrammarParser { while (true) { $$ = _parse_auth_scheme(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_LWS(); if (!success) break; seq[1] = $$; @@ -13810,7 +13892,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_auth_param(); if (!success) break; seq[1] = $$; @@ -13907,7 +13990,7 @@ class GrammarParser { while (true) { $$ = _parse_pname(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -13921,7 +14004,8 @@ class GrammarParser { while (true) { $$ = _matchChar(61, '='); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_pvalue(); if (!success) break; seq[1] = $$; @@ -13961,7 +14045,7 @@ class GrammarParser { } if (param.toLowerCase() == 'transport') value = value.toLowerCase(); - data.uri_params[param.toLowerCase()] = value; + data.uri_params![param.toLowerCase()] = value; ///CODE_END })($start, $1, $2); @@ -14296,7 +14380,7 @@ class GrammarParser { while (true) { $$ = _parse_segment(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -14312,7 +14396,8 @@ class GrammarParser { while (true) { $$ = _matchChar(47, '/'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_segment(); if (!success) break; seq[1] = $$; @@ -14525,7 +14610,8 @@ class GrammarParser { success = true; _testing = testing0; if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false) + ..[0] = $$; var testing1 = _testing; _testing = _cursor; $$ = _parse_DIGIT(); @@ -14804,7 +14890,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings54, 'qop', true); if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -14819,7 +14905,8 @@ class GrammarParser { while (true) { $$ = _parse_qop_value(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -14834,7 +14921,8 @@ class GrammarParser { while (true) { $$ = _matchChar(44, ','); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_qop_value(); if (!success) break; seq[1] = $$; @@ -15050,7 +15138,7 @@ class GrammarParser { while (true) { $$ = _matchChar(92, '\\'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; switch (_getState(_transitions24)) { case 0: var startPos1 = _startPos; @@ -15130,7 +15218,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_DQUOTE(); if (!success) break; seq[1] = $$; @@ -15233,7 +15321,7 @@ class GrammarParser { while (true) { $$ = _parse_SWS(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_DQUOTE(); if (!success) break; seq[1] = $$; @@ -15332,7 +15420,7 @@ class GrammarParser { while (true) { $$ = _matchChar(48, '0'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch == 46 @@ -15347,7 +15435,8 @@ class GrammarParser { while (true) { $$ = _matchChar(46, '.'); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false) + ..[0] = $$; var testing1 = _testing; _testing = _cursor; $$ = _parse_DIGIT(); @@ -15436,7 +15525,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings46, 'realm', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -15514,7 +15603,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings57, 'cause', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -15657,7 +15746,8 @@ class GrammarParser { while (true) { $$ = _parse_name_addr(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -15673,7 +15763,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_rr_param(); if (!success) break; seq[1] = $$; @@ -15732,9 +15823,9 @@ class GrammarParser { if (data.multi_header == null) data.multi_header = []; try { header = NameAddrHeader(data.uri, data.display_name, data.params); - data.uri = null; - data.display_name = null; - data.params = null; + // data.uri = null; + // data.display_name = null; + // data.params = null; } catch (e) { header = null; } @@ -16056,7 +16147,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings74, 'rport', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -16087,7 +16178,8 @@ class GrammarParser { success = true; _testing = testing1; if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false) + ..[0] = $$; var testing2 = _testing; _testing = _cursor; $$ = _parse_DIGIT(); @@ -16206,7 +16298,7 @@ class GrammarParser { while (true) { $$ = _parse_name_addr(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -16222,7 +16314,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_rr_param(); if (!success) break; seq[1] = $$; @@ -16416,7 +16509,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings79, 'refresher', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -16498,7 +16591,7 @@ class GrammarParser { while (true) { $$ = _parse_ALPHA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: true)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -16620,7 +16713,7 @@ class GrammarParser { } } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing1 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -16636,7 +16729,8 @@ class GrammarParser { while (true) { $$ = _matchChar(59, ';'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_param(); if (!success) break; seq[1] = $$; @@ -16698,7 +16792,7 @@ class GrammarParser { while (true) { $$ = _parse_via_host(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -16713,7 +16807,8 @@ class GrammarParser { while (true) { $$ = _parse_COLON(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_via_port(); if (!success) break; seq[1] = $$; @@ -16768,7 +16863,7 @@ class GrammarParser { while (true) { $$ = _parse_protocol_name(); if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false)..[0] = $$; $$ = _parse_SLASH(); if (!success) break; seq[1] = $$; @@ -16830,7 +16925,8 @@ class GrammarParser { while (true) { $$ = _parse_userinfo(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _matchChar(64, '@'); if (!success) break; seq[1] = $$; @@ -16854,7 +16950,8 @@ class GrammarParser { success = true; _testing = testing1; if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_hostport(); if (!success) break; seq[1] = $$; @@ -16904,7 +17001,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings50, 'stale', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -16970,7 +17067,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings28, 'expires', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17030,7 +17128,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings61, 'reason', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17081,7 +17180,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings62, 'retry_after', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17145,7 +17245,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings61, 'reason', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17196,7 +17297,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings28, 'expires', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17247,7 +17349,8 @@ class GrammarParser { while (true) { $$ = _matchString(_strings62, 'retry_after', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17410,7 +17513,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings44, 'tag', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17502,7 +17605,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings83, 'to-tag', false); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -17826,7 +17929,7 @@ class GrammarParser { while (true) { $$ = _parse_ALPHA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -17996,7 +18099,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings5, 'transport=', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; switch (_getState(_transitions37)) { case 0: var startPos1 = _startPos; @@ -18071,7 +18174,7 @@ class GrammarParser { $$ = ((offset, transport) { ///CODE_START if (data.uri_params == null) data.uri_params = {}; - data.uri_params['transport'] = transport.toLowerCase(); + data.uri_params!['transport'] = transport.toLowerCase(); ///CODE_END })($start, $2); @@ -18128,7 +18231,8 @@ class GrammarParser { while (true) { $$ = _parse_DIGIT(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false) + ..[0] = $$; var testing0 = _testing; _testing = _cursor; $$ = _parse_DIGIT(); @@ -18201,7 +18305,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings14, 'ttl=', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_ttl(); if (!success) break; seq[1] = $$; @@ -18214,7 +18318,7 @@ class GrammarParser { $$ = ((offset, ttl) { ///CODE_START if (data.params == null) data.params = {}; - data.params['ttl'] = ttl; + data.params!['ttl'] = ttl; ///CODE_END })($start, $2); @@ -18413,7 +18517,8 @@ class GrammarParser { while (true) { $$ = _matchChar(59, ';'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_uri_parameter(); if (!success) break; seq[1] = $$; @@ -18785,7 +18890,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings10, 'user=', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; switch (_getState(_transitions38)) { case 0: var startPos1 = _startPos; @@ -18841,7 +18946,7 @@ class GrammarParser { $$ = ((offset, user) { ///CODE_START if (data.uri_params == null) data.uri_params = {}; - data.uri_params['user'] = user.toLowerCase(); + data.uri_params!['user'] = user.toLowerCase(); ///CODE_END })($start, $2); @@ -18956,7 +19061,7 @@ class GrammarParser { success = true; _testing = testing0; if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; switch (_getState(_transitions25)) { case 0: var startPos1 = _startPos; @@ -18989,7 +19094,8 @@ class GrammarParser { while (true) { $$ = _matchChar(58, ':'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_password(); if (!success) break; seq[1] = $$; @@ -19067,7 +19173,7 @@ class GrammarParser { while (true) { $$ = _parse_hex8(); if (!success) break; - var seq = new List(9)..[0] = $$; + var seq = List.filled(9, null, growable: false)..[0] = $$; $$ = _matchChar(45, '-'); if (!success) break; seq[1] = $$; @@ -19149,7 +19255,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings73, 'branch', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -19305,7 +19411,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings71, 'maddr', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -19364,7 +19470,7 @@ class GrammarParser { while (true) { $$ = _parse_sent_protocol(); if (!success) break; - var seq = new List(4)..[0] = $$; + var seq = List.filled(4, null, growable: false)..[0] = $$; $$ = _parse_LWS(); if (!success) break; seq[1] = $$; @@ -19386,7 +19492,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_via_params(); if (!success) break; seq[1] = $$; @@ -19583,7 +19690,8 @@ class GrammarParser { success = true; _testing = testing0; if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false) + ..[0] = $$; var testing1 = _testing; _testing = _cursor; $$ = _parse_DIGIT(); @@ -19668,7 +19776,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings72, 'received', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -19751,7 +19859,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings70, 'ttl', true); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_EQUAL(); if (!success) break; seq[1] = $$; @@ -20022,7 +20130,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings43, 'x-', true); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_token(); if (!success) break; seq[1] = $$; @@ -20087,8 +20195,7 @@ class GrammarParser { return const []; } - var codePoints = []; - codePoints.length = length; + var codePoints = List.filled(length, 0); var i = 0; var pos = 0; for (; i < length; pos++) { @@ -20107,13 +20214,13 @@ class GrammarParser { } } - codePoints.length = pos; + // codePoints.length = pos; return codePoints; } static List _unmap(List mapping) { var length = mapping.length; - var result = new List(length * 31); + var result = List.filled(length * 31, false, growable: false); var offset = 0; for (var i = 0; i < length; i++) { var v = mapping[i]; @@ -20159,7 +20266,7 @@ class GrammarParser { errors.add(error); } } - var names = new Set(); + var names = Set(); names.addAll(_expected); if (names.contains(null)) { var string = getc(_failurePos); @@ -20191,7 +20298,7 @@ class GrammarParser { while (true) { $$ = _parse_event_type(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -20207,7 +20314,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_event_type(); if (!success) break; seq[1] = $$; @@ -20273,7 +20381,7 @@ class GrammarParser { while (true) { $$ = _parse_CSeq_value(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_LWS(); if (!success) break; seq[1] = $$; @@ -20323,7 +20431,7 @@ class GrammarParser { while (true) { $$ = _parse_word(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; _testing = _cursor; switch (_ch >= 0 && _ch <= 1114111 @@ -20337,7 +20445,8 @@ class GrammarParser { while (true) { $$ = _matchChar(64, '@'); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_word(); if (!success) break; seq[1] = $$; @@ -20433,7 +20542,8 @@ class GrammarParser { while (true) { $$ = _parse_contact_param(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -20449,7 +20559,9 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = + List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_contact_param(); if (!success) break; seq[1] = $$; @@ -20556,7 +20668,7 @@ class GrammarParser { while (true) { $$ = _parse_disp_type(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -20572,7 +20684,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_disp_param(); if (!success) break; seq[1] = $$; @@ -20634,7 +20747,7 @@ class GrammarParser { while (true) { $$ = _parse_content_coding(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -20650,7 +20763,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_content_coding(); if (!success) break; seq[1] = $$; @@ -20820,7 +20934,7 @@ class GrammarParser { while (true) { $$ = _parse_event_type(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -20836,7 +20950,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_event_param(); if (!success) break; seq[1] = $$; @@ -20980,7 +21095,7 @@ class GrammarParser { _failure(_expect81); } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -20996,7 +21111,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_from_param(); if (!success) break; seq[1] = $$; @@ -21233,7 +21349,7 @@ class GrammarParser { } } if (!success) break; - var seq = new List(5)..[0] = $$; + var seq = List.filled(5, null, growable: false)..[0] = $$; $$ = _parse_LAQUOT(); if (!success) break; seq[1] = $$; @@ -21258,7 +21374,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_generic_param(); if (!success) break; seq[1] = $$; @@ -21360,7 +21477,7 @@ class GrammarParser { while (true) { $$ = _parse_option_tag(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -21376,7 +21493,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_option_tag(); if (!success) break; seq[1] = $$; @@ -21467,7 +21585,7 @@ class GrammarParser { _failure(_expect112); } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -21483,7 +21601,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_reason_param(); if (!success) break; seq[1] = $$; @@ -21525,11 +21644,11 @@ class GrammarParser { ///CODE_START data.protocol = protocol.toLowerCase(); if (data.params == null) data.params = {}; - if (data.params['text'] != null && - data.params['text'][0] == '"') { - var text = data.params['text']; + if (data.params!['text'] != null && + data.params!['text'][0] == '"') { + var text = data.params!['text']; data.text = text.substring(1, text.length - 1); - data.params['text'] = null; + data.params!['text'] = null; } return data; @@ -21569,7 +21688,7 @@ class GrammarParser { while (true) { $$ = _parse_rec_route(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -21585,7 +21704,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_rec_route(); if (!success) break; seq[1] = $$; @@ -21704,7 +21824,7 @@ class GrammarParser { _failure(_expect81); } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -21720,7 +21840,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_generic_param(); if (!success) break; seq[1] = $$; @@ -21798,7 +21919,7 @@ class GrammarParser { while (true) { $$ = _parse_call_id(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -21814,7 +21935,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_replaces_param(); if (!success) break; seq[1] = $$; @@ -21949,7 +22071,7 @@ class GrammarParser { while (true) { $$ = _parse_option_tag(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -21965,7 +22087,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_option_tag(); if (!success) break; seq[1] = $$; @@ -22031,7 +22154,7 @@ class GrammarParser { while (true) { $$ = _parse_route_param(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22047,7 +22170,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_route_param(); if (!success) break; seq[1] = $$; @@ -22113,7 +22237,7 @@ class GrammarParser { while (true) { $$ = _parse_s_e_expires(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22129,7 +22253,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_s_e_params(); if (!success) break; seq[1] = $$; @@ -22247,7 +22372,7 @@ class GrammarParser { while (true) { $$ = _parse_substate_value(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22263,7 +22388,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_subexp_params(); if (!success) break; seq[1] = $$; @@ -22336,7 +22462,8 @@ class GrammarParser { while (true) { $$ = _parse_option_tag(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; var testing1 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22352,7 +22479,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_option_tag(); if (!success) break; seq[1] = $$; @@ -22459,7 +22587,7 @@ class GrammarParser { _failure(_expect81); } if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22475,7 +22603,8 @@ class GrammarParser { while (true) { $$ = _parse_SEMI(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_to_param(); if (!success) break; seq[1] = $$; @@ -22557,7 +22686,7 @@ class GrammarParser { while (true) { $$ = _parse_via_param(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22573,7 +22702,8 @@ class GrammarParser { while (true) { $$ = _parse_COMMA(); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false) + ..[0] = $$; $$ = _parse_via_param(); if (!success) break; seq[1] = $$; @@ -22672,7 +22802,7 @@ class GrammarParser { while (true) { $$ = _parse_LPAREN(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; var testing0 = _testing; for (var reps = [];;) { _testing = _cursor; @@ -22764,7 +22894,7 @@ class GrammarParser { while (true) { $$ = _parse_header_name(); if (!success) break; - var seq = new List(3)..[0] = $$; + var seq = List.filled(3, null, growable: false)..[0] = $$; $$ = _parse_HCOLON(); if (!success) break; seq[1] = $$; @@ -22970,7 +23100,7 @@ class GrammarParser { while (true) { $$ = _matchString(_strings82, 'uuid:', false); if (!success) break; - var seq = new List(2)..[0] = $$; + var seq = List.filled(2, null, growable: false)..[0] = $$; $$ = _parse_uuid(); if (!success) break; seq[1] = $$; @@ -23003,7 +23133,7 @@ class GrammarParser { throw new RangeError('pos'); } _cursor = pos; - _cache = new List>(252); + _cache = new List>.filled(252, {}); _cachePos = new List.filled(252, -1); _cacheable = new List.filled(252, false); _ch = -1; @@ -23024,7 +23154,7 @@ class GrammarParser { var data = ParsedData(); int parseInt(str) { - return int.tryParse(str) ?? null; + return int.tryParse(str) ?? 0; } double parseFloat(str) { @@ -23278,7 +23408,7 @@ class GrammarParser { startRule = "CRLF"; } this.startRule = startRule; - return parseFunctions[startRule](); + return parseFunctions[startRule]!(); } } diff --git a/lib/src/logger.dart b/lib/src/logger.dart index 28d9d77a..fb72eb24 100644 --- a/lib/src/logger.dart +++ b/lib/src/logger.dart @@ -13,29 +13,29 @@ class Log extends Logger { factory Log.d(String message, [dynamic error, StackTrace? stackTrace]) { autoInit(); - _self.d(message, error, stackTrace); - return _self; + _self!.d(message, error, stackTrace); + return _self!; } factory Log.i(String message, [dynamic error, StackTrace? stackTrace]) { autoInit(); - _self.i(message, error, stackTrace); - return _self; + _self!.i(message, error, stackTrace); + return _self!; } factory Log.w(String message, [dynamic error, StackTrace? stackTrace]) { autoInit(); - _self.w(message, error, stackTrace); - return _self; + _self!.w(message, error, stackTrace); + return _self!; } factory Log.e(String message, [dynamic error, StackTrace? stackTrace]) { autoInit(); - _self.e(message, error, stackTrace); - return _self; + _self!.e(message, error, stackTrace); + return _self!; } - static late Log _self; + static Log? _self; static late String _localPath; static Level _loggingLevel = Level.debug; static set loggingLevel(Level loggingLevel) => _loggingLevel = loggingLevel; @@ -71,11 +71,12 @@ class Log extends Logger { StackTraceNJ frames = StackTraceNJ(); - for (Stackframe frame in frames.frames) { - _localPath = frame.sourceFile.path - .substring(frame.sourceFile.path.lastIndexOf('/')); - break; - } + if (frames.frames != null) + for (Stackframe frame in frames.frames!) { + _localPath = frame.sourceFile.path + .substring(frame.sourceFile.path.lastIndexOf('/')); + break; + } } } @@ -110,14 +111,15 @@ class MyLogPrinter extends LogPrinter { StackTraceNJ frames = StackTraceNJ(); int i = 0; int depth = 0; - for (Stackframe frame in frames.frames) { - i++; - String path2 = frame.sourceFile.path; - if (!path2.contains(Log._localPath) && !path2.contains('logger.dart')) { - depth = i - 1; - break; + if (frames.frames != null) + for (Stackframe frame in frames.frames!) { + i++; + String path2 = frame.sourceFile.path; + if (!path2.contains(Log._localPath) && !path2.contains('logger.dart')) { + depth = i - 1; + break; + } } - } print(color( '[$formattedDate] ${event.level} ${StackTraceNJ(skipFrames: depth).formatStackTrace(methodCount: 1)} ::: ${event.message}')); diff --git a/lib/src/message.dart b/lib/src/message.dart index 687266e7..9822079a 100644 --- a/lib/src/message.dart +++ b/lib/src/message.dart @@ -28,23 +28,23 @@ class Message extends EventManager { _data = {}; } - UA _ua; + UA? _ua; dynamic _request; - bool _closed; - String _direction; - NameAddrHeader _local_identity; - NameAddrHeader _remote_identity; - bool _is_replied; - Map _data; - String get direction => _direction; + bool? _closed; + String? _direction; + NameAddrHeader? _local_identity; + NameAddrHeader? _remote_identity; + bool? _is_replied; + Map? _data; + String? get direction => _direction; - NameAddrHeader get local_identity => _local_identity; + NameAddrHeader? get local_identity => _local_identity; - NameAddrHeader get remote_identity => _remote_identity; + NameAddrHeader? get remote_identity => _remote_identity; - Map get data => _data; + Map? get data => _data; - void send(String target, String body, [Map options]) { + void send(String target, String body, [Map? options]) { String originalTarget = target; options = options ?? {}; @@ -53,7 +53,7 @@ class Message extends EventManager { } // Check target validity. - URI normalized = _ua.normalizeTarget(target); + URI? normalized = _ua!.normalizeTarget(target); if (normalized == null) { throw Exceptions.TypeError('Invalid target: $originalTarget'); } @@ -85,7 +85,7 @@ class Message extends EventManager { _receiveResponse(event.response); }); - RequestSender request_sender = RequestSender(_ua, _request, handlers); + RequestSender request_sender = RequestSender(_ua!, _request, handlers); _newMessage('local', _request); @@ -112,7 +112,7 @@ class Message extends EventManager { */ void accept(Map options) { List extraHeaders = Utils.cloneArray(options['extraHeaders']); - String body = options['body']; + String? body = options['body']; if (_direction != 'incoming') { throw Exceptions.NotSupportedError( @@ -133,9 +133,9 @@ class Message extends EventManager { */ void reject(Map options) { int status_code = options['status_code'] ?? 480; - String reason_phrase = options['reason_phrase']; + String? reason_phrase = options['reason_phrase']; List extraHeaders = Utils.cloneArray(options['extraHeaders']); - String body = options['body']; + String? body = options['body']; if (_direction != 'incoming') { throw Exceptions.NotSupportedError( @@ -154,11 +154,11 @@ class Message extends EventManager { _request.reply(status_code, reason_phrase, extraHeaders, body); } - void _receiveResponse(IncomingResponse response) { + void _receiveResponse(IncomingResponse? response) { if (_closed != null) { return; } - if (RegExp(r'^1[0-9]{2}$').hasMatch(response.status_code)) { + if (RegExp(r'^1[0-9]{2}$').hasMatch(response!.status_code)) { // Ignore provisional responses. } else if (RegExp(r'^2[0-9]{2}$').hasMatch(response.status_code)) { _succeeded('remote', response); @@ -172,20 +172,21 @@ class Message extends EventManager { if (_closed != null) { return; } - _failed('system', 408, DartSIP_C.causes.REQUEST_TIMEOUT, 'Request Timeout'); + _failed( + 'system', 408, DartSIP_C.CausesType.REQUEST_TIMEOUT, 'Request Timeout'); } void _onTransportError() { if (_closed != null) { return; } - _failed( - 'system', 500, DartSIP_C.causes.CONNECTION_ERROR, 'Transport Error'); + _failed('system', 500, DartSIP_C.CausesType.CONNECTION_ERROR, + 'Transport Error'); } void close() { _closed = true; - _ua.destroyMessage(this); + _ua!.destroyMessage(this); } /** @@ -203,11 +204,11 @@ class Message extends EventManager { _remote_identity = request.to; } - _ua.newMessage(this, originator, request); + _ua!.newMessage(this, originator, request); } - void _failed( - String originator, int status_code, String cause, String reason_phrase) { + void _failed(String originator, int? status_code, String cause, + String? reason_phrase) { logger.debug('MESSAGE failed'); close(); logger.debug('emit "failed"'); @@ -219,7 +220,7 @@ class Message extends EventManager { reason_phrase: reason_phrase))); } - void _succeeded(String originator, IncomingResponse response) { + void _succeeded(String originator, IncomingResponse? response) { logger.debug('MESSAGE succeeded'); close(); diff --git a/lib/src/name_addr_header.dart b/lib/src/name_addr_header.dart index 1504993b..a2924071 100644 --- a/lib/src/name_addr_header.dart +++ b/lib/src/name_addr_header.dart @@ -3,10 +3,10 @@ import 'uri.dart'; import 'utils.dart'; class NameAddrHeader { - NameAddrHeader(URI uri, String display_name, - [Map parameters]) { + NameAddrHeader(URI? uri, String? display_name, + [Map? parameters]) { // Checks. - if (uri == null || uri is! URI) { + if (uri == null) { throw AssertionError('missing or invalid "uri" = $uri parameter'); } @@ -21,9 +21,9 @@ class NameAddrHeader { }); } } - URI _uri; - Map _parameters; - String _display_name; + URI? _uri; + Map? _parameters; + String? _display_name; /** * Parse the given string and returns a NameAddrHeader instance or null if * it is an invalid NameAddrHeader. @@ -37,39 +37,39 @@ class NameAddrHeader { } } - URI get uri => _uri; + URI? get uri => _uri; - String get display_name => _display_name; + String? get display_name => _display_name; set display_name(dynamic value) { _display_name = (value == 0) ? '0' : value; } - void setParam(String key, dynamic value) { + void setParam(String? key, dynamic value) { if (key != null) { - _parameters[key.toLowerCase()] = + _parameters![key.toLowerCase()] = (value == null) ? null : value.toString(); } } dynamic getParam(String key) { if (key != null) { - return _parameters[key.toLowerCase()]; + return _parameters![key.toLowerCase()]; } } bool hasParam(String key) { if (key != null) { - return _parameters.containsKey(key.toLowerCase()); + return _parameters!.containsKey(key.toLowerCase()); } return false; } dynamic deleteParam(String parameter) { parameter = parameter.toLowerCase(); - if (_parameters[parameter] != null) { - dynamic value = _parameters[parameter]; - _parameters.remove(parameter); + if (_parameters![parameter] != null) { + dynamic value = _parameters![parameter]; + _parameters!.remove(parameter); return value; } } @@ -79,7 +79,7 @@ class NameAddrHeader { } NameAddrHeader clone() { - return NameAddrHeader(_uri.clone(), _display_name, + return NameAddrHeader(_uri!.clone(), _display_name, decoder.convert(encoder.convert(_parameters))); } @@ -89,14 +89,14 @@ class NameAddrHeader { @override String toString() { - String body = (_display_name != null && _display_name.length > 0) - ? '"${_quote(_display_name)}" ' + String body = (_display_name != null && _display_name!.length > 0) + ? '"${_quote(_display_name!)}" ' : ''; body += '<${_uri.toString()}>'; - _parameters.forEach((dynamic key, dynamic value) { - if (_parameters.containsKey(key)) { + _parameters!.forEach((dynamic key, dynamic value) { + if (_parameters!.containsKey(key)) { body += ';$key'; if (value != null) { body += '=$value'; diff --git a/lib/src/parser.dart b/lib/src/parser.dart index 027101e9..c0446d30 100644 --- a/lib/src/parser.dart +++ b/lib/src/parser.dart @@ -8,7 +8,7 @@ import 'ua.dart'; /** * Parse SIP Message */ -IncomingMessage parseMessage(String data, UA ua) { +IncomingMessage? parseMessage(String data, UA? ua) { IncomingMessage message; int bodyStart; int headerEnd = data.indexOf('\r\n'); @@ -85,9 +85,11 @@ IncomingMessage parseMessage(String data, UA ua) { if (contentLength is String) { contentLength = int.tryParse(contentLength) ?? 0; } + contentLength ??= 0; if (contentLength > 0) { List encoded = utf8.encode(data); - List content = encoded.sublist(bodyStart, bodyStart + contentLength); + List content = + encoded.sublist(bodyStart, bodyStart + contentLength as int); message.body = utf8.decode(content); } } else { @@ -185,7 +187,7 @@ dynamic parseHeader( } else { for (Map header in parsed) { message.addHeader('record-route', header['raw']); - message.headers['Record-Route'] + message.headers!['Record-Route'] [message.getHeaders('record-route').length - 1]['parsed'] = header['parsed']; } @@ -208,7 +210,7 @@ dynamic parseHeader( } else { for (Map header in parsed) { message.addHeader('contact', header['raw']); - message.headers['Contact'][message.getHeaders('contact').length - 1] + message.headers!['Contact'][message.getHeaders('contact').length - 1] ['parsed'] = header['parsed']; } } diff --git a/lib/src/registrator.dart b/lib/src/registrator.dart index 89c9f613..13a4ec75 100644 --- a/lib/src/registrator.dart +++ b/lib/src/registrator.dart @@ -24,20 +24,20 @@ class UnHandledResponse { } class Registrator { - Registrator(UA ua, [Transport transport]) { + Registrator(UA ua, [Transport? transport]) { int reg_id = 1; // Force reg_id to 1. _ua = ua; _transport = transport; - _registrar = ua.configuration.registrar_server; - _expires = ua.configuration.register_expires; + _registrar = ua.configuration!.registrar_server; + _expires = ua.configuration!.register_expires; // Call-ID and CSeq values RFC3261 10.2. _call_id = utils.createRandomToken(22); _cseq = 0; - _to_uri = ua.configuration.uri; + _to_uri = ua.configuration!.uri; _registrationTimer = null; @@ -48,7 +48,7 @@ class Registrator { _registered = false; // Contact header. - _contact = _ua.contact.toString(); + _contact = _ua!.contact.toString(); // Sip.ice media feature tag (RFC 5768). _contact += ';+sip.ice'; @@ -61,44 +61,39 @@ class Registrator { // Custom Contact URI params for REGISTER and un-REGISTER. setExtraContactUriParams( - ua.configuration.register_extra_contact_uri_params); + ua.configuration!.register_extra_contact_uri_params); if (reg_id != null) { _contact += ';reg-id=$reg_id'; _contact += - ';+sip.instance=""'; + ';+sip.instance=""'; } } - UA _ua; - Transport _transport; - URI _registrar; - int _expires; - String _call_id; - int _cseq; - URI _to_uri; - Timer _registrationTimer; - bool _registering; - bool _registered; - String _contact; - List _extraHeaders; - String _extraContactParams; - - bool get registered => _registered; - - Transport get transport => _transport; - - void setExtraHeaders(List extraHeaders) { - if (extraHeaders is! List) { - extraHeaders = []; - } - _extraHeaders = extraHeaders; + UA? _ua; + Transport? _transport; + URI? _registrar; + int? _expires; + String? _call_id; + late int _cseq; + URI? _to_uri; + Timer? _registrationTimer; + late bool _registering; + bool? _registered; + late String _contact; + List? _extraHeaders; + late String _extraContactParams; + + bool? get registered => _registered; + + Transport? get transport => _transport; + + void setExtraHeaders(List? extraHeaders) { + _extraHeaders = extraHeaders ?? []; } - void setExtraContactParams(Map extraContactParams) { - if (extraContactParams is! Map) { - extraContactParams = {}; - } + void setExtraContactParams(Map? extraContactParams) { + extraContactParams ??= {}; // Reset it. _extraContactParams = ''; @@ -111,15 +106,15 @@ class Registrator { }); } - void setExtraContactUriParams(Map extraContactUriParams) { + void setExtraContactUriParams(Map? extraContactUriParams) { if (extraContactUriParams is! Map) { extraContactUriParams = {}; } - NameAddrHeader contact = Grammar.parse(_contact, 'Contact')[0]['parsed']; + NameAddrHeader? contact = Grammar.parse(_contact, 'Contact')[0]['parsed']; - extraContactUriParams.forEach((String param_key, dynamic param_value) { - contact.uri.setParam(param_key, param_value); + extraContactUriParams!.forEach((String param_key, dynamic param_value) { + contact!.uri!.setParam(param_key, param_value); }); _contact = contact.toString(); @@ -153,13 +148,13 @@ class Registrator { EventManager handlers = EventManager(); handlers.on(EventOnRequestTimeout(), (EventOnRequestTimeout value) { _registrationFailure( - UnHandledResponse(408, DartSIP_C.causes.REQUEST_TIMEOUT), - DartSIP_C.causes.REQUEST_TIMEOUT); + UnHandledResponse(408, DartSIP_C.CausesType.REQUEST_TIMEOUT), + DartSIP_C.CausesType.REQUEST_TIMEOUT); }); handlers.on(EventOnTransportError(), (EventOnTransportError value) { _registrationFailure( - UnHandledResponse(500, DartSIP_C.causes.CONNECTION_ERROR), - DartSIP_C.causes.CONNECTION_ERROR); + UnHandledResponse(500, DartSIP_C.CausesType.CONNECTION_ERROR), + DartSIP_C.CausesType.CONNECTION_ERROR); }); handlers.on(EventOnAuthenticated(), (EventOnAuthenticated value) { _cseq += 1; @@ -167,7 +162,7 @@ class Registrator { handlers.on(EventOnReceiveResponse(), (EventOnReceiveResponse event) { { // Discard responses to older REGISTER/un-REGISTER requests. - if (event.response.cseq != _cseq) { + if (event.response!.cseq != _cseq) { return; } @@ -177,26 +172,26 @@ class Registrator { _registrationTimer = null; } - String status_code = event.response.status_code.toString(); + String status_code = event.response!.status_code.toString(); if (utils.test1XX(status_code)) { // Ignore provisional responses. } else if (utils.test2XX(status_code)) { _registering = false; - if (!event.response.hasHeader('Contact')) { + if (!event.response!.hasHeader('Contact')) { logger.debug( 'no Contact header in response to REGISTER, response ignored'); return; } List contacts = []; - event.response.headers['Contact'].forEach((dynamic item) { + event.response!.headers!['Contact'].forEach((dynamic item) { contacts.add(item['parsed']); }); // Get the Contact pointing to us and update the expires value accordingly. dynamic contact = contacts.firstWhere( - (dynamic element) => element.uri.user == _ua.contact.uri.user); + (dynamic element) => element.uri.user == _ua!.contact!.uri!.user); if (contact == null) { logger.debug('no Contact header pointing to us, response ignored'); @@ -205,8 +200,8 @@ class Registrator { dynamic expires = contact.getParam('expires'); - if (expires == null && event.response.hasHeader('expires')) { - expires = event.response.getHeader('expires'); + if (expires == null && event.response!.hasHeader('expires')) { + expires = event.response!.getHeader('expires'); } expires ??= _expires; @@ -224,36 +219,37 @@ class Registrator { _registrationTimer = null; // If there are no listeners for registrationExpiring, reregistration. // If there are listeners, var the listening do the register call. - if (!_ua.hasListeners(EventRegistrationExpiring())) { + if (!_ua!.hasListeners(EventRegistrationExpiring())) { register(); } else { - _ua.emit(EventRegistrationExpiring()); + _ua!.emit(EventRegistrationExpiring()); } }, (expires * 1000) - 5000); // Save gruu values. if (contact.hasParam('temp-gruu')) { - _ua.contact.temp_gruu = + _ua!.contact!.temp_gruu = contact.getParam('temp-gruu').replaceAll('"', ''); } if (contact.hasParam('pub-gruu')) { - _ua.contact.pub_gruu = + _ua!.contact!.pub_gruu = contact.getParam('pub-gruu').replaceAll('"', ''); } - if (!_registered) { + if (!_registered!) { _registered = true; - _ua.registered(response: event.response); + _ua!.registered(response: event.response); } } else // Interval too brief RFC3261 10.2.8. if (status_code.contains(RegExp(r'^423$'))) { - if (event.response.hasHeader('min-expires')) { + if (event.response!.hasHeader('min-expires')) { // Increase our registration interval to the suggested minimum. - _expires = - num.tryParse(event.response.getHeader('min-expires')) ?? 0; + _expires = num.tryParse(event.response!.getHeader('min-expires')) + as int? ?? + 0; - if (_expires < MIN_REGISTER_EXPIRES) + if (_expires! < MIN_REGISTER_EXPIRES) _expires = MIN_REGISTER_EXPIRES; // Attempt the registration again immediately. @@ -264,16 +260,16 @@ class Registrator { '423 response received for REGISTER without Min-Expires'); _registrationFailure( - event.response, DartSIP_C.causes.SIP_FAILURE_CODE); + event.response, DartSIP_C.CausesType.SIP_FAILURE_CODE); } } else { - String cause = utils.sipErrorCause(event.response.status_code); + String cause = utils.sipErrorCause(event.response!.status_code); _registrationFailure(event.response, cause); } } }); - RequestSender request_sender = RequestSender(_ua, request, handlers); + RequestSender request_sender = RequestSender(_ua!, request, handlers); _registering = true; request_sender.send(); @@ -318,10 +314,10 @@ class Registrator { EventManager handlers = EventManager(); handlers.on(EventOnRequestTimeout(), (EventOnRequestTimeout value) { - _unregistered(null, DartSIP_C.causes.REQUEST_TIMEOUT); + _unregistered(null, DartSIP_C.CausesType.REQUEST_TIMEOUT); }); handlers.on(EventOnTransportError(), (EventOnTransportError value) { - _unregistered(null, DartSIP_C.causes.CONNECTION_ERROR); + _unregistered(null, DartSIP_C.CausesType.CONNECTION_ERROR); }); handlers.on(EventOnAuthenticated(), (EventOnAuthenticated response) { // Increase the CSeq on authentication. @@ -329,24 +325,24 @@ class Registrator { _cseq += 1; }); handlers.on(EventOnReceiveResponse(), (EventOnReceiveResponse event) { - String status_code = event.response.status_code.toString(); + String status_code = event.response!.status_code.toString(); if (utils.test2XX(status_code)) { _unregistered(event.response); } else if (utils.test1XX(status_code)) { // Ignore provisional responses. } else { - String cause = utils.sipErrorCause(event.response.status_code); + String cause = utils.sipErrorCause(event.response!.status_code); _unregistered(event.response, cause); } }); - RequestSender request_sender = RequestSender(_ua, request, handlers); + RequestSender request_sender = RequestSender(_ua!, request, handlers); request_sender.send(); } void close() { - if (_registered) { + if (_registered!) { unregister(false); } } @@ -358,25 +354,25 @@ class Registrator { _registrationTimer = null; } - if (_registered) { + if (_registered!) { _registered = false; - _ua.unregistered(); + _ua!.unregistered(); } } void _registrationFailure(dynamic response, String cause) { _registering = false; - _ua.registrationFailed(response: response, cause: cause); + _ua!.registrationFailed(response: response, cause: cause); - if (_registered) { + if (_registered!) { _registered = false; - _ua.unregistered(response: response, cause: cause); + _ua!.unregistered(response: response, cause: cause); } } - void _unregistered([dynamic response, String cause]) { + void _unregistered([dynamic response, String? cause]) { _registering = false; _registered = false; - _ua.unregistered(response: response, cause: cause); + _ua!.unregistered(response: response, cause: cause); } } diff --git a/lib/src/request_sender.dart b/lib/src/request_sender.dart index aac3b892..8e0bf107 100644 --- a/lib/src/request_sender.dart +++ b/lib/src/request_sender.dart @@ -1,4 +1,3 @@ -import 'package:sip_ua/src/grammar_parser.dart'; import 'constants.dart'; import 'data.dart'; import 'digest_authentication.dart'; @@ -31,14 +30,14 @@ class RequestSender { _eventHandlers.emit(EventOnTransportError()); } } - UA _ua; - EventManager _eventHandlers; - SipMethod _method; - OutgoingRequest _request; - DigestAuthentication _auth; - bool _challenged; - bool _staled; - TransactionBase clientTransaction; + late UA _ua; + late EventManager _eventHandlers; + SipMethod? _method; + OutgoingRequest? _request; + DigestAuthentication? _auth; + late bool _challenged; + late bool _staled; + late TransactionBase clientTransaction; /** * Create the client transaction and send the message. @@ -55,21 +54,21 @@ class RequestSender { _eventHandlers.emit(event); }); handlers.on(EventOnReceiveResponse(), (EventOnReceiveResponse event) { - _receiveResponse(event.response); + _receiveResponse(event.response!); }); switch (_method) { case SipMethod.INVITE: clientTransaction = - InviteClientTransaction(_ua, _ua.transport, _request, handlers); + InviteClientTransaction(_ua, _ua.transport!, _request!, handlers); break; case SipMethod.ACK: clientTransaction = - AckClientTransaction(_ua, _ua.transport, _request, handlers); + AckClientTransaction(_ua, _ua.transport!, _request!, handlers); break; default: - clientTransaction = - NonInviteClientTransaction(_ua, _ua.transport, _request, handlers); + clientTransaction = NonInviteClientTransaction( + _ua, _ua.transport!, _request!, handlers); } clientTransaction.send(); @@ -80,16 +79,17 @@ class RequestSender { * Authenticate request if needed or pass the response back to the applicant. */ void _receiveResponse(IncomingResponse response) { - ParsedData challenge; + ParsedData? challenge; String authorization_header_name; - int status_code = response.status_code; + int? status_code = response.status_code; /* * Authentication * Authenticate once. _challenged_ flag used to avoid infinite authentications. */ if ((status_code == 401 || status_code == 407) && - (_ua.configuration.password != null || _ua.configuration.ha1 != null)) { + (_ua.configuration!.password != null || + _ua.configuration!.ha1 != null)) { // Get and parse the appropriate WWW-Authenticate or Proxy-Authenticate header. if (response.status_code == 401) { challenge = response.parseHeader('www-authenticate'); @@ -110,15 +110,15 @@ class RequestSender { if (!_challenged || (!_staled && challenge.stale == true)) { _auth ??= DigestAuthentication(Credentials.fromMap({ - 'username': _ua.configuration.authorization_user, - 'password': _ua.configuration.password, - 'realm': _ua.configuration.realm, - 'ha1': _ua.configuration.ha1 + 'username': _ua.configuration!.authorization_user, + 'password': _ua.configuration!.password, + 'realm': _ua.configuration!.realm, + 'ha1': _ua.configuration!.ha1 })); // Verify that the challenge is really valid. - if (!_auth.authenticate( - _request.method, + if (!_auth!.authenticate( + _request!.method!, Challenge.fromMap({ 'algorithm': challenge.algorithm, 'realm': challenge.realm, @@ -127,25 +127,25 @@ class RequestSender { 'stale': challenge.stale, 'qop': challenge.qop, }), - _request.ruri)) { + _request!.ruri)) { _eventHandlers.emit(EventOnReceiveResponse(response: response)); return; } _challenged = true; // Update ha1 and realm in the UA. - _ua.set('realm', _auth.get('realm')); - _ua.set('ha1', _auth.get('ha1')); + _ua.set('realm', _auth!.get('realm')); + _ua.set('ha1', _auth!.get('ha1')); if (challenge.stale != null) { _staled = true; } - _request = _request.clone(); - _request.cseq += 1; - _request.setHeader( - 'cseq', '${_request.cseq} ${SipMethodHelper.getName(_method)}'); - _request.setHeader(authorization_header_name, _auth.toString()); + _request = _request!.clone(); + _request!.cseq = _request!.cseq! + 1; + _request!.setHeader( + 'cseq', '${_request!.cseq} ${SipMethodHelper.getName(_method)}'); + _request!.setHeader(authorization_header_name, _auth.toString()); _eventHandlers.emit(EventOnAuthenticated(request: _request)); send(); diff --git a/lib/src/rtc_session.dart b/lib/src/rtc_session.dart index bf9f5b96..085dcb75 100644 --- a/lib/src/rtc_session.dart +++ b/lib/src/rtc_session.dart @@ -43,13 +43,13 @@ class C { /** * Local variables. */ -const List holdMediaTypes = ['audio', 'video']; +const List holdMediaTypes = ['audio', 'video']; class SIPTimers { - Timer ackTimer; - Timer expiresTimer; - Timer invite2xxTimer; - Timer userNoAnswerTimer; + Timer? ackTimer; + Timer? expiresTimer; + Timer? invite2xxTimer; + Timer? userNoAnswerTimer; } class RFC4028Timers { @@ -57,22 +57,22 @@ class RFC4028Timers { this.currentExpires, this.running, this.refresher, this.timer); bool enabled; SipMethod refreshMethod; - int defaultExpires; - int currentExpires; + int? defaultExpires; + int? currentExpires; bool running; bool refresher; - Timer timer; + Timer? timer; } class RTCSession extends EventManager { - RTCSession(UA ua) { + RTCSession(UA? ua) { logger.debug('new'); _id = null; _ua = ua; _status = C.STATUS_NULL; _dialog = null; - _earlyDialogs = {}; + _earlyDialogs = {}; _contact = null; _from_tag = null; _to_tag = null; @@ -123,8 +123,8 @@ class RTCSession extends EventManager { // Session Timers (RFC 4028). _sessionTimers = RFC4028Timers( - _ua.configuration.session_timers, - _ua.configuration.session_timers_refresh_method, + _ua!.configuration!.session_timers, + _ua!.configuration!.session_timers_refresh_method, DartSIP_C.SESSION_EXPIRES, null, false, @@ -132,7 +132,7 @@ class RTCSession extends EventManager { null); // Map of ReferSubscriber instances indexed by the REFER's CSeq number. - _referSubscribers = {}; + _referSubscribers = {}; // Custom session empty object for high level use. data = {}; @@ -140,79 +140,79 @@ class RTCSession extends EventManager { receiveRequest = _receiveRequest; } - String _id; - UA _ua; + String? _id; + UA? _ua; dynamic _request; - bool _late_sdp; - Map _rtcOfferConstraints; - Map _rtcAnswerConstraints; - MediaStream _localMediaStream; - Map data; - Map _earlyDialogs; - String _from_tag; - String _to_tag; - SIPTimers _timers; - bool _is_confirmed; - bool _is_canceled; - RFC4028Timers _sessionTimers; - String _cancel_reason; - int _status; - Dialog _dialog; - RTCPeerConnection _connection; - RTCIceGatheringState _iceGatheringState; - bool _localMediaStreamLocallyGenerated; - bool _rtcReady; - String _direction; - - Map _referSubscribers; - DateTime _start_time; - DateTime _end_time; - - bool _audioMuted; - bool _videoMuted; - bool _localHold; - bool _remoteHold; - - NameAddrHeader _local_identity; - NameAddrHeader _remote_identity; - - String _contact; - String _tones; + late bool _late_sdp; + Map? _rtcOfferConstraints; + Map? _rtcAnswerConstraints; + MediaStream? _localMediaStream; + Map? data; + late Map _earlyDialogs; + String? _from_tag; + String? _to_tag; + late SIPTimers _timers; + late bool _is_confirmed; + late bool _is_canceled; + late RFC4028Timers _sessionTimers; + String? _cancel_reason; + int? _status; + Dialog? _dialog; + RTCPeerConnection? _connection; + RTCIceGatheringState? _iceGatheringState; + late bool _localMediaStreamLocallyGenerated; + late bool _rtcReady; + String? _direction; + + late Map _referSubscribers; + DateTime? _start_time; + DateTime? _end_time; + + bool? _audioMuted; + bool? _videoMuted; + bool? _localHold; + bool? _remoteHold; + + NameAddrHeader? _local_identity; + NameAddrHeader? _remote_identity; + + String? _contact; + String? _tones; Future dtmfFuture = (Completer()..complete()).future; - Function(IncomingRequest) receiveRequest; + late Function(IncomingRequest) receiveRequest; /** * User API */ // Expose session failed/ended causes as a property of the RTCSession instance. - Type get causes => DartSIP_C.causes; + Type get causes => DartSIP_C.CausesType; - String get id => _id; + String? get id => _id; dynamic get request => _request; - RTCPeerConnection get connection => _connection; + RTCPeerConnection? get connection => _connection; RTCDTMFSender get dtmfSender => - _connection.createDtmfSender(_localMediaStream.getAudioTracks()[0]); + _connection!.createDtmfSender(_localMediaStream!.getAudioTracks()[0]); - String get contact => _contact; + String? get contact => _contact; - String get direction => _direction; + String? get direction => _direction; - NameAddrHeader get local_identity => _local_identity; + NameAddrHeader? get local_identity => _local_identity; - NameAddrHeader get remote_identity => _remote_identity; + NameAddrHeader? get remote_identity => _remote_identity; - DateTime get start_time => _start_time; + DateTime? get start_time => _start_time; - DateTime get end_time => _end_time; + DateTime? get end_time => _end_time; - UA get ua => _ua; + UA? get ua => _ua; - int get status => _status; + int? get status => _status; bool isInProgress() { switch (_status) { @@ -257,7 +257,8 @@ class RTCSession extends EventManager { } void connect(dynamic target, - [Map options, InitSuccessCallback initCallback]) async { + [Map? options, + InitSuccessCallback? initCallback]) async { logger.debug('connect()'); options = options ?? {}; @@ -266,7 +267,7 @@ class RTCSession extends EventManager { List extraHeaders = utils.cloneArray(options['extraHeaders']); Map mediaConstraints = options['mediaConstraints'] ?? {'audio': true, 'video': true}; - MediaStream mediaStream = options['mediaStream']; + MediaStream? mediaStream = options['mediaStream']; Map pcConfig = options['pcConfig'] ?? {'iceServers': []}; Map rtcConstraints = @@ -296,7 +297,7 @@ class RTCSession extends EventManager { //} // Check target validity. - target = _ua.normalizeTarget(target); + target = _ua!.normalizeTarget(target); if (target == null) { throw Exceptions.TypeError('Invalid target: $originalTarget'); } @@ -323,15 +324,15 @@ class RTCSession extends EventManager { Map requestParams = { 'from_tag': _from_tag }; - _ua.contact.anonymous = anonymous; - _ua.contact.outbound = true; - _contact = _ua.contact.toString(); + _ua!.contact!.anonymous = anonymous; + _ua!.contact!.outbound = true; + _contact = _ua!.contact.toString(); if (anonymous) { requestParams['from_display_name'] = 'Anonymous'; requestParams['from_uri'] = URI('sip', 'anonymous', 'anonymous.invalid'); extraHeaders - .add('P-Preferred-Identity: ${_ua.configuration.uri.toString()}'); + .add('P-Preferred-Identity: ${_ua!.configuration!.uri.toString()}'); extraHeaders.add('Privacy: id'); } @@ -365,11 +366,11 @@ class RTCSession extends EventManager { } void init_incoming(IncomingRequest request, - [Function(RTCSession) initCallback]) { + [Function(RTCSession)? initCallback]) { logger.debug('init_incoming()'); - int expires; - String contentType = request.getHeader('Content-Type'); + int? expires; + String? contentType = request.getHeader('Content-Type'); // Check body and content type. if (request.body != null && (contentType != 'application/sdp')) { @@ -380,9 +381,9 @@ class RTCSession extends EventManager { // Session parameter initialization. _status = C.STATUS_INVITE_RECEIVED; _from_tag = request.from_tag; - _id = request.call_id + _from_tag; + _id = request.call_id! + _from_tag!; _request = request; - _contact = _ua.contact.toString(); + _contact = _ua!.contact.toString(); // Get the Expires header value if exists. if (request.hasHeader('expires')) { @@ -411,9 +412,9 @@ class RTCSession extends EventManager { // Set userNoAnswerTimer. _timers.userNoAnswerTimer = setTimeout(() { request.reply(408); - _failed('local', null, null, null, 408, DartSIP_C.causes.NO_ANSWER, + _failed('local', null, null, null, 408, DartSIP_C.CausesType.NO_ANSWER, 'No Answer'); - }, _ua.configuration.no_answer_timeout); + }, _ua!.configuration!.no_answer_timeout); /* Set expiresTimer * RFC3261 13.3.1 @@ -422,7 +423,7 @@ class RTCSession extends EventManager { _timers.expiresTimer = setTimeout(() { if (_status == C.STATUS_WAITING_FOR_ANSWER) { request.reply(487); - _failed('system', null, null, null, 487, DartSIP_C.causes.EXPIRES, + _failed('system', null, null, null, 487, DartSIP_C.CausesType.EXPIRES, 'Timeout'); } }, expires); @@ -463,7 +464,7 @@ class RTCSession extends EventManager { List extraHeaders = utils.cloneArray(options['extraHeaders']); Map mediaConstraints = options['mediaConstraints'] ?? {}; - MediaStream mediaStream = options['mediaStream'] ?? null; + MediaStream? mediaStream = options['mediaStream'] ?? null; Map pcConfig = options['pcConfig'] ?? {'iceServers': []}; Map rtcConstraints = @@ -478,7 +479,7 @@ class RTCSession extends EventManager { bool peerOffersFullVideo = false; // In future versions, unified-plan will be used by default - String sdpSemantics = 'unified-plan'; + String? sdpSemantics = 'unified-plan'; if (pcConfig['sdpSemantics'] != null) { sdpSemantics = pcConfig['sdpSemantics']; } @@ -586,7 +587,7 @@ class RTCSession extends EventManager { // TODO(cloudwebrtc): This may throw an error, should react. await _createRTCConnection(pcConfig, rtcConstraints); - MediaStream stream; + MediaStream? stream; // A local MediaStream is given, use it. if (mediaStream != null) { stream = mediaStream; @@ -610,7 +611,7 @@ class RTCSession extends EventManager { null, null, 480, - DartSIP_C.causes.USER_DENIED_MEDIA_ACCESS, + DartSIP_C.CausesType.USER_DENIED_MEDIA_ACCESS, 'User Denied Media Access'); logger.error('emit "getusermediafailed" [error:${error.toString()}]'); emit(EventGetUserMediaFailed(exception: error)); @@ -629,16 +630,15 @@ class RTCSession extends EventManager { switch (sdpSemantics) { case 'unified-plan': stream.getTracks().forEach((MediaStreamTrack track) { - _connection.addTrack(track, stream); + _connection!.addTrack(track, stream!); }); break; case 'plan-b': - _connection.addStream(stream); + _connection!.addStream(stream); break; default: logger.error('Unkown sdp semantics $sdpSemantics'); throw Exceptions.NotReadyError('Unkown sdp semantics $sdpSemantics'); - break; } } @@ -652,10 +652,16 @@ class RTCSession extends EventManager { RTCSessionDescription offer = RTCSessionDescription(request.body, 'offer'); try { - await _connection.setRemoteDescription(offer); + await _connection!.setRemoteDescription(offer); } catch (error) { request.reply(488); - _failed('system', null, null, null, 488, DartSIP_C.causes.WEBRTC_ERROR, + _failed( + 'system', + null, + null, + null, + 488, + DartSIP_C.CausesType.WEBRTC_ERROR, 'SetRemoteDescription(offer) failed'); logger.error( 'emit "peerconnection:setremotedescriptionfailed" [error:${error.toString()}]'); @@ -697,7 +703,7 @@ class RTCSession extends EventManager { _accepted('local'); }, () { _failed('system', null, null, null, 500, - DartSIP_C.causes.CONNECTION_ERROR, 'Transport Error'); + DartSIP_C.CausesType.CONNECTION_ERROR, 'Transport Error'); }); } catch (error, s) { if (_status == C.STATUS_TERMINATED) { @@ -710,18 +716,21 @@ class RTCSession extends EventManager { /** * Terminate the call. */ - void terminate([Map options]) { + void terminate([Map? options]) { logger.debug('terminate()'); options = options ?? {}; - Object cause = options['cause'] ?? DartSIP_C.causes.BYE; - List extraHeaders = utils.cloneArray(options['extraHeaders']); - Object body = options['body']; + Object cause = options['cause'] ?? DartSIP_C.CausesType.BYE; - String cancel_reason; - int status_code = options['status_code']; - String reason_phrase = options['reason_phrase']; + List extraHeaders = options['extraHeaders'] != null + ? utils.cloneArray(options['extraHeaders']) + : []; + Object? body = options['body']; + + String? cancel_reason; + int? status_code = options['status_code'] as int?; + String? reason_phrase = options['reason_phrase'] as String?; // Check Session Status. if (_status == C.STATUS_TERMINATED) { @@ -754,7 +763,7 @@ class RTCSession extends EventManager { cancel_reason = cancel_reason ?? 'Canceled by local'; status_code = status_code ?? 100; _failed('local', null, null, null, status_code, - DartSIP_C.causes.CANCELED, cancel_reason); + DartSIP_C.CausesType.CANCELED, cancel_reason); break; // - UAS - @@ -771,15 +780,15 @@ class RTCSession extends EventManager { _request.reply(status_code, reason_phrase, extraHeaders, body); _failed('local', null, null, null, status_code, - DartSIP_C.causes.REJECTED, reason_phrase); + DartSIP_C.CausesType.REJECTED, reason_phrase); break; case C.STATUS_WAITING_FOR_ACK: case C.STATUS_CONFIRMED: logger.debug('terminating session'); - reason_phrase = - options['reason_phrase'] ?? DartSIP_C.REASON_PHRASE[status_code]; + reason_phrase = options['reason_phrase'] as String? ?? + DartSIP_C.REASON_PHRASE[status_code ?? 0]; if (status_code != null && (status_code < 200 || status_code >= 700)) { throw Exceptions.InvalidStateError( @@ -799,7 +808,7 @@ class RTCSession extends EventManager { _direction == 'incoming' && _request.server_transaction.state != TransactionState.TERMINATED) { /// Save the dialog for later restoration. - Dialog dialog = _dialog; + Dialog dialog = _dialog!; // Send the BYE as soon as the ACK is received... receiveRequest = (IncomingMessage request) { @@ -829,7 +838,7 @@ class RTCSession extends EventManager { 'local', null, ErrorCause( - cause: cause, + cause: cause as String?, status_code: status_code, reason_phrase: reason_phrase)); @@ -837,7 +846,7 @@ class RTCSession extends EventManager { _dialog = dialog; // Restore the dialog into 'ua' so the ACK can reach 'this' session. - _ua.newDialog(dialog); + _ua!.newDialog(dialog); } else { sendRequest(SipMethod.BYE, {'extraHeaders': extraHeaders, 'body': body}); @@ -847,7 +856,7 @@ class RTCSession extends EventManager { 'local', null, ErrorCause( - cause: cause, + cause: cause as String?, status_code: status_code, reason_phrase: reason_phrase)); } @@ -855,12 +864,12 @@ class RTCSession extends EventManager { } /// tones may be a single character or a string of dtmf digits - void sendDTMF(String tones, [Map options]) { + void sendDTMF(dynamic tones, [Map? options]) { logger.debug('sendDTMF() | tones: ${tones.toString()}'); options = options ?? {}; - DtmfMode mode = _ua.configuration.dtmf_mode; + DtmfMode mode = _ua!.configuration!.dtmf_mode; // sensible defaults int duration = options['duration'] ?? RTCSession_DTMF.C.DEFAULT_DURATION; @@ -903,7 +912,7 @@ class RTCSession extends EventManager { '"duration" value is greater than the maximum allowed, setting it to ${RTCSession_DTMF.C.MAX_DURATION} milliseconds'); duration = RTCSession_DTMF.C.MAX_DURATION; } else { - duration = utils.Math.abs(duration); + duration = utils.Math.abs(duration) as int; } options['duration'] = duration; @@ -918,7 +927,7 @@ class RTCSession extends EventManager { '"interToneGap" value is lower than the minimum allowed, setting it to ${RTCSession_DTMF.C.MIN_INTER_TONE_GAP} milliseconds'); interToneGap = RTCSession_DTMF.C.MIN_INTER_TONE_GAP; } else { - interToneGap = utils.Math.abs(interToneGap); + interToneGap = utils.Math.abs(interToneGap) as int; } options['interToneGap'] = interToneGap; @@ -951,7 +960,7 @@ class RTCSession extends EventManager { logger.error('Failed to send DTMF ${event.cause}'); }); - options['eventHandlers'] = handlers; + options!['eventHandlers'] = handlers; dtmf.send(tone, options); await Future.delayed( @@ -1033,7 +1042,7 @@ class RTCSession extends EventManager { /** * Hold */ - bool hold([Map options, Function done]) { + bool hold([Map? options, Function? done]) { logger.debug('hold()'); options = options ?? {}; @@ -1062,7 +1071,7 @@ class RTCSession extends EventManager { }); handlers.on(EventCallFailed(), (EventCallFailed event) { terminate({ - 'cause': DartSIP_C.causes.WEBRTC_ERROR, + 'cause': DartSIP_C.CausesType.WEBRTC_ERROR, 'status_code': 500, 'reason_phrase': 'Hold Failed' }); @@ -1084,7 +1093,7 @@ class RTCSession extends EventManager { return true; } - bool unhold([Map options, Function done]) { + bool unhold([Map? options, Function? done]) { logger.debug('unhold()'); options = options ?? {}; @@ -1112,7 +1121,7 @@ class RTCSession extends EventManager { }); handlers.on(EventCallFailed(), (EventCallFailed event) { terminate({ - 'cause': DartSIP_C.causes.WEBRTC_ERROR, + 'cause': DartSIP_C.CausesType.WEBRTC_ERROR, 'status_code': 500, 'reason_phrase': 'Unhold Failed' }); @@ -1134,12 +1143,12 @@ class RTCSession extends EventManager { return true; } - bool renegotiate([Map options, Function done]) { + bool renegotiate([Map? options, Function? done]) { logger.debug('renegotiate()'); options = options ?? {}; - Map rtcOfferConstraints = + Map? rtcOfferConstraints = options['rtcOfferConstraints'] ?? _rtcOfferConstraints; if (_status != C.STATUS_WAITING_FOR_ACK && _status != C.STATUS_CONFIRMED) { @@ -1159,7 +1168,7 @@ class RTCSession extends EventManager { handlers.on(EventCallFailed(), (EventCallFailed event) { terminate({ - 'cause': DartSIP_C.causes.WEBRTC_ERROR, + 'cause': DartSIP_C.CausesType.WEBRTC_ERROR, 'status_code': 500, 'reason_phrase': 'Media Renegotiation Failed' }); @@ -1188,7 +1197,7 @@ class RTCSession extends EventManager { /** * Refer */ - ReferSubscriber refer(dynamic target, [Map options]) { + ReferSubscriber? refer(dynamic target, [Map? options]) { logger.debug('refer()'); options = options ?? {}; @@ -1200,7 +1209,7 @@ class RTCSession extends EventManager { } // Check target validity. - target = _ua.normalizeTarget(target); + target = _ua!.normalizeTarget(target); if (target == null) { throw Exceptions.TypeError('Invalid target: $originalTarget'); } @@ -1210,7 +1219,7 @@ class RTCSession extends EventManager { referSubscriber.sendRefer(target, options); // Store in the map. - int id = referSubscriber.id; + int? id = referSubscriber.id; _referSubscribers[id] = referSubscriber; @@ -1233,10 +1242,10 @@ class RTCSession extends EventManager { * Send a generic in-dialog Request */ OutgoingRequest sendRequest(SipMethod method, - [Map options]) { + [Map? options]) { logger.debug('sendRequest()'); - return _dialog.sendRequest(method, options); + return _dialog!.sendRequest(method, options); } /** @@ -1261,8 +1270,8 @@ class RTCSession extends EventManager { _status == C.STATUS_ANSWERED) { _status = C.STATUS_CANCELED; _request.reply(487); - _failed('remote', null, request, null, 487, DartSIP_C.causes.CANCELED, - request.reason_phrase); + _failed('remote', null, request, null, 487, + DartSIP_C.CausesType.CANCELED, request.reason_phrase); } } else { // Requests arriving here are in-dialog requests. @@ -1279,7 +1288,7 @@ class RTCSession extends EventManager { if (_late_sdp) { if (request.body == null) { terminate({ - 'cause': DartSIP_C.causes.MISSING_SDP, + 'cause': DartSIP_C.CausesType.MISSING_SDP, 'status_code': 400 }); break; @@ -1292,10 +1301,10 @@ class RTCSession extends EventManager { RTCSessionDescription answer = RTCSessionDescription(request.body, 'answer'); try { - await _connection.setRemoteDescription(answer); + await _connection!.setRemoteDescription(answer); } catch (error) { terminate({ - 'cause': DartSIP_C.causes.BAD_MEDIA_DESCRIPTION, + 'cause': DartSIP_C.CausesType.BAD_MEDIA_DESCRIPTION, 'status_code': 488 }); logger.error( @@ -1314,7 +1323,7 @@ class RTCSession extends EventManager { 'remote', request, ErrorCause( - cause: DartSIP_C.causes.BYE, + cause: DartSIP_C.CausesType.BYE, status_code: 200, reason_phrase: 'BYE Received')); } else if (_status == C.STATUS_INVITE_RECEIVED) { @@ -1324,7 +1333,7 @@ class RTCSession extends EventManager { 'remote', request, ErrorCause( - cause: DartSIP_C.causes.BYE, + cause: DartSIP_C.CausesType.BYE, status_code: request.status_code, reason_phrase: request.reason_phrase)); } else { @@ -1348,7 +1357,7 @@ class RTCSession extends EventManager { _status == C.STATUS_ANSWERED || _status == C.STATUS_WAITING_FOR_ACK || _status == C.STATUS_CONFIRMED) { - String contentType = request.getHeader('content-type'); + String? contentType = request.getHeader('content-type'); if (contentType != null && contentType.contains(RegExp(r'^application\/dtmf-relay', caseSensitive: false))) { @@ -1397,8 +1406,8 @@ class RTCSession extends EventManager { if (_status != C.STATUS_TERMINATED) { terminate({ 'status_code': 500, - 'reason_phrase': DartSIP_C.causes.CONNECTION_ERROR, - 'cause': DartSIP_C.causes.CONNECTION_ERROR + 'reason_phrase': DartSIP_C.CausesType.CONNECTION_ERROR, + 'cause': DartSIP_C.CausesType.CONNECTION_ERROR }); } } @@ -1409,8 +1418,8 @@ class RTCSession extends EventManager { if (_status != C.STATUS_TERMINATED) { terminate({ 'status_code': 408, - 'reason_phrase': DartSIP_C.causes.REQUEST_TIMEOUT, - 'cause': DartSIP_C.causes.REQUEST_TIMEOUT + 'reason_phrase': DartSIP_C.CausesType.REQUEST_TIMEOUT, + 'cause': DartSIP_C.CausesType.REQUEST_TIMEOUT }); } } @@ -1421,8 +1430,8 @@ class RTCSession extends EventManager { if (_status != C.STATUS_TERMINATED) { terminate({ 'status_code': 500, - 'reason_phrase': DartSIP_C.causes.DIALOG_ERROR, - 'cause': DartSIP_C.causes.DIALOG_ERROR + 'reason_phrase': DartSIP_C.CausesType.DIALOG_ERROR, + 'cause': DartSIP_C.CausesType.DIALOG_ERROR }); } } @@ -1459,8 +1468,8 @@ class RTCSession extends EventManager { } // Another INVITE transaction is in progress. - if (_dialog.uac_pending_reply == true || - _dialog.uas_pending_reply == true) { + if (_dialog!.uac_pending_reply == true || + _dialog!.uas_pending_reply == true) { logger.debug( '_isReadyToReOffer() | there is another INVITE/UPDATE transaction in progress'); @@ -1479,8 +1488,8 @@ class RTCSession extends EventManager { // Terminate RTC. if (_connection != null) { try { - await _connection.close(); - await _connection.dispose(); + await _connection!.close(); + await _connection!.dispose(); _connection = null; } catch (error) { logger.error( @@ -1490,7 +1499,7 @@ class RTCSession extends EventManager { // Close local MediaStream if it was not given by the user. if (_localMediaStream != null && _localMediaStreamLocallyGenerated) { logger.debug('close() | closing local MediaStream'); - await _localMediaStream.dispose(); + await _localMediaStream!.dispose(); _localMediaStream = null; } @@ -1507,20 +1516,20 @@ class RTCSession extends EventManager { // Terminate confirmed dialog. if (_dialog != null) { - _dialog.terminate(); + _dialog!.terminate(); _dialog = null; } // Terminate early dialogs. - _earlyDialogs.forEach((String key, _) { - _earlyDialogs[key].terminate(); + _earlyDialogs.forEach((String? key, _) { + _earlyDialogs[key]!.terminate(); }); _earlyDialogs.clear(); // Terminate REFER subscribers. _referSubscribers.clear(); - _ua.destroyRTCSession(this); + _ua!.destroyRTCSession(this); } /** @@ -1532,7 +1541,7 @@ class RTCSession extends EventManager { * Response retransmissions cannot be accomplished by transaction layer * since it is destroyed when receiving the first 2xx answer */ - void _setInvite2xxTimer(dynamic request, String body) { + void _setInvite2xxTimer(dynamic request, String? body) { int timeout = Timers.T1; void invite2xxRetransmission() { @@ -1568,7 +1577,7 @@ class RTCSession extends EventManager { 'remote', null, ErrorCause( - cause: DartSIP_C.causes.NO_ACK, + cause: DartSIP_C.CausesType.NO_ACK, status_code: 408, // Request Timeout reason_phrase: 'no ACK received, terminating the session')); } @@ -1585,13 +1594,13 @@ class RTCSession extends EventManager { Future _createRTCConnection(Map pcConfig, Map rtcConstraints) async { _connection = await createPeerConnection(pcConfig, rtcConstraints); - _connection.onIceConnectionState = (RTCIceConnectionState state) { + _connection!.onIceConnectionState = (RTCIceConnectionState state) { // TODO(cloudwebrtc): Do more with different states. if (state == RTCIceConnectionState.RTCIceConnectionStateFailed) { terminate({ - 'cause': DartSIP_C.causes.RTP_TIMEOUT, + 'cause': DartSIP_C.CausesType.RTP_TIMEOUT, 'status_code': 408, - 'reason_phrase': DartSIP_C.causes.RTP_TIMEOUT + 'reason_phrase': DartSIP_C.CausesType.RTP_TIMEOUT }); } else if (state == RTCIceConnectionState.RTCIceConnectionStateDisconnected) { @@ -1600,14 +1609,14 @@ class RTCSession extends EventManager { }; // In future versions, unified-plan will be used by default - String sdpSemantics = 'unified-plan'; + String? sdpSemantics = 'unified-plan'; if (pcConfig['sdpSemantics'] != null) { sdpSemantics = pcConfig['sdpSemantics']; } switch (sdpSemantics) { case 'unified-plan': - _connection.onTrack = (RTCTrackEvent event) { + _connection!.onTrack = (RTCTrackEvent event) { if (event.streams.isNotEmpty) { emit(EventStream( session: this, originator: 'remote', stream: event.streams[0])); @@ -1615,7 +1624,7 @@ class RTCSession extends EventManager { }; break; case 'plan-b': - _connection.onAddStream = (MediaStream stream) { + _connection!.onAddStream = (MediaStream stream) { emit( EventStream(session: this, originator: 'remote', stream: stream)); }; @@ -1627,8 +1636,8 @@ class RTCSession extends EventManager { return; } - FutureOr _createLocalDescription( - String type, Map constraints) async { + Future _createLocalDescription( + String type, Map? constraints) async { logger.debug('createLocalDescription()'); _iceGatheringState = RTCIceGatheringState.RTCIceGatheringStateNew; Completer completer = @@ -1640,10 +1649,10 @@ class RTCSession extends EventManager { } _rtcReady = false; - RTCSessionDescription desc; + late RTCSessionDescription desc; if (type == 'offer') { try { - desc = await _connection.createOffer(constraints); + desc = await _connection!.createOffer(constraints!); } catch (error) { logger.error( 'emit "peerconnection:createofferfailed" [error:${error.toString()}]'); @@ -1652,7 +1661,7 @@ class RTCSession extends EventManager { } } else { try { - desc = await _connection.createAnswer(constraints); + desc = await _connection!.createAnswer(constraints!); } catch (error) { logger.error( 'emit "peerconnection:createanswerfailed" [error:${error.toString()}]'); @@ -1663,21 +1672,22 @@ class RTCSession extends EventManager { // Add 'pc.onicencandidate' event handler to resolve on last candidate. bool finished = false; - Future Function() ready = () async { + + Future ready() async { if (!finished && _status != C.STATUS_TERMINATED) { finished = true; - _connection.onIceCandidate = null; - _connection.onIceGatheringState = null; + _connection!.onIceCandidate = null; + _connection!.onIceGatheringState = null; _iceGatheringState = RTCIceGatheringState.RTCIceGatheringStateComplete; _rtcReady = true; - RTCSessionDescription desc = await _connection.getLocalDescription(); + RTCSessionDescription? desc = await _connection!.getLocalDescription(); logger.debug('emit "sdp"'); - emit(EventSdp(originator: 'local', type: type, sdp: desc.sdp)); + emit(EventSdp(originator: 'local', type: type, sdp: desc!.sdp)); completer.complete(desc); } - }; + } - _connection.onIceGatheringState = (RTCIceGatheringState state) { + _connection!.onIceGatheringState = (RTCIceGatheringState state) { _iceGatheringState = state; if (state == RTCIceGatheringState.RTCIceGatheringStateComplete) { ready(); @@ -1685,7 +1695,7 @@ class RTCSession extends EventManager { }; bool hasCandidate = false; - _connection.onIceCandidate = (RTCIceCandidate candidate) { + _connection!.onIceCandidate = (RTCIceCandidate candidate) { if (candidate != null) { emit(EventIceCandidate(candidate, ready)); if (!hasCandidate) { @@ -1696,13 +1706,13 @@ class RTCSession extends EventManager { * Because trickle ICE is not defined in the sip protocol, the delay of * initiating a call to answer the call waiting will be unacceptable. */ - setTimeout(() => ready(), ua.configuration.ice_gathering_timeout); + setTimeout(() => ready(), ua!.configuration!.ice_gathering_timeout); } } }; try { - await _connection.setLocalDescription(desc); + await _connection!.setLocalDescription(desc); } catch (error) { _rtcReady = true; logger.error( @@ -1715,9 +1725,9 @@ class RTCSession extends EventManager { if (_iceGatheringState == RTCIceGatheringState.RTCIceGatheringStateComplete) { _rtcReady = true; - RTCSessionDescription desc = await _connection.getLocalDescription(); + RTCSessionDescription? desc = await _connection!.getLocalDescription(); logger.debug('emit "sdp"'); - emit(EventSdp(originator: 'local', type: type, sdp: desc.sdp)); + emit(EventSdp(originator: 'local', type: type, sdp: desc!.sdp)); return desc; } @@ -1728,10 +1738,10 @@ class RTCSession extends EventManager { * Dialog Management */ bool _createDialog(dynamic message, String type, [bool early = false]) { - String local_tag = (type == 'UAS') ? message.to_tag : message.from_tag; - String remote_tag = (type == 'UAS') ? message.from_tag : message.to_tag; - String id = message.call_id + local_tag + remote_tag; - Dialog early_dialog = _earlyDialogs[id]; + String? local_tag = (type == 'UAS') ? message.to_tag : message.from_tag; + String? remote_tag = (type == 'UAS') ? message.from_tag : message.to_tag; + String? id = message.call_id + local_tag + remote_tag; + Dialog? early_dialog = _earlyDialogs[id]; // Early Dialog. if (early) { @@ -1739,11 +1749,17 @@ class RTCSession extends EventManager { return true; } else { try { - early_dialog = Dialog(this, message, type, Dialog_C.STATUS_EARLY); + early_dialog = Dialog(this, message, type, DialogStatus.STATUS_EARLY); } catch (error) { logger.debug('$error'); - _failed('remote', message, null, null, 500, - DartSIP_C.causes.INTERNAL_ERROR, 'Can\'t create Early Dialog'); + _failed( + 'remote', + message, + null, + null, + 500, + DartSIP_C.CausesType.INTERNAL_ERROR, + 'Can\'t create Early Dialog'); return false; } // Dialog has been successfully created. @@ -1769,8 +1785,14 @@ class RTCSession extends EventManager { return true; } catch (error) { logger.debug(error.toString()); - _failed('remote', message, null, null, 500, - DartSIP_C.causes.INTERNAL_ERROR, 'Can\'t create Confirmed Dialog'); + _failed( + 'remote', + message, + null, + null, + 500, + DartSIP_C.CausesType.INTERNAL_ERROR, + 'Can\'t create Confirmed Dialog'); return false; } } @@ -1780,7 +1802,7 @@ class RTCSession extends EventManager { void _receiveReinvite(IncomingRequest request) async { logger.debug('receiveReinvite()'); - String contentType = request.getHeader('Content-Type'); + String? contentType = request.getHeader('Content-Type'); bool rejected = false; bool reject(dynamic options) { @@ -1811,7 +1833,7 @@ class RTCSession extends EventManager { _late_sdp = false; - void sendAnswer(String sdp) async { + void sendAnswer(String? sdp) async { List extraHeaders = ['Contact: $_contact']; _handleSessionTimersInIncomingRequest(request, extraHeaders); @@ -1827,8 +1849,8 @@ class RTCSession extends EventManager { }); // If callback is given execute it. - if (data['callback'] is Function) { - data['callback'](); + if (data!['callback'] is Function) { + data!['callback'](); } } @@ -1892,9 +1914,9 @@ class RTCSession extends EventManager { return true; } - String contentType = request.getHeader('Content-Type'); + String? contentType = request.getHeader('Content-Type'); - void sendAnswer(String sdp) { + void sendAnswer(String? sdp) { List extraHeaders = ['Contact: $_contact']; _handleSessionTimersInIncomingRequest(request, extraHeaders); request.reply(200, null, extraHeaders, sdp); @@ -1907,7 +1929,7 @@ class RTCSession extends EventManager { return; } - if (request.body == null || request.body.isEmpty) { + if (request.body == null || request.body!.isEmpty) { sendAnswer(null); return; } @@ -1964,7 +1986,7 @@ class RTCSession extends EventManager { throw Exceptions.InvalidStateError('terminated'); } try { - await _connection.setRemoteDescription(offer); + await _connection!.setRemoteDescription(offer); } catch (error) { request.reply(488); logger.error( @@ -2026,8 +2048,8 @@ class RTCSession extends EventManager { ReferNotifier notifier = ReferNotifier(this, request.cseq); - dynamic accept2 = - (InitSuccessCallback initCallback, Map options) { + bool accept2( + InitSuccessCallback? initCallback, Map options) { initCallback = (initCallback is Function) ? initCallback : null; if (_status != C.STATUS_WAITING_FOR_ACK && @@ -2049,9 +2071,9 @@ class RTCSession extends EventManager { session.on(EventFailedUnderScore(), (EventFailedUnderScore data) { if (data.cause != null) { - notifier.notify(data.cause.status_code, data.cause.reason_phrase); + notifier.notify(data.cause!.status_code, data.cause!.reason_phrase); } else { - notifier.notify(487, data.cause.cause); + notifier.notify(487, data.cause!.cause); } }); // Consider the Replaces header present in the Refer-To URI. @@ -2064,11 +2086,11 @@ class RTCSession extends EventManager { } session.connect(request.refer_to.uri.toAor(), options, initCallback); return true; - }; + } - Null Function() reject = () { + void reject() { notifier.notify(603); - }; + } logger.debug('emit "refer"'); @@ -2095,14 +2117,14 @@ class RTCSession extends EventManager { request.reply(400); } - switch (request.event.event) { + switch (request.event!.event) { case 'refer': { - int id; - ReferSubscriber referSubscriber; + int? id; + ReferSubscriber? referSubscriber; - if (request.event.params['id'] != null) { - id = utils.parseInt(request.event.params['id'], 10); + if (request.event!.params!['id'] != null) { + id = utils.parseInt(request.event!.params!['id'], 10); referSubscriber = _referSubscribers[id]; } else if (_referSubscribers.length == 1) { referSubscriber = @@ -2174,11 +2196,11 @@ class RTCSession extends EventManager { /** * Initial Request Sender */ - Future _sendInitialRequest( + Future _sendInitialRequest( Map pcConfig, Map mediaConstraints, Map rtcOfferConstraints, - MediaStream mediaStream) async { + MediaStream? mediaStream) async { EventManager handlers = EventManager(); handlers.on(EventOnRequestTimeout(), (EventOnRequestTimeout value) { onRequestTimeout(); @@ -2193,17 +2215,17 @@ class RTCSession extends EventManager { _receiveInviteResponse(event.response); }); - RequestSender request_sender = RequestSender(_ua, _request, handlers); + RequestSender request_sender = RequestSender(_ua!, _request, handlers); // In future versions, unified-plan will be used by default - String sdpSemantics = 'unified-plan'; + String? sdpSemantics = 'unified-plan'; if (pcConfig['sdpSemantics'] != null) { sdpSemantics = pcConfig['sdpSemantics']; } // This Promise is resolved within the next iteration, so the app has now // a chance to set events such as 'peerconnection' and 'connecting'. - MediaStream stream; + MediaStream? stream; // A stream is given, var the app set events such as 'peerconnection' and 'connecting'. if (mediaStream != null) { stream = mediaStream; @@ -2225,7 +2247,7 @@ class RTCSession extends EventManager { null, null, 500, - DartSIP_C.causes.USER_DENIED_MEDIA_ACCESS, + DartSIP_C.CausesType.USER_DENIED_MEDIA_ACCESS, 'User Denied Media Access'); logger.error('emit "getusermediafailed" [error:${error.toString()}]'); emit(EventGetUserMediaFailed(exception: error)); @@ -2243,16 +2265,15 @@ class RTCSession extends EventManager { switch (sdpSemantics) { case 'unified-plan': stream.getTracks().forEach((MediaStreamTrack track) { - _connection.addTrack(track, stream); + _connection!.addTrack(track, stream!); }); break; case 'plan-b': - _connection.addStream(stream); + _connection!.addStream(stream); break; default: logger.error('Unkown sdp semantics $sdpSemantics'); throw Exceptions.NotReadyError('Unkown sdp semantics $sdpSemantics'); - break; } } @@ -2275,8 +2296,8 @@ class RTCSession extends EventManager { request_sender.send(); } catch (error, s) { - logger.error(error, null, s); - _failed('local', null, null, null, 500, DartSIP_C.causes.WEBRTC_ERROR, + logger.error(error.toString(), null, s); + _failed('local', null, null, null, 500, DartSIP_C.CausesType.WEBRTC_ERROR, 'Can\'t create local SDP'); if (_status == C.STATUS_TERMINATED) { return; @@ -2287,19 +2308,19 @@ class RTCSession extends EventManager { } /// Reception of Response for Initial INVITE - void _receiveInviteResponse(IncomingResponse response) async { + void _receiveInviteResponse(IncomingResponse? response) async { logger.debug('receiveInviteResponse()'); /// Handle 2XX retransmissions and responses from forked requests. if (_dialog != null && - (response.status_code >= 200 && response.status_code <= 299)) { + (response!.status_code >= 200 && response.status_code <= 299)) { /// /// If it is a retransmission from the endpoint that established /// the dialog, send an ACK /// - if (_dialog.id.call_id == response.call_id && - _dialog.id.local_tag == response.from_tag && - _dialog.id.remote_tag == response.to_tag) { + if (_dialog!.id!.call_id == response.call_id && + _dialog!.id!.local_tag == response.from_tag && + _dialog!.id!.remote_tag == response.to_tag) { sendRequest(SipMethod.ACK); return; } else { @@ -2308,7 +2329,7 @@ class RTCSession extends EventManager { // ignore: unused_local_variable Dialog dialog = Dialog(this, response, 'UAC'); } catch (error) { - logger.debug(error); + logger.debug(error.toString()); return; } sendRequest(SipMethod.ACK); @@ -2319,7 +2340,7 @@ class RTCSession extends EventManager { // Proceed to cancellation if the user requested. if (_is_canceled) { - if (response.status_code >= 100 && response.status_code < 200) { + if (response!.status_code >= 100 && response.status_code < 200) { _request.cancel(_cancel_reason); } else if (response.status_code >= 200 && response.status_code < 299) { _acceptAndTerminate(response); @@ -2331,7 +2352,7 @@ class RTCSession extends EventManager { return; } - String status_code = response.status_code.toString(); + String status_code = response!.status_code.toString(); if (utils.test100(status_code)) { // 100 trying @@ -2355,7 +2376,7 @@ class RTCSession extends EventManager { _status = C.STATUS_1XX_RECEIVED; _progress('remote', response); - if (response.body == null || response.body.isEmpty) { + if (response.body == null || response.body!.isEmpty) { return; } @@ -2366,7 +2387,7 @@ class RTCSession extends EventManager { RTCSessionDescription(response.body, 'answer'); try { - _connection.setRemoteDescription(answer); + _connection!.setRemoteDescription(answer); } catch (error) { logger.error( 'emit "peerconnection:setremotedescriptionfailed" [error:${error.toString()}]'); @@ -2376,10 +2397,10 @@ class RTCSession extends EventManager { // 2XX _status = C.STATUS_CONFIRMED; - if (response.body == null || response.body.isEmpty) { - _acceptAndTerminate(response, 400, DartSIP_C.causes.MISSING_SDP); + if (response.body == null || response.body!.isEmpty) { + _acceptAndTerminate(response, 400, DartSIP_C.CausesType.MISSING_SDP); _failed('remote', null, null, response, 400, - DartSIP_C.causes.BAD_MEDIA_DESCRIPTION, 'Missing SDP'); + DartSIP_C.CausesType.BAD_MEDIA_DESCRIPTION, 'Missing SDP'); return; } @@ -2396,14 +2417,14 @@ class RTCSession extends EventManager { // Be ready for 200 with SDP after a 180/183 with SDP. // We created a SDP 'answer' for it, so check the current signaling state. - if (_connection.signalingState == + if (_connection!.signalingState == RTCSignalingState.RTCSignalingStateStable || - _connection.signalingState == + _connection!.signalingState == RTCSignalingState.RTCSignalingStateHaveLocalOffer) { try { RTCSessionDescription offer = - await _connection.createOffer(_rtcOfferConstraints); - await _connection.setLocalDescription(offer); + await _connection!.createOffer(_rtcOfferConstraints!); + await _connection!.setLocalDescription(offer); } catch (error) { _acceptAndTerminate(response, 500, error.toString()); _failed( @@ -2412,13 +2433,13 @@ class RTCSession extends EventManager { null, response, 500, - DartSIP_C.causes.WEBRTC_ERROR, + DartSIP_C.CausesType.WEBRTC_ERROR, 'Can\'t create offer ${error.toString()}'); } } try { - await _connection.setRemoteDescription(answer); + await _connection!.setRemoteDescription(answer); // Handle Session Timers. _handleSessionTimersInIncomingResponse(response); _accepted('remote', response); @@ -2427,7 +2448,7 @@ class RTCSession extends EventManager { } catch (error) { _acceptAndTerminate(response, 488, 'Not Acceptable Here'); _failed('remote', null, null, response, 488, - DartSIP_C.causes.BAD_MEDIA_DESCRIPTION, 'Not Acceptable Here'); + DartSIP_C.CausesType.BAD_MEDIA_DESCRIPTION, 'Not Acceptable Here'); logger.error( 'emit "peerconnection:setremotedescriptionfailed" [error:${error.toString()}]'); emit(EventSetRemoteDescriptionFailed(exception: error)); @@ -2442,12 +2463,16 @@ class RTCSession extends EventManager { /** * Send Re-INVITE */ - void _sendReinvite([Map options]) async { + void _sendReinvite([Map? options]) async { logger.debug('sendReinvite()'); - List extraHeaders = utils.cloneArray(options['extraHeaders']); + options = options ?? {}; + + List extraHeaders = options['extraHeaders'] != null + ? utils.cloneArray(options['extraHeaders']) + : []; EventManager eventHandlers = options['eventHandlers'] ?? EventManager(); - Map rtcOfferConstraints = + Map? rtcOfferConstraints = options['rtcOfferConstraints'] ?? _rtcOfferConstraints; bool succeeded = false; @@ -2465,7 +2490,7 @@ class RTCSession extends EventManager { eventHandlers.emit(EventCallFailed(session: this, response: response)); } - void onSucceeded(IncomingResponse response) async { + void onSucceeded(IncomingResponse? response) async { if (_status == C.STATUS_TERMINATED) { return; } @@ -2481,7 +2506,7 @@ class RTCSession extends EventManager { _handleSessionTimersInIncomingResponse(response); // Must have SDP answer. - if (response.body == null || response.body.isEmpty) { + if (response!.body == null || response.body!.isEmpty) { onFailed(); return; } else if (response.getHeader('Content-Type') != 'application/sdp') { @@ -2496,7 +2521,7 @@ class RTCSession extends EventManager { RTCSessionDescription(response.body, 'answer'); try { - await _connection.setRemoteDescription(answer); + await _connection!.setRemoteDescription(answer); eventHandlers.emit(EventSucceeded(response: response)); } catch (error) { onFailed(); @@ -2509,13 +2534,13 @@ class RTCSession extends EventManager { try { RTCSessionDescription desc = await _createLocalDescription('offer', rtcOfferConstraints); - String sdp = _mangleOffer(desc.sdp); + String? sdp = _mangleOffer(desc.sdp); logger.debug('emit "sdp"'); emit(EventSdp(originator: 'local', type: 'offer', sdp: sdp)); EventManager handlers = EventManager(); handlers.on(EventOnSuccessResponse(), (EventOnSuccessResponse event) { - onSucceeded(event.response); + onSucceeded(event.response as IncomingResponse?); succeeded = true; }); handlers.on(EventOnErrorResponse(), (EventOnErrorResponse event) { @@ -2545,7 +2570,7 @@ class RTCSession extends EventManager { /** * Send UPDATE */ - void _sendUpdate([Map options]) async { + void _sendUpdate([Map? options]) async { logger.debug('sendUpdate()'); options = options ?? {}; @@ -2572,7 +2597,7 @@ class RTCSession extends EventManager { eventHandlers.emit(EventCallFailed(session: this, response: response)); } - void onSucceeded(IncomingResponse response) async { + void onSucceeded(IncomingResponse? response) async { if (_status == C.STATUS_TERMINATED) { return; } @@ -2587,7 +2612,7 @@ class RTCSession extends EventManager { // Must have SDP answer. if (sdpOffer) { - if (response.body != null && response.body.trim().isNotEmpty) { + if (response!.body != null && response.body!.trim().isNotEmpty) { onFailed(); return; } else if (response.getHeader('Content-Type') != 'application/sdp') { @@ -2603,7 +2628,7 @@ class RTCSession extends EventManager { RTCSessionDescription(response.body, 'answer'); try { - await _connection.setRemoteDescription(answer); + await _connection!.setRemoteDescription(answer); eventHandlers.emit(EventSucceeded(response: response)); } catch (error) { onFailed(error); @@ -2623,14 +2648,14 @@ class RTCSession extends EventManager { try { RTCSessionDescription desc = await _createLocalDescription('offer', rtcOfferConstraints); - String sdp = _mangleOffer(desc.sdp); + String? sdp = _mangleOffer(desc.sdp); logger.debug('emit "sdp"'); emit(EventSdp(originator: 'local', type: 'offer', sdp: sdp)); EventManager handlers = EventManager(); handlers.on(EventOnSuccessResponse(), (EventOnSuccessResponse event) { - onSucceeded(event.response); + onSucceeded(event.response as IncomingResponse?); succeeded = true; }); handlers.on(EventOnErrorResponse(), (EventOnErrorResponse event) { @@ -2659,7 +2684,7 @@ class RTCSession extends EventManager { EventManager handlers = EventManager(); handlers.on(EventOnSuccessResponse(), (EventOnSuccessResponse event) { - onSucceeded(event.response); + onSucceeded(event.response as IncomingResponse?); }); handlers.on(EventOnErrorResponse(), (EventOnErrorResponse event) { onFailed(event.response); @@ -2681,8 +2706,8 @@ class RTCSession extends EventManager { } } - void _acceptAndTerminate(IncomingResponse response, - [int status_code, String reason_phrase]) async { + void _acceptAndTerminate(IncomingResponse? response, + [int? status_code, String? reason_phrase]) async { logger.debug('acceptAndTerminate()'); List extraHeaders = []; @@ -2708,15 +2733,15 @@ class RTCSession extends EventManager { /** * Correctly set the SDP direction attributes if the call is on local hold */ - String _mangleOffer(String sdpInput) { - if (!_localHold && !_remoteHold) { + String? _mangleOffer(String? sdpInput) { + if (!_localHold! && !_remoteHold!) { return sdpInput; } - Map sdp = sdp_transform.parse(sdpInput); + Map sdp = sdp_transform.parse(sdpInput!); // Local hold. - if (_localHold && !_remoteHold) { + if (_localHold! && !_remoteHold!) { logger.debug('mangleOffer() | me on hold, mangling offer'); for (Map m in sdp['media']) { if (holdMediaTypes.indexOf(m['type']) == -1) { @@ -2732,7 +2757,7 @@ class RTCSession extends EventManager { } } // Local and remote hold. - else if (_localHold && _remoteHold) { + else if (_localHold! && _remoteHold!) { logger.debug('mangleOffer() | both on hold, mangling offer'); for (Map m in sdp['media']) { if (holdMediaTypes.indexOf(m['type']) == -1) { @@ -2742,7 +2767,7 @@ class RTCSession extends EventManager { } } // Remote hold. - else if (_remoteHold) { + else if (_remoteHold!) { logger.debug('mangleOffer() | remote on hold, mangling offer'); for (Map m in sdp['media']) { if (holdMediaTypes.indexOf(m['type']) == -1) { @@ -2764,16 +2789,16 @@ class RTCSession extends EventManager { void _setLocalMediaStatus() { bool enableAudio = true, enableVideo = true; - if (_localHold || _remoteHold) { + if (_localHold! || _remoteHold!) { enableAudio = false; enableVideo = false; } - if (_audioMuted) { + if (_audioMuted!) { enableAudio = false; } - if (_videoMuted) { + if (_videoMuted!) { enableVideo = false; } @@ -2795,8 +2820,8 @@ class RTCSession extends EventManager { String session_expires_refresher; if (request.session_expires != null && - request.session_expires > 0 && - request.session_expires >= DartSIP_C.MIN_SESSION_EXPIRES) { + request.session_expires! > 0 && + request.session_expires! >= DartSIP_C.MIN_SESSION_EXPIRES) { _sessionTimers.currentExpires = request.session_expires; session_expires_refresher = request.session_expires_refresher ?? 'uas'; } else { @@ -2837,7 +2862,7 @@ class RTCSession extends EventManager { } void _runSessionTimer() { - int expires = _sessionTimers.currentExpires; + int? expires = _sessionTimers.currentExpires; _sessionTimers.running = true; @@ -2857,7 +2882,7 @@ class RTCSession extends EventManager { } else { _sendReinvite(); } - }, expires * 500); // Half the given interval (as the RFC states). + }, expires! * 500); // Half the given interval (as the RFC states). } // I'm not the refresher. else { @@ -2870,17 +2895,17 @@ class RTCSession extends EventManager { 'runSessionTimer() | timer expired, terminating the session'); terminate({ - 'cause': DartSIP_C.causes.REQUEST_TIMEOUT, + 'cause': DartSIP_C.CausesType.REQUEST_TIMEOUT, 'status_code': 408, 'reason_phrase': 'Session Timer Expired' }); - }, expires * 1100); + }, expires! * 1100); } } void _toggleMuteAudio(bool mute) { if (_localMediaStream != null) { - for (MediaStreamTrack track in _localMediaStream.getAudioTracks()) { + for (MediaStreamTrack track in _localMediaStream!.getAudioTracks()) { track.enabled = !mute; } } @@ -2888,7 +2913,7 @@ class RTCSession extends EventManager { void _toggleMuteVideo(bool mute) { if (_localMediaStream != null) { - for (MediaStreamTrack track in _localMediaStream.getVideoTracks()) { + for (MediaStreamTrack track in _localMediaStream!.getVideoTracks()) { track.enabled = !mute; } } @@ -2896,7 +2921,7 @@ class RTCSession extends EventManager { void _newRTCSession(String originator, dynamic request) { logger.debug('newRTCSession()'); - _ua.newRTCSession(originator: originator, session: this, request: request); + _ua!.newRTCSession(originator: originator, session: this, request: request); } void _connecting(dynamic request) { @@ -2927,7 +2952,7 @@ class RTCSession extends EventManager { emit(EventCallConfirmed(session: this, originator: originator, ack: ack)); } - void _ended(String originator, IncomingRequest request, ErrorCause cause) { + void _ended(String originator, IncomingRequest? request, ErrorCause cause) { logger.debug('session ended'); _end_time = DateTime.now(); _close(); @@ -2937,7 +2962,7 @@ class RTCSession extends EventManager { } void _failed(String originator, dynamic message, dynamic request, - dynamic response, int status_code, String cause, String reason_phrase) { + dynamic response, int? status_code, String cause, String? reason_phrase) { logger.debug('session failed'); // Emit private '_failed' event first. @@ -2975,14 +3000,14 @@ class RTCSession extends EventManager { emit(EventCallUnhold(session: this, originator: originator)); } - void _onmute([bool audio, bool video]) { + void _onmute([bool? audio, bool? video]) { logger.debug('session onmute'); _setLocalMediaStatus(); logger.debug('emit "muted"'); emit(EventCallMuted(session: this, audio: audio, video: video)); } - void _onunmute([bool audio, bool video]) { + void _onunmute([bool? audio, bool? video]) { logger.debug('session onunmute'); _setLocalMediaStatus(); logger.debug('emit "unmuted"'); diff --git a/lib/src/rtc_session/dtmf.dart b/lib/src/rtc_session/dtmf.dart index 365a18d1..876e5cbd 100644 --- a/lib/src/rtc_session/dtmf.dart +++ b/lib/src/rtc_session/dtmf.dart @@ -24,19 +24,19 @@ class DTMF extends EventManager { } final rtc.RTCSession _session; - DtmfMode _mode; - String _direction; - String _tone; - int _duration; - int _interToneGap; - IncomingRequest _request; - EventManager _eventHandlers; + DtmfMode? _mode; + String? _direction; + String? _tone; + int? _duration; + int? _interToneGap; + IncomingRequest? _request; + late EventManager _eventHandlers; - String get tone => _tone; + String? get tone => _tone; - int get duration => _duration; + int? get duration => _duration; - String get direction => _direction; + String? get direction => _direction; void send(String tone, Map options) { if (tone == null) { @@ -51,19 +51,13 @@ class DTMF extends EventManager { throw Exceptions.InvalidStateError(_session.status); } - List extraHeaders = Utils.cloneArray(options['extraHeaders']); + print(options); + List extraHeaders = options['extraHeaders'] != null + ? Utils.cloneArray(options['extraHeaders']) + : []; _eventHandlers = options['eventHandlers'] ?? EventManager(); - // Check tone type. - if (tone is String) { - tone = tone.toUpperCase(); - } else if (tone is num) { - tone = tone.toString(); - } else { - throw Exceptions.TypeError('Invalid tone: $tone'); - } - // Check tone value. if (!tone.contains(RegExp(r'^[0-9A-DR#*]$'))) { throw Exceptions.TypeError('Invalid tone: $tone'); @@ -77,8 +71,8 @@ class DTMF extends EventManager { if (_mode == DtmfMode.RFC2833) { RTCDTMFSender dtmfSender = _session.dtmfSender; - dtmfSender.insertDTMF(_tone, - duration: _duration, interToneGap: _interToneGap); + dtmfSender.insertDTMF(_tone!, + duration: _duration!, interToneGap: _interToneGap!); } else if (_mode == DtmfMode.INFO) { extraHeaders.add('Content-Type: application/dtmf-relay'); @@ -126,7 +120,7 @@ class DTMF extends EventManager { request.reply(200); if (request.body != null) { - List body = request.body.split('\n'); + List body = request.body!.split('\n'); if (body.length >= 1) { if ((body[0]).contains(RegExp(reg_tone))) { diff --git a/lib/src/rtc_session/info.dart b/lib/src/rtc_session/info.dart index a7224196..6eca4c2d 100644 --- a/lib/src/rtc_session/info.dart +++ b/lib/src/rtc_session/info.dart @@ -10,16 +10,16 @@ class Info extends EventManager { Info(this._session); final rtc.RTCSession _session; - String _direction; - String _contentType; - String _body; - IncomingRequest _request; + String? _direction; + String? _contentType; + String? _body; + IncomingRequest? _request; - String get contentType => _contentType; + String? get contentType => _contentType; - String get body => _body; + String? get body => _body; - String get direction => _direction; + String? get direction => _direction; void send(String contentType, String body, Map options) { _direction = 'outgoing'; diff --git a/lib/src/rtc_session/refer_notifier.dart b/lib/src/rtc_session/refer_notifier.dart index 4cf6f20b..dd944936 100644 --- a/lib/src/rtc_session/refer_notifier.dart +++ b/lib/src/rtc_session/refer_notifier.dart @@ -12,7 +12,7 @@ class C { } class ReferNotifier { - ReferNotifier(rtc.RTCSession session, int id, [int expires]) { + ReferNotifier(rtc.RTCSession session, int? id, [int? expires]) { _session = session; _id = id; _expires = expires ?? C.expires; @@ -22,23 +22,23 @@ class ReferNotifier { notify(100); } - rtc.RTCSession _session; - int _id; - int _expires; - bool _active; + late rtc.RTCSession _session; + int? _id; + int? _expires; + bool? _active; - void notify(int code, [String reason]) { + void notify(int? code, [String? reason]) { logger.debug('notify()'); if (_active == false) { return; } - reason = reason ?? DartSIP_C.REASON_PHRASE[code] ?? ''; + reason = reason ?? DartSIP_C.REASON_PHRASE[code!] ?? ''; String state; - if (code >= 200) { + if (code! >= 200) { state = 'terminated;reason=noresource'; } else { state = 'active;expires=$_expires'; diff --git a/lib/src/rtc_session/refer_subscriber.dart b/lib/src/rtc_session/refer_subscriber.dart index dd0a23b1..9c5f8b8a 100644 --- a/lib/src/rtc_session/refer_subscriber.dart +++ b/lib/src/rtc_session/refer_subscriber.dart @@ -12,10 +12,10 @@ import '../utils.dart' as Utils; class ReferSubscriber extends EventManager { ReferSubscriber(this._session); - int _id; + int? _id; final rtc.RTCSession _session; - int get id => _id; + int? get id => _id; void sendRefer(URI target, Map options) { logger.debug('sendRefer()'); @@ -27,7 +27,8 @@ class ReferSubscriber extends EventManager { addAllEventHandlers(eventHandlers); // Replaces URI header field. - String replaces; + + String replaces = ''; if (options['replaces'] != null) { replaces = options['replaces'].call_id; @@ -38,14 +39,14 @@ class ReferSubscriber extends EventManager { // Refer-To header field. String referTo = 'Refer-To: <$target' + - (replaces != null ? '?Replaces=$replaces' : '') + + (replaces.isNotEmpty ? '?Replaces=$replaces' : '') + '>'; extraHeaders.add(referTo); // Referred-By header field. String referredBy = - 'Referred-By: <${_session.ua.configuration.uri.scheme}:${_session.ua.configuration.uri.user}@${_session.ua.configuration.uri.host}>'; + 'Referred-By: <${_session.ua!.configuration!.uri.scheme}:${_session.ua!.configuration!.uri.user}@${_session.ua!.configuration!.uri.host}>'; extraHeaders.add(referredBy); extraHeaders.add('Contact: ${_session.contact}'); @@ -55,16 +56,16 @@ class ReferSubscriber extends EventManager { _requestSucceeded(event.response); }); handlers.on(EventOnErrorResponse(), (EventOnErrorResponse event) { - _requestFailed(event.response, DartSIP_C.causes.REJECTED); + _requestFailed(event.response, DartSIP_C.CausesType.REJECTED); }); handlers.on(EventOnTransportError(), (EventOnTransportError event) { - _requestFailed(null, DartSIP_C.causes.CONNECTION_ERROR); + _requestFailed(null, DartSIP_C.CausesType.CONNECTION_ERROR); }); handlers.on(EventOnRequestTimeout(), (EventOnRequestTimeout event) { - _requestFailed(null, DartSIP_C.causes.REQUEST_TIMEOUT); + _requestFailed(null, DartSIP_C.CausesType.REQUEST_TIMEOUT); }); handlers.on(EventOnDialogError(), (EventOnDialogError event) { - _requestFailed(null, DartSIP_C.causes.DIALOG_ERROR); + _requestFailed(null, DartSIP_C.CausesType.DIALOG_ERROR); }); OutgoingRequest request = _session.sendRequest( @@ -83,7 +84,7 @@ class ReferSubscriber extends EventManager { return; } - String status_line = request.body.trim(); + String status_line = request.body!.trim(); dynamic parsed = Grammar.parse(status_line, 'Status_Line'); if (parsed == -1) { @@ -108,7 +109,7 @@ class ReferSubscriber extends EventManager { } } - void _requestSucceeded(IncomingMessage response) { + void _requestSucceeded(IncomingMessage? response) { logger.debug('REFER succeeded'); logger.debug('emit "requestSucceeded"'); @@ -116,7 +117,7 @@ class ReferSubscriber extends EventManager { emit(EventReferRequestSucceeded(response: response)); } - void _requestFailed(IncomingMessage response, dynamic cause) { + void _requestFailed(IncomingMessage? response, dynamic cause) { logger.debug('REFER failed'); logger.debug('emit "requestFailed"'); diff --git a/lib/src/sanity_check.dart b/lib/src/sanity_check.dart index 770a507c..0dc3c190 100644 --- a/lib/src/sanity_check.dart +++ b/lib/src/sanity_check.dart @@ -26,9 +26,9 @@ const List responses = [ ]; // local variables. -IncomingMessage message; -UA ua; -Transport transport; +late IncomingMessage message; +late UA ua; +late Transport transport; bool sanityCheck(IncomingMessage m, UA u, Transport t) { message = m; @@ -91,7 +91,7 @@ bool rfc3261_8_2_2_1() { bool rfc3261_16_3_4() { if (message.to_tag == null) { - if (message.call_id.substring(0, 5) == ua.configuration.jssip_id) { + if (message.call_id!.substring(0, 5) == ua.configuration!.jssip_id) { reply(482); return false; @@ -101,7 +101,7 @@ bool rfc3261_16_3_4() { } bool rfc3261_18_3_request() { - int len = Utils.str_utf8_length(message.body); + int len = Utils.str_utf8_length(message.body!); dynamic contentLength = message.getHeader('content-length'); if (contentLength != null && contentLength is String) { @@ -120,9 +120,9 @@ bool rfc3261_18_3_request() { } bool rfc3261_8_2_2_2() { - String fromTag = message.from_tag; - String call_id = message.call_id; - int cseq = message.cseq; + String? fromTag = message.from_tag; + String? call_id = message.call_id; + int? cseq = message.cseq; // Accept any in-dialog request. if (message.to_tag != null) { @@ -136,7 +136,7 @@ bool rfc3261_8_2_2_2() { // and ignore the INVITE. // TODO(cloudwebrtc): we should reply the last response. if (ua.transactions - .getTransaction(InviteServerTransaction, message.via_branch) != + .getTransaction(InviteServerTransaction, message.via_branch!) != null) { result = false; } @@ -158,7 +158,7 @@ bool rfc3261_8_2_2_2() { // and ignore the request. // TODO(cloudwebrtc): we should reply the last response. else if (ua.transactions - .getTransaction(NonInviteServerTransaction, message.via_branch) != + .getTransaction(NonInviteServerTransaction, message.via_branch!) != null) { result = false; } @@ -190,7 +190,7 @@ bool rfc3261_8_1_3_3() { } bool rfc3261_18_3_response() { - int len = Utils.str_utf8_length(message.body); + int len = Utils.str_utf8_length(message.body!); // ignore: always_specify_types var contentLength = message.getHeader('content-length'); diff --git a/lib/src/sip_message.dart b/lib/src/sip_message.dart index b497b47a..246baeaf 100644 --- a/lib/src/sip_message.dart +++ b/lib/src/sip_message.dart @@ -8,7 +8,6 @@ import 'constants.dart'; import 'data.dart'; import 'exceptions.dart' as Exceptions; import 'grammar.dart'; -import 'grammar_parser.dart'; import 'logger.dart'; import 'name_addr_header.dart'; import 'transport.dart'; @@ -27,28 +26,28 @@ import 'utils.dart' as utils; * -param {String} [body] */ class OutgoingRequest { - OutgoingRequest(SipMethod method, URI ruri, UA ua, - [Map params, List extraHeaders, String body]) { + OutgoingRequest(this.method, this.ruri, this.ua, + [Map? params, + List? extraHeaders, + String? body]) { // Mandatory parameters check. if (method == null || ruri == null || ua == null) { throw Exceptions.TypeError('OutgoingRequest: ctor parameters invalid!'); } params = params ?? {}; - - this.ua = ua; - this.method = method; - this.ruri = ruri; + // ignore: prefer_initializing_formals this.body = body; - this.extraHeaders = utils.cloneArray(extraHeaders); + if (extraHeaders != null) + this.extraHeaders = utils.cloneArray(extraHeaders); // Fill the Common SIP Request Headers. // Route. if (params['route_set'] != null) { setHeader('route', params['route_set']); - } else if (ua.configuration.use_preloaded_route) { - setHeader('route', '<${ua.transport.sip_uri};lr>'); + } else if (ua!.configuration!.use_preloaded_route) { + setHeader('route', '<${ua!.transport!.sip_uri};lr>'); } // Via. @@ -63,22 +62,22 @@ class OutgoingRequest { dynamic to_params = params['to_tag'] != null ? {'tag': params['to_tag']} : null; - String to_display_name = params['to_display_name']; + String? to_display_name = params['to_display_name']; to = NameAddrHeader(to_uri, to_display_name, to_params); setHeader('to', to.toString()); // From. - dynamic from_uri = params['from_uri'] ?? ua.configuration.uri; + dynamic from_uri = params['from_uri'] ?? ua!.configuration!.uri; Map from_params = { 'tag': params['from_tag'] ?? utils.newTag() }; - String display_name; + String? display_name; if (params['from_display_name'] != null) { display_name = params['from_display_name']; - } else if (ua.configuration.display_name != null) { - display_name = ua.configuration.display_name; + } else if (ua!.configuration!.display_name != null) { + display_name = ua!.configuration!.display_name; } else { display_name = null; } @@ -88,7 +87,7 @@ class OutgoingRequest { // Call-ID. String call_id = params['call_id'] ?? - (ua.configuration.jssip_id + utils.createRandomToken(15)); + (ua!.configuration!.jssip_id! + utils.createRandomToken(15)); this.call_id = call_id; setHeader('call-id', call_id); @@ -97,21 +96,21 @@ class OutgoingRequest { num cseq = params['cseq'] ?? utils.Math.floor(utils.Math.randomDouble() * 10000); - this.cseq = cseq; + this.cseq = cseq as int?; setHeader('cseq', '$cseq ${SipMethodHelper.getName(method)}'); } - UA ua; - Map headers = {}; - SipMethod method; - URI ruri; + UA? ua; + Map headers = {}; + SipMethod? method; + URI? ruri; String? body; List extraHeaders = []; - NameAddrHeader to; - NameAddrHeader from; - String call_id; - int cseq; - Map sdp; + NameAddrHeader? to; + NameAddrHeader? from; + String? call_id; + int? cseq; + Map? sdp; dynamic transaction; /** @@ -138,7 +137,7 @@ class OutgoingRequest { * -returns {String|null} Returns the specified header, null if header doesn't exist. */ dynamic getHeader(String name) { - List headers = this.headers[utils.headerize(name)]; + List? headers = this.headers[utils.headerize(name)]; if (headers != null) { if (headers[0] != null) { @@ -162,7 +161,7 @@ class OutgoingRequest { * -returns {Array} Array with all the headers of the specified name. */ List getHeaders(String name) { - List headers = this.headers[utils.headerize(name)]; + List? headers = this.headers[utils.headerize(name)]; List result = []; if (headers != null) { @@ -212,7 +211,7 @@ class OutgoingRequest { * * Returns sdp. */ - Map parseSDP({bool force = false}) { + Map? parseSDP({bool force = false}) { if (!force && sdp != null) { return sdp; } else { @@ -225,15 +224,15 @@ class OutgoingRequest { String toString() { String msg = '${SipMethodHelper.getName(method)} $ruri SIP/2.0\r\n'; - headers.forEach((String headerName, dynamic headerValues) { + headers.forEach((String? headerName, dynamic headerValues) { headerValues.forEach((dynamic value) { msg += '$headerName: $value\r\n'; }); }); - extraHeaders.forEach((dynamic header) { + for (dynamic header in extraHeaders) { msg += '${header.trim()}\r\n'; - }); + } // Supported. List supported = []; @@ -244,17 +243,17 @@ class OutgoingRequest { supported.add('gruu'); break; case SipMethod.INVITE: - if (ua.configuration.session_timers) { + if (ua!.configuration!.session_timers) { supported.add('timer'); } - if (ua.contact.pub_gruu != null || ua.contact.temp_gruu != null) { + if (ua!.contact!.pub_gruu != null || ua!.contact!.temp_gruu != null) { supported.add('gruu'); } supported.add('ice'); supported.add('replaces'); break; case SipMethod.UPDATE: - if (ua.configuration.session_timers) { + if (ua!.configuration!.session_timers) { supported.add('timer'); } supported.add('ice'); @@ -265,7 +264,7 @@ class OutgoingRequest { supported.add('outbound'); - String userAgent = ua.configuration.user_agent ?? DartSIP_C.USER_AGENT; + String userAgent = ua!.configuration!.user_agent; // Allow. msg += 'Allow: ${DartSIP_C.ALLOWED_METHODS}\r\n'; @@ -273,12 +272,12 @@ class OutgoingRequest { msg += 'User-Agent: $userAgent\r\n'; if (body != null) { - logger.debug('Outgoing Message: ' + body); + logger.debug('Outgoing Message: ' + body!); //Here we should calculate the real content length for UTF8 - List encoded = utf8.encode(body); + List encoded = utf8.encode(body!); int length = encoded.length; msg += 'Content-Length: $length\r\n\r\n'; - msg += body; + msg += body!; } else { msg += 'Content-Length: 0\r\n\r\n'; } @@ -289,7 +288,7 @@ class OutgoingRequest { OutgoingRequest clone() { OutgoingRequest request = OutgoingRequest(method, ruri, ua); - headers.forEach((String name, dynamic value) { + headers.forEach((String? name, dynamic value) { request.headers[name] = headers[name]; }); @@ -305,8 +304,8 @@ class OutgoingRequest { } class InitialOutgoingInviteRequest extends OutgoingRequest { - InitialOutgoingInviteRequest(URI ruri, UA ua, - [Map params, List extraHeaders, String body]) + InitialOutgoingInviteRequest(URI? ruri, UA? ua, + [Map? params, List? extraHeaders, String? body]) : super(SipMethod.INVITE, ruri, ua, params, extraHeaders, body) { transaction = null; } @@ -320,7 +319,7 @@ class InitialOutgoingInviteRequest extends OutgoingRequest { InitialOutgoingInviteRequest request = InitialOutgoingInviteRequest(ruri, ua); - headers.forEach((String name, dynamic value) { + headers.forEach((String? name, dynamic value) { request.headers[name] = List.from(headers[name]); }); @@ -353,24 +352,24 @@ class IncomingMessage { sdp = null; } - String data; - Map headers; - SipMethod method; - String via_branch; - String call_id; - int cseq; - NameAddrHeader from; - String from_tag; - NameAddrHeader to; + late String data; + Map? headers; + SipMethod? method; + String? via_branch; + String? call_id; + int? cseq; + NameAddrHeader? from; + String? from_tag; + NameAddrHeader? to; String? to_tag; - String body; - Map sdp; + String? body; + Map? sdp; dynamic status_code; - String reason_phrase; - int session_expires; - String session_expires_refresher; - ParsedData event; - ParsedData replaces; + String? reason_phrase; + int? session_expires; + String? session_expires_refresher; + ParsedData? event; + late ParsedData replaces; dynamic refer_to; /** @@ -382,10 +381,10 @@ class IncomingMessage { name = utils.headerize(name); - if (headers[name] != null) { - headers[name].add(header); + if (headers![name] != null) { + headers![name].add(header); } else { - headers[name] = [header]; + headers![name] = [header]; } } @@ -393,7 +392,7 @@ class IncomingMessage { * Get the value of the given header name at the given position. */ dynamic getHeader(String name) { - dynamic header = headers[utils.headerize(name)]; + dynamic header = headers![utils.headerize(name)]; if (header != null) { if (header[0] != null) { @@ -408,7 +407,7 @@ class IncomingMessage { * Get the header/s of the given name. */ List getHeaders(String name) { - List headers = this.headers[utils.headerize(name)]; + List? headers = this.headers![utils.headerize(name)]; List result = []; if (headers == null) { @@ -426,7 +425,7 @@ class IncomingMessage { * Verify the existence of the given header. */ bool hasHeader(String name) { - return headers.containsKey(utils.headerize(name)); + return headers!.containsKey(utils.headerize(name)); } /** @@ -439,15 +438,15 @@ class IncomingMessage { dynamic parseHeader(String name, {int idx = 0}) { name = utils.headerize(name); - if (headers[name] == null) { + if (headers![name] == null) { logger.debug('header "$name" not present'); return null; - } else if (idx >= headers[name].length) { + } else if (idx >= headers![name].length) { logger.debug('not so many "$name" headers present'); return null; } - dynamic header = headers[name][idx]; + dynamic header = headers![name][idx]; dynamic value = header['raw']; if (header['parsed'] != null) { @@ -457,7 +456,7 @@ class IncomingMessage { // Substitute '-' by '_' for grammar rule matching. dynamic parsed = Grammar.parse(value, name.replaceAll('-', '_')); if (parsed == -1) { - headers[name].splice(idx, 1); // delete from headers + headers![name].splice(idx, 1); // delete from headers logger.debug('error parsing "$name" header field with value "$value"'); return null; } else { @@ -489,7 +488,7 @@ class IncomingMessage { void setHeader(String name, dynamic value) { Map header = {'raw': value}; - headers[utils.headerize(name)] = [header]; + headers![utils.headerize(name)] = [header]; } /** @@ -499,7 +498,7 @@ class IncomingMessage { * * Returns sdp. */ - Map parseSDP({bool force = false}) { + Map? parseSDP({bool force = false}) { if (!force && sdp != null) { return sdp; } else { @@ -515,17 +514,16 @@ class IncomingMessage { } class IncomingRequest extends IncomingMessage { - IncomingRequest(UA ua) : super() { - this.ua = ua; - headers = {}; + IncomingRequest(this.ua) : super() { + headers = {}; ruri = null; transport = null; server_transaction = null; } - UA ua; - URI ruri; - Transport transport; - TransactionBase server_transaction; + UA? ua; + URI? ruri; + Transport? transport; + TransactionBase? server_transaction; /** * Stateful reply. * -param {Number} code status code @@ -536,26 +534,25 @@ class IncomingRequest extends IncomingMessage { * -param {Function} [onFailure] onFailure callback */ void reply(int code, - [String reason, - List extraHeaders, - String body, - Function onSuccess, - Function onFailure]) { + [String? reason, + List? extraHeaders, + String? body, + Function? onSuccess, + Function? onFailure]) { List supported = []; dynamic to = getHeader('To'); - code = code ?? null; reason = reason ?? null; // Validate code and reason values. - if (code == null || (code < 100 || code > 699)) { + if (code < 100 || code > 699) { throw Exceptions.TypeError('Invalid status_code: $code'); - } else if (reason != null && reason is! String) { + } else if (reason != null) { throw Exceptions.TypeError('Invalid reason_phrase: $reason'); } reason = reason ?? DartSIP_C.REASON_PHRASE[code] ?? ''; - extraHeaders = utils.cloneArray(extraHeaders); + if (extraHeaders != null) extraHeaders = utils.cloneArray(extraHeaders); String response = 'SIP/2.0 $code $reason\r\n'; @@ -584,24 +581,25 @@ class IncomingRequest extends IncomingMessage { response += 'Call-ID: $call_id\r\n'; response += 'CSeq: $cseq ${SipMethodHelper.getName(method)}\r\n'; - for (dynamic header in extraHeaders) { - response += '${header.trim()}\r\n'; - } + if (extraHeaders != null) + for (dynamic header in extraHeaders) { + response += '${header.trim()}\r\n'; + } // Supported. switch (method) { case SipMethod.INVITE: - if (ua.configuration.session_timers) { + if (ua!.configuration!.session_timers) { supported.add('timer'); } - if (ua.contact.pub_gruu != null || ua.contact.temp_gruu != null) { + if (ua!.contact!.pub_gruu != null || ua!.contact!.temp_gruu != null) { supported.add('gruu'); } supported.add('ice'); supported.add('replaces'); break; case SipMethod.UPDATE: - if (ua.configuration.session_timers) { + if (ua!.configuration!.session_timers) { supported.add('timer'); } if (body != null) { @@ -640,7 +638,8 @@ class IncomingRequest extends IncomingMessage { IncomingMessage message = IncomingMessage(); message.data = response; - server_transaction.receiveResponse(code, message, onSuccess, onFailure); + server_transaction!.receiveResponse(code, message, + onSuccess as void Function()?, onFailure as void Function()?); } /** @@ -648,13 +647,13 @@ class IncomingRequest extends IncomingMessage { * -param {Number} code status code * -param {String} reason reason phrase */ - void reply_sl(int code, [String reason]) { + void reply_sl(int code, [String? reason]) { List vias = getHeaders('via'); // Validate code and reason values. if (code == null || (code < 100 || code > 699)) { throw Exceptions.TypeError('Invalid status_code: $code'); - } else if (reason != null && reason is! String) { + } else if (reason != null) { throw Exceptions.TypeError('Invalid reason_phrase: $reason'); } @@ -680,13 +679,13 @@ class IncomingRequest extends IncomingMessage { response += 'CSeq: $cseq ${SipMethodHelper.getName(method)}\r\n'; response += 'Content-Length: ${0}\r\n\r\n'; - transport.send(response); + transport!.send(response); } } class IncomingResponse extends IncomingMessage { IncomingResponse() { - headers = {}; + headers = {}; status_code = null; reason_phrase = null; } diff --git a/lib/src/sip_ua_helper.dart b/lib/src/sip_ua_helper.dart index 78ce4fd1..93aef7ca 100644 --- a/lib/src/sip_ua_helper.dart +++ b/lib/src/sip_ua_helper.dart @@ -10,7 +10,6 @@ import 'event_manager/event_manager.dart'; import 'logger.dart'; import 'message.dart'; import 'rtc_session.dart'; -import 'socket.dart'; import 'stack_trace_nj.dart'; import 'transports/websocket_interface.dart'; import 'ua.dart'; @@ -21,24 +20,34 @@ class SIPUAHelper extends EventManager { } UA? _ua; - Settings _settings; - UaSettings _uaSettings; - final Map _calls = {}; + Settings? _settings; + late UaSettings _uaSettings; + final Map _calls = {}; RegistrationState _registerState = RegistrationState(state: RegistrationStateEnum.NONE); set loggingLevel(Level loggingLevel) => Log.loggingLevel = loggingLevel; - bool get registered => _ua?.isRegistered() ?? false; + bool? get registered { + if (_ua != null) { + return _ua!.isRegistered(); + } + return false; + } - bool get connected => _ua?.isConnected() ?? false; + bool get connected { + if (_ua != null) { + return _ua!.isConnected(); + } + return false; + } RegistrationState get registerState => _registerState; void stop() async { if (_ua != null) { - _ua?.stop(); + _ua!.stop(); } else { Log.w('ERROR: stop called but not started, call start first.'); } @@ -47,13 +56,13 @@ class SIPUAHelper extends EventManager { void register() { assert(_ua != null, 'register called but not started, you must call start first.'); - _ua?.register(); + _ua!.register(); } void unregister([bool all = true]) { if (_ua != null) { - assert(registered, 'ERROR: you must call register first.'); - _ua.unregister(all: all); + assert(registered!, 'ERROR: you must call register first.'); + _ua!.unregister(all: all); } else { Log.e('ERROR: unregister called, you must call start first.'); } @@ -61,16 +70,16 @@ class SIPUAHelper extends EventManager { Future call(String target, {bool voiceonly = false, - MediaStream mediaStream = null, - List headers = const []}) async { - if (_ua != null && _ua.isConnected()) { - Map options = buildCallOptions(voiceonly); + MediaStream? mediaStream, + List? headers}) async { + if (_ua != null && _ua!.isConnected()) { + Map options = buildCallOptions(voiceonly); if (mediaStream != null) { options['mediaStream'] = mediaStream; } - List extHeaders = options['extraHeaders']; - extHeaders.addAll(headers); - _ua.call(target, options); + List extHeaders = options['extraHeaders'] as List; + extHeaders.addAll(headers ?? []); + _ua!.call(target, options); return true; } else { logger.error( @@ -87,7 +96,7 @@ class SIPUAHelper extends EventManager { if (_ua != null) { logger.warn( 'UA instance already exist!, stopping UA and creating a one...'); - _ua?.stop(); + _ua!.stop(); } _uaSettings = uaSettings; @@ -95,57 +104,57 @@ class SIPUAHelper extends EventManager { _settings = Settings(); WebSocketInterface socket = WebSocketInterface( uaSettings.webSocketUrl, uaSettings.webSocketSettings); - _settings.sockets = [socket]; - _settings.uri = uaSettings.uri; - _settings.password = uaSettings.password; - _settings.ha1 = uaSettings.ha1; - _settings.display_name = uaSettings.displayName; - _settings.authorization_user = uaSettings.authorizationUser; - _settings.user_agent = uaSettings.userAgent ?? DartSIP_C.USER_AGENT; - _settings.register = uaSettings.register; - _settings.register_expires = uaSettings.register_expires; - _settings.register_extra_contact_uri_params = + _settings!.sockets = [socket]; + _settings!.uri = uaSettings.uri; + _settings!.password = uaSettings.password; + _settings!.ha1 = uaSettings.ha1; + _settings!.display_name = uaSettings.displayName; + _settings!.authorization_user = uaSettings.authorizationUser; + _settings!.user_agent = uaSettings.userAgent ?? DartSIP_C.USER_AGENT; + _settings!.register = uaSettings.register; + _settings!.register_expires = uaSettings.register_expires; + _settings!.register_extra_contact_uri_params = uaSettings.registerParams.extraContactUriParams; - _settings.dtmf_mode = uaSettings.dtmfMode; - _settings.session_timers = uaSettings.sessionTimers; - _settings.ice_gathering_timeout = uaSettings.iceGatheringTimeout; + _settings!.dtmf_mode = uaSettings.dtmfMode; + _settings!.session_timers = uaSettings.sessionTimers; + _settings!.ice_gathering_timeout = uaSettings.iceGatheringTimeout; try { - UA ua = UA(_settings); - ua.on(EventSocketConnecting(), (EventSocketConnecting event) { + _ua = UA(_settings); + _ua!.on(EventSocketConnecting(), (EventSocketConnecting event) { logger.debug('connecting => ' + event.toString()); _notifyTransportStateListeners( TransportState(TransportStateEnum.CONNECTING)); }); - ua.on(EventSocketConnected(), (EventSocketConnected event) { + _ua!.on(EventSocketConnected(), (EventSocketConnected event) { logger.debug('connected => ' + event.toString()); _notifyTransportStateListeners( TransportState(TransportStateEnum.CONNECTED)); }); - ua.on(EventSocketDisconnected(), (EventSocketDisconnected event) { + _ua!.on(EventSocketDisconnected(), (EventSocketDisconnected event) { logger.debug('disconnected => ' + (event.cause.toString())); _notifyTransportStateListeners(TransportState( TransportStateEnum.DISCONNECTED, cause: event.cause)); }); - ua.on(EventRegistered(), (EventRegistered event) { + _ua!.on(EventRegistered(), (EventRegistered event) { logger.debug('registered => ' + event.cause.toString()); _registerState = RegistrationState( state: RegistrationStateEnum.REGISTERED, cause: event.cause); _notifyRegsistrationStateListeners(_registerState); }); - ua.on(EventUnregister(), (EventUnregister event) { + _ua!.on(EventUnregister(), (EventUnregister event) { logger.debug('unregistered => ' + event.cause.toString()); _registerState = RegistrationState( state: RegistrationStateEnum.UNREGISTERED, cause: event.cause); _notifyRegsistrationStateListeners(_registerState); }); - ua.on(EventRegistrationFailed(), (EventRegistrationFailed event) { + _ua!.on(EventRegistrationFailed(), (EventRegistrationFailed event) { logger.debug('registrationFailed => ' + (event.cause.toString())); _registerState = RegistrationState( state: RegistrationStateEnum.REGISTRATION_FAILED, @@ -153,9 +162,9 @@ class SIPUAHelper extends EventManager { _notifyRegsistrationStateListeners(_registerState); }); - ua.on(EventNewRTCSession(), (EventNewRTCSession event) { + _ua!.on(EventNewRTCSession(), (EventNewRTCSession event) { logger.debug('newRTCSession => ' + event.toString()); - RTCSession session = event.session; + RTCSession session = event.session!; if (session.direction == 'incoming') { // Set event handlers. session.addAllEventHandlers( @@ -167,18 +176,17 @@ class SIPUAHelper extends EventManager { event, CallState(CallStateEnum.CALL_INITIATION)); }); - ua.on(EventNewMessage(), (EventNewMessage event) { + _ua!.on(EventNewMessage(), (EventNewMessage event) { logger.debug('newMessage => ' + event.toString()); //Only notify incoming message to listener - if (event.message.direction == 'incoming') { + if (event.message!.direction == 'incoming') { SIPMessageRequest message = SIPMessageRequest(event.message, event.originator, event.request); _notifyNewMessageListeners(message); } }); - ua.start(); - _ua = ua; + _ua!.start(); } catch (event, s) { logger.error(event.toString(), null, s); } @@ -187,10 +195,10 @@ class SIPUAHelper extends EventManager { /// Build the call options. /// You may override this method in a custom SIPUAHelper class in order to /// modify the options to your needs. - Map buildCallOptions([bool voiceonly = false]) => + Map buildCallOptions([bool voiceonly = false]) => _options(voiceonly); - Map _options([bool voiceonly = false]) { + Map _options([bool voiceonly = false]) { // Register callbacks to desired call events EventManager handlers = EventManager(); handlers.on(EventCallConnecting(), (EventCallConnecting event) { @@ -269,7 +277,7 @@ class SIPUAHelper extends EventManager { }, buildCallOptions(true)); }); - Map _defaultOptions = { + Map _defaultOptions = { 'eventHandlers': handlers, 'extraHeaders': [], 'pcConfig': { @@ -312,17 +320,16 @@ class SIPUAHelper extends EventManager { }, 'sessionTimersExpires': 120 }; - return _defaultOptions; } Message sendMessage(String target, String body, [Map? options]) { - return _ua.sendMessage(target, body, options); + return _ua!.sendMessage(target, body, options); } void terminateSessions(Map options) { - _ua.terminateSessions(options); + _ua!.terminateSessions(options as Map); } final Set _sipUaHelperListeners = @@ -337,33 +344,33 @@ class SIPUAHelper extends EventManager { } void _notifyTransportStateListeners(TransportState state) { - _sipUaHelperListeners.forEach((SipUaHelperListener listener) { + for (SipUaHelperListener listener in _sipUaHelperListeners) { listener.transportStateChanged(state); - }); + } } void _notifyRegsistrationStateListeners(RegistrationState state) { - _sipUaHelperListeners.forEach((SipUaHelperListener listener) { + for (SipUaHelperListener listener in _sipUaHelperListeners) { listener.registrationStateChanged(state); - }); + } } void _notifyCallStateListeners(CallEvent event, CallState state) { - Call call = _calls[event.id]; + Call? call = _calls[event.id]; if (call == null) { logger.e('Call ${event.id} not found!'); return; } call.state = state.state; - _sipUaHelperListeners.forEach((SipUaHelperListener listener) { + for (SipUaHelperListener listener in _sipUaHelperListeners) { listener.callStateChanged(call, state); - }); + } } void _notifyNewMessageListeners(SIPMessageRequest msg) { - _sipUaHelperListeners.forEach((SipUaHelperListener listener) { + for (SipUaHelperListener listener in _sipUaHelperListeners) { listener.onNewMessage(msg); - }); + } } } @@ -386,15 +393,15 @@ enum CallStateEnum { class Call { Call(this._id, this._session, this.state); - final String _id; + final String? _id; final RTCSession _session; - String get id => _id; - RTCPeerConnection get peerConnection => _session.connection; + String? get id => _id; + RTCPeerConnection? get peerConnection => _session.connection; RTCSession get session => _session; CallStateEnum state; - void answer(Map options, {MediaStream mediaStream = null}) { + void answer(Map options, {MediaStream? mediaStream = null}) { assert(_session != null, 'ERROR(answer): rtc session is invalid!'); if (mediaStream != null) { options['mediaStream'] = mediaStream; @@ -404,7 +411,7 @@ class Call { void refer(String target) { assert(_session != null, 'ERROR(refer): rtc session is invalid!'); - ReferSubscriber refer = _session.refer(target); + ReferSubscriber refer = _session.refer(target)!; refer.on(EventReferTrying(), (EventReferTrying data) {}); refer.on(EventReferProgress(), (EventReferProgress data) {}); refer.on(EventReferAccepted(), (EventReferAccepted data) { @@ -413,9 +420,9 @@ class Call { refer.on(EventReferFailed(), (EventReferFailed data) {}); } - void hangup([Map options]) { + void hangup([Map? options]) { assert(_session != null, 'ERROR(hangup): rtc session is invalid!'); - _session.terminate(options); + _session.terminate(options as Map?); } void hold() { @@ -443,7 +450,7 @@ class Call { _session.renegotiate(options); } - void sendDTMF(String tones, [Map options]) { + void sendDTMF(String tones, [Map? options]) { assert(_session != null, 'ERROR(sendDTMF): rtc session is invalid!'); _session.sendDTMF(tones, options); } @@ -453,34 +460,34 @@ class Call { _session.sendInfo(contentType, body, options); } - String get remote_display_name { + String? get remote_display_name { assert(_session != null, 'ERROR(get remote_identity): rtc session is invalid!'); if (_session.remote_identity != null && - _session.remote_identity.display_name != null) { - return _session.remote_identity.display_name; + _session.remote_identity!.display_name != null) { + return _session.remote_identity!.display_name; } return ''; } - String get remote_identity { + String? get remote_identity { assert(_session != null, 'ERROR(get remote_identity): rtc session is invalid!'); if (_session.remote_identity != null && - _session.remote_identity.uri != null && - _session.remote_identity.uri.user != null) { - return _session.remote_identity.uri.user; + _session.remote_identity!.uri != null && + _session.remote_identity!.uri!.user != null) { + return _session.remote_identity!.uri!.user; } return ''; } - String get local_identity { + String? get local_identity { assert( _session != null, 'ERROR(get local_identity): rtc session is invalid!'); if (_session.local_identity != null && - _session.local_identity.uri != null && - _session.local_identity.uri.user != null) { - return _session.local_identity.uri.user; + _session.local_identity!.uri != null && + _session.local_identity!.uri!.user != null) { + return _session.local_identity!.uri!.user; } return ''; } @@ -488,7 +495,7 @@ class Call { String get direction { assert(_session != null, 'ERROR(get direction): rtc session is invalid!'); if (_session.direction != null) { - return _session.direction.toUpperCase(); + return _session.direction!.toUpperCase(); } return ''; } @@ -532,12 +539,12 @@ class CallState { this.cause, this.refer}); CallStateEnum state; - ErrorCause cause; - String originator; - bool audio; - bool video; - MediaStream stream; - EventCallRefer refer; + ErrorCause? cause; + String? originator; + bool? audio; + bool? video; + MediaStream? stream; + EventCallRefer? refer; } enum RegistrationStateEnum { @@ -549,8 +556,8 @@ enum RegistrationStateEnum { class RegistrationState { RegistrationState({this.state, this.cause}); - RegistrationStateEnum state; - ErrorCause cause; + RegistrationStateEnum? state; + ErrorCause? cause; } enum TransportStateEnum { @@ -563,14 +570,14 @@ enum TransportStateEnum { class TransportState { TransportState(this.state, {this.cause}); TransportStateEnum state; - ErrorCause cause; + ErrorCause? cause; } class SIPMessageRequest { SIPMessageRequest(this.message, this.originator, this.request); dynamic request; - String originator; - Message message; + String? originator; + Message? message; } abstract class SipUaHelperListener { @@ -593,7 +600,7 @@ class WebSocketSettings { Map extraHeaders = {}; /// `User Agent` field for dart http client. - String userAgent; + String? userAgent; /// Don‘t check the server certificate /// for self-signed certificate. @@ -602,7 +609,7 @@ class WebSocketSettings { /// Custom transport scheme string to use. /// Otherwise the used protocol will be used (for example WS for ws:// /// or WSS for wss://, based on the given web socket URL). - String transport_scheme; + String? transport_scheme; } enum DtmfMode { @@ -611,26 +618,26 @@ enum DtmfMode { } class UaSettings { - String webSocketUrl; + late String webSocketUrl; WebSocketSettings webSocketSettings = WebSocketSettings(); /// May not need to register if on a static IP, just Auth /// Default is true - bool register; + bool? register; /// Default is 600 secs in config.dart - int register_expires; + int? register_expires; /// Mainly used for RFC8599 Push Notification Support RegisterParams registerParams = RegisterParams(); /// `User Agent` field for sip message. - String userAgent; - String uri; - String authorizationUser; - String password; - String ha1; - String displayName; + String? userAgent; + String? uri; + String? authorizationUser; + String? password; + String? ha1; + String? displayName; /// DTMF mode, in band (rfc2833) or out of band (sip info) DtmfMode dtmfMode = DtmfMode.INFO; diff --git a/lib/src/socket.dart b/lib/src/socket.dart index a95751bd..e1a9c5e4 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -5,19 +5,18 @@ import 'utils.dart' as Utils; /// Socket Interface. abstract class Socket { - String via_transport; - String get url; - String get sip_uri; + late String via_transport; + String? get url; + String? get sip_uri; void connect(); void disconnect(); void send(dynamic data); - void Function() onconnect; - void Function( - WebSocketInterface socket, bool error, int closeCode, String reason) - ondisconnect; - void Function(dynamic data) ondata; + void Function()? onconnect; + void Function(WebSocketInterface socket, bool error, int? closeCode, + String? reason)? ondisconnect; + void Function(dynamic data)? ondata; } bool isSocket(dynamic socket) { @@ -56,11 +55,11 @@ bool isSocket(dynamic socket) { } // Check Methods. - if (socket.connect == null || socket.connect is! Function) + if (socket.connect == null) return false; - else if (socket.disconnect == null || socket.disconnect is! Function) + else if (socket.disconnect == null) return false; - else if (socket.send == null || socket.send is! Function) { + else if (socket.send == null) { return false; } diff --git a/lib/src/stack_trace_nj.dart b/lib/src/stack_trace_nj.dart index cf52fc87..cfafa043 100644 --- a/lib/src/stack_trace_nj.dart +++ b/lib/src/stack_trace_nj.dart @@ -17,16 +17,16 @@ class StackTraceNJ implements core.StackTrace { RegExp(r'#[0-9]+[\s]+(.+) \(([^\s]+)\)'); final core.StackTrace stackTrace; - final String workingDirectory; + final String? workingDirectory; final int _skipFrames; - List _frames; + List? _frames; /// /// Returns a File instance for the current stackframe /// File get sourceFile { - return frames[0].sourceFile; + return frames![0].sourceFile; } /// @@ -43,18 +43,18 @@ class StackTraceNJ implements core.StackTrace { /// Returns the filename for the current stackframe /// int get lineNo { - return frames[0].lineNo; + return frames![0].lineNo; } /// Outputs a formatted string of the current stack_trace_nj /// showing upto [methodCount] methods in the trace. /// [methodCount] defaults to 10. - String formatStackTrace({bool showPath = false, int methodCount = 10}) { + String? formatStackTrace({bool showPath = false, int methodCount = 10}) { List formatted = []; int count = 0; - for (Stackframe stackFrame in frames) { + for (Stackframe stackFrame in frames!) { // if (stackFrame.sourceFile.contains('log.dart') || // stackFrame.sourceFile.contains('package:logger')) { // continue; @@ -69,7 +69,7 @@ class StackTraceNJ implements core.StackTrace { String newLine = '$sourceFile:${stackFrame.lineNo}'; if (workingDirectory != null) { - formatted.add('file:///' + workingDirectory + newLine); + formatted.add('file:///' + workingDirectory! + newLine); } else { formatted.add(newLine); } @@ -85,14 +85,14 @@ class StackTraceNJ implements core.StackTrace { } } - List get frames { + List? get frames { _frames ??= _extractFrames(); return _frames; } @override String toString() { - return formatStackTrace(); + return formatStackTrace()!; } List _extractFrames() { @@ -107,13 +107,13 @@ class StackTraceNJ implements core.StackTrace { skipFrames--; continue; } - Match match = stackTraceRegex.matchAsPrefix(line); + Match? match = stackTraceRegex.matchAsPrefix(line); if (match == null) continue; // source is one of two formats // file:///.../squarephone_app/filename.dart:column:line // package:/squarephone/.path./filename.dart:column:line - String source = match.group(2); + String source = match.group(2)!; List sourceParts = source.split(':'); ArgumentError.value(sourceParts.length == 4, "Stackframe source does not contain the expeted no of colons '$source'"); @@ -129,7 +129,7 @@ class StackTraceNJ implements core.StackTrace { } // the actual contents of the line (sort of) - String details = match.group(1); + String? details = match.group(1); sourcePath = sourcePath.replaceAll('', '()'); sourcePath = sourcePath.replaceAll('package:', ''); @@ -152,5 +152,5 @@ class Stackframe { final File sourceFile; final int lineNo; final int column; - final String details; + final String? details; } diff --git a/lib/src/timers.dart b/lib/src/timers.dart index 85bfdc8d..f0f52432 100644 --- a/lib/src/timers.dart +++ b/lib/src/timers.dart @@ -18,10 +18,10 @@ class Timers { } Timer setTimeout(Function fn, int duration) { - return Timer(Duration(milliseconds: duration), fn); + return Timer(Duration(milliseconds: duration), fn as void Function()); } -void clearTimeout(Timer timer) { +void clearTimeout(Timer? timer) { if (timer != null) { timer.cancel(); } @@ -33,7 +33,7 @@ Timer setInterval(Function fn, int interval) { }); } -void clearInterval(Timer timer) { +void clearInterval(Timer? timer) { if (timer != null) { timer.cancel(); } diff --git a/lib/src/transactions/ack_client.dart b/lib/src/transactions/ack_client.dart index 20c80997..c687a307 100644 --- a/lib/src/transactions/ack_client.dart +++ b/lib/src/transactions/ack_client.dart @@ -17,16 +17,16 @@ class AckClientTransaction extends TransactionBase { String via = 'SIP/2.0/${transport.via_transport}'; - via += ' ${ua.configuration.via_host};branch=$id'; + via += ' ${ua.configuration!.via_host};branch=$id'; request.setHeader('via', via); } - EventManager _eventHandlers; + late EventManager _eventHandlers; @override void send() { - if (!transport.send(request)) { + if (!transport!.send(request)) { onTransportError(); } } diff --git a/lib/src/transactions/invite_client.dart b/lib/src/transactions/invite_client.dart index 782922be..0be8e9a1 100644 --- a/lib/src/transactions/invite_client.dart +++ b/lib/src/transactions/invite_client.dart @@ -23,15 +23,15 @@ class InviteClientTransaction extends TransactionBase { String via = 'SIP/2.0/${transport.via_transport}'; - via += ' ${ua.configuration.via_host};branch=$id'; + via += ' ${ua.configuration!.via_host};branch=$id'; this.request.setHeader('via', via); - this.ua.newTransaction(this); + this.ua!.newTransaction(this); } - EventManager _eventHandlers; + late EventManager _eventHandlers; - Timer B, D, M; + Timer? B, D, M; void stateChanged(TransactionState state) { this.state = state; @@ -45,7 +45,7 @@ class InviteClientTransaction extends TransactionBase { timer_B(); }, Timers.TIMER_B); - if (!transport.send(request)) { + if (!transport!.send(request)) { onTransportError(); } } @@ -62,7 +62,7 @@ class InviteClientTransaction extends TransactionBase { } stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } // RFC 6026 7.2. @@ -72,7 +72,7 @@ class InviteClientTransaction extends TransactionBase { if (state == TransactionState.ACCEPTED) { clearTimeout(B); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } } @@ -81,7 +81,7 @@ class InviteClientTransaction extends TransactionBase { logger.debug('Timer B expired for transaction $id'); if (state == TransactionState.CALLING) { stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); _eventHandlers.emit(EventOnRequestTimeout()); } } @@ -90,7 +90,7 @@ class InviteClientTransaction extends TransactionBase { logger.debug('Timer D expired for transaction $id'); clearTimeout(B); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } void sendACK(IncomingMessage response) { @@ -109,7 +109,7 @@ class InviteClientTransaction extends TransactionBase { timer_D(); }, Timers.TIMER_D); - transport.send(ack); + transport!.send(ack); } void cancel(String reason) { @@ -133,22 +133,24 @@ class InviteClientTransaction extends TransactionBase { cancel.setHeader('reason', reason); } - transport.send(cancel); + transport!.send(cancel); } @override - void receiveResponse(int status_code, IncomingMessage response, - [void Function() onSuccess, void Function() onFailure]) { + void receiveResponse(int? status_code, IncomingMessage response, + [void Function()? onSuccess, void Function()? onFailure]) { int status_code = response.status_code; if (status_code >= 100 && status_code <= 199) { switch (state) { case TransactionState.CALLING: stateChanged(TransactionState.PROCEEDING); - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit( + EventOnReceiveResponse(response: response as IncomingResponse?)); break; case TransactionState.PROCEEDING: - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit( + EventOnReceiveResponse(response: response as IncomingResponse?)); break; default: break; @@ -161,10 +163,12 @@ class InviteClientTransaction extends TransactionBase { M = setTimeout(() { timer_M(); }, Timers.TIMER_M); - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit( + EventOnReceiveResponse(response: response as IncomingResponse?)); break; case TransactionState.ACCEPTED: - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit( + EventOnReceiveResponse(response: response as IncomingResponse?)); break; default: break; @@ -175,7 +179,8 @@ class InviteClientTransaction extends TransactionBase { case TransactionState.PROCEEDING: stateChanged(TransactionState.COMPLETED); sendACK(response); - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit( + EventOnReceiveResponse(response: response as IncomingResponse?)); break; case TransactionState.COMPLETED: sendACK(response); diff --git a/lib/src/transactions/invite_server.dart b/lib/src/transactions/invite_server.dart index 9ae98e97..150f8cd6 100644 --- a/lib/src/transactions/invite_server.dart +++ b/lib/src/transactions/invite_server.dart @@ -9,7 +9,8 @@ import '../ua.dart'; import 'transaction_base.dart'; class InviteServerTransaction extends TransactionBase { - InviteServerTransaction(UA ua, Transport transport, IncomingRequest request) { + InviteServerTransaction( + UA ua, Transport? transport, IncomingRequest request) { id = request.via_branch; this.ua = ua; this.transport = transport; @@ -25,9 +26,9 @@ class InviteServerTransaction extends TransactionBase { request.reply(100); } - Timer _resendProvisionalTimer; - bool transportError; - Timer L, H, I; + Timer? _resendProvisionalTimer; + bool? transportError; + Timer? L, H, I; void stateChanged(TransactionState state) { this.state = state; @@ -42,7 +43,7 @@ class InviteServerTransaction extends TransactionBase { } stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } void timer_I() { @@ -55,7 +56,7 @@ class InviteServerTransaction extends TransactionBase { if (state == TransactionState.ACCEPTED) { stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } } @@ -76,12 +77,12 @@ class InviteServerTransaction extends TransactionBase { clearTimeout(I); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } } void resend_provisional() { - if (!transport.send(last_response)) { + if (!transport!.send(last_response)) { onTransportError(); } } @@ -89,11 +90,11 @@ class InviteServerTransaction extends TransactionBase { // INVITE Server Transaction RFC 3261 17.2.1. @override void receiveResponse(int status_code, IncomingMessage response, - [void Function() onSuccess, void Function() onFailure]) { + [void Function()? onSuccess, void Function()? onFailure]) { if (status_code >= 100 && status_code <= 199) { switch (state) { case TransactionState.PROCEEDING: - if (!transport.send(response)) { + if (!transport!.send(response)) { onTransportError(); } last_response = response; @@ -126,7 +127,7 @@ class InviteServerTransaction extends TransactionBase { /* falls through */ if (state == TransactionState.ACCEPTED) { // Note that this point will be reached for proceeding state also. - if (!transport.send(response)) { + if (!transport!.send(response)) { onTransportError(); if (onFailure != null) { onFailure(); @@ -143,7 +144,7 @@ class InviteServerTransaction extends TransactionBase { _resendProvisionalTimer = null; } - if (!transport.send(response)) { + if (!transport!.send(response)) { onTransportError(); if (onFailure != null) { onFailure(); diff --git a/lib/src/transactions/non_invite_client.dart b/lib/src/transactions/non_invite_client.dart index ac66fe43..7a8992c1 100644 --- a/lib/src/transactions/non_invite_client.dart +++ b/lib/src/transactions/non_invite_client.dart @@ -21,15 +21,15 @@ class NonInviteClientTransaction extends TransactionBase { String via = 'SIP/2.0/${transport.via_transport}'; - via += ' ${ua.configuration.via_host};branch=$id'; + via += ' ${ua.configuration!.via_host};branch=$id'; request.setHeader('via', via); ua.newTransaction(this); } - EventManager _eventHandlers; - Timer F, K; + late EventManager _eventHandlers; + Timer? F, K; void stateChanged(TransactionState state) { this.state = state; @@ -43,7 +43,7 @@ class NonInviteClientTransaction extends TransactionBase { timer_F(); }, Timers.TIMER_F); - if (!transport.send(request)) { + if (!transport!.send(request)) { onTransportError(); } } @@ -54,31 +54,32 @@ class NonInviteClientTransaction extends TransactionBase { clearTimeout(F); clearTimeout(K); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); _eventHandlers.emit(EventOnTransportError()); } void timer_F() { logger.debug('Timer F expired for transaction $id'); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); _eventHandlers.emit(EventOnRequestTimeout()); } void timer_K() { stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } @override void receiveResponse(int status_code, IncomingMessage response, - [void Function() onSuccess, void Function() onFailure]) { + [void Function()? onSuccess, void Function()? onFailure]) { if (status_code < 200) { switch (state) { case TransactionState.TRYING: case TransactionState.PROCEEDING: stateChanged(TransactionState.PROCEEDING); - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit( + EventOnReceiveResponse(response: response as IncomingResponse?)); break; default: break; @@ -93,7 +94,8 @@ class NonInviteClientTransaction extends TransactionBase { if (status_code == 408) { _eventHandlers.emit(EventOnRequestTimeout()); } else { - _eventHandlers.emit(EventOnReceiveResponse(response: response)); + _eventHandlers.emit(EventOnReceiveResponse( + response: response as IncomingResponse?)); } K = setTimeout(() { diff --git a/lib/src/transactions/non_invite_server.dart b/lib/src/transactions/non_invite_server.dart index 65e77209..92bc686f 100644 --- a/lib/src/transactions/non_invite_server.dart +++ b/lib/src/transactions/non_invite_server.dart @@ -10,7 +10,7 @@ import 'transaction_base.dart'; class NonInviteServerTransaction extends TransactionBase { NonInviteServerTransaction( - UA ua, Transport transport, IncomingRequest request) { + UA ua, Transport? transport, IncomingRequest request) { id = request.via_branch; this.ua = ua; this.transport = transport; @@ -22,8 +22,8 @@ class NonInviteServerTransaction extends TransactionBase { ua.newTransaction(this); } - bool transportError; - Timer J; + bool? transportError; + Timer? J; void stateChanged(TransactionState state) { this.state = state; @@ -33,7 +33,7 @@ class NonInviteServerTransaction extends TransactionBase { void timer_J() { logger.debug('Timer J expired for transaction $id'); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } @override @@ -45,13 +45,13 @@ class NonInviteServerTransaction extends TransactionBase { clearTimeout(J); stateChanged(TransactionState.TERMINATED); - ua.destroyTransaction(this); + ua!.destroyTransaction(this); } } @override void receiveResponse(int status_code, IncomingMessage response, - [void Function() onSuccess, void Function() onFailure]) { + [void Function()? onSuccess, void Function()? onFailure]) { if (status_code == 100) { /* RFC 4320 4.1 * 'A SIP element MUST NOT @@ -61,13 +61,13 @@ class NonInviteServerTransaction extends TransactionBase { switch (state) { case TransactionState.TRYING: stateChanged(TransactionState.PROCEEDING); - if (!transport.send(response)) { + if (!transport!.send(response)) { onTransportError(); } break; case TransactionState.PROCEEDING: last_response = response; - if (!transport.send(response)) { + if (!transport!.send(response)) { onTransportError(); if (onFailure != null) { onFailure(); @@ -88,7 +88,7 @@ class NonInviteServerTransaction extends TransactionBase { J = setTimeout(() { timer_J(); }, Timers.TIMER_J); - if (!transport.send(response)) { + if (!transport!.send(response)) { onTransportError(); if (onFailure != null) { onFailure(); diff --git a/lib/src/transactions/transaction_base.dart b/lib/src/transactions/transaction_base.dart index de33d68d..21ed10b9 100644 --- a/lib/src/transactions/transaction_base.dart +++ b/lib/src/transactions/transaction_base.dart @@ -15,18 +15,18 @@ enum TransactionState { } abstract class TransactionBase extends EventManager { - String id; - UA ua; - Transport transport; - TransactionState state; - IncomingMessage last_response; + String? id; + UA? ua; + Transport? transport; + TransactionState? state; + IncomingMessage? last_response; dynamic request; void onTransportError(); void send(); void receiveResponse(int status_code, IncomingMessage response, - [void Function() onSuccess, void Function() onFailure]) { + [void Function()? onSuccess, void Function()? onFailure]) { // default NO_OP implementation } } diff --git a/lib/src/transactions/transactions.dart b/lib/src/transactions/transactions.dart index d13d42c8..ccc47727 100644 --- a/lib/src/transactions/transactions.dart +++ b/lib/src/transactions/transactions.dart @@ -17,30 +17,30 @@ class TransactionBag { } void addTransaction(TransactionBase transaction) { - String key = _buildKey(transaction.runtimeType, transaction.id); + String key = _buildKey(transaction.runtimeType, transaction.id!); transactions[key] = transaction; } void removeTransaction(TransactionBase transaction) { - String key = _buildKey(transaction.runtimeType, transaction.id); + String key = _buildKey(transaction.runtimeType, transaction.id!); transactions.remove(key); } List getAll(Type type) { List results = []; - transactions.values.forEach((TransactionBase transaction) { + for (TransactionBase transaction in transactions.values) { if (transaction.runtimeType == type) { results.add(transaction as T); } - }); + } return results; } - T getTransaction(Type type, String id) { + T? getTransaction(Type type, String id) { String key = _buildKey(type, id); - return transactions[key] as T; + return transactions[key] as T?; } List removeAll() { @@ -72,12 +72,12 @@ class TransactionBag { bool checkTransaction(TransactionBag _transactions, IncomingRequest request) { switch (request.method) { case SipMethod.INVITE: - InviteServerTransaction tr = _transactions.getTransaction( - InviteServerTransaction, request.via_branch); + InviteServerTransaction? tr = _transactions.getTransaction( + InviteServerTransaction, request.via_branch!); if (tr != null) { switch (tr.state) { case TransactionState.PROCEEDING: - tr.transport.send(tr.last_response); + tr.transport!.send(tr.last_response); break; // RFC 6026 7.1 Invite retransmission. @@ -92,8 +92,8 @@ bool checkTransaction(TransactionBag _transactions, IncomingRequest request) { } break; case SipMethod.ACK: - InviteServerTransaction tr = _transactions.getTransaction( - InviteServerTransaction, request.via_branch); + InviteServerTransaction? tr = _transactions.getTransaction( + InviteServerTransaction, request.via_branch!); // RFC 6026 7.1. if (tr != null) { @@ -114,8 +114,8 @@ bool checkTransaction(TransactionBag _transactions, IncomingRequest request) { } break; case SipMethod.CANCEL: - InviteServerTransaction tr = _transactions.getTransaction( - InviteServerTransaction, request.via_branch); + InviteServerTransaction? tr = _transactions.getTransaction( + InviteServerTransaction, request.via_branch!); if (tr != null) { request.reply_sl(200); if (tr.state == TransactionState.PROCEEDING) { @@ -127,18 +127,17 @@ bool checkTransaction(TransactionBag _transactions, IncomingRequest request) { request.reply_sl(481); return true; } - break; default: // Non-INVITE Server Transaction RFC 3261 17.2.2. - NonInviteServerTransaction tr = _transactions.getTransaction( - NonInviteServerTransaction, request.via_branch); + NonInviteServerTransaction? tr = _transactions.getTransaction( + NonInviteServerTransaction, request.via_branch!); if (tr != null) { switch (tr.state) { case TransactionState.TRYING: break; case TransactionState.PROCEEDING: case TransactionState.COMPLETED: - tr.transport.send(tr.last_response); + tr.transport!.send(tr.last_response); break; default: break; diff --git a/lib/src/transport.dart b/lib/src/transport.dart index c3268ea5..7453be9d 100644 --- a/lib/src/transport.dart +++ b/lib/src/transport.dart @@ -62,7 +62,7 @@ class Transport { sockets = [sockets]; } - sockets.forEach((dynamic socket) { + for (dynamic socket in sockets) { if (!Socket.isSocket(socket)) { throw Exceptions.TypeError( 'Invalid argument. invalid \'DartSIP.Socket\' instance'); @@ -78,34 +78,34 @@ class Transport { 'weight': socket.weight ?? 0, 'status': C.SOCKET_STATUS_READY }); - }); + } // Get the socket with higher weight. _getSocket(); } - int status; - WebSocketInterface socket; - List> _socketsMap; - Map _recovery_options; - int _recover_attempts; - Timer _recovery_timer; - bool _close_requested; + int? status; + WebSocketInterface? socket; + late List> _socketsMap; + late Map _recovery_options; + int? _recover_attempts; + Timer? _recovery_timer; + late bool _close_requested; - void Function(WebSocketInterface socket, int attempts) onconnecting; - void Function(WebSocketInterface socket, ErrorCause cause) ondisconnect; - void Function(Transport transport) onconnect; - void Function(Transport transport, String messageData) ondata; + late void Function(WebSocketInterface? socket, int? attempts) onconnecting; + late void Function(WebSocketInterface? socket, ErrorCause cause) ondisconnect; + late void Function(Transport transport) onconnect; + late void Function(Transport transport, String messageData) ondata; /** * Instance Methods */ - String get via_transport => socket.via_transport; + String get via_transport => socket!.via_transport; - String get url => socket.url; + String? get url => socket!.url; - String get sip_uri => socket.sip_uri; + String? get sip_uri => socket!.sip_uri; void connect() { logger.debug('connect()'); @@ -126,10 +126,10 @@ class Transport { if (!_close_requested) { // Bind socket event callbacks. - socket.onconnect = _onConnect; - socket.ondisconnect = _onDisconnect; - socket.ondata = _onData; - socket.connect(); + socket!.onconnect = _onConnect; + socket!.ondisconnect = _onDisconnect; + socket!.ondata = _onData; + socket!.connect(); } return; } @@ -148,13 +148,13 @@ class Transport { } // Unbind socket event callbacks. - socket.onconnect = () => () {}; - socket.ondisconnect = - (WebSocketInterface socket, bool error, int closeCode, String reason) => - () {}; - socket.ondata = (dynamic data) => () {}; + socket!.onconnect = () => () {}; + socket!.ondisconnect = (WebSocketInterface socket, bool error, + int? closeCode, String? reason) => + () {}; + socket!.ondata = (dynamic data) => () {}; - socket.disconnect(); + socket!.disconnect(); ondisconnect( socket, ErrorCause( @@ -176,7 +176,7 @@ class Transport { String message = data.toString(); //logger.debug('sending message:\n\n$message\n'); - return socket.send(message); + return socket!.send(message); } bool isConnected() { @@ -192,15 +192,15 @@ class Transport { */ void _reconnect(bool error) { - _recover_attempts += 1; + _recover_attempts = _recover_attempts! + 1; num k = - Math.floor((Math.randomDouble() * Math.pow(2, _recover_attempts)) + 1); + Math.floor((Math.randomDouble() * Math.pow(2, _recover_attempts!)) + 1); - if (k < _recovery_options['min_interval']) { - k = _recovery_options['min_interval']; - } else if (k > _recovery_options['max_interval']) { - k = _recovery_options['max_interval']; + if (k < _recovery_options['min_interval']!) { + k = _recovery_options['min_interval']!; + } else if (k > _recovery_options['max_interval']!) { + k = _recovery_options['max_interval']!; } logger.debug( @@ -213,7 +213,7 @@ class Transport { // Connect the socket. connect(); } - }, k * 1000); + }, k * 1000 as int); } /** @@ -222,7 +222,7 @@ class Transport { void _getSocket() { List> candidates = >[]; - _socketsMap.forEach((Map socket) { + for (Map socket in _socketsMap) { if (socket['status'] == C.SOCKET_STATUS_ERROR) { return; // continue the array iteration } else if (candidates.isEmpty) { @@ -232,13 +232,13 @@ class Transport { } else if (socket['weight'] == candidates[0]['weight']) { candidates.add(socket); } - }); + } if (candidates.isEmpty) { // All sockets have failed. reset sockets status. - _socketsMap.forEach((Map socket) { + for (Map socket in _socketsMap) { socket['status'] = C.SOCKET_STATUS_READY; - }); + } // Get next available socket. _getSocket(); return; @@ -246,7 +246,7 @@ class Transport { num idx = Math.floor(Math.randomDouble() * candidates.length); - socket = candidates[idx]['socket']; + socket = candidates[idx as int]['socket']; } /** @@ -266,7 +266,7 @@ class Transport { } void _onDisconnect( - WebSocketInterface socket, bool error, int closeCode, String reason) { + WebSocketInterface socket, bool error, int? closeCode, String? reason) { status = C.STATUS_DISCONNECTED; ondisconnect( socket, @@ -278,11 +278,11 @@ class Transport { } // Update socket status. else { - _socketsMap.forEach((Map socket) { + for (Map socket in _socketsMap) { if (socket == socket['socket']) { socket['status'] = C.SOCKET_STATUS_ERROR; } - }); + } } _reconnect(error); diff --git a/lib/src/transports/websocket_dart_impl.dart b/lib/src/transports/websocket_dart_impl.dart index 6d499cac..9b1038f7 100644 --- a/lib/src/transports/websocket_dart_impl.dart +++ b/lib/src/transports/websocket_dart_impl.dart @@ -7,35 +7,36 @@ import 'package:sip_ua/src/sip_ua_helper.dart'; import '../logger.dart'; typedef OnMessageCallback = void Function(dynamic msg); -typedef OnCloseCallback = void Function(int code, String reason); +typedef OnCloseCallback = void Function(int? code, String? reason); typedef OnOpenCallback = void Function(); class WebSocketImpl { WebSocketImpl(this._url); - final String _url; - WebSocket _socket; - OnOpenCallback onOpen; - OnMessageCallback onMessage; - OnCloseCallback onClose; + final String? _url; + WebSocket? _socket; + OnOpenCallback? onOpen; + OnMessageCallback? onMessage; + OnCloseCallback? onClose; void connect( - {Iterable protocols, WebSocketSettings webSocketSettings}) async { + {Iterable? protocols, + required WebSocketSettings webSocketSettings}) async { logger.info('connect $_url, ${webSocketSettings.extraHeaders}, $protocols'); try { if (webSocketSettings.allowBadCertificate) { /// Allow self-signed certificate, for test only. - _socket = await _connectForBadCertificate(_url, webSocketSettings); + _socket = await _connectForBadCertificate(_url!, webSocketSettings); } else { - _socket = await WebSocket.connect(_url, + _socket = await WebSocket.connect(_url!, protocols: protocols, headers: webSocketSettings.extraHeaders); } onOpen?.call(); - _socket.listen((dynamic data) { + _socket!.listen((dynamic data) { onMessage?.call(data); }, onDone: () { - onClose?.call(_socket.closeCode, _socket.closeReason); + onClose?.call(_socket!.closeCode, _socket!.closeReason); }); } catch (e) { onClose?.call(500, e.toString()); @@ -44,17 +45,17 @@ class WebSocketImpl { void send(dynamic data) { if (_socket != null) { - _socket.add(data); + _socket!.add(data); logger.debug('send: \n\n$data'); } } void close() { - _socket.close(); + _socket!.close(); } bool isConnecting() { - return _socket != null && _socket.readyState == WebSocket.connecting; + return _socket != null && _socket!.readyState == WebSocket.connecting; } /// For test only. diff --git a/lib/src/transports/websocket_interface.dart b/lib/src/transports/websocket_interface.dart index 82eb018b..a78aeeb9 100644 --- a/lib/src/transports/websocket_interface.dart +++ b/lib/src/transports/websocket_interface.dart @@ -20,7 +20,7 @@ class WebSocketInterface implements Socket { } else { String transport_scheme = webSocketSettings != null && webSocketSettings.transport_scheme != null - ? webSocketSettings.transport_scheme.toLowerCase() + ? webSocketSettings.transport_scheme!.toLowerCase() : parsed_url.scheme; String port = parsed_url.port != null ? ':${parsed_url.port}' : ''; @@ -31,25 +31,24 @@ class WebSocketInterface implements Socket { _webSocketSettings = webSocketSettings ?? WebSocketSettings(); } - String _url; - String _sip_uri; - String _via_transport; + String? _url; + String? _sip_uri; + late String _via_transport; final String _websocket_protocol = 'sip'; - WebSocketImpl _ws; + WebSocketImpl? _ws; bool _closed = false; bool _connected = false; - int weight; - int status; - WebSocketSettings _webSocketSettings; + int? weight; + int? status; + late WebSocketSettings _webSocketSettings; @override - void Function() onconnect; + void Function()? onconnect; @override - void Function( - WebSocketInterface socket, bool error, int closeCode, String reason) - ondisconnect; + void Function(WebSocketInterface socket, bool error, int? closeCode, + String? reason)? ondisconnect; @override - void Function(dynamic data) ondata; + void Function(dynamic data)? ondata; @override String get via_transport => _via_transport; @@ -59,10 +58,10 @@ class WebSocketInterface implements Socket { } @override - String get sip_uri => _sip_uri; + String? get sip_uri => _sip_uri; @override - String get url => _url; + String? get url => _url; @override void connect() async { @@ -81,24 +80,24 @@ class WebSocketInterface implements Socket { try { _ws = WebSocketImpl(_url); - _ws.onOpen = () { + _ws!.onOpen = () { _closed = false; _connected = true; logger.debug('Web Socket is now connected'); _onOpen(); }; - _ws.onMessage = (dynamic data) { + _ws!.onMessage = (dynamic data) { _onMessage(data); }; - _ws.onClose = (int closeCode, String closeReason) { + _ws!.onClose = (int? closeCode, String? closeReason) { logger.debug('Closed [$closeCode, $closeReason]!'); _connected = false; _onClose(true, closeCode, closeReason); }; - _ws.connect( + _ws!.connect( protocols: [_websocket_protocol], webSocketSettings: _webSocketSettings); } catch (e, s) { @@ -118,7 +117,7 @@ class WebSocketInterface implements Socket { _onClose(true, 0, 'Client send disconnect'); try { if (_ws != null) { - _ws.close(); + _ws!.close(); } } catch (error) { logger @@ -133,7 +132,7 @@ class WebSocketInterface implements Socket { throw 'transport closed'; } try { - _ws.send(message); + _ws!.send(message); return true; } catch (error) { logger.error('send() | error sending message: ' + error.toString()); @@ -146,7 +145,7 @@ class WebSocketInterface implements Socket { } bool isConnecting() { - return _ws != null && _ws.isConnecting(); + return _ws != null && _ws!.isConnecting(); } /** @@ -154,22 +153,22 @@ class WebSocketInterface implements Socket { */ void _onOpen() { logger.debug('WebSocket $_url connected'); - onconnect(); + onconnect!(); } - void _onClose(bool wasClean, int code, String reason) { + void _onClose(bool wasClean, int? code, String? reason) { logger.debug('WebSocket $_url closed'); if (wasClean == false) { logger.debug('WebSocket abrupt disconnection'); } - ondisconnect(this, !wasClean, code, reason); + ondisconnect!(this, !wasClean, code, reason); } void _onMessage(dynamic data) { logger.debug('Received WebSocket message'); if (data != null) { if (data.toString().trim().length > 0) { - ondata(data); + ondata!(data); } else { logger.debug('Received and ignored empty packet'); } diff --git a/lib/src/transports/websocket_web_impl.dart b/lib/src/transports/websocket_web_impl.dart index f58c5b9c..367cdd9c 100644 --- a/lib/src/transports/websocket_web_impl.dart +++ b/lib/src/transports/websocket_web_impl.dart @@ -5,28 +5,29 @@ import 'package:sip_ua/src/sip_ua_helper.dart'; import '../logger.dart'; typedef OnMessageCallback = void Function(dynamic msg); -typedef OnCloseCallback = void Function(int code, String reason); +typedef OnCloseCallback = void Function(int? code, String? reason); typedef OnOpenCallback = void Function(); class WebSocketImpl { WebSocketImpl(this._url); final String _url; - WebSocket _socket; - OnOpenCallback onOpen; - OnMessageCallback onMessage; - OnCloseCallback onClose; + WebSocket? _socket; + OnOpenCallback? onOpen; + OnMessageCallback? onMessage; + OnCloseCallback? onClose; void connect( - {Iterable protocols, WebSocketSettings webSocketSettings}) async { + {Iterable? protocols, + required WebSocketSettings webSocketSettings}) async { logger.info('connect $_url, ${webSocketSettings.extraHeaders}, $protocols'); try { _socket = WebSocket(_url, 'sip'); - _socket.onOpen.listen((Event e) { + _socket!.onOpen.listen((Event e) { onOpen?.call(); }); - _socket.onMessage.listen((MessageEvent e) async { + _socket!.onMessage.listen((MessageEvent e) async { if (e.data is Blob) { dynamic arrayBuffer = await JSUtils.promiseToFuture( JSUtils.callMethod(e.data, 'arrayBuffer', [])); @@ -37,17 +38,17 @@ class WebSocketImpl { } }); - _socket.onClose.listen((CloseEvent e) { + _socket!.onClose.listen((CloseEvent e) { onClose?.call(e.code, e.reason); }); } catch (e) { - onClose?.call(e.code, e.reason); + onClose?.call(0, e.toString()); } } void send(dynamic data) { - if (_socket != null && _socket.readyState == WebSocket.OPEN) { - _socket.send(data); + if (_socket != null && _socket!.readyState == WebSocket.OPEN) { + _socket!.send(data); logger.debug('send: \n\n$data'); } else { logger.error('WebSocket not connected, message $data not sent'); @@ -55,10 +56,10 @@ class WebSocketImpl { } bool isConnecting() { - return _socket != null && _socket.readyState == WebSocket.CONNECTING; + return _socket != null && _socket!.readyState == WebSocket.CONNECTING; } void close() { - _socket.close(); + _socket!.close(); } } diff --git a/lib/src/ua.dart b/lib/src/ua.dart index 1ad37bab..bf338acb 100644 --- a/lib/src/ua.dart +++ b/lib/src/ua.dart @@ -40,12 +40,10 @@ class C { static const int NETWORK_ERROR = 2; } -class window { - static bool hasRTCPeerConnection = true; -} +final bool hasRTCPeerConnection = true; class DynamicSettings { - bool register = false; + bool? register = false; } class Contact { @@ -55,7 +53,7 @@ class Contact { String? temp_gruu; bool anonymous = false; bool outbound = false; - URI uri; + URI? uri; @override String toString() { @@ -84,7 +82,7 @@ class Contact { * @throws {TypeError} If no configuration is given. */ class UA extends EventManager { - UA(Settings configuration) { + UA(Settings? configuration) { logger.debug('new() [configuration:${configuration.toString()}]'); _cache = {'credentials': {}}; @@ -96,7 +94,7 @@ class UA extends EventManager { // User actions outside any session/dialog (MESSAGE). _applicants = {}; - _sessions = {}; + _sessions = {}; _transport = null; _contact = null; _status = C.STATUS_INIT; @@ -126,28 +124,28 @@ class UA extends EventManager { _registrator = Registrator(this); } - Map _cache; - Settings _configuration; - DynamicSettings _dynConfiguration; - Map _dialogs; - Set _applicants; - Map _sessions = {}; - Transport _transport; - Contact _contact; - int _status; - int _error; + Map? _cache; + Settings? _configuration; + DynamicSettings? _dynConfiguration; + late Map _dialogs; + late Set _applicants; + Map _sessions = {}; + Transport? _transport; + Contact? _contact; + int? _status; + int? _error; TransactionBag _transactions = TransactionBag(); - Map _data; + Map? _data; Timer? _closeTimer; dynamic _registrator; - int get status => _status; + int? get status => _status; - Contact get contact => _contact; + Contact? get contact => _contact; - Settings get configuration => _configuration; + Settings? get configuration => _configuration; - Transport get transport => _transport; + Transport? get transport => _transport; TransactionBag get transactions => _transactions; @@ -163,7 +161,7 @@ class UA extends EventManager { logger.debug('start()'); if (_status == C.STATUS_INIT) { - _transport.connect(); + _transport!.connect(); } else if (_status == C.STATUS_USER_CLOSED) { logger.debug('restarting UA'); @@ -171,12 +169,12 @@ class UA extends EventManager { if (_closeTimer != null) { clearTimeout(_closeTimer); _closeTimer = null; - _transport.disconnect(); + _transport!.disconnect(); } // Reconnect. _status = C.STATUS_INIT; - _transport.connect(); + _transport!.connect(); } else if (_status == C.STATUS_READY) { logger.debug('UA is in READY status, not restarted'); } else { @@ -185,7 +183,7 @@ class UA extends EventManager { } // Set dynamic configuration. - _dynConfiguration.register = _configuration.register; + _dynConfiguration!.register = _configuration!.register; } /** @@ -193,7 +191,7 @@ class UA extends EventManager { */ void register() { logger.debug('register()'); - _dynConfiguration.register = true; + _dynConfiguration!.register = true; _registrator.register(); } @@ -203,21 +201,21 @@ class UA extends EventManager { void unregister({bool all = false}) { logger.debug('unregister()'); - _dynConfiguration.register = false; + _dynConfiguration!.register = false; _registrator.unregister(all); } /** * Get the Registrator instance. */ - Registrator registrator() { + Registrator? registrator() { return _registrator; } /** * Registration state. */ - bool isRegistered() { + bool? isRegistered() { return _registrator.registered; } @@ -225,7 +223,7 @@ class UA extends EventManager { * Connection state. */ bool isConnected() { - return _transport.isConnected(); + return _transport!.isConnected(); } /** @@ -255,7 +253,7 @@ class UA extends EventManager { * */ Message sendMessage( - String target, String body, Map options) { + String target, String body, Map? options) { logger.debug('sendMessage()'); Message message = Message(this); message.send(target, body, options); @@ -267,9 +265,9 @@ class UA extends EventManager { */ void terminateSessions(Map options) { logger.debug('terminateSessions()'); - _sessions.forEach((String key, _) { - if (!_sessions[key].isEnded()) { - _sessions[key].terminate(options); + _sessions.forEach((String? key, _) { + if (!_sessions[key]!.isEnded()) { + _sessions[key]!.terminate(options); } }); } @@ -297,11 +295,11 @@ class UA extends EventManager { int num_sessions = _sessions.length; // Run _terminate_ on every Session. - _sessions.forEach((String key, _) { + _sessions.forEach((String? key, _) { if (_sessions.containsKey(key)) { logger.debug('closing session $key'); try { - RTCSession rtcSession = _sessions[key]; + RTCSession rtcSession = _sessions[key]!; if (!rtcSession.isEnded()) { rtcSession.terminate(); } @@ -322,12 +320,12 @@ class UA extends EventManager { int num_transactions = _transactions.countTransactions(); if (num_transactions == 0 && num_sessions == 0) { - _transport.disconnect(); + _transport!.disconnect(); } else { _closeTimer = setTimeout(() { logger.info('Closing connection'); _closeTimer = null; - _transport.disconnect(); + _transport!.disconnect(); }, 2000); } } @@ -337,20 +335,20 @@ class UA extends EventManager { * -param {String} target * -returns {DartSIP.URI|null} */ - URI normalizeTarget(String target) { - return Utils.normalizeTarget(target, _configuration.hostport_params); + URI? normalizeTarget(String? target) { + return Utils.normalizeTarget(target, _configuration!.hostport_params); } /** * Allow retrieving configuration and autogenerated fields in runtime. */ - String get(String parameter) { + String? get(String parameter) { switch (parameter) { case 'realm': - return _configuration.realm; + return _configuration!.realm; case 'ha1': - return _configuration.ha1; + return _configuration!.ha1; default: logger.error('get() | cannot get "$parameter" parameter in runtime'); @@ -367,27 +365,27 @@ class UA extends EventManager { switch (parameter) { case 'password': { - _configuration.password = value.toString(); + _configuration!.password = value.toString(); break; } case 'realm': { - _configuration.realm = value.toString(); + _configuration!.realm = value.toString(); break; } case 'ha1': { - _configuration.ha1 = value.toString(); + _configuration!.ha1 = value.toString(); // Delete the plain SIP password. - _configuration.password = null; + _configuration!.password = null; break; } case 'display_name': { - _configuration.display_name = value; + _configuration!.display_name = value; break; } @@ -454,9 +452,7 @@ class UA extends EventManager { * RTCSession */ void newRTCSession( - {required RTCSession session, - required String originator, - dynamic request}) { + {required RTCSession session, String? originator, dynamic request}) { _sessions[session.id] = session; emit(EventNewRTCSession( session: session, originator: originator, request: request)); @@ -472,7 +468,7 @@ class UA extends EventManager { /** * Registered */ - void registered({dynamic response}) { + void registered({required dynamic response}) { emit(EventRegistered( cause: ErrorCause( cause: 'registered', @@ -483,7 +479,7 @@ class UA extends EventManager { /** * Unregistered */ - void unregistered({dynamic response, String cause}) { + void unregistered({dynamic response, String? cause}) { emit(EventUnregister( cause: ErrorCause( cause: cause ?? 'unregistered', @@ -494,7 +490,7 @@ class UA extends EventManager { /** * Registration Failed */ - void registrationFailed({dynamic response, String cause}) { + void registrationFailed({required dynamic response, String? cause}) { emit(EventRegistrationFailed( cause: ErrorCause( cause: Utils.sipErrorCause(response.status_code), @@ -510,11 +506,11 @@ class UA extends EventManager { * Request reception */ void receiveRequest(IncomingRequest request) { - DartSIP_C.SipMethod method = request.method; + DartSIP_C.SipMethod? method = request.method; // Check that request URI points to us. - if (request.ruri.user != _configuration.uri.user && - request.ruri.user != _contact.uri.user) { + if (request.ruri!.user != _configuration!.uri.user && + request.ruri!.user != _contact!.uri!.user) { logger.debug('Request-URI does not point to us'); if (request.method != SipMethod.ACK) { request.reply_sl(404); @@ -524,7 +520,7 @@ class UA extends EventManager { } // Check request URI scheme. - if (request.ruri.scheme == DartSIP_C.SIPS) { + if (request.ruri!.scheme == DartSIP_C.SIPS) { request.reply_sl(416); return; @@ -570,22 +566,22 @@ class UA extends EventManager { } } - Dialog dialog; - RTCSession session; + Dialog? dialog; + RTCSession? session; // Initial Request. if (request.to_tag == null) { switch (method) { case SipMethod.INVITE: - if (window.hasRTCPeerConnection) { + if (hasRTCPeerConnection) { if (request.hasHeader('replaces')) { ParsedData replaces = request.replaces; dialog = _findDialog( - replaces.call_id, replaces.from_tag, replaces.to_tag); + replaces.call_id, replaces.from_tag!, replaces.to_tag!); if (dialog != null) { session = dialog.owner; - if (!session.isEnded()) { + if (!session!.isEnded()) { session.receiveRequest(request); } else { request.reply(603); @@ -608,7 +604,7 @@ class UA extends EventManager { break; case SipMethod.CANCEL: session = - _findSession(request.call_id, request.from_tag, request.to_tag); + _findSession(request.call_id!, request.from_tag, request.to_tag); if (session != null) { session.receiveRequest(request); } else { @@ -633,13 +629,14 @@ class UA extends EventManager { } // In-dialog request. else { - dialog = _findDialog(request.call_id, request.from_tag, request.to_tag); + dialog = + _findDialog(request.call_id!, request.from_tag!, request.to_tag!); if (dialog != null) { dialog.receiveRequest(request); } else if (method == SipMethod.NOTIFY) { session = - _findSession(request.call_id, request.from_tag, request.to_tag); + _findSession(request.call_id!, request.from_tag, request.to_tag); if (session != null) { session.receiveRequest(request); } else { @@ -667,11 +664,11 @@ class UA extends EventManager { /** * Get the session to which the request belongs to, if any. */ - RTCSession _findSession(String call_id, String from_tag, String to_tag) { + RTCSession? _findSession(String call_id, String? from_tag, String? to_tag) { String sessionIDa = call_id + (from_tag ?? ''); - RTCSession sessionA = _sessions[sessionIDa]; + RTCSession? sessionA = _sessions[sessionIDa]; String sessionIDb = call_id + (to_tag ?? ''); - RTCSession sessionB = _sessions[sessionIDb]; + RTCSession? sessionB = _sessions[sessionIDb]; if (sessionA != null) { return sessionA; @@ -685,9 +682,9 @@ class UA extends EventManager { /** * Get the dialog to which the request belongs to, if any. */ - Dialog _findDialog(String call_id, String from_tag, String to_tag) { + Dialog? _findDialog(String call_id, String from_tag, String to_tag) { String id = call_id + from_tag + to_tag; - Dialog dialog = _dialogs[id]; + Dialog? dialog = _dialogs[id]; if (dialog != null) { return dialog; @@ -713,84 +710,84 @@ class UA extends EventManager { // Post Configuration Process. // Allow passing 0 number as display_name. - if (_configuration.display_name is num && - _configuration.display_name as num == 0) { - _configuration.display_name = '0'; + if (_configuration!.display_name is num && + (_configuration!.display_name as num?) == 0) { + _configuration!.display_name = '0'; } // Instance-id for GRUU. - _configuration.instance_id ??= Utils.newUUID(); + _configuration!.instance_id ??= Utils.newUUID(); // Jssip_id instance parameter. Static random tag of length 5. - _configuration.jssip_id = Utils.createRandomToken(5); + _configuration!.jssip_id = Utils.createRandomToken(5); // String containing _configuration.uri without scheme and user. - URI hostport_params = _configuration.uri.clone(); + URI hostport_params = _configuration!.uri.clone(); hostport_params.user = null; - _configuration.hostport_params = hostport_params + _configuration!.hostport_params = hostport_params .toString() .replaceAll(RegExp(r'sip:', caseSensitive: false), ''); // Transport. try { - _transport = Transport(_configuration.sockets, { + _transport = Transport(_configuration!.sockets, { // Recovery options. - 'max_interval': _configuration.connection_recovery_max_interval, - 'min_interval': _configuration.connection_recovery_min_interval + 'max_interval': _configuration!.connection_recovery_max_interval, + 'min_interval': _configuration!.connection_recovery_min_interval }); // Transport event callbacks. - _transport.onconnecting = onTransportConnecting; - _transport.onconnect = onTransportConnect; - _transport.ondisconnect = onTransportDisconnect; - _transport.ondata = onTransportData; + _transport!.onconnecting = onTransportConnecting; + _transport!.onconnect = onTransportConnect; + _transport!.ondisconnect = onTransportDisconnect; + _transport!.ondata = onTransportData; } catch (e) { logger.error('Failed to _loadConfig: ${e.toString()}'); - throw Exceptions.ConfigurationError('sockets', _configuration.sockets); + throw Exceptions.ConfigurationError('sockets', _configuration!.sockets); } String transport = 'ws'; - if (_configuration.sockets.isNotEmpty) { - transport = _configuration.sockets.first.via_transport.toLowerCase(); + if (_configuration!.sockets!.isNotEmpty) { + transport = _configuration!.sockets!.first.via_transport.toLowerCase(); } // Remove sockets instance from configuration object. // TODO(cloudwebrtc): need dispose?? - _configuration.sockets = null; + _configuration!.sockets = null; // Check whether authorization_user is explicitly defined. // Take '_configuration.uri.user' value if not. - _configuration.authorization_user ??= _configuration.uri.user; + _configuration!.authorization_user ??= _configuration!.uri.user; // If no 'registrar_server' is set use the 'uri' value without user portion and // without URI params/headers. - if (_configuration.registrar_server == null) { - URI registrar_server = _configuration.uri.clone(); + if (_configuration!.registrar_server == null) { + URI registrar_server = _configuration!.uri.clone(); registrar_server.user = null; registrar_server.clearParams(); registrar_server.clearHeaders(); - _configuration.registrar_server = registrar_server; + _configuration!.registrar_server = registrar_server; } // User no_answer_timeout. - _configuration.no_answer_timeout *= 1000; + _configuration!.no_answer_timeout *= 1000; // Via Host. - if (_configuration.contact_uri != null) { - _configuration.via_host = _configuration.contact_uri.host; + if (_configuration!.contact_uri != null) { + _configuration!.via_host = _configuration!.contact_uri.host; } // Contact URI. else { - _configuration.contact_uri = URI( + _configuration!.contact_uri = URI( 'sip', Utils.createRandomToken(8), - _configuration.via_host, + _configuration!.via_host, null, {'transport': transport}); } - _contact = Contact(_configuration.contact_uri); + _contact = Contact(_configuration!.contact_uri); return; } @@ -799,7 +796,7 @@ class UA extends EventManager { */ // Transport connecting event. - void onTransportConnecting(WebSocketInterface socket, int attempts) { + void onTransportConnecting(WebSocketInterface? socket, int? attempts) { logger.debug('Transport connecting'); emit(EventSocketConnecting(socket: socket)); } @@ -815,13 +812,13 @@ class UA extends EventManager { emit(EventSocketConnected(socket: transport.socket)); - if (_dynConfiguration.register) { + if (_dynConfiguration!.register!) { _registrator.register(); } } // Transport disconnected event. - void onTransportDisconnect(WebSocketInterface socket, ErrorCause cause) { + void onTransportDisconnect(WebSocketInterface? socket, ErrorCause cause) { // Run _onTransportError_ callback on every client transaction using _transport_. _transactions.removeAll().forEach((TransactionBase transaction) { transaction.onTransportError(); @@ -840,7 +837,7 @@ class UA extends EventManager { // Transport data event. void onTransportData(Transport transport, String messageData) { - IncomingMessage message = Parser.parseMessage(messageData, this); + IncomingMessage? message = Parser.parseMessage(messageData, this); if (message == null) { return; @@ -866,8 +863,8 @@ class UA extends EventManager { switch (message.method) { case SipMethod.INVITE: - InviteClientTransaction transaction = _transactions.getTransaction( - InviteClientTransaction, message.via_branch); + InviteClientTransaction? transaction = _transactions.getTransaction( + InviteClientTransaction, message.via_branch!); if (transaction != null) { transaction.receiveResponse(message.status_code, message); } @@ -876,8 +873,8 @@ class UA extends EventManager { // Just in case ;-). break; default: - NonInviteClientTransaction transaction = _transactions.getTransaction( - NonInviteClientTransaction, message.via_branch); + NonInviteClientTransaction? transaction = _transactions + .getTransaction(NonInviteClientTransaction, message.via_branch!); if (transaction != null) { transaction.receiveResponse(message.status_code, message); } diff --git a/lib/src/uri.dart b/lib/src/uri.dart index 69484e5f..33a7097f 100644 --- a/lib/src/uri.dart +++ b/lib/src/uri.dart @@ -13,7 +13,7 @@ import 'utils.dart'; * */ class URI { - URI(String? scheme, String user, String? host, + URI(String? scheme, this.user, String? host, [int? port, Map? parameters, Map? headers]) { @@ -21,9 +21,6 @@ class URI { if (host == null) { throw AssertionError('missing or invalid "host" parameter'); } - - // Initialize parameters. - this.user = user; _scheme = scheme ?? DartSIP_C.SIP; _host = host.toLowerCase(); _port = port; @@ -163,7 +160,7 @@ class URI { String uri = '$_scheme:'; if (user != null) { - uri += '${utils.escapeUser(user)}@'; + uri += '${utils.escapeUser(user!)}@'; } uri += host; if (port != null || port == 0) { @@ -195,7 +192,7 @@ class URI { String aor = '$_scheme:'; if (user != null) { - aor += '${utils.escapeUser(user)}@'; + aor += '${utils.escapeUser(user!)}@'; } aor += _host; if (show_port && (_port != null || _port == 0)) { diff --git a/lib/src/utils.dart b/lib/src/utils.dart index a0610a3f..06c5c84d 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -156,7 +156,7 @@ URI? normalizeTarget(dynamic target, [String? domain]) { // - Last fragment is the desired domain. // - Otherwise append the given domain argument. } else if (target is String) { - List targetArray = (target as String).split('@'); + List targetArray = target.split('@'); String targetUser; String targetDomain; @@ -237,6 +237,6 @@ String calculateMD5(String string) { return md5.convert(utf8.encode(string)).toString(); } -List cloneArray(List array) { - return (array != null && array is List) ? array.sublist(0) : []; +List cloneArray(List? array) { + return (array != null) ? array.sublist(0) : []; } diff --git a/pubspec.yaml b/pubspec.yaml index 9b5e572e..fbf8b091 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,11 +4,11 @@ description: A SIP UA stack for Flutter/Dart, based on flutter-webrtc, support i homepage: https://github.com/cloudwebrtc/dart-sip-ua environment: sdk: ">=2.12.0 <3.0.0" - flutter: ">=1.10.0" + flutter: ">=2.0.0" dependencies: crypto: ^3.0.0 - flutter_webrtc: ^0.6.8 + flutter_webrtc: 0.6.8 intl: ^0.17.0 logger: ^1.0.0 parser_error: ^0.2.0 @@ -20,5 +20,5 @@ dependencies: dev_dependencies: + lints: ^1.0.1 test: ^1.6.7 - import_sorter: ^4.6.0 diff --git a/test/test2_websocket.dart b/test/test2_websocket.dart index 25e30e76..8b4b25f0 100644 --- a/test/test2_websocket.dart +++ b/test/test2_websocket.dart @@ -10,8 +10,8 @@ void main() async { class TestWebsocket2 { bool connected = false; - WebSocket ws; - Completer completer; + late WebSocket ws; + late Completer completer; int ctr = 1; Completer finished = Completer(); @@ -23,7 +23,7 @@ class TestWebsocket2 { completer.future.then((dynamic t) { ctr += 7; if (ctr > 5000 || finished.isCompleted) { - finished.complete(); + finished.complete(''); } else { send(); } @@ -45,8 +45,8 @@ class TestWebsocket2 { void _onMessage(String data) { print('Received data of size ${data.length} expected $ctr'); if (data.length != ctr) { - finished.complete(); + finished.complete(''); } - completer.complete(); + completer.complete(''); } } diff --git a/test/test_all.dart b/test/test_all.dart index b698934f..4cfcb08d 100644 --- a/test/test_all.dart +++ b/test/test_all.dart @@ -5,9 +5,19 @@ import 'test_parser.dart' as Parser; import 'test_websocket.dart' as Websocket; void main() { - Classes.testFunctions.forEach((Function func) => func()); - Parser.testFunctions.forEach((Function func) => func()); - NormalizeTarget.testFunctions.forEach((Function func) => func()); - DigestAuthentication.testFunctions.forEach((Function func) => func()); - Websocket.testFunctions.forEach((Function func) => func()); + for (Function func in Classes.testFunctions) { + func(); + } + for (Function func in Parser.testFunctions) { + func(); + } + for (Function func in NormalizeTarget.testFunctions) { + func(); + } + for (Function func in DigestAuthentication.testFunctions) { + func(); + } + for (Function func in Websocket.testFunctions) { + func(); + } } diff --git a/test/test_classes.dart b/test/test_classes.dart index 8deb386c..9efe9e28 100644 --- a/test/test_classes.dart +++ b/test/test_classes.dart @@ -1,7 +1,6 @@ -import 'package:test/test.dart'; - import 'package:sip_ua/src/name_addr_header.dart'; import 'package:sip_ua/src/uri.dart'; +import 'package:test/test.dart'; List testFunctions = [ () => test('Class: URI', () { @@ -34,8 +33,6 @@ List testFunctions = [ expect(uri.toAor(), 'sip:jssip.net'); uri.user = 'alice'; - expect(() => uri.host = null, throwsNoSuchMethodError); - // causes compile error with strict // expect(() => uri.host = {'bar': 'foo'}, throwsNoSuchMethodError); @@ -148,5 +145,7 @@ List testFunctions = [ ]; void main() { - testFunctions.forEach((Function func) => func()); + for (Function func in testFunctions) { + func(); + } } diff --git a/test/test_digest_authentication.dart b/test/test_digest_authentication.dart index f8019dd0..a77b269a 100644 --- a/test/test_digest_authentication.dart +++ b/test/test_digest_authentication.dart @@ -1,7 +1,6 @@ -import 'package:test/test.dart'; - import 'package:sip_ua/src/constants.dart'; import 'package:sip_ua/src/digest_authentication.dart'; +import 'package:test/test.dart'; // Results of this tests originally obtained from RFC 2617 and: // 'https://pernau.at/kd/sipdigest.php' @@ -141,5 +140,7 @@ List testFunctions = [ ]; void main() { - testFunctions.forEach((Function func) => func()); + for (Function func in testFunctions) { + func(); + } } diff --git a/test/test_normalize_target.dart b/test/test_normalize_target.dart index 4caf6863..79ce6147 100644 --- a/test/test_normalize_target.dart +++ b/test/test_normalize_target.dart @@ -1,14 +1,13 @@ -import 'package:test/test.dart'; - import 'package:sip_ua/src/uri.dart'; import 'package:sip_ua/src/utils.dart' as Utils; +import 'package:test/test.dart'; List testFunctions = [ () => test('NormalizeTarget: valid targets', () { String domain = 'jssip.net'; void test_ok(dynamic given_data, dynamic expected) { - URI uri = Utils.normalizeTarget(given_data, domain); + URI? uri = Utils.normalizeTarget(given_data, domain); expect(uri.toString(), expected); } @@ -55,5 +54,7 @@ List testFunctions = [ ]; void main() { - testFunctions.forEach((Function func) => func()); + for (Function func in testFunctions) { + func(); + } } diff --git a/test/test_parser.dart b/test/test_parser.dart index 5edc096d..f4ffd1cb 100644 --- a/test/test_parser.dart +++ b/test/test_parser.dart @@ -1,9 +1,8 @@ -import 'package:test/test.dart'; - import 'package:sip_ua/src/data.dart'; import 'package:sip_ua/src/grammar.dart'; import 'package:sip_ua/src/name_addr_header.dart'; import 'package:sip_ua/src/uri.dart'; +import 'package:test/test.dart'; List testFunctions = [ () => test('Parser: Host => [ domain, ipv4, ipv6 ].', () { @@ -365,5 +364,7 @@ List testFunctions = [ ]; void main() { - testFunctions.forEach((Function func) => func()); + for (Function func in testFunctions) { + func(); + } } diff --git a/test/test_sip_message_parser.dart b/test/test_sip_message_parser.dart index 4b4018cd..8a9369a1 100644 --- a/test/test_sip_message_parser.dart +++ b/test/test_sip_message_parser.dart @@ -1,6 +1,6 @@ +import 'package:sip_ua/src/parser.dart'; import 'package:test/test.dart'; -import 'package:sip_ua/src/parser.dart'; import 'data/sip_message.dart'; List testFunctions = [ diff --git a/test/test_sip_ua.dart b/test/test_sip_ua.dart index e2358c55..7435d017 100644 --- a/test/test_sip_ua.dart +++ b/test/test_sip_ua.dart @@ -1,13 +1,12 @@ import 'dart:async'; -import 'package:test/test.dart'; - import 'package:sip_ua/src/config.dart' as config; import 'package:sip_ua/src/event_manager/event_manager.dart'; import 'package:sip_ua/src/transports/websocket_interface.dart'; import 'package:sip_ua/src/ua.dart'; +import 'package:test/test.dart'; -UA ua; +late UA ua; void main() { test(' WebSocket: EchoTest', () async { Completer completer = Completer(); diff --git a/test/test_uri_parse.dart b/test/test_uri_parse.dart index 76ff8d05..6b990818 100644 --- a/test/test_uri_parse.dart +++ b/test/test_uri_parse.dart @@ -15,5 +15,7 @@ List testFunctions = [ ]; void main() { - testFunctions.forEach((Function func) => func()); + for (Function func in testFunctions) { + func(); + } } diff --git a/test/test_websocket.dart b/test/test_websocket.dart index 72829882..a65ae09c 100644 --- a/test/test_websocket.dart +++ b/test/test_websocket.dart @@ -1,11 +1,10 @@ import 'dart:async'; import 'dart:io'; -import 'package:test/test.dart'; - import 'package:sip_ua/src/event_manager/events.dart'; import 'package:sip_ua/src/transport.dart'; import 'package:sip_ua/src/transports/websocket_interface.dart'; +import 'package:test/test.dart'; List testFunctions = [ () => test(' WebSocket: EchoTest', () async { @@ -49,7 +48,7 @@ List testFunctions = [ completer.complete(); }; client.ondisconnect = (WebSocketInterface socket, bool error, - int closeCode, String reason) { + int? closeCode, String? reason) { print( 'ondisconnect => error $error [$closeCode] ${reason.toString()}'); expect(client.isConnected(), false); @@ -81,7 +80,7 @@ List testFunctions = [ WebSocketInterface('ws://127.0.0.1:4041/sip'); Transport trasnport = Transport(socket); - trasnport.onconnecting = (WebSocketInterface socket, int attempt) { + trasnport.onconnecting = (WebSocketInterface? socket, int? attempt) { expect(trasnport.isConnecting(), true); }; @@ -95,7 +94,8 @@ List testFunctions = [ trasnport.disconnect(); }; - trasnport.ondisconnect = (WebSocketInterface socket, ErrorCause cause) { + trasnport.ondisconnect = + (WebSocketInterface? socket, ErrorCause cause) { expect(trasnport.isConnected(), false); completer.complete(); }; @@ -107,5 +107,7 @@ List testFunctions = [ ]; void main() { - testFunctions.forEach((Function func) => func()); + for (Function func in testFunctions) { + func(); + } }