Skip to content

Commit 1db2473

Browse files
author
Mikael Wills
committed
More conversion from string uri to the URI class
1 parent e7309a8 commit 1db2473

File tree

8 files changed

+106
-69
lines changed

8 files changed

+106
-69
lines changed

example/lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'src/dialpad.dart';
1414
import 'src/register.dart';
1515

1616
void main() {
17-
// Logger.level = Level.warning;
17+
Logger.level = Level.warning;
1818
if (WebRTC.platformIsDesktop) {
1919
debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
2020
}

example/lib/src/register.dart

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:dart_sip_ua_example/src/user_state/sip_user.dart';
22
import 'package:dart_sip_ua_example/src/user_state/sip_user_cubit.dart';
33
import 'package:flutter/material.dart';
4+
import 'package:logger/logger.dart';
45
import 'package:provider/provider.dart';
56
import 'package:shared_preferences/shared_preferences.dart';
67
import 'package:sip_ua/sip_ua.dart';
@@ -36,6 +37,7 @@ class _MyRegisterWidget extends State<RegisterWidget>
3637
SIPUAHelper? get helper => widget._helper;
3738

3839
late SipUserCubit currentUser;
40+
final Logger _logger = Logger();
3941

4042
@override
4143
void initState() {
@@ -72,7 +74,7 @@ class _MyRegisterWidget extends State<RegisterWidget>
7274
_wsUriController.text =
7375
_preferences.getString('ws_uri') ?? 'wss://tryit.jssip.net:10443';
7476
_sipUriController.text =
75-
_preferences.getString('sip_uri') ?? 'hello_flutter@tryit.jssip.net';
77+
_preferences.getString('sip_uri') ?? 'sip:hello_flutter@tryit.jssip.net';
7678
_displayNameController.text =
7779
_preferences.getString('display_name') ?? 'Flutter SIP UA';
7880
_passwordController.text = _preferences.getString('password') ?? '';
@@ -126,22 +128,25 @@ class _MyRegisterWidget extends State<RegisterWidget>
126128

127129
_saveSettings();
128130

129-
print('Selected Transport: $_selectedTransport');
130-
print('WS Extra Headers: $_wsExtraHeaders');
131-
print('Port: ${_portController.text}');
132-
print('Display Name: ${_displayNameController.text}');
133-
print('Password: ${_passwordController.text}');
134-
print('Auth User: ${_authorizationUserController.text}');
135-
print("Sip URI: ${_sipUriController.text}");
131+
try {
132+
String inputUri = _sipUriController.text;
133+
if (!RegExp(r'^sip:').hasMatch(inputUri)) {
134+
inputUri = 'sip:$inputUri';
135+
}
136+
URI sipUri = URI.parse(inputUri);
137+
sipUri.port ??= int.parse(_portController.text);
136138

137-
currentUser.register(SipUser(
138-
selectedTransport: _selectedTransport,
139-
wsExtraHeaders: _wsExtraHeaders,
140-
sipUri: _sipUriController.text,
141-
port: _portController.text,
142-
displayName: _displayNameController.text,
143-
password: _passwordController.text,
144-
authUser: _authorizationUserController.text));
139+
currentUser.register(SipUser(
140+
selectedTransport: _selectedTransport,
141+
wsExtraHeaders: _wsExtraHeaders,
142+
sipUri: sipUri,
143+
port: _portController.text,
144+
displayName: _displayNameController.text,
145+
password: _passwordController.text,
146+
authUser: _authorizationUserController.text));
147+
} catch (e) {
148+
_logger.w("Your sip URI format is incorrect: $e");
149+
}
145150
}
146151

147152
@override

example/lib/src/user_state/sip_user.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class SipUser {
44
final String port;
55
final String displayName;
66
final String? wsUrl;
7-
final String? sipUri;
7+
final URI sipUri;
88
final String password;
99
final String authUser;
1010
final TransportType selectedTransport;
@@ -18,7 +18,7 @@ class SipUser {
1818
required this.selectedTransport,
1919
this.wsExtraHeaders,
2020
this.wsUrl,
21-
this.sipUri,
21+
required this.sipUri,
2222
});
2323

2424
@override

example/lib/src/user_state/sip_user_cubit.dart

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,22 @@ class SipUserCubit extends Cubit<SipUser?> {
66
final SIPUAHelper sipHelper;
77
SipUserCubit({required this.sipHelper}) : super(null);
88

9-
109
void register(SipUser user) {
11-
UaSettings settings = UaSettings();
12-
settings.port = user.port;
10+
UaSettings settings = UaSettings(
11+
uri: user.sipUri,
12+
transportType: user.selectedTransport,
13+
webSocketUrl: user.wsUrl,
14+
authorizationUser: user.authUser,
15+
password: user.password,
16+
displayName: user.displayName,
17+
userAgent: 'Dart SIP Client v1.0.0',
18+
dtmfMode: DtmfMode.RFC2833,
19+
contact_uri: user.sipUri,
20+
);
1321
settings.webSocketSettings.extraHeaders = user.wsExtraHeaders ?? {};
1422
settings.webSocketSettings.allowBadCertificate = true;
1523
//settings.webSocketSettings.userAgent = 'Dart/2.8 (dart:io) for OpenSIPS.';
16-
settings.tcpSocketSettings.allowBadCertificate = true;
17-
settings.transportType = user.selectedTransport;
18-
settings.uri = user.sipUri;
19-
settings.webSocketUrl = user.wsUrl;
20-
settings.host = user.sipUri?.split('@')[1];
21-
settings.authorizationUser = user.authUser;
22-
settings.password = user.password;
23-
settings.displayName = user.displayName;
24-
settings.userAgent = 'Dart SIP Client v1.0.0';
25-
settings.dtmfMode = DtmfMode.RFC2833;
26-
settings.contact_uri = 'sip:${user.sipUri}';
27-
24+
2825
emit(user);
2926
sipHelper.start(settings);
3027
}

lib/src/config.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,21 +96,20 @@ class Checks {
9696
dst!.sockets = copy;
9797
},
9898
'uri': (Settings src, Settings? dst) {
99-
dynamic uri = src.uri;
10099
if (src.uri == null && dst!.uri == null) {
101100
throw Exceptions.ConfigurationError('uri', null);
102101
}
103-
if (!uri.contains(RegExp(r'^sip:', caseSensitive: false))) {
104-
uri = '${DartSIP_C.SIP}:$uri';
102+
URI uri = src.uri!;
103+
if (uri.host == null) {
104+
throw Exceptions.ConfigurationError('uri.host', null);
105105
}
106-
dynamic parsed = URI.parse(uri);
107-
if (parsed == null) {
108-
throw Exceptions.ConfigurationError('uri', parsed);
109-
} else if (parsed.user == null) {
110-
throw Exceptions.ConfigurationError('uri', parsed);
111-
} else {
112-
dst!.uri = parsed;
106+
if (uri.port == null) {
107+
throw Exceptions.ConfigurationError('uri.port', null);
108+
}
109+
if (uri.scheme == null) {
110+
throw Exceptions.ConfigurationError('uri.scheme', null);
113111
}
112+
dst!.uri = src.uri;
114113
},
115114
'transport_type': (Settings src, Settings? dst) {
116115
dynamic transportType = src.transportType;

lib/src/sip_ua_helper.dart

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,7 @@ class SIPUAHelper extends EventManager {
151151
_settings.sockets = <SIPUASocketInterface>[];
152152

153153
if (uaSettings.transportType == TransportType.TCP) {
154-
SIPUATcpSocket socket = SIPUATcpSocket(
155-
uaSettings.host ?? '0.0.0.0', uaSettings.port ?? '5060',
156-
messageDelay: 1);
154+
SIPUATcpSocket socket = SIPUATcpSocket(uaSettings.uri, messageDelay: 1);
157155
_settings.sockets!.add(socket);
158156
}
159157

@@ -166,7 +164,7 @@ class SIPUAHelper extends EventManager {
166164
}
167165

168166
_settings.transportType = uaSettings.transportType!;
169-
_settings.uri = uaSettings.uri != null ? URI.parse(uaSettings.uri!) : null;
167+
_settings.uri = uaSettings.uri;
170168
_settings.sip_message_delay = uaSettings.sip_message_delay;
171169
_settings.realm = uaSettings.realm;
172170
_settings.password = uaSettings.password;
@@ -186,9 +184,7 @@ class SIPUAHelper extends EventManager {
186184
uaSettings.sessionTimersRefreshMethod;
187185
_settings.instance_id = uaSettings.instanceId;
188186
_settings.registrar_server = uaSettings.registrarServer;
189-
_settings.contact_uri = uaSettings.contact_uri != null
190-
? URI.parse(uaSettings.contact_uri!)
191-
: null;
187+
_settings.contact_uri = uaSettings.contact_uri;
192188
_settings.connection_recovery_max_interval =
193189
uaSettings.connectionRecoveryMaxInterval;
194190
_settings.connection_recovery_min_interval =
@@ -853,6 +849,50 @@ extension _IceTransportPolicyEncoding on IceTransportPolicy {
853849
}
854850

855851
class UaSettings {
852+
UaSettings({
853+
required this.uri,
854+
this.register,
855+
this.register_expires,
856+
this.userAgent,
857+
this.webSocketUrl,
858+
this.realm,
859+
this.authorizationUser,
860+
this.password,
861+
this.ha1,
862+
this.displayName,
863+
this.instanceId,
864+
this.registrarServer,
865+
this.contact_uri,
866+
this.transportType,
867+
this.dtmfMode = DtmfMode.INFO,
868+
this.sessionTimers = true,
869+
this.iceGatheringTimeout = 500,
870+
this.connectionRecoveryMaxInterval = 30,
871+
this.connectionRecoveryMinInterval = 2,
872+
this.terminateOnMediaPortZero = false,
873+
this.sip_message_delay = 0,
874+
this.iceServers = const <Map<String, String>>[
875+
<String, String>{'urls': 'stun:stun.l.google.com:19302'},
876+
],
877+
this.iceTransportPolicy,
878+
this.sessionTimersRefreshMethod = DartSIP_C.SipMethod.UPDATE,
879+
}) {
880+
_validateUri(uri);
881+
}
882+
// Validate the URI (host, port, scheme) without assigning it
883+
static void _validateUri(URI uri) {
884+
if (uri.host == null || uri.host.isEmpty) {
885+
throw ArgumentError('Invalid URI: Missing host');
886+
}
887+
if (uri.port == null) {
888+
throw ArgumentError('Invalid URI: Missing port');
889+
}
890+
if (uri.scheme == null || uri.scheme.isEmpty) {
891+
print('URI: Missing scheme, adding sip');
892+
uri.scheme = DartSIP_C.SIP;
893+
}
894+
}
895+
856896
WebSocketSettings webSocketSettings = WebSocketSettings();
857897
TcpSocketSettings tcpSocketSettings = TcpSocketSettings();
858898

@@ -867,10 +907,8 @@ class UaSettings {
867907
RegisterParams registerParams = RegisterParams();
868908

869909
/// `User Agent` field for sip message.
910+
final URI uri;
870911
String? userAgent;
871-
String? host;
872-
String? port;
873-
String? uri;
874912
String? webSocketUrl;
875913
String? realm;
876914
String? authorizationUser;
@@ -879,7 +917,7 @@ class UaSettings {
879917
String? displayName;
880918
String? instanceId;
881919
String? registrarServer;
882-
String? contact_uri;
920+
URI? contact_uri;
883921

884922
TransportType? transportType;
885923

lib/src/transports/tcp_socket.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,18 @@ import 'socket_interface.dart';
55
import 'tcp_socket_impl.dart';
66

77
class SIPUATcpSocket extends SIPUASocketInterface {
8-
SIPUATcpSocket(String host, String port,
8+
SIPUATcpSocket(URI uri,
99
{required int messageDelay,
1010
TcpSocketSettings? tcpSocketSettings,
1111
int? weight})
1212
: _messageDelay = messageDelay {
13-
logger.d('new() [host:$host:$port]');
13+
logger.d('new() [host:${uri.host}:${uri.port}]');
1414
String transport_scheme = 'tcp';
1515
_weight = weight;
16-
_host = host;
17-
_port = port;
18-
19-
_sip_uri = 'sip:$host:$port;transport=$transport_scheme';
20-
logger.d('TCPC SIP URI: $_sip_uri');
16+
_host = uri.host;
17+
_port = uri.port.toString();
18+
_sip_uri = uri.toString();
19+
logger.d('TCP SIP URI: $sip_uri');
2120
_via_transport = transport_scheme.toUpperCase();
2221
_tcpSocketSettings = tcpSocketSettings ?? TcpSocketSettings();
2322
}
@@ -37,6 +36,9 @@ class SIPUATcpSocket extends SIPUASocketInterface {
3736
int? status;
3837
late TcpSocketSettings _tcpSocketSettings;
3938

39+
@override
40+
String? get sip_uri => _sip_uri;
41+
4042
@override
4143
String get via_transport => _via_transport;
4244

@@ -48,9 +50,6 @@ class SIPUATcpSocket extends SIPUASocketInterface {
4850
@override
4951
int? get weight => _weight;
5052

51-
@override
52-
String? get sip_uri => _sip_uri;
53-
5453
String? get host => _host;
5554

5655
String? get port => _port;

lib/src/uri.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,13 @@ class URI {
3838
}
3939
}
4040
/**
41-
* Parse the given string and returns a DartSIP.URI instance or null if
42-
* it is an invalid URI.
41+
* Parse the given string, if incorrect will tell you whats wrong
4342
*/
4443
static dynamic parse(String uri) {
4544
try {
4645
return Grammar.parse(uri, 'SIP_URI');
47-
} catch (_) {
48-
return null;
46+
} catch (e) {
47+
throw FormatException('Uri did not parse: $e');
4948
}
5049
}
5150

0 commit comments

Comments
 (0)