Как добавить провайдера для элемента без пространства имен в smack 4.2.0

Я не смог ничего найти по этому поводу в моем поиске по Google, но я далек от эксперта по XMPP, поэтому, возможно, ответ очевиден. Мне интересно, как лучше всего проанализировать пользовательские дочерние элементы, у которых нет явного пространства имен. В этом случае я разбираю некоторые элементы jingle, и некоторые из них не имеют явного пространства имен (например, payload-type, или же parameter которые не указывают явно пространство имен и просто наследуют его).

Например:

<description maxptime="60" media="audio" xmlns="urn:xmpp:jingle:apps:rtp:1">
  <payload-type name="opus" clockrate="48000" id="111" channels="2">
    <parameter value="10" name="minptime" />
    <parameter value="1" name="useinbandfec" />
  </payload-type>
  ...
</description>

Здесь и тип полезной нагрузки, и параметр будут наследовать родительское пространство имен из описания (urn:xmpp:jingle:apps:rtp:1). Но параметр также может быть использован в другом месте:

<source ssrc="1789460357" xmlns="urn:xmpp:jingle:apps:rtp:ssma:0">
  <parameter value="mixed" name="cname" />
  ...  
</source>

Здесь параметр будет иметь urn:xmpp:jingle:apps:rtp:ssma:0 namspace.

При добавлении пользовательских провайдеров в ProviderManager требуется передача явного пространства имен, поэтому я не могу передать только пустую строку (ProviderManager.addExtensionProvider явно проверяет это).

Одним из вариантов будет регистрация parameter провайдера, например, под каждым возможным пространством имен, но это не слишком здорово.

Другим вариантом будет для провайдеров более высокого уровня (тех, которые имеют явные пространства имен) анализировать любые вложенные дочерние элементы без пространств имен вместо простого рекурсивного получения соответствующего провайдера расширения и анализа вызова. Казалось, что регистрация всего с ProviderManager была более идиотским способом сделать это все же. Это, вероятно, будет использовать какую-то внутреннюю версию менеджера провайдеров, которая будет работать только на имя. Поэтому элемент сначала ищет в официальном ProviderManager все, что соответствует, а затем пробует его внутреннюю версию.

Есть ли идиоматический способ добиться этого? Может быть, я что-то пропустил?

В этом вопросе я вижу, что пространства имен ожидаемы, но я не вижу ни одного из перечисленных в спецификации Jingle RTP. Так что, возможно, одна из идей, которые у меня есть выше, является правильной, но мне интересно, какая из них лучше всего подойдет для библиотеки.

Спасибо

0 ответов

Другие вопросы по тегам