diff --git a/README.md b/README.md index 2c7091ae..3f0e924c 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ The first version was sponsored by Suretec Systems Ltd. T/A [SureVoIP](http://ww ## Contributing The project is inseparable from the contributors of the community. - [CloudWebRTC](https://github.com/cloudwebrtc) - Original Author +- [Robert Sutton](https://github.com/rlsutton1) - Contributor ## License dart-sip-ua is released under the [MIT license](https://github.com/cloudwebrtc/dart-sip-ua/blob/master/LICENSE). diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index d2656c3a..9aaad78c 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -1,27 +1,6 @@ include: package:pedantic/analysis_options.yaml analyzer: - errors: - unused_local_variable: ignore - unnecessary_new: ignore - 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 - curly_braces_in_flow_control_structures: ignore - unnecessary_null_in_if_null_operators: ignore - prefer_contains: ignore - missing_return: ignore - override_on_non_overriding_getter: ignore - override_on_non_overriding_field: ignore - override_on_non_overriding_method: ignore - avoid_types_as_parameter_names: ignore - empty_catches: ignore - unawaited_futures: ignore - use_rethrow_when_possible: ignore - unused_import: ignore - must_be_immutable: ignore - + strong-mode: + implicit-casts: false + implicit-dynamic: false \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index e89cc778..40942ea1 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -23,7 +23,7 @@ void main() { } class MyApp extends StatelessWidget { - var _helper = new SIPUAHelper(); + final SIPUAHelper _helper = SIPUAHelper(); @override Widget build(BuildContext context) { return MaterialApp( diff --git a/example/lib/src/callscreen.dart b/example/lib/src/callscreen.dart index 9a5ccd2d..99716bbc 100644 --- a/example/lib/src/callscreen.dart +++ b/example/lib/src/callscreen.dart @@ -3,27 +3,27 @@ import 'package:flutter/material.dart'; import 'package:flutter_webrtc/webrtc.dart'; import 'sip_ua_helper.dart'; import 'package:sip_ua/src/RTCSession.dart'; +import 'package:sip_ua/src/NameAddrHeader.dart'; class CallScreenWidget extends StatefulWidget { - SIPUAHelper _helper; + final SIPUAHelper _helper; CallScreenWidget(this._helper, {Key key}) : super(key: key); @override _MyCallScreenWidget createState() => _MyCallScreenWidget(); } class _MyCallScreenWidget extends State { - RTCVideoRenderer _localRenderer = new RTCVideoRenderer(); - RTCVideoRenderer _remoteRenderer = new RTCVideoRenderer(); + RTCVideoRenderer _localRenderer = RTCVideoRenderer(); + RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); double _localVideoHeight; double _localVideoWidth; EdgeInsetsGeometry _localVideoMargin; - var _localStream; - var _remoteStream; - var _direction; - var _local_identity; - var _remote_identity; - bool _showNumPad = false; - var _label; + MediaStream _localStream; + MediaStream _remoteStream; + String _direction; + NameAddrHeader _local_identity; + NameAddrHeader _remote_identity; + var _timeLabel = '00:00'; Timer _timer; @@ -37,9 +37,9 @@ class _MyCallScreenWidget extends State { SIPUAHelper get helper => widget._helper; - get voiceonly => - (_localStream == null || _localStream.getVideoTracks().length == 0) && - (_remoteStream == null || _remoteStream.getVideoTracks().length == 0); + bool get voiceonly => + (_localStream == null || _localStream.getVideoTracks().isEmpty) && + (_remoteStream == null || _remoteStream.getVideoTracks().isEmpty); @override initState() { @@ -59,7 +59,7 @@ class _MyCallScreenWidget extends State { _disposeRenderers(); } - _startTimer() { + void _startTimer() { _timer = Timer.periodic(Duration(seconds: 1), (Timer timer) { Duration duration = Duration(seconds: timer.tick); if (mounted) { @@ -74,7 +74,7 @@ class _MyCallScreenWidget extends State { }); } - _initRenderers() async { + void _initRenderers() async { if (_localRenderer != null) { await _localRenderer.initialize(); } @@ -83,7 +83,7 @@ class _MyCallScreenWidget extends State { } } - _disposeRenderers() { + void _disposeRenderers() { if (_localRenderer != null) { _localRenderer.dispose(); _localRenderer = null; @@ -94,28 +94,28 @@ class _MyCallScreenWidget extends State { } } - _bindEventListeners() { + void _bindEventListeners() { helper.on('callState', _handleCalllState); } - _handleCalllState(state, data) { + void _handleCalllState(String state, Map data) { if (state == 'hold' || state == 'unhold') { _hold = state == 'hold'; - _holdOriginator = data['originator']; + _holdOriginator = data['originator'] as String; this.setState(() {}); return; } if (state == 'muted') { - if (data['audio']) _audioMuted = true; - if (data['video']) _videoMuted = true; + if (data['audio'] as bool) _audioMuted = true; + if (data['video'] as bool) _videoMuted = true; this.setState(() {}); return; } if (state == 'unmuted') { - if (data['audio']) _audioMuted = false; - if (data['video']) _videoMuted = false; + if (data['audio'] as bool) _audioMuted = false; + if (data['video'] as bool) _videoMuted = false; this.setState(() {}); return; } @@ -140,19 +140,19 @@ class _MyCallScreenWidget extends State { this.setState(() {}); } - _removeEventListeners() { + void _removeEventListeners() { helper.remove('callState', _handleCalllState); } - _backToDialPad() { + void _backToDialPad() { _timer.cancel(); - new Timer(Duration(seconds: 2), () { + Timer(Duration(seconds: 2), () { Navigator.of(context).pop(); }); } - _handelStreams(event) async { - var stream = event['stream']; + void _handelStreams(Map event) async { + var stream = event['stream'] as MediaStream; if (event['originator'] == 'local') { if (_localRenderer != null) { _localRenderer.srcObject = stream; @@ -171,7 +171,7 @@ class _MyCallScreenWidget extends State { }); } - _resizeLocalVideo() { + void _resizeLocalVideo() { _localVideoMargin = _remoteStream != null ? EdgeInsets.only(top: 15, right: 15) : EdgeInsets.all(0); @@ -183,48 +183,51 @@ class _MyCallScreenWidget extends State { : MediaQuery.of(context).size.height; } - _handleHangup() { + void _handleHangup() { helper.hangup(); _timer.cancel(); } - _handleAccept() { + void _handleAccept() { helper.answer(); } - _switchCamera() { + void _switchCamera() { if (_localStream != null) { _localStream.getVideoTracks()[0].switchCamera(); } } - _muteAudio() { - if (_audioMuted) + void _muteAudio() { + if (_audioMuted) { helper.unmute(true, false); - else + } else { helper.mute(true, false); + } } - _muteVideo() { - if (_videoMuted) + void _muteVideo() { + if (_videoMuted) { helper.unmute(false, true); - else + } else { helper.mute(false, true); + } } - _handleHold() { - if (_hold) + void _handleHold() { + if (_hold) { helper.unhold(); - else + } else { helper.hold(); + } } - _buildActionButtons() { + Widget _buildActionButtons() { var hangupBtn = FloatingActionButton( heroTag: "hangup", onPressed: () => _handleHangup(), tooltip: 'Hangup', - child: new Icon(Icons.call_end), + child: Icon(Icons.call_end), backgroundColor: Colors.red, ); @@ -232,7 +235,7 @@ class _MyCallScreenWidget extends State { heroTag: "hangup", onPressed: () => _handleHangup(), tooltip: 'Hangup', - child: new Icon(Icons.call_end), + child: Icon(Icons.call_end), backgroundColor: Colors.grey, ); @@ -258,14 +261,14 @@ class _MyCallScreenWidget extends State { { advanceActions.add(FloatingActionButton( heroTag: "mute_mic", - child: new Icon(_audioMuted ? Icons.mic_off : Icons.mic), + child: Icon(_audioMuted ? Icons.mic_off : Icons.mic), onPressed: () => _muteAudio(), )); if (voiceonly) { advanceActions.add(FloatingActionButton( heroTag: "keypad", - child: new Icon(Icons.dialpad), + child: Icon(Icons.dialpad), onPressed: () => _handleHold(), )); } else { @@ -279,21 +282,20 @@ class _MyCallScreenWidget extends State { if (voiceonly) { advanceActions.add(FloatingActionButton( heroTag: "speaker", - child: new Icon(Icons.volume_up), + child: Icon(Icons.volume_up), onPressed: () => _handleHold(), )); } else { advanceActions.add(FloatingActionButton( heroTag: "camera_off", - child: - new Icon(_videoMuted ? Icons.videocam : Icons.videocam_off), + child: Icon(_videoMuted ? Icons.videocam : Icons.videocam_off), onPressed: () => _muteVideo(), )); } basicActions.add(FloatingActionButton( heroTag: "hold", - child: new Icon(_hold ? Icons.play_arrow : Icons.pause), + child: Icon(_hold ? Icons.play_arrow : Icons.pause), onPressed: () => _handleHold(), )); @@ -301,7 +303,7 @@ class _MyCallScreenWidget extends State { basicActions.add(FloatingActionButton( heroTag: "transfer", - child: new Icon(Icons.phone_forwarded), + child: Icon(Icons.phone_forwarded), onPressed: () => _handleHold(), )); } @@ -318,27 +320,27 @@ class _MyCallScreenWidget extends State { var actionWidgets = []; - if (advanceActions.length > 0) { + if (advanceActions.isNotEmpty) { actionWidgets.add(Padding( padding: const EdgeInsets.all(3), - child: new Row( + child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: advanceActions))); } actionWidgets.add(Padding( padding: const EdgeInsets.all(3), - child: new Row( + child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: basicActions))); - return new Column( + return Column( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: actionWidgets); } - _buildContent() { + Widget _buildContent() { var stackWidgets = []; if (!voiceonly && _remoteStream != null) { @@ -369,7 +371,7 @@ class _MyCallScreenWidget extends State { left: 0, right: 0, child: Center( - child: new Column( + child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -415,8 +417,8 @@ class _MyCallScreenWidget extends State { floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButton: Padding( padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 36.0), - child: new Container( - height: 128, width: 300, child: _buildActionButtons()), + child: + Container(height: 128, width: 300, child: _buildActionButtons()), )); } } diff --git a/example/lib/src/dialpad.dart b/example/lib/src/dialpad.dart index 3bf0d4c3..a5bdf58b 100644 --- a/example/lib/src/dialpad.dart +++ b/example/lib/src/dialpad.dart @@ -3,14 +3,14 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'sip_ua_helper.dart'; class DialPadWidget extends StatefulWidget { - SIPUAHelper _helper; + final SIPUAHelper _helper; DialPadWidget(this._helper, {Key key}) : super(key: key); @override _MyDialPadWidget createState() => _MyDialPadWidget(); } class _MyDialPadWidget extends State { - var _dest; + String _dest; SIPUAHelper get helper => widget._helper; TextEditingController _textController; SharedPreferences prefs; @@ -22,38 +22,38 @@ class _MyDialPadWidget extends State { _loadSettings(); } - _loadSettings() async { + void _loadSettings() async { prefs = await SharedPreferences.getInstance(); _dest = prefs.getString('dest') ?? 'sip:111_6ackea@tryit.jssip.net'; - _textController = new TextEditingController(text: _dest); + _textController = TextEditingController(text: _dest); _textController.text = _dest; - this.setState((){}); + this.setState(() {}); } - _handleRegisterState(state, data) { + void _handleRegisterState(String state, Map data) { this.setState(() {}); } - _bindEventListeners() { + void _bindEventListeners() { helper.on('registerState', _handleRegisterState); - helper.on('uaState', (state, data) { + helper.on('uaState', (String state, Map data) { if (state == 'newRTCSession') Navigator.pushNamed(context, '/callscreen'); }); } - _handleCall(context, [voiceonly]) { + Widget _handleCall(BuildContext context, [bool voiceonly]) { var dest = _textController.text; - if (dest == null || dest.length == 0) { + if (dest == null || dest.isEmpty) { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { - return new AlertDialog( - title: new Text('Target is empty.'), - content: new Text('Please enter a SIP URI or username!'), + return AlertDialog( + title: Text('Target is empty.'), + content: Text('Please enter a SIP URI or username!'), actions: [ - new FlatButton( - child: new Text('Ok'), + FlatButton( + child: Text('Ok'), onPressed: () { Navigator.of(context).pop(); }, @@ -62,15 +62,16 @@ class _MyDialPadWidget extends State { ); }, ); - return; + return null; } - helper.connect(dest, voiceonly); + helper.call(dest, voiceonly); prefs.setString('dest', dest); + return null; } - _handleBackSpace() { + void _handleBackSpace() { var text = _textController.text; - if (text.length > 0) { + if (text.isNotEmpty) { this.setState(() { text = text.substring(0, text.length - 1); _textController.text = text; @@ -78,13 +79,13 @@ class _MyDialPadWidget extends State { } } - _handleNum(number) { + void _handleNum(String number) { this.setState(() { _textController.text += number; }); } - _buildDialPad() { + List _buildDialPad() { var lables = [ [ {'1': ''}, @@ -127,24 +128,24 @@ class _MyDialPadWidget extends State { controller: _textController, )), ])), - new Container( + Container( width: 300, - child: new Column( + child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: lables - .map((row) => new Padding( + .map((row) => Padding( padding: const EdgeInsets.all(3), - child: new Row( + child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: row - .map((label) => new Container( + .map((label) => Container( height: 72, width: 72, - child: new FlatButton( + child: FlatButton( //heroTag: "num_$label", shape: CircleBorder(), - child: new Column( + child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -168,7 +169,7 @@ class _MyDialPadWidget extends State { .toList())), Container( width: 300, - child: new Row( + child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ @@ -197,7 +198,7 @@ class _MyDialPadWidget extends State { appBar: AppBar( title: Text("Dart SIP UA Demo"), actions: [ - new PopupMenuButton( + PopupMenuButton( onSelected: (String value) { switch (value) { case 'account': @@ -213,18 +214,18 @@ class _MyDialPadWidget extends State { icon: Icon(Icons.menu), itemBuilder: (BuildContext context) => >[ PopupMenuItem( - child: new Row( + child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Padding( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: new Icon( + child: Icon( Icons.account_circle, color: Colors.black38, ), ), SizedBox( - child: new Text('Account'), + child: Text('Account'), width: 64, ) ], @@ -232,15 +233,15 @@ class _MyDialPadWidget extends State { value: 'account', ), PopupMenuItem( - child: new Row( + child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - new Icon( + Icon( Icons.info, color: Colors.black38, ), SizedBox( - child: new Text('About'), + child: Text('About'), width: 64, ) ], @@ -264,8 +265,8 @@ class _MyDialPadWidget extends State { style: TextStyle(fontSize: 14, color: Colors.black54), )), ), - new Container( - child: new Column( + Container( + child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: _buildDialPad(), diff --git a/example/lib/src/register.dart b/example/lib/src/register.dart index 945ebbf9..26d5f47e 100644 --- a/example/lib/src/register.dart +++ b/example/lib/src/register.dart @@ -3,25 +3,25 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'sip_ua_helper.dart'; class RegisterWidget extends StatefulWidget { - SIPUAHelper _helper; + final SIPUAHelper _helper; RegisterWidget(this._helper, {Key key}) : super(key: key); @override _MyRegisterWidget createState() => _MyRegisterWidget(); } class _MyRegisterWidget extends State { - var _password; - var _wsUri; - var _sipUri; - var _displayName; - var _wsExtraHeaders = { + String _password; + String _wsUri; + String _sipUri; + String _displayName; + Map _wsExtraHeaders = { 'Origin': ' https://tryit.jssip.net', 'Host': 'tryit.jssip.net:10443' }; SharedPreferences prefs; - var _registerState; + String _registerState; - get helper => widget._helper; + SIPUAHelper get helper => widget._helper; @override initState() { @@ -40,46 +40,46 @@ class _MyRegisterWidget extends State { _saveSettings(); } - _loadSettings() async { + void _loadSettings() async { prefs = await SharedPreferences.getInstance(); - _wsUri = prefs.getString('ws_uri') ?? 'wss://tryit.jssip.net:10443'; - _sipUri = prefs.getString('sip_uri') ?? 'hello_flutter@tryit.jssip.net'; - _displayName = prefs.getString('display_name') ?? 'Flutter SIP UA'; - _password = prefs.getString('password'); - prefs.commit(); - this.setState(() {}); + this.setState(() { + _wsUri = prefs.getString('ws_uri') ?? 'wss://tryit.jssip.net:10443'; + _sipUri = prefs.getString('sip_uri') ?? 'hello_flutter@tryit.jssip.net'; + _displayName = prefs.getString('display_name') ?? 'Flutter SIP UA'; + _password = prefs.getString('password'); + }); } - _saveSettings() { + void _saveSettings() { prefs.setString('ws_uri', _wsUri); prefs.setString('sip_uri', _sipUri); prefs.setString('display_name', _displayName); prefs.setString('password', _password); } - _handleRegisterState(state, data) { + void _handleRegisterState(String state, Map data) { this.setState(() { _registerState = state; }); } - _handleSocketState(state, data) { + void _handleSocketState(String state, Map data) { this.setState(() { _registerState = state; }); } - _alert(context, alertFieldName) { + void _alert(BuildContext context, String alertFieldName) { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { - return new AlertDialog( - title: new Text('$alertFieldName is empty'), - content: new Text('Please enter $alertFieldName!'), + return AlertDialog( + title: Text('$alertFieldName is empty'), + content: Text('Please enter $alertFieldName!'), actions: [ - new FlatButton( - child: new Text('Ok'), + FlatButton( + child: Text('Ok'), onPressed: () { Navigator.of(context).pop(); }, @@ -90,13 +90,13 @@ class _MyRegisterWidget extends State { ); } - _handleSave(context) { + void _handleSave(BuildContext context) { if (_wsUri == null) { - return _alert(context, "WebSocket URL"); + _alert(context, "WebSocket URL"); } else if (_sipUri == null) { - return _alert(context, "SIP URI"); + _alert(context, "SIP URI"); } - bool addExtraHeaders = (_wsUri == 'wss://tryit.jssip.net:10443'); + bool addExtraHeaders = _wsExtraHeaders.isNotEmpty; helper.start(_wsUri, _sipUri, _password, _displayName, addExtraHeaders ? _wsExtraHeaders : null); } @@ -107,7 +107,7 @@ class _MyRegisterWidget extends State { appBar: AppBar( title: Text("SIP Account"), ), - body: new Align( + body: Align( alignment: Alignment(0, 0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/example/lib/src/sip_ua_helper.dart b/example/lib/src/sip_ua_helper.dart index 4b9cfe70..71bac859 100644 --- a/example/lib/src/sip_ua_helper.dart +++ b/example/lib/src/sip_ua_helper.dart @@ -2,23 +2,20 @@ import 'dart:async'; import 'package:sip_ua/sip_ua.dart'; import 'package:events2/events2.dart'; import 'package:sip_ua/src/RTCSession.dart'; +import 'package:sip_ua/src/Message.dart'; class SIPUAHelper extends EventEmitter { UA _ua; Settings _settings; - final logger = new Logger('SIPUA::Helper'); + final logger = Logger('SIPUA::Helper'); RTCSession _session; bool _registered = false; bool _connected = false; var _registerState = 'new'; - var _localStream; - var _remoteStream; - SIPUAHelper(); + void debug(dynamic msg) => logger.debug(msg); - debug(msg) => logger.debug(msg); - - debugerror(error) => logger.error(error); + void debugerror(dynamic error) => logger.error(error); RTCSession get session => _session; @@ -26,99 +23,117 @@ class SIPUAHelper extends EventEmitter { bool get connected => _connected; - get registerState => _registerState; + String get registerState => _registerState; - get localStream => _localStream; + void stop() async { + await this._ua.stop(); + } - get remoteStream => _remoteStream; + void register() { + this._ua.register(); + } - _handleSocketState(state, data) { - this.emit('socketState', state, data); + void unregister([bool all = true]) { + this._ua.unregister(all: all); } - _handleRegisterState(state, data) { - this.emit('registerState', state, data); + Future call(String uri, [bool voiceonly = false]) async { + if (_ua != null && _ua.isConnected()) { + _session = _ua.call(uri, this._options(voiceonly)); + return _session; + } else { + logger.error("Not connected, you will need to register."); + } + return null; } - _handleUAState(state, data) { - this.emit('uaState', state, data); + void answer() { + if (_session != null) { + _session.answer(this._options()); + } } - _handleCallState(state, data) { - this.emit('callState', state, data); + void hangup() { + if (_session != null) { + _session.terminate(); + } } - start(wsUrl, uri, [password, displayName, wsExtraHeaders]) async { + void start(String wsUrl, String uri, + [String password, + String displayName, + Map wsExtraHeaders]) async { if (this._ua != null) { debugerror( 'UA instance already exist!, stopping UA and creating a new one...'); this._ua.stop(); } - _settings = new Settings(); - var socket = new WebSocketInterface(wsUrl, wsExtraHeaders); + _settings = Settings(); + var socket = WebSocketInterface(wsUrl, wsExtraHeaders); _settings.sockets = [socket]; _settings.uri = uri; _settings.password = password; _settings.display_name = displayName; try { - this._ua = new UA(_settings); - this._ua.on('onnecting', (data) { + this._ua = UA(_settings); + this._ua.on('onnecting', (Map data) { debug('onnecting => ' + data.toString()); _handleSocketState('onnecting', data); }); - this._ua.on('connected', (data) { + this._ua.on('connected', (Map data) { debug('connected => ' + data.toString()); _handleSocketState('connected', data); _connected = true; }); - this._ua.on('disconnected', (data) { + this._ua.on('disconnected', (Map data) { debug('disconnected => ' + data.toString()); _handleSocketState('disconnected', data); _connected = false; }); - this._ua.on('registered', (data) { + this._ua.on('registered', (Map data) { debug('registered => ' + data.toString()); _registered = true; _registerState = 'registered'; _handleRegisterState('registered', data); }); - this._ua.on('unregistered', (data) { + this._ua.on('unregistered', (Map data) { debug('unregistered => ' + data.toString()); _registerState = 'unregistered'; _registered = false; _handleRegisterState('unregistered', data); }); - this._ua.on('registrationFailed', (data) { - debug('registrationFailed => ' + data['cause']); + this._ua.on('registrationFailed', (Map data) { + debug('registrationFailed => ' + (data['cause'] as String)); _registerState = 'registrationFailed[${data['cause']}]'; _registered = false; _handleRegisterState('registrationFailed', data); }); - this._ua.on('newRTCSession', (data) { + this._ua.on('newRTCSession', (Map data) { debug('newRTCSession => ' + data.toString()); - _session = data['session']; + _session = data['session'] as RTCSession; if (_session.direction == 'incoming') { // Set event handlers. - options()['eventHandlers'].forEach((event, func) { + (_options()['eventHandlers'] as Map) + .forEach((String event, Function func) { _session.on(event, func); }); } _handleUAState('newRTCSession', data); }); - this._ua.on('newMessage', (data) { + this._ua.on('newMessage', (Map data) { debug('newMessage => ' + data.toString()); _handleUAState('newMessage', data); }); - this._ua.on('sipEvent', (data) { + this._ua.on('sipEvent', (Map data) { debug('sipEvent => ' + data.toString()); _handleUAState('sipEvent', data); }); @@ -128,90 +143,73 @@ class SIPUAHelper extends EventEmitter { } } - stop() async { - await this._ua.stop(); - } - - register() { - this._ua.register(); - } - - unregister([all = true]) { - this._ua.unregister(all: all); - } - - options([voiceonly]) { - voiceonly = voiceonly ?? false; + Map _options([bool voiceonly = false]) { // Register callbacks to desired call events var eventHandlers = { - 'connecting': (e) { + 'connecting': (Map e) { debug('call connecting'); _handleCallState('connecting', e); }, - 'progress': (e) { + 'progress': (Map e) { debug('call is in progress'); _handleCallState('progress', e); }, - 'failed': (e) { - debug('call failed with cause: ' + e['cause']); + 'failed': (Map e) { + debug('call failed with cause: ' + (e['cause'] as String)); _handleCallState('failed', e); _session = null; var cause = 'failed (${e['cause']})'; - _localStream = null; - _remoteStream = null; }, - 'ended': (e) { - debug('call ended with cause: ' + e['cause']); + 'ended': (Map e) { + debug('call ended with cause: ' + (e['cause'] as String)); _handleCallState('ended', e); _session = null; - _localStream = null; - _remoteStream = null; }, - 'accepted': (e) { + 'accepted': (Map e) { debug('call accepted'); _handleCallState('accepted', e); }, - 'confirmed': (e) { + 'confirmed': (Map e) { debug('call confirmed'); _handleCallState('confirmed', e); }, - 'hold': (e) { + 'hold': (Map e) { debug('call hold'); _handleCallState('hold', e); }, - 'unhold': (e) { + 'unhold': (Map e) { debug('call unhold'); _handleCallState('unhold', e); }, - 'muted': (e) { + 'muted': (Map e) { debug('call muted'); _handleCallState('muted', e); }, - 'unmuted': (e) { + 'unmuted': (Map e) { debug('call unmuted'); _handleCallState('unmuted', e); }, - 'stream': (e) async { + 'stream': (Map e) async { // Wating for callscreen ready. - new Timer(Duration(milliseconds: 100), () { + Timer(Duration(milliseconds: 100), () { _handleCallState('stream', e); }); } }; - var defaultOptions = { + var _defaultOptions = { 'eventHandlers': eventHandlers, 'pcConfig': { 'iceServers': [ {'url': 'stun:stun.l.google.com:19302'}, /* - * turn server configuration example. - { - 'url': 'turn:123.45.67.89:3478', - 'username': 'change_to_real_user', - 'credential': 'change_to_real_secret' - }, - */ + * turn server configuration example. + { + 'url': 'turn:123.45.67.89:3478', + 'username': 'change_to_real_user', + 'credential': 'change_to_real_secret' + }, + */ ] }, 'mediaConstraints': { @@ -225,7 +223,7 @@ class SIPUAHelper extends EventEmitter { "minFrameRate": '30', }, "facingMode": "user", - "optional": [], + "optional": List(), } }, 'rtcOfferConstraints': { @@ -233,77 +231,72 @@ class SIPUAHelper extends EventEmitter { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': !voiceonly, }, - 'optional': [], + 'optional': List(), }, 'rtcAnswerConstraints': { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true, }, - 'optional': [], + 'optional': List(), }, 'rtcConstraints': { - 'mandatory': {}, + 'mandatory': Map(), 'optional': [ {'DtlsSrtpKeyAgreement': true}, ], }, 'sessionTimersExpires': 120 }; - return defaultOptions; + return _defaultOptions; } - connect(uri, [voiceonly]) async { - if (_ua != null && _ua.isConnected()) { - _session = _ua.call(uri, this.options(voiceonly)); - return _session; - } else { - logger.error("Not connected, you will need to register."); - } - return null; - } - - answer() { - if (_session != null) { - _session.answer(this.options()); - } + void _handleSocketState(String state, Map data) { + this.emit('socketState', state, data); } - hangup() { - if (_session != null) { - _session.terminate(); - } + void _handleRegisterState(String state, Map data) { + this.emit('registerState', state, data); } - hold() { + void hold() { if (_session != null) { _session.hold(); } } - unhold() { + void unhold() { if (_session != null) { _session.unhold(); } } - mute([audio = true, video = true]) { + void mute([bool audio = true, bool video = true]) { if (_session != null) { _session.mute(audio, video); } } - unmute([audio = true, video = true]) { + void unmute([bool audio = true, bool video = true]) { if (_session != null) { _session.unmute(audio, video); } } - sendMessage(target, body, [options]) { + void _handleCallState(String state, Map data) { + this.emit('callState', state, data); + } + + void _handleUAState(String state, Map data) { + this.emit('uaState', state, data); + } + + Message sendMessage(String target, String body, + [Map options]) { return this._ua.sendMessage(target, body, options); } - terminateSessions(options) { - return this._ua.terminateSessions(options); + void terminateSessions(Map options) { + this._ua.terminateSessions(options); } } diff --git a/example/test/test2_websocket.dart b/example/test/test2_websocket.dart new file mode 100644 index 00000000..5ace168f --- /dev/null +++ b/example/test/test2_websocket.dart @@ -0,0 +1,52 @@ +import 'dart:async'; +import 'dart:io'; + +void main() async { + TestWebsocket2 tester = TestWebsocket2(); + tester.connect("wss://echo.websocket.org/"); + + await tester.finished.future; +} + +class TestWebsocket2 { + bool connected = false; + WebSocket ws; + Completer completer; + int ctr = 1; + + Completer finished = Completer(); + + void send() { + String message = "A" * ctr; + ws.add(message); + completer = Completer(); + completer.future.then((dynamic t) { + ctr += 7; + if (ctr > 5000 || finished.isCompleted) { + finished.complete(); + } else { + send(); + } + }); + } + + void connect(String url) async { + ws = await WebSocket.connect(url); + connected = true; + ws.listen((dynamic data) { + this._onMessage(data as String); + }, onDone: () { + print('Closed by server [${ws.closeCode}, ${ws.closeReason}]!'); + connected = false; + }); + send(); + } + + void _onMessage(String data) { + print("Received data of size ${data.length} expected ${ctr}"); + if (data.length != ctr) { + finished.complete(); + } + completer.complete(); + } +} diff --git a/lib/src/Config.dart b/lib/src/Config.dart index 0568e9c5..b8d787ae 100644 --- a/lib/src/Config.dart +++ b/lib/src/Config.dart @@ -1,12 +1,11 @@ -import 'package:sip_ua/sip_ua.dart'; - +import '../sip_ua.dart'; import 'Constants.dart'; -import 'Utils.dart' as Utils; import 'Constants.dart' as DartSIP_C; +import 'Exceptions.dart' as Exceptions; import 'Grammar.dart'; -import 'URI.dart'; import 'Socket.dart' as Socket; -import 'Exceptions.dart' as Exceptions; +import 'URI.dart'; +import 'Utils.dart' as Utils; import 'logger.dart'; final logger = Logger('Config'); diff --git a/lib/src/Dialog.dart b/lib/src/Dialog.dart index 6bfe3b03..f81b5d44 100644 --- a/lib/src/Dialog.dart +++ b/lib/src/Dialog.dart @@ -1,5 +1,3 @@ -import 'package:sip_ua/src/transactions/transaction_base.dart'; - import '../sip_ua.dart'; import 'Constants.dart'; import 'Dialog/RequestSender.dart'; @@ -8,6 +6,7 @@ import 'RTCSession.dart'; import 'SIPMessage.dart' as SIPMessage; import 'Utils.dart' as Utils; import 'logger.dart'; +import 'transactions/transaction_base.dart'; class Dialog_C { // Dialog states. diff --git a/lib/src/Dialog/RequestSender.dart b/lib/src/Dialog/RequestSender.dart index 7f95c6ab..d20fc99d 100644 --- a/lib/src/Dialog/RequestSender.dart +++ b/lib/src/Dialog/RequestSender.dart @@ -1,5 +1,3 @@ -import 'package:sip_ua/src/transactions/transaction_base.dart'; - import '../../sip_ua.dart'; import '../Constants.dart'; import '../Dialog.dart'; @@ -7,6 +5,7 @@ import '../RTCSession.dart' as RTCSession; import '../RequestSender.dart'; import '../SIPMessage.dart'; import '../Timers.dart'; +import '../transactions/transaction_base.dart'; // Default event handlers. var EventHandlers = { diff --git a/lib/src/Grammar.dart b/lib/src/Grammar.dart index b412de54..a3962466 100644 --- a/lib/src/Grammar.dart +++ b/lib/src/Grammar.dart @@ -1,6 +1,7 @@ -import 'package:sip_ua/src/grammar_parser.dart'; import "package:parser_error/parser_error.dart"; +import 'grammar_parser.dart'; + class Grammar { static parse(String input,String startRule) { var parser = new GrammarParser(''); diff --git a/lib/src/Message.dart b/lib/src/Message.dart index 98195cbe..259e78d5 100644 --- a/lib/src/Message.dart +++ b/lib/src/Message.dart @@ -1,11 +1,12 @@ import 'package:events2/events2.dart'; + import '../sip_ua.dart'; import 'Constants.dart' as DartSIP_C; import 'Constants.dart'; +import 'Exceptions.dart' as Exceptions; +import 'RequestSender.dart'; import 'SIPMessage.dart' as SIPMessage; import 'Utils.dart' as Utils; -import 'RequestSender.dart'; -import 'Exceptions.dart' as Exceptions; import 'logger.dart'; class Message extends EventEmitter { @@ -45,7 +46,7 @@ class Message extends EventEmitter { get data => this._data; - send(target, body, [options]) { + send(String target, String body, [Map options]) { var originalTarget = target; options = options ?? {}; diff --git a/lib/src/Parser.dart b/lib/src/Parser.dart index 8c401fb6..636c70a0 100644 --- a/lib/src/Parser.dart +++ b/lib/src/Parser.dart @@ -1,7 +1,6 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/SIPMessage.dart'; - +import '../sip_ua.dart'; import 'Grammar.dart'; +import 'SIPMessage.dart'; import 'SIPMessage.dart' as SIPMessage; import 'logger.dart'; diff --git a/lib/src/RTCSession.dart b/lib/src/RTCSession.dart index 0a29286d..b8d601ad 100644 --- a/lib/src/RTCSession.dart +++ b/lib/src/RTCSession.dart @@ -3,13 +3,13 @@ import 'dart:async'; import 'package:events2/events2.dart'; import 'package:flutter_webrtc/webrtc.dart'; import 'package:sdp_transform/sdp_transform.dart' as sdp_transform; -import 'package:sip_ua/src/transactions/transaction_base.dart'; import '../sip_ua.dart'; import 'Constants.dart'; import 'Constants.dart' as DartSIP_C; import 'Dialog.dart'; import 'Exceptions.dart' as Exceptions; +import 'NameAddrHeader.dart'; import 'RTCSession/DTMF.dart' as RTCSession_DTMF; import 'RTCSession/Info.dart' as RTCSession_Info; import 'RTCSession/ReferNotifier.dart' as RTCSession_ReferNotifier; @@ -21,6 +21,7 @@ import 'Timers.dart'; import 'URI.dart'; import 'Utils.dart' as Utils; import 'logger.dart'; +import 'transactions/transaction_base.dart'; class C { // RTCSession states. @@ -83,7 +84,7 @@ class RTCSession extends EventEmitter { var _iceGatheringState; bool _localMediaStreamLocallyGenerated; bool _rtcReady; - var _direction; + String _direction; Map _referSubscribers; var _start_time; @@ -94,8 +95,8 @@ class RTCSession extends EventEmitter { bool _localHold; bool _remoteHold; - var _local_identity; - var _remote_identity; + NameAddrHeader _local_identity; + NameAddrHeader _remote_identity; String _contact; var _tones; @@ -195,11 +196,11 @@ class RTCSession extends EventEmitter { get contact => this._contact; - get direction => this._direction; + String get direction => this._direction; - get local_identity => this._local_identity; + NameAddrHeader get local_identity => this._local_identity; - get remote_identity => this._remote_identity; + NameAddrHeader get remote_identity => this._remote_identity; get start_time => this._start_time; @@ -677,7 +678,7 @@ class RTCSession extends EventEmitter { /** * Terminate the call. */ - terminate([options]) { + terminate([Map options]) { debug('terminate()'); options = options ?? {}; @@ -687,7 +688,7 @@ class RTCSession extends EventEmitter { var body = options['body']; var cancel_reason; - var status_code = options['status_code']; + int status_code = options['status_code']; var reason_phrase = options['reason_phrase']; // Check Session Status. @@ -1631,7 +1632,7 @@ class RTCSession extends EventEmitter { /** * Dialog Management */ - _createDialog(message, type, [early]) { + bool _createDialog(message, type, [early]) { var local_tag = (type == 'UAS') ? message.to_tag : message.from_tag; var remote_tag = (type == 'UAS') ? message.from_tag : message.to_tag; var id = message.call_id + local_tag + remote_tag; @@ -1679,7 +1680,7 @@ class RTCSession extends EventEmitter { } /// In dialog INVITE Reception - _receiveReinvite(request) async { + void _receiveReinvite(request) async { debug('receiveReinvite()'); var contentType = request.getHeader('Content-Type'); @@ -1714,7 +1715,7 @@ class RTCSession extends EventEmitter { this._late_sdp = false; - sendAnswer(sdp) async { + void sendAnswer(String sdp) async { var extraHeaders = ['Contact: ${this._contact}']; this._handleSessionTimersInIncomingRequest(request, extraHeaders); @@ -1771,7 +1772,7 @@ class RTCSession extends EventEmitter { /** * In dialog UPDATE Reception */ - _receiveUpdate(request) async { + void _receiveUpdate(request) async { debug('receiveUpdate()'); var rejected = false; @@ -1814,7 +1815,7 @@ class RTCSession extends EventEmitter { return; } - if (request.body == null || request.body.length == 0) { + if (request.body == null || request.body.length == 0) { sendAnswer(null); return; } @@ -2501,11 +2502,15 @@ class RTCSession extends EventEmitter { if (sdpOffer) { extraHeaders.add('Content-Type: application/sdp'); try { - var desc = + RTCSessionDescription desc = await this._createLocalDescription('offer', rtcOfferConstraints); - var sdp = this._mangleOffer(desc.sdp); + String sdp = this._mangleOffer(desc.sdp); - var e = {'originator': 'local', 'type': 'offer', 'sdp': sdp}; + Map e = { + 'originator': 'local', + 'type': 'offer', + 'sdp': sdp + }; debug('emit "sdp"'); this.emit('sdp', e); @@ -2585,12 +2590,12 @@ class RTCSession extends EventEmitter { /** * Correctly set the SDP direction attributes if the call is on local hold */ - _mangleOffer(sdp) { + String _mangleOffer(String sdpInput) { if (!this._localHold && !this._remoteHold) { - return sdp; + return sdpInput; } - sdp = sdp_transform.parse(sdp); + Map sdp = sdp_transform.parse(sdpInput); // Local hold. if (this._localHold && !this._remoteHold) { diff --git a/lib/src/RTCSession/ReferSubscriber.dart b/lib/src/RTCSession/ReferSubscriber.dart index ec541c00..f1d9a4f2 100644 --- a/lib/src/RTCSession/ReferSubscriber.dart +++ b/lib/src/RTCSession/ReferSubscriber.dart @@ -1,4 +1,5 @@ import 'package:events2/events2.dart'; + import '../Constants.dart' as DartSIP_C; import '../Constants.dart'; import '../Grammar.dart'; diff --git a/lib/src/Registrator.dart b/lib/src/Registrator.dart index 102294cb..a4716068 100644 --- a/lib/src/Registrator.dart +++ b/lib/src/Registrator.dart @@ -321,7 +321,7 @@ class Registrator { if (this._registered) { this._registered = false; - this._ua.unregistered({}); + this._ua.unregistered(Map()); } } diff --git a/lib/src/RequestSender.dart b/lib/src/RequestSender.dart index 2466f8b9..a280a6d3 100644 --- a/lib/src/RequestSender.dart +++ b/lib/src/RequestSender.dart @@ -1,15 +1,14 @@ -import 'package:sip_ua/src/transactions/ack_client.dart'; -import 'package:sip_ua/src/transactions/invite_client.dart'; -import 'package:sip_ua/src/transactions/non_invite_client.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; - import '../sip_ua.dart'; import 'Constants.dart'; import 'DigestAuthentication.dart'; import 'UA.dart' as UAC; import 'logger.dart'; +import 'transactions/ack_client.dart'; +import 'transactions/invite_client.dart'; +import 'transactions/non_invite_client.dart'; +import 'transactions/transaction_base.dart'; // Default event handlers. var EventHandlers = { diff --git a/lib/src/SIPMessage.dart b/lib/src/SIPMessage.dart index 99b0f96c..e14a2285 100644 --- a/lib/src/SIPMessage.dart +++ b/lib/src/SIPMessage.dart @@ -1,11 +1,12 @@ import 'package:sdp_transform/sdp_transform.dart' as sdp_transform; + import '../sip_ua.dart'; import 'Constants.dart'; -import 'NameAddrHeader.dart'; +import 'Constants.dart' as DartSIP_C; import 'Exceptions.dart' as Exceptions; import 'Grammar.dart'; +import 'NameAddrHeader.dart'; import 'Utils.dart' as Utils; -import 'Constants.dart' as DartSIP_C; import 'logger.dart'; final logger = Logger('SIPMessage'); diff --git a/lib/src/Transport.dart b/lib/src/Transport.dart index 65b4efbd..69a56a87 100644 --- a/lib/src/Transport.dart +++ b/lib/src/Transport.dart @@ -1,11 +1,8 @@ -import 'dart:io'; - -import 'package:sip_ua/src/WebSocketInterface.dart'; - -import 'Socket.dart' as Socket; import 'Exceptions.dart' as Exceptions; -import 'Utils.dart'; +import 'Socket.dart' as Socket; import 'Timers.dart'; +import 'Utils.dart'; +import 'WebSocketInterface.dart'; import 'logger.dart'; /** @@ -159,11 +156,12 @@ class Transport { this.ondisconnect({'socket': this.socket, 'error': false}); } - send(data) { + bool send(data) { debug('send()'); if (!this.isConnected()) { - debugerror('unable to send message, transport is not connected. Current state is ${this.status}'); + debugerror( + 'unable to send message, transport is not connected. Current state is ${this.status}'); return false; } @@ -172,11 +170,11 @@ class Transport { return this.socket.send(message); } - isConnected() { + bool isConnected() { return this.status == C.STATUS_CONNECTED; } - isConnecting() { + bool isConnecting() { return this.status == C.STATUS_CONNECTING; } diff --git a/lib/src/UA.dart b/lib/src/UA.dart index f1dc21b4..1f8aca3c 100644 --- a/lib/src/UA.dart +++ b/lib/src/UA.dart @@ -1,11 +1,4 @@ import 'package:events2/events2.dart'; -import 'package:sip_ua/src/SIPMessage.dart'; -import 'package:sip_ua/src/transactions/Transactions.dart'; -import 'package:sip_ua/src/transactions/invite_client.dart'; -import 'package:sip_ua/src/transactions/invite_server.dart'; -import 'package:sip_ua/src/transactions/non_invite_client.dart'; -import 'package:sip_ua/src/transactions/non_invite_server.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; import 'Config.dart' as config; import 'Config.dart'; @@ -17,6 +10,7 @@ import 'Message.dart'; import 'Parser.dart' as Parser; import 'RTCSession.dart'; import 'Registrator.dart'; +import 'SIPMessage.dart'; import 'SIPMessage.dart' as SIPMessage; import 'Timers.dart'; import 'Transport.dart'; @@ -24,6 +18,12 @@ import 'URI.dart'; import 'Utils.dart' as Utils; import 'logger.dart'; import 'sanityCheck.dart'; +import 'transactions/Transactions.dart'; +import 'transactions/invite_client.dart'; +import 'transactions/invite_server.dart'; +import 'transactions/non_invite_client.dart'; +import 'transactions/non_invite_server.dart'; +import 'transactions/transaction_base.dart'; class C { // UA status codes. @@ -217,14 +217,14 @@ class UA extends EventEmitter { /** * Registration state. */ - isRegistered() { + bool isRegistered() { return this._registrator.registered; } /** * Connection state. */ - isConnected() { + bool isConnected() { return this._transport.isConnected(); } @@ -237,9 +237,9 @@ class UA extends EventEmitter { * -throws {TypeError} * */ - call(target, options) { + RTCSession call(target, options) { debug('call()'); - var session = new RTCSession(this); + RTCSession session = new RTCSession(this); session.connect(target, options); return session; } @@ -254,7 +254,8 @@ class UA extends EventEmitter { * -throws {TypeError} * */ - sendMessage(target, body, options) { + Message sendMessage( + String target, String body, Map options) { debug('sendMessage()'); var message = new Message(this); message.send(target, body, options); @@ -264,7 +265,7 @@ class UA extends EventEmitter { /** * Terminate ongoing sessions. */ - terminateSessions(options) { + void terminateSessions(Map options) { debug('terminateSessions()'); this._sessions.forEach((idx, value) { if (!this._sessions[idx].isEnded()) { @@ -469,7 +470,7 @@ class UA extends EventEmitter { /** * Unregistered */ - unregistered(data) { + unregistered(Map data) { this.emit('unregistered', data); } @@ -821,13 +822,13 @@ class UA extends EventEmitter { */ // Transport connecting event. - onTransportConnecting(data) { + onTransportConnecting(Map data) { debug('Transport connecting'); this.emit('connecting', data); } // Transport connected event. - onTransportConnect(data) { + onTransportConnect(Map data) { debug('Transport connected'); if (this._status == C.STATUS_USER_CLOSED) { return; @@ -843,7 +844,7 @@ class UA extends EventEmitter { } // Transport disconnected event. - onTransportDisconnect(data) { + onTransportDisconnect(Map data) { // Run _onTransportError_ callback on every client transaction using _transport_. this._transactions.removeAll().forEach((transaction) { transaction.onTransportError(); @@ -861,7 +862,7 @@ class UA extends EventEmitter { } // Transport data event. - onTransportData(data) { + onTransportData(Map data) { var transport = data['transport']; String messageData = data['message']; diff --git a/lib/src/WebSocketInterface.dart b/lib/src/WebSocketInterface.dart index f51207a8..efd62ef3 100644 --- a/lib/src/WebSocketInterface.dart +++ b/lib/src/WebSocketInterface.dart @@ -3,11 +3,10 @@ import 'dart:async'; import 'dart:io'; import 'dart:math'; -import 'package:sip_ua/src/Timers.dart'; - +import 'Grammar.dart'; import 'Socket.dart'; +import 'Timers.dart'; import 'logger.dart'; -import 'Grammar.dart'; class WebSocketInterface implements Socket { String _url; @@ -18,7 +17,7 @@ class WebSocketInterface implements Socket { var _closed = false; var _connected = false; var weight; - var _wsExtraHeaders; + Map _wsExtraHeaders; final logger = Logger('WebSocketInterface'); debug(msg) => logger.debug(msg); @@ -30,7 +29,7 @@ class WebSocketInterface implements Socket { @override dynamic ondata; - WebSocketInterface(url, [wsExtraHeaders]) { + WebSocketInterface(String url, [Map wsExtraHeaders]) { debug('new() [url:' + url + ']'); this._url = url; var parsed_url = Grammar.parse(url, 'absoluteURI'); @@ -160,7 +159,7 @@ class WebSocketInterface implements Socket { } @override - send(message) { + bool send(message) { debug('send()'); if (this._closed) { throw 'transport closed'; diff --git a/lib/src/sanityCheck.dart b/lib/src/sanityCheck.dart index b557bfda..1107b725 100644 --- a/lib/src/sanityCheck.dart +++ b/lib/src/sanityCheck.dart @@ -1,14 +1,13 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/SIPMessage.dart'; -import 'package:sip_ua/src/Transport.dart'; -import 'package:sip_ua/src/transactions/invite_server.dart'; -import 'package:sip_ua/src/transactions/non_invite_server.dart'; - +import '../sip_ua.dart'; import 'Constants.dart' as DartSIP_C; import 'Constants.dart'; +import 'SIPMessage.dart'; import 'SIPMessage.dart' as SIPMessage; +import 'Transport.dart'; import 'Utils.dart' as Utils; import 'logger.dart'; +import 'transactions/invite_server.dart'; +import 'transactions/non_invite_server.dart'; final logger = Logger('sanityCheck'); debug(msg) => logger.debug(msg); diff --git a/lib/src/transactions/Transactions.dart b/lib/src/transactions/Transactions.dart index 55e022a8..e75b1dce 100644 --- a/lib/src/transactions/Transactions.dart +++ b/lib/src/transactions/Transactions.dart @@ -1,10 +1,8 @@ -import 'package:events2/events2.dart'; -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Constants.dart'; -import 'package:sip_ua/src/Timers.dart'; -import 'package:sip_ua/src/transactions/invite_server.dart'; -import 'package:sip_ua/src/transactions/non_invite_server.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; +import '../Constants.dart'; +import '../Timers.dart'; +import 'invite_server.dart'; +import 'non_invite_server.dart'; +import 'transaction_base.dart'; class TransactionBag { Map transactions = {}; diff --git a/lib/src/transactions/ack_client.dart b/lib/src/transactions/ack_client.dart index e1cf19aa..d30ad93d 100644 --- a/lib/src/transactions/ack_client.dart +++ b/lib/src/transactions/ack_client.dart @@ -1,8 +1,7 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Transport.dart'; -import 'package:sip_ua/src/Utils.dart'; -import 'package:sip_ua/src/transactions/Transactions.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; +import '../../sip_ua.dart'; +import '../Transport.dart'; +import '../Utils.dart'; +import 'transaction_base.dart'; final act_logger = new Logger('AckClientTransaction'); debugact(msg) => act_logger.debug(msg); diff --git a/lib/src/transactions/invite_client.dart b/lib/src/transactions/invite_client.dart index ec915ec9..2ffa318a 100644 --- a/lib/src/transactions/invite_client.dart +++ b/lib/src/transactions/invite_client.dart @@ -1,12 +1,10 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Constants.dart'; -import 'package:sip_ua/src/Timers.dart'; - -import 'package:sip_ua/src/Transport.dart'; -import 'package:sip_ua/src/Utils.dart'; -import 'package:sip_ua/src/transactions/Transactions.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; +import '../../sip_ua.dart'; +import '../Constants.dart'; import '../SIPMessage.dart' as SIPMessage; +import '../Timers.dart'; +import '../Transport.dart'; +import '../Utils.dart'; +import 'transaction_base.dart'; final ict_logger = new Logger('InviteClientTransaction'); diff --git a/lib/src/transactions/invite_server.dart b/lib/src/transactions/invite_server.dart index d2593f2e..0d0b814b 100644 --- a/lib/src/transactions/invite_server.dart +++ b/lib/src/transactions/invite_server.dart @@ -1,8 +1,7 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Timers.dart'; -import 'package:sip_ua/src/Transport.dart'; -import 'package:sip_ua/src/transactions/Transactions.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; +import '../../sip_ua.dart'; +import '../Timers.dart'; +import '../Transport.dart'; +import 'transaction_base.dart'; final ist_logger = new Logger('InviteServerTransaction'); debugist(msg) => ist_logger.debug(msg); diff --git a/lib/src/transactions/non_invite_client.dart b/lib/src/transactions/non_invite_client.dart index 5f9952cc..1f5dbf5d 100644 --- a/lib/src/transactions/non_invite_client.dart +++ b/lib/src/transactions/non_invite_client.dart @@ -1,11 +1,9 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Timers.dart'; -import 'package:sip_ua/src/Transport.dart'; -import 'package:sip_ua/src/Utils.dart'; -import 'package:sip_ua/src/transactions/Transactions.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; - +import '../../sip_ua.dart'; import '../SIPMessage.dart' as SIPMessage; +import '../Timers.dart'; +import '../Transport.dart'; +import '../Utils.dart'; +import 'transaction_base.dart'; final nict_logger = new Logger('NonInviteClientTransaction'); debugnict(msg) => nict_logger.debug(msg); diff --git a/lib/src/transactions/non_invite_server.dart b/lib/src/transactions/non_invite_server.dart index 70620313..9eefb8b0 100644 --- a/lib/src/transactions/non_invite_server.dart +++ b/lib/src/transactions/non_invite_server.dart @@ -1,9 +1,7 @@ -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Timers.dart'; - -import 'package:sip_ua/src/Transport.dart'; -import 'package:sip_ua/src/transactions/Transactions.dart'; -import 'package:sip_ua/src/transactions/transaction_base.dart'; +import '../../sip_ua.dart'; +import '../Timers.dart'; +import '../Transport.dart'; +import 'transaction_base.dart'; final nist_logger = new Logger('NonInviteServerTransaction'); debugnist(msg) => nist_logger.debug(msg); diff --git a/lib/src/transactions/transaction_base.dart b/lib/src/transactions/transaction_base.dart index d796ebeb..0bb461b5 100644 --- a/lib/src/transactions/transaction_base.dart +++ b/lib/src/transactions/transaction_base.dart @@ -1,6 +1,7 @@ import 'package:events2/events2.dart'; -import 'package:sip_ua/sip_ua.dart'; -import 'package:sip_ua/src/Transport.dart'; + +import '../../sip_ua.dart'; +import '../Transport.dart'; enum TransactionState { // Transaction states.