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();
}