Skip to content
13 changes: 8 additions & 5 deletions example/lib/src/sip_ua_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ class SIPUAHelper extends EventEmitter {

start(wsUrl, uri, [password, displayName, wsExtraHeaders]) async {
if (this._ua != null) {
debugerror('UA instance already exist!');
this._ua.start();
return;
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.sockets = [socket];
_settings.sockets = [socket] ;
_settings.uri = uri;
_settings.password = password;
_settings.display_name = displayName;
Expand Down Expand Up @@ -254,9 +254,12 @@ class SIPUAHelper extends EventEmitter {
}

connect(uri, [voiceonly]) async {
if (_ua != null) {
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;
}
Expand Down
14 changes: 7 additions & 7 deletions lib/src/Config.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:sip_ua/sip_ua.dart';

import 'Constants.dart';
import 'Utils.dart' as Utils;
import 'Constants.dart' as DartSIP_C;
Expand Down Expand Up @@ -43,7 +45,7 @@ class Settings {
var registrar_server = null;

// Connection options.
var sockets = null;
List<WebSocketInterface> sockets = null;
var connection_recovery_max_interval = 30;
var connection_recovery_min_interval = 2;

Expand All @@ -64,18 +66,16 @@ var settings = new Settings();
// Configuration checks.
class Checks {
var mandatory = {
'sockets': (src, dst) {
var sockets = src.sockets;
'sockets': (Settings src, Settings dst) {
List<WebSocketInterface> sockets = src.sockets;
/* Allow defining sockets parameter as:
* Socket: socket
* List of Socket: [socket1, socket2]
* List of Objects: [{socket: socket1, weight:1}, {socket: Socket2, weight:0}]
* List of Objects and Socket: [{socket: socket1}, socket2]
*/
var _sockets = [];
if (sockets != null && Socket.isSocket(sockets)) {
_sockets.add({'socket': sockets});
} else if (sockets is List && sockets.length > 0) {
List<WebSocketInterface> _sockets = [];
if (sockets is List && sockets.length > 0) {
for (var socket in sockets) {
if (Socket.isSocket(socket)) {
_sockets.add(socket);
Expand Down
18 changes: 9 additions & 9 deletions lib/src/Dialog.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import 'package:sip_ua/src/transactions/transaction_base.dart';

import '../sip_ua.dart';
import 'Constants.dart';
import 'Dialog/RequestSender.dart';
import 'Exceptions.dart' as Exceptions;
import 'RTCSession.dart';
import 'SIPMessage.dart' as SIPMessage;
import 'Constants.dart' as DartSIP_C;
import 'Transactions.dart' as Transactions;
import 'Exceptions.dart' as Exceptions;
import 'Dialog/RequestSender.dart';
import 'Utils.dart' as Utils;
import 'logger.dart';

Expand Down Expand Up @@ -244,11 +244,11 @@ class Dialog {
this._uas_pending_reply = true;
var stateChanged = () {
if (request.server_transaction.state ==
Transactions.C.STATUS_ACCEPTED ||
TransactionState.ACCEPTED ||
request.server_transaction.state ==
Transactions.C.STATUS_COMPLETED ||
TransactionState.COMPLETED ||
request.server_transaction.state ==
Transactions.C.STATUS_TERMINATED) {
TransactionState.TERMINATED) {
this._uas_pending_reply = false;
}
};
Expand All @@ -259,7 +259,7 @@ class Dialog {
if (request.hasHeader('contact')) {
request.server_transaction.on('stateChanged', () {
if (request.server_transaction.state ==
Transactions.C.STATUS_ACCEPTED) {
TransactionState.ACCEPTED) {
this._remote_target = request.parseHeader('contact').uri;
}
});
Expand All @@ -269,7 +269,7 @@ class Dialog {
if (request.hasHeader('contact')) {
request.server_transaction.on('stateChanged', () {
if (request.server_transaction.state ==
Transactions.C.STATUS_COMPLETED) {
TransactionState.COMPLETED) {
this._remote_target = request.parseHeader('contact').uri;
}
});
Expand Down
14 changes: 7 additions & 7 deletions lib/src/Dialog/RequestSender.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import 'package:sip_ua/src/transactions/transaction_base.dart';

import '../../sip_ua.dart';
import '../Constants.dart' as DartSIP_C;
import '../Constants.dart';
import '../Dialog.dart';
import '../SIPMessage.dart';
import '../Transactions.dart' as Transactions;
import '../RTCSession.dart' as RTCSession;
import '../RequestSender.dart';
import '../SIPMessage.dart';
import '../Timers.dart';

// Default event handlers.
Expand Down Expand Up @@ -64,17 +64,17 @@ class DialogRequestSender {
if ((this._request.method == SipMethod.INVITE ||
(this._request.method == SipMethod.UPDATE && this._request.body != null)) &&
request_sender.clientTransaction.state !=
Transactions.C.STATUS_TERMINATED) {
TransactionState.TERMINATED) {
this._dialog.uac_pending_reply = true;

var stateChanged;
stateChanged = () {
if (request_sender.clientTransaction.state ==
Transactions.C.STATUS_ACCEPTED ||
TransactionState.ACCEPTED ||
request_sender.clientTransaction.state ==
Transactions.C.STATUS_COMPLETED ||
TransactionState.COMPLETED ||
request_sender.clientTransaction.state ==
Transactions.C.STATUS_TERMINATED) {
TransactionState.TERMINATED) {
request_sender.clientTransaction.remove('stateChanged', stateChanged);
this._dialog.uac_pending_reply = false;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/src/Grammar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:sip_ua/src/grammar_parser.dart';
import "package:parser_error/parser_error.dart";

class Grammar {
static parse(input, startRule) {
static parse(String input,String startRule) {
var parser = new GrammarParser('');
var result = parser.parse(input, startRule);
if (!parser.success) {
Expand Down
8 changes: 4 additions & 4 deletions lib/src/Message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ class Message extends EventEmitter {
request.reply(200);
}

this._close();
this.close();
}

/*
Expand Down Expand Up @@ -187,7 +187,7 @@ class Message extends EventEmitter {
this._failed('system', null, DartSIP_C.causes.CONNECTION_ERROR);
}

_close() {
close() {
this._closed = true;
this._ua.destroyMessage(this);
}
Expand All @@ -214,7 +214,7 @@ class Message extends EventEmitter {
_failed(originator, response, cause) {
debug('MESSAGE failed');

this._close();
this.close();

debug('emit "failed"');

Expand All @@ -228,7 +228,7 @@ class Message extends EventEmitter {
_succeeded(originator, response) {
debug('MESSAGE succeeded');

this._close();
this.close();

debug('emit "succeeded"');

Expand Down
28 changes: 16 additions & 12 deletions lib/src/Parser.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import 'package:sip_ua/sip_ua.dart';
import 'package:sip_ua/src/SIPMessage.dart';

import 'Grammar.dart';
import 'SIPMessage.dart' as SIPMessage;
import 'logger.dart';
Expand All @@ -9,18 +12,18 @@ debugerror(error) => logger.error(error);
/**
* Parse SIP Message
*/
parseMessage(data, ua) {
var message;
var bodyStart;
var headerEnd = data.indexOf('\r\n');
IncomingMessage parseMessage(String data, UA ua) {
IncomingMessage message;
int bodyStart;
int headerEnd = data.indexOf('\r\n');

if (headerEnd == -1) {
debugerror('parseMessage() | no CRLF found, not a SIP message');
return null;
}

// Parse first line. Check if it is a Request or a Reply.
var firstLine = data.substring(0, headerEnd);
String firstLine = data.substring(0, headerEnd);
var parsed;
try{
parsed = Grammar.parse(firstLine, 'Request_Response');
Expand All @@ -36,9 +39,10 @@ parseMessage(data, ua) {

return null;
} else if (parsed.status_code == null) {
message = new SIPMessage.IncomingRequest(ua);
message.method = parsed.method;
message.ruri = parsed.uri;
IncomingRequest incomingRequest = new SIPMessage.IncomingRequest(ua);
incomingRequest.method = parsed.method;
incomingRequest.ruri = parsed.uri;
message = incomingRequest;
} else {
message = new SIPMessage.IncomingResponse();
message.status_code = parsed.status_code;
Expand Down Expand Up @@ -97,13 +101,13 @@ parseMessage(data, ua) {
/**
* Extract and parse every header of a SIP message.
*/
getHeader(data, headerStart) {
getHeader(String data, int headerStart) {
// 'start' position of the header.
var start = headerStart;
int start = headerStart;
// 'end' position of the header.
var end = 0;
int end = 0;
// 'partial end' position of the header.
var partialEnd = 0;
int partialEnd = 0;

// End of message.
if (data.substring(start, start + 2).contains(new RegExp(r'(^\r\n)'))) {
Expand Down
29 changes: 15 additions & 14 deletions lib/src/RTCSession.dart
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import 'dart:async';

import 'package:events2/events2.dart';
import 'package:sdp_transform/sdp_transform.dart' as sdp_transform;
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 'RTCSession/DTMF.dart' as RTCSession_DTMF;
import 'RTCSession/Info.dart' as RTCSession_Info;
import 'RTCSession/ReferNotifier.dart' as RTCSession_ReferNotifier;
import 'RTCSession/ReferSubscriber.dart' as RTCSession_ReferSubscriber;

import 'Constants.dart' as DartSIP_C;
import 'Exceptions.dart' as Exceptions;
import 'RequestSender.dart';
import 'SIPMessage.dart';
import 'Transactions.dart' as Transactions;
import 'Utils.dart' as Utils;
import 'Timers.dart';
import 'SIPMessage.dart' as SIPMessage;
import 'Dialog.dart';
import 'RequestSender.dart';
import 'Timers.dart';
import 'URI.dart';
import 'Utils.dart' as Utils;
import 'logger.dart';

class C {
Expand Down Expand Up @@ -566,7 +565,7 @@ class RTCSession extends EventEmitter {

// Don't ask for video if the incoming offer has no video section.
if (mediaStream == null && !peerHasVideoLine) {
mediaConstraints.video = false;
mediaConstraints['video'] = false;
}

// Create a new RTCPeerConnection instance.
Expand Down Expand Up @@ -765,7 +764,7 @@ class RTCSession extends EventEmitter {
if (this._status == C.STATUS_WAITING_FOR_ACK &&
this._direction == 'incoming' &&
this._request.server_transaction.state !=
Transactions.C.STATUS_TERMINATED) {
TransactionState.TERMINATED) {
/// Save the dialog for later restoration.
Dialog dialog = this._dialog;

Expand All @@ -781,7 +780,7 @@ class RTCSession extends EventEmitter {
// .., or when the INVITE transaction times out
this._request.server_transaction.on('stateChanged', () {
if (this._request.server_transaction.state ==
Transactions.C.STATUS_TERMINATED) {
TransactionState.TERMINATED) {
this.sendRequest(
SipMethod.BYE, {'extraHeaders': extraHeaders, 'body': body});
dialog.terminate();
Expand Down Expand Up @@ -2267,7 +2266,9 @@ class RTCSession extends EventEmitter {
// 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 (this._connection.signalingState ==
RTCSignalingState.RTCSignalingStateStable) {
RTCSignalingState.RTCSignalingStateStable ||
this._connection.signalingState ==
RTCSignalingState.RTCSignalingStateHaveLocalOffer) {
try {
var offer =
await this._connection.createOffer(this._rtcOfferConstraints);
Expand Down Expand Up @@ -2453,7 +2454,7 @@ class RTCSession extends EventEmitter {

// Must have SDP answer.
if (sdpOffer != null) {
if (!response.body) {
if (response.body !=null && response.body.trim().isNotEmpty) {
onFailed();
return;
} else if (response.getHeader('Content-Type') != 'application/sdp') {
Expand Down
15 changes: 9 additions & 6 deletions lib/src/RequestSender.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@


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' as DartSIP_C;
import 'Constants.dart';
import 'DigestAuthentication.dart';
import 'Transactions.dart' as Transactions;
import 'UA.dart' as UAC;
import 'logger.dart';

Expand All @@ -24,7 +27,7 @@ class RequestSender {
var _auth;
var _challenged;
var _staled;
var clientTransaction;
TransactionBase clientTransaction;
final logger = new Logger('RequestSender');
debug(msg) => logger.debug(msg);
debugerror(error) => logger.error(error);
Expand Down Expand Up @@ -66,15 +69,15 @@ class RequestSender {

switch (this._method) {
case SipMethod.INVITE:
this.clientTransaction = new Transactions.InviteClientTransaction(
this.clientTransaction = new InviteClientTransaction(
this._ua, this._ua.transport, this._request, eventHandlers);
break;
case SipMethod.ACK:
this.clientTransaction = new Transactions.AckClientTransaction(
this.clientTransaction = new AckClientTransaction(
this._ua, this._ua.transport, this._request, eventHandlers);
break;
default:
this.clientTransaction = new Transactions.NonInviteClientTransaction(
this.clientTransaction = new NonInviteClientTransaction(
this._ua, this._ua.transport, this._request, eventHandlers);
}

Expand Down
Loading