register method
void
register()
Implementation
void register() {
if (_registering) {
logger.debug('Register request in progress...');
return;
}
List<String> extraHeaders = List<String>.from(_extraHeaders ?? <String>[]);
extraHeaders
.add('Contact: $_contact;expires=$_expires$_extraContactParams');
extraHeaders.add('Expires: $_expires');
logger.warn(_contact);
OutgoingRequest request = OutgoingRequest(
SipMethod.REGISTER,
_registrar,
_ua,
<String, dynamic>{
'to_uri': _toUri,
'call_id': _callId,
'cseq': _cseq += 1
},
extraHeaders);
EventManager handlers = EventManager();
handlers.on(EventOnRequestTimeout(), (EventOnRequestTimeout value) {
_registrationFailure(
UnHandledResponse(408, dart_sip_c.CausesType.REQUEST_TIMEOUT),
dart_sip_c.CausesType.REQUEST_TIMEOUT);
});
handlers.on(EventOnTransportError(), (EventOnTransportError value) {
_registrationFailure(
UnHandledResponse(500, dart_sip_c.CausesType.CONNECTION_ERROR),
dart_sip_c.CausesType.CONNECTION_ERROR);
});
handlers.on(EventOnAuthenticated(), (EventOnAuthenticated value) {
_cseq += 1;
});
handlers.on(EventOnReceiveResponse(), (EventOnReceiveResponse event) {
{
// Discard responses to older REGISTER/un-REGISTER requests.
if (event.response!.cseq != _cseq) {
return;
}
// Clear registration timer.
if (_registrationTimer != null) {
clearTimeout(_registrationTimer);
_registrationTimer = null;
}
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')) {
logger.debug(
'no Contact header in response to REGISTER, response ignored');
return;
}
List<dynamic> contacts = <dynamic>[];
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);
if (contact == null) {
logger.debug('no Contact header pointing to us, response ignored');
return;
}
dynamic expires = contact.getParam('expires');
if (expires == null && event.response!.hasHeader('expires')) {
expires = event.response!.getHeader('expires');
}
expires ??= _expires;
expires = num.tryParse(expires) ?? 0;
if (expires < minRegisterExpires) {
expires = minRegisterExpires;
}
// Re-Register or emit an event before the expiration interval has elapsed.
// For that, decrease the expires value. ie: 3 seconds.
_registrationTimer = setTimeout(() {
clearTimeout(_registrationTimer);
_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())) {
//! WARNING: do not re-register when session expired time
// register();
} else {
_ua!.emit(EventRegistrationExpiring());
}
}, (expires * 1000) - 5000);
// Save gruu values.
if (contact.hasParam('temp-gruu')) {
_ua!.contact!.temp_gruu =
contact.getParam('temp-gruu').replaceAll('"', '');
}
if (contact.hasParam('pub-gruu')) {
_ua!.contact!.pub_gruu =
contact.getParam('pub-gruu').replaceAll('"', '');
}
if (!_registered!) {
_registered = true;
_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')) {
// Increase our registration interval to the suggested minimum.
_expires = num.tryParse(event.response!.getHeader('min-expires'))
as int? ??
0;
if (_expires! < minRegisterExpires) {
_expires = minRegisterExpires;
}
// Attempt the registration again immediately.
// register();
} else {
// This response MUST contain a Min-Expires header field.
logger.debug(
'423 response received for REGISTER without Min-Expires');
_registrationFailure(
event.response, dart_sip_c.CausesType.SIP_FAILURE_CODE);
}
} else {
String cause = utils.sipErrorCause(event.response!.status_code);
_registrationFailure(event.response, cause);
}
}
});
RequestSender request_sender = RequestSender(_ua!, request, handlers);
_registering = true;
request_sender.send();
}